Skip to content

Commit 57ce9f7

Browse files
pcacjrsmfrench
authored andcommitted
smb: client: fix missing timestamp updates after ftruncate(2)
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>
1 parent 110fee6 commit 57ce9f7

1 file changed

Lines changed: 8 additions & 10 deletions

File tree

fs/smb/client/inode.c

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3156,12 +3156,11 @@ cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs)
31563156
if (rc != 0)
31573157
goto out;
31583158
/*
3159-
* The man page of truncate says if the size changed,
3160-
* then the st_ctime and st_mtime fields for the file
3161-
* are updated.
3159+
* Avoid setting timestamps on the server for ftruncate(2) to
3160+
* prevent it from disabling automatic timestamp updates as per
3161+
* MS-FSA 2.1.4.17.
31623162
*/
3163-
attrs->ia_ctime = attrs->ia_mtime = current_time(inode);
3164-
attrs->ia_valid |= ATTR_CTIME | ATTR_MTIME;
3163+
attrs->ia_valid &= ~(ATTR_CTIME | ATTR_MTIME);
31653164
}
31663165

31673166
/* skip mode change if it's just for clearing setuid/setgid */
@@ -3335,12 +3334,11 @@ cifs_setattr_nounix(struct dentry *direntry, struct iattr *attrs)
33353334
if (rc != 0)
33363335
goto cifs_setattr_exit;
33373336
/*
3338-
* The man page of truncate says if the size changed,
3339-
* then the st_ctime and st_mtime fields for the file
3340-
* are updated.
3337+
* Avoid setting timestamps on the server for ftruncate(2) to
3338+
* prevent it from disabling automatic timestamp updates as per
3339+
* MS-FSA 2.1.4.17.
33413340
*/
3342-
attrs->ia_ctime = attrs->ia_mtime = current_time(inode);
3343-
attrs->ia_valid |= ATTR_CTIME | ATTR_MTIME;
3341+
attrs->ia_valid &= ~(ATTR_CTIME | ATTR_MTIME);
33443342
}
33453343

33463344
if (attrs->ia_valid & ATTR_UID)

0 commit comments

Comments
 (0)