diff --git a/kmod/src/net.c b/kmod/src/net.c index 93478a5f..eab190da 100644 --- a/kmod/src/net.c +++ b/kmod/src/net.c @@ -355,6 +355,7 @@ static int submit_send(struct super_block *sb, } if (rid != 0) { spin_unlock(&conn->lock); + kfree(msend); return -ENOTCONN; } } @@ -1345,10 +1346,12 @@ scoutfs_net_alloc_conn(struct super_block *sb, if (!conn) return NULL; - conn->info = kzalloc(info_size, GFP_NOFS); - if (!conn->info) { - kfree(conn); - return NULL; + if (info_size) { + conn->info = kzalloc(info_size, GFP_NOFS); + if (!conn->info) { + kfree(conn); + return NULL; + } } conn->workq = alloc_workqueue("scoutfs_net_%s", diff --git a/kmod/src/omap.c b/kmod/src/omap.c index 604c397e..c39dbc9c 100644 --- a/kmod/src/omap.c +++ b/kmod/src/omap.c @@ -157,6 +157,15 @@ static int free_rid(struct omap_rid_list *list, struct omap_rid_entry *entry) return nr; } +static void free_rid_list(struct omap_rid_list *list) +{ + struct omap_rid_entry *entry; + struct omap_rid_entry *tmp; + + list_for_each_entry_safe(entry, tmp, &list->head, head) + free_rid(list, entry); +} + static int copy_rids(struct omap_rid_list *to, struct omap_rid_list *from, spinlock_t *from_lock) { struct omap_rid_entry *entry; @@ -804,6 +813,10 @@ void scoutfs_omap_server_shutdown(struct super_block *sb) llist_for_each_entry_safe(req, tmp, requests, llnode) kfree(req); + spin_lock(&ominf->lock); + free_rid_list(&ominf->rids); + spin_unlock(&ominf->lock); + synchronize_rcu(); } @@ -864,6 +877,10 @@ void scoutfs_omap_destroy(struct super_block *sb) rhashtable_walk_stop(&iter); rhashtable_walk_exit(&iter); + spin_lock(&ominf->lock); + free_rid_list(&ominf->rids); + spin_unlock(&ominf->lock); + rhashtable_destroy(&ominf->group_ht); rhashtable_destroy(&ominf->req_ht); kfree(ominf); diff --git a/kmod/src/super.c b/kmod/src/super.c index 5cac5148..d38fcb65 100644 --- a/kmod/src/super.c +++ b/kmod/src/super.c @@ -496,7 +496,7 @@ static int scoutfs_fill_super(struct super_block *sb, void *data, int silent) ret = assign_random_id(sbi); if (ret < 0) - return ret; + goto out; spin_lock_init(&sbi->next_ino_lock); spin_lock_init(&sbi->data_wait_root.lock); @@ -505,7 +505,7 @@ static int scoutfs_fill_super(struct super_block *sb, void *data, int silent) /* parse options early for use during setup */ ret = scoutfs_options_early_setup(sb, data); if (ret < 0) - return ret; + goto out; scoutfs_options_read(sb, &opts); ret = sb_set_blocksize(sb, SCOUTFS_BLOCK_SM_SIZE);