[PATCH] ftruncate does not always update m/ctime

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi.

In the course of trying to track down a bug where a file mtime was not
being updated correctly, it was discovered that the m/ctime updates were
not quite being handled correctly for ftruncate() calls.

Quoth SUSv3:

open(2):

       If O_TRUNC is set and the file did previously exist, upon
       successful completion, open() shall mark for update the st_ctime
       and st_mtime fields of the file.

truncate(2):

       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, and the S_ISUID and S_ISGID bits of the file mode
       may be cleared.

ftruncate(2):

       Upon successful completion, if fildes refers to a regular file,
       the ftruncate() function shall mark for update the st_ctime and
       st_mtime fields of the file and the S_ISUID and S_ISGID bits of
       the file mode may be cleared. If the ftruncate() function is
       unsuccessful, the file is unaffected.

The open(O_TRUNC) and truncate cases were being handled correctly, but
the ftruncate case was being handled like the truncate case.  The
semantics of truncate and ftruncate don't quite match, so ftruncate
needs to be handled slightly differently.

The attached patch should address this issue for ftruncate(2).

My thanx to Stephen Tweedie and Trond Myklebust for their help in
understanding the situation and semantics.

   Thanx...

      ps

Signed-off-by: Peter Staubach <[email protected]>
--- linux-2.6.16.x86_64/fs/open.c.org
+++ linux-2.6.16.x86_64/fs/open.c
@@ -322,7 +322,7 @@ static long do_sys_ftruncate(unsigned in
 
 	error = locks_verify_truncate(inode, file, length);
 	if (!error)
-		error = do_truncate(dentry, length, 0, file);
+		error = do_truncate(dentry, length, ATTR_MTIME|ATTR_CTIME, file);
 out_putf:
 	fput(file);
 out:

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux