fs/open.c: update {m,c}time for truncate
diff mbox series

Message ID 20190822073300.6ljb36ieah5g2p55@XZHOUW.usersys.redhat.com
State New
Headers show
Series
  • fs/open.c: update {m,c}time for truncate
Related show

Commit Message

Murphy Zhou Aug. 22, 2019, 7:33 a.m. UTC
Just like what we do for ftruncate. (Why not)
Without this patch, cifs, sometimes NFS, fail to update timestamps
after truncate call.

Signed-off-by: Murphy Zhou <jencce.kernel@gmail.com>
---
 fs/open.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Miklos Szeredi Aug. 22, 2019, 12:08 p.m. UTC | #1
On Thu, Aug 22, 2019 at 9:33 AM Murphy Zhou <jencce.kernel@gmail.com> wrote:
>
> Just like what we do for ftruncate. (Why not)
> Without this patch, cifs, sometimes NFS, fail to update timestamps
> after truncate call.

Digging through history:

4a30131e7dbb ("[PATCH] Fix some problems with truncate and mtime semantics.")
6e656be89999 ("[PATCH] ftruncate does not always update m/ctime")

These are pretty old commits (>10years); has anything changed since
then relative to the required semantics for truncate/ftruncate?

Thanks,
Miklos
Miklos Szeredi Aug. 22, 2019, 1:03 p.m. UTC | #2
On Thu, Aug 22, 2019 at 2:08 PM Miklos Szeredi <miklos@szeredi.hu> wrote:
>
> On Thu, Aug 22, 2019 at 9:33 AM Murphy Zhou <jencce.kernel@gmail.com> wrote:
> >
> > Just like what we do for ftruncate. (Why not)
> > Without this patch, cifs, sometimes NFS, fail to update timestamps
> > after truncate call.
>
> Digging through history:
>
> 4a30131e7dbb ("[PATCH] Fix some problems with truncate and mtime semantics.")
> 6e656be89999 ("[PATCH] ftruncate does not always update m/ctime")
>
> These are pretty old commits (>10years); has anything changed since
> then relative to the required semantics for truncate/ftruncate?

SUSv3/POSIX:2004:

   "Upon successful completion, if the file size is changed, this
function shall mark for update the st_ctime and st_mtime fields of the
file"

SUSv4/POSIX:2008:

   "Upon successful completion, truncate() shall mark for update the
last data modification and last file status change timestamps of the
file..."

Note the omission of the "if the file size is changed" condition...

Thanks,
Miklos

Patch
diff mbox series

diff --git a/fs/open.c b/fs/open.c
index a59abe3c669a..f247085aaee4 100644
--- a/fs/open.c
+++ b/fs/open.c
@@ -107,7 +107,8 @@  long vfs_truncate(const struct path *path, loff_t length)
 	if (!error)
 		error = security_path_truncate(path);
 	if (!error)
-		error = do_truncate(path->dentry, length, 0, NULL);
+		error = do_truncate(path->dentry, length,
+				ATTR_MTIME|ATTR_CTIME, NULL);
 
 put_write_and_out:
 	put_write_access(inode);