nfsd4: break lease on nfsd setattr
authorJ. Bruce Fields <bfields@redhat.com>
Tue, 11 Jan 2011 17:54:39 +0000 (12:54 -0500)
committerJ. Bruce Fields <bfields@redhat.com>
Fri, 14 Jan 2011 02:04:08 +0000 (21:04 -0500)
Leases (delegations) should really be broken on any metadata change, not
just on size change.

Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/vfs.c

index 0a01e2fc5dda81c23ca4b2af567d8656bd569316..f97d4356431b27fd1a274a5ce3588f623e9ae371 100644 (file)
@@ -374,14 +374,6 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap,
                                goto out;
                }
 
-               /*
-                * If we are changing the size of the file, then
-                * we need to break all leases.
-                */
-               host_err = break_lease(inode, O_WRONLY | O_NONBLOCK);
-               if (host_err) /* ENOMEM or EWOULDBLOCK */
-                       goto out_nfserr;
-
                host_err = get_write_access(inode);
                if (host_err)
                        goto out_nfserr;
@@ -422,7 +414,11 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap,
 
        err = nfserr_notsync;
        if (!check_guard || guardtime == inode->i_ctime.tv_sec) {
+               host_err = break_lease(inode, O_WRONLY | O_NONBLOCK);
+               if (host_err)
+                       goto out_nfserr;
                fh_lock(fhp);
+
                host_err = notify_change(dentry, iap);
                err = nfserrno(host_err);
                fh_unlock(fhp);