]> www.infradead.org Git - users/hch/misc.git/commitdiff
smb: client: fix missing timestamp updates after ftruncate(2)
authorPaulo Alcantara <pc@manguebit.org>
Tue, 7 Oct 2025 19:23:23 +0000 (16:23 -0300)
committerSteve French <stfrench@microsoft.com>
Thu, 9 Oct 2025 15:42:14 +0000 (10:42 -0500)
Mask off ATTR_MTIME|ATTR_CTIME bits on ATTR_SIZE (e.g. ftruncate(2))
to prevent the client from sending set info calls and then disabling
automatic timestamp updates on server side as per MS-FSA 2.1.4.17.

---8<---
import os
import time

filename = '/mnt/foo'

def print_stat(prefix):
    st = os.stat(filename)
    print(prefix, ': ', time.ctime(st.st_atime), time.ctime(st.st_ctime))

fd = os.open(filename, os.O_CREAT|os.O_TRUNC|os.O_WRONLY, 0o644)
print_stat('old')
os.ftruncate(fd, 10)
time.sleep(2)
os.write(fd, b'foo')
os.close(fd)
time.sleep(2)
print_stat('new')
---8<---

Before patch:

$ mount.cifs //srv/share /mnt -o ...
$ python3 run.py
old :  Fri Oct  3 13:47:03 2025 Fri Oct  3 13:47:03 2025
new :  Fri Oct  3 13:47:00 2025 Fri Oct  3 13:47:03 2025

After patch:

$ mount.cifs //srv/share /mnt -o ...
$ python3 run.py
old :  Fri Oct  3 13:48:39 2025 Fri Oct  3 13:48:39 2025
new :  Fri Oct  3 13:48:41 2025 Fri Oct  3 13:48:41 2025

Signed-off-by: Paulo Alcantara (Red Hat) <pc@manguebit.org>
Cc: Frank Sorenson <sorenson@redhat.com>
Reviewed-by: David Howells <dhowells@redhat.com>
Cc: linux-cifs@vger.kernel.org
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/inode.c

index ce88bef4e44cd62a39090f7597bef6e01e540199..fbfd5b556815d33c3fc42041b893c87d4ca2bf34 100644 (file)
@@ -3156,12 +3156,11 @@ cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
                if (rc != 0)
                        goto out;
                /*
-                * The man page of truncate says if the size changed,
-                * then the st_ctime and st_mtime fields for the file
-                * are updated.
+                * Avoid setting timestamps on the server for ftruncate(2) to
+                * prevent it from disabling automatic timestamp updates as per
+                * MS-FSA 2.1.4.17.
                 */
-               attrs->ia_ctime = attrs->ia_mtime = current_time(inode);
-               attrs->ia_valid |= ATTR_CTIME | ATTR_MTIME;
+               attrs->ia_valid &= ~(ATTR_CTIME | ATTR_MTIME);
        }
 
        /* skip mode change if it's just for clearing setuid/setgid */
@@ -3335,12 +3334,11 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
                if (rc != 0)
                        goto cifs_setattr_exit;
                /*
-                * The man page of truncate says if the size changed,
-                * then the st_ctime and st_mtime fields for the file
-                * are updated.
+                * Avoid setting timestamps on the server for ftruncate(2) to
+                * prevent it from disabling automatic timestamp updates as per
+                * MS-FSA 2.1.4.17.
                 */
-               attrs->ia_ctime = attrs->ia_mtime = current_time(inode);
-               attrs->ia_valid |= ATTR_CTIME | ATTR_MTIME;
+               attrs->ia_valid &= ~(ATTR_CTIME | ATTR_MTIME);
        }
 
        if (attrs->ia_valid & ATTR_UID)