X-Git-Url: http://v3vee.org/palacios/gitweb/gitweb.cgi?a=blobdiff_plain;f=linux_module%2Fiface-file.c;h=e826296e1339bb890f95c8d83c2b3a599e30d71e;hb=e4d65eb1a4af57179bd00c397120c78c9e5b32b1;hp=46d4a28839b9a66d52c39433055914010a4f1d0a;hpb=07aa8f3c18a33af0961e7546980a63ab5f6fba4f;p=palacios.git diff --git a/linux_module/iface-file.c b/linux_module/iface-file.c index 46d4a28..e826296 100644 --- a/linux_module/iface-file.c +++ b/linux_module/iface-file.c @@ -161,7 +161,7 @@ static int palacios_file_mkdir(const char * pathname, unsigned short perms, int { dentry = kern_path_create(AT_FDCWD, pathname, &tmp_path, 1); - if (IS_ERR(dentry)) { + if (!dentry || IS_ERR(dentry)) { return 0; } @@ -170,7 +170,7 @@ static int palacios_file_mkdir(const char * pathname, unsigned short perms, int #endif - if (!IS_ERR(dentry)) { + if (!(!dentry || IS_ERR(dentry))) { ret = vfs_mkdir(path_ptr->dentry->d_inode, dentry, perms); } @@ -218,9 +218,9 @@ static void * palacios_file_open(const char * path, int mode, void * private_dat pfile->mode |= O_LARGEFILE; - pfile->filp = filp_open(path, pfile->mode, 0); + pfile->filp = filp_open(path, pfile->mode, 0600); // rw------- to start - if (IS_ERR(pfile->filp)) { + if (!pfile->filp || IS_ERR(pfile->filp)) { ERROR("Cannot open file: %s\n", path); palacios_free(pfile); return NULL; @@ -237,7 +237,7 @@ static void * palacios_file_open(const char * path, int mode, void * private_dat strncpy(pfile->path, path, strlen(path)); pfile->guest = guest; - spin_lock_init(&(pfile->lock)); + palacios_spinlock_init(&(pfile->lock)); if (guest == NULL) { list_add(&(pfile->file_node), &(global_files)); @@ -252,10 +252,16 @@ static void * palacios_file_open(const char * path, int mode, void * private_dat static int palacios_file_close(void * file_ptr) { struct palacios_file * pfile = (struct palacios_file *)file_ptr; + if (!pfile) { + return -1; + } + filp_close(pfile->filp, NULL); list_del(&(pfile->file_node)); + palacios_spinlock_deinit(&(pfile->lock)); + palacios_free(pfile->path); palacios_free(pfile); @@ -342,8 +348,14 @@ static int file_init( void ) { static int file_deinit( void ) { - if (!list_empty(&(global_files))) { - ERROR("Error removing module with open files\n"); + struct palacios_file * pfile = NULL; + struct palacios_file * tmp = NULL; + + list_for_each_entry_safe(pfile, tmp, &(global_files), file_node) { + filp_close(pfile->filp, NULL); + list_del(&(pfile->file_node)); + palacios_free(pfile->path); + palacios_free(pfile); } return 0; @@ -368,9 +380,18 @@ static int guest_file_init(struct v3_guest * guest, void ** vm_data) { static int guest_file_deinit(struct v3_guest * guest, void * vm_data) { + struct vm_file_state * state = (struct vm_file_state *)vm_data; + struct palacios_file * pfile = NULL; + struct palacios_file * tmp = NULL; - palacios_free(vm_data); + list_for_each_entry_safe(pfile, tmp, &(state->open_files), file_node) { + filp_close(pfile->filp, NULL); + list_del(&(pfile->file_node)); + palacios_free(pfile->path); + palacios_free(pfile); + } + palacios_free(state); return 0; }