diff options
author | Trond Myklebust <trondmy@gmail.com> | 2019-04-07 19:59:10 +0200 |
---|---|---|
committer | Anna Schumaker <Anna.Schumaker@Netapp.com> | 2019-04-25 20:18:15 +0200 |
commit | 154945112dac10b7109d816275f3e4896b0b064e (patch) | |
tree | 91733947622b31660a7de05a2c3c92f9bc6fe075 /fs/nfs/inode.c | |
parent | NFS: Allow signal interruption of NFS4ERR_DELAYed operations (diff) | |
download | linux-154945112dac10b7109d816275f3e4896b0b064e.tar.xz linux-154945112dac10b7109d816275f3e4896b0b064e.zip |
NFS: Ensure that all nfs lock contexts have a valid open context
Force the lock context to keep a reference to the parent open
context so that we can guarantee the validity of the latter.
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Diffstat (limited to '')
-rw-r--r-- | fs/nfs/inode.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index 414a90d48493..efc45f22c581 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -885,10 +885,14 @@ struct nfs_lock_context *nfs_get_lock_context(struct nfs_open_context *ctx) spin_lock(&inode->i_lock); res = __nfs_find_lock_context(ctx); if (res == NULL) { - list_add_tail_rcu(&new->list, &ctx->lock_context.list); - new->open_context = ctx; - res = new; - new = NULL; + new->open_context = get_nfs_open_context(ctx); + if (new->open_context) { + list_add_tail_rcu(&new->list, + &ctx->lock_context.list); + res = new; + new = NULL; + } else + res = ERR_PTR(-EBADF); } spin_unlock(&inode->i_lock); kfree(new); @@ -906,6 +910,7 @@ void nfs_put_lock_context(struct nfs_lock_context *l_ctx) return; list_del_rcu(&l_ctx->list); spin_unlock(&inode->i_lock); + put_nfs_open_context(ctx); kfree_rcu(l_ctx, rcu_head); } EXPORT_SYMBOL_GPL(nfs_put_lock_context); |