提交 0a9c63fa 编写于 作者: T Trond Myklebust

NFSv4.1: Fix a race in set_pnfs_layoutdriver

The call to try_module_get() dereferences ld_type outside the
spin locks, which means that it may be pointing to garbage if
a module unload was in progress.
Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
上级 2a4c8994
...@@ -70,6 +70,10 @@ find_pnfs_driver(u32 id) ...@@ -70,6 +70,10 @@ find_pnfs_driver(u32 id)
spin_lock(&pnfs_spinlock); spin_lock(&pnfs_spinlock);
local = find_pnfs_driver_locked(id); local = find_pnfs_driver_locked(id);
if (local != NULL && !try_module_get(local->owner)) {
dprintk("%s: Could not grab reference on module\n", __func__);
local = NULL;
}
spin_unlock(&pnfs_spinlock); spin_unlock(&pnfs_spinlock);
return local; return local;
} }
...@@ -118,10 +122,6 @@ set_pnfs_layoutdriver(struct nfs_server *server, const struct nfs_fh *mntfh, ...@@ -118,10 +122,6 @@ set_pnfs_layoutdriver(struct nfs_server *server, const struct nfs_fh *mntfh,
goto out_no_driver; goto out_no_driver;
} }
} }
if (!try_module_get(ld_type->owner)) {
dprintk("%s: Could not grab reference on module\n", __func__);
goto out_no_driver;
}
server->pnfs_curr_ld = ld_type; server->pnfs_curr_ld = ld_type;
if (ld_type->set_layoutdriver if (ld_type->set_layoutdriver
&& ld_type->set_layoutdriver(server, mntfh)) { && ld_type->set_layoutdriver(server, mntfh)) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册