]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
NFSv4: Only pass the delegation to setattr if we're sending a truncate
authorTrond Myklebust <trond.myklebust@primarydata.com>
Mon, 9 Apr 2018 15:15:30 +0000 (11:15 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 16 Aug 2019 08:13:57 +0000 (10:13 +0200)
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

index 27deee5c8fa8e89a36326cd4b63f5fb6ea1eb963..68e7a6bb2ce06eca87156366aedba73d90455782 100644 (file)
@@ -2954,7 +2954,6 @@ static int _nfs4_do_setattr(struct inode *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 *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 *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;