]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
fat: truncate inode timestamp updates in setattr
authorFrank Sorenson <sorenson@redhat.com>
Tue, 30 Oct 2018 22:07:01 +0000 (15:07 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 31 Oct 2018 15:54:14 +0000 (08:54 -0700)
setattr_copy can't truncate timestamps correctly for
msdos/vfat, so truncate and copy them ourselves.

Link: http://lkml.kernel.org/r/a2b4701b1125573fafaeaae6802050ca86d6f8cc.1538363961.git.sorenson@redhat.com
Signed-off-by: Frank Sorenson <sorenson@redhat.com>
Acked-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/fat/file.c

index 4b54384054154e84b950a87608d7bc8da2e720a2..13935ee99e1e53038f458e257d48f11cc7426591 100644 (file)
@@ -542,6 +542,18 @@ int fat_setattr(struct dentry *dentry, struct iattr *attr)
                up_write(&MSDOS_I(inode)->truncate_lock);
        }
 
+       /*
+        * setattr_copy can't truncate these appropriately, so we'll
+        * copy them ourselves
+        */
+       if (attr->ia_valid & ATTR_ATIME)
+               fat_truncate_time(inode, &attr->ia_atime, S_ATIME);
+       if (attr->ia_valid & ATTR_CTIME)
+               fat_truncate_time(inode, &attr->ia_ctime, S_CTIME);
+       if (attr->ia_valid & ATTR_MTIME)
+               fat_truncate_time(inode, &attr->ia_mtime, S_MTIME);
+       attr->ia_valid &= ~(ATTR_ATIME|ATTR_CTIME|ATTR_MTIME);
+
        setattr_copy(inode, attr);
        mark_inode_dirty(inode);
 out: