| From 991eedb1371dc09b0f9848f59c8898fe63d198c0 Mon Sep 17 00:00:00 2001 |
| From: Trond Myklebust <trond.myklebust@primarydata.com> |
| Date: Mon, 9 Apr 2018 11:15:30 -0400 |
| Subject: NFSv4: Only pass the delegation to setattr if we're sending a truncate |
| |
| From: Trond Myklebust <trond.myklebust@primarydata.com> |
| |
| commit 991eedb1371dc09b0f9848f59c8898fe63d198c0 upstream. |
| |
| Even then it isn't really necessary. The reason why we may not want to |
| pass in a stateid in other cases is that we cannot use the delegation |
| credential. |
| |
| Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/nfs/nfs4proc.c | 12 +++++++----- |
| 1 file changed, 7 insertions(+), 5 deletions(-) |
| |
| --- a/fs/nfs/nfs4proc.c |
| +++ b/fs/nfs/nfs4proc.c |
| @@ -2954,7 +2954,6 @@ static int _nfs4_do_setattr(struct inode |
| }; |
| struct rpc_cred *delegation_cred = NULL; |
| unsigned long timestamp = jiffies; |
| - fmode_t fmode; |
| bool truncate; |
| int status; |
| |
| @@ -2962,11 +2961,12 @@ static int _nfs4_do_setattr(struct inode |
| |
| /* Servers should only apply open mode checks for file size changes */ |
| truncate = (arg->iap->ia_valid & ATTR_SIZE) ? true : false; |
| - fmode = truncate ? FMODE_WRITE : FMODE_READ; |
| + if (!truncate) |
| + goto zero_stateid; |
| |
| - if (nfs4_copy_delegation_stateid(inode, fmode, &arg->stateid, &delegation_cred)) { |
| + if (nfs4_copy_delegation_stateid(inode, FMODE_WRITE, &arg->stateid, &delegation_cred)) { |
| /* Use that stateid */ |
| - } else if (truncate && ctx != NULL) { |
| + } else if (ctx != NULL) { |
| struct nfs_lock_context *l_ctx; |
| if (!nfs4_valid_open_stateid(ctx->state)) |
| return -EBADF; |
| @@ -2978,8 +2978,10 @@ static int _nfs4_do_setattr(struct inode |
| nfs_put_lock_context(l_ctx); |
| if (status == -EIO) |
| return -EBADF; |
| - } else |
| + } else { |
| +zero_stateid: |
| nfs4_stateid_copy(&arg->stateid, &zero_stateid); |
| + } |
| if (delegation_cred) |
| msg.rpc_cred = delegation_cred; |
| |