NFS: Check size by inode_newsize_ok in nfs_setattr
authorKinglong Mee <kinglongmee@gmail.com>
Wed, 26 Aug 2015 13:10:55 +0000 (21:10 +0800)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Thu, 27 Aug 2015 23:44:21 +0000 (19:44 -0400)
Set rlimit for NFS's files is useless right now.
For local process's rlimit, it should be checked by nfs client.

The same, CIFS also call inode_change_ok checking rlimit at its client
in cifs_setattr_nounix() and cifs_setattr_unix().

v3, fix bad using of error

Signed-off-by: Kinglong Mee <kinglongmee@gmail.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/inode.c

index e2cc0031decb6053a74152ee9e3dc68a4ef17556..99a68bd9c17828bd6f9f55575738486d37b69430 100644 (file)
@@ -504,7 +504,7 @@ nfs_setattr(struct dentry *dentry, struct iattr *attr)
 {
        struct inode *inode = d_inode(dentry);
        struct nfs_fattr *fattr;
-       int error = -ENOMEM;
+       int error = 0;
 
        nfs_inc_stats(inode, NFSIOS_VFSSETATTR);
 
@@ -513,15 +513,14 @@ nfs_setattr(struct dentry *dentry, struct iattr *attr)
                attr->ia_valid &= ~ATTR_MODE;
 
        if (attr->ia_valid & ATTR_SIZE) {
-               loff_t i_size;
-
                BUG_ON(!S_ISREG(inode->i_mode));
 
-               i_size = i_size_read(inode);
-               if (attr->ia_size == i_size)
+               error = inode_newsize_ok(inode, attr->ia_size);
+               if (error)
+                       return error;
+
+               if (attr->ia_size == i_size_read(inode))
                        attr->ia_valid &= ~ATTR_SIZE;
-               else if (attr->ia_size < i_size && IS_SWAPFILE(inode))
-                       return -ETXTBSY;
        }
 
        /* Optimization: if the end result is no change, don't RPC */
@@ -536,8 +535,11 @@ nfs_setattr(struct dentry *dentry, struct iattr *attr)
                nfs_sync_inode(inode);
 
        fattr = nfs_alloc_fattr();
-       if (fattr == NULL)
+       if (fattr == NULL) {
+               error = -ENOMEM;
                goto out;
+       }
+
        /*
         * Return any delegations if we're going to change ACLs
         */