Use truncate_setsize in zfs_setattr
authorPrasad Joshi <pjoshi@stec-inc.com>
Sat, 25 Jun 2011 14:06:37 +0000 (15:06 +0100)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 27 Jun 2011 16:59:52 +0000 (09:59 -0700)
According to Linux kernel commit 2c27c65e, using truncate_setsize in
setattr simplifies the code. Therefore, the patch replaces the call
to vmtruncate() with truncate_setsize().

zfs_setattr uses zfs_freesp to free the disk space belonging to the
file.  As truncate_setsize may release the page cache and flushing
the dirty data to disk, it must be called before the zfs_freesp.

Suggested-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Prasad Joshi <pjoshi@stec-inc.com>
Closes #255

module/zfs/zfs_vnops.c

index 5b47cba..86bef25 100644 (file)
@@ -72,6 +72,7 @@
 #include <sys/kidmap.h>
 #include <sys/cred.h>
 #include <sys/attr.h>
+#include <sys/zpl.h>
 
 /*
  * Programming rules.
@@ -2433,6 +2434,8 @@ top:
                if (err)
                        goto out3;
 
+               truncate_setsize(ip, vap->va_size);
+
                /*
                 * XXX - Note, we are not providing any open
                 * mode flags here (like FNDELAY), so we may
@@ -2443,11 +2446,6 @@ top:
                err = zfs_freesp(zp, vap->va_size, 0, 0, FALSE);
                if (err)
                        goto out3;
-
-               /* Careful negative Linux return code here */
-               err = -vmtruncate(ip, vap->va_size);
-               if (err)
-                       goto out3;
        }
 
        if (mask & (ATTR_ATIME|ATTR_MTIME) ||