9p: implement proper trans module refcounting and unregistration
9p trans modules aren't refcounted nor were they unregistered properly. Fix it. * Add 9p_trans_module->owner and reference the module on each trans instance creation and put it on destruction. * Protect v9fs_trans_list with a spinlock. This isn't strictly necessary as the list is manipulated only during module loading / unloading but it's a good idea to make the API safe. * Unregister trans modules when the corresponding module is being unloaded. * While at it, kill unnecessary EXPORT_SYMBOL on p9_trans_fd_init(). Signed-off-by: Tejun Heo <tj@kernel.org> Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
This commit is contained in:
committed by
Eric Van Hensbergen
parent
72d31053f6
commit
72029fe85d
@@ -75,7 +75,6 @@ static int parse_opts(char *opts, struct p9_client *clnt)
|
||||
int option;
|
||||
int ret = 0;
|
||||
|
||||
clnt->trans_mod = v9fs_default_trans();
|
||||
clnt->dotu = 1;
|
||||
clnt->msize = 8192;
|
||||
|
||||
@@ -108,7 +107,7 @@ static int parse_opts(char *opts, struct p9_client *clnt)
|
||||
clnt->msize = option;
|
||||
break;
|
||||
case Opt_trans:
|
||||
clnt->trans_mod = v9fs_match_trans(&args[0]);
|
||||
clnt->trans_mod = v9fs_get_trans_by_name(&args[0]);
|
||||
break;
|
||||
case Opt_legacy:
|
||||
clnt->dotu = 0;
|
||||
@@ -117,6 +116,10 @@ static int parse_opts(char *opts, struct p9_client *clnt)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (!clnt->trans_mod)
|
||||
clnt->trans_mod = v9fs_get_default_trans();
|
||||
|
||||
kfree(options);
|
||||
return ret;
|
||||
}
|
||||
@@ -150,6 +153,7 @@ struct p9_client *p9_client_create(const char *dev_name, char *options)
|
||||
if (!clnt)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
clnt->trans_mod = NULL;
|
||||
clnt->trans = NULL;
|
||||
spin_lock_init(&clnt->lock);
|
||||
INIT_LIST_HEAD(&clnt->fidlist);
|
||||
@@ -235,6 +239,8 @@ void p9_client_destroy(struct p9_client *clnt)
|
||||
clnt->trans = NULL;
|
||||
}
|
||||
|
||||
v9fs_put_trans(clnt->trans_mod);
|
||||
|
||||
list_for_each_entry_safe(fid, fidptr, &clnt->fidlist, flist)
|
||||
p9_fid_destroy(fid);
|
||||
|
||||
|
Reference in New Issue
Block a user