nfs: prevent truncate on active swapfile
authorOmar Sandoval <osandov@osandov.com>
Thu, 8 Jan 2015 09:18:30 +0000 (01:18 -0800)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Sat, 31 Jan 2015 01:43:29 +0000 (20:43 -0500)
Most filesystems prevent truncation of an active swapfile by way of
inode_newsize_ok, called from inode_change_ok. NFS doesn't call either
from nfs_setattr, presumably because most of these checks are expected
to be done server-side. However, the IS_SWAPFILE check can only be done
client-side, and truncating a swapfile can't possibly be good.

Signed-off-by: Omar Sandoval <osandov@osandov.com>
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/inode.c

index 2211f6ba873628485fcabf874adf0c3c985a6d84..d2398c193bdaab4ce90d27917d3408e8d610b260 100644 (file)
@@ -507,10 +507,15 @@ 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));
 
-               if (attr->ia_size == i_size_read(inode))
+               i_size = i_size_read(inode);
+               if (attr->ia_size == i_size)
                        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 */