]> Zhao Yanbai Git Server - minix.git/commitdiff
Fix time modification on truncate()
authorEvgeniy Ivanov <lolkaantimat@gmail.com>
Fri, 15 Jul 2011 14:21:05 +0000 (14:21 +0000)
committerThomas Veerman <thomas@minix3.org>
Fri, 15 Jul 2011 14:21:05 +0000 (14:21 +0000)
POSIX truncate specification says "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." This patch prevents
changing of the date fields when the size stays the same.

servers/ext2/link.c
servers/mfs/link.c
test/test16.c

index 2cf634b1bf1e5e73983747f5e920e385984907b9..4da39513d2cc41675806ab74924243ff54223c26 100644 (file)
@@ -563,6 +563,8 @@ off_t newsize;                      /* inode must become this size */
        return(EINVAL);
   if (newsize > rip->i_sp->s_max_size) /* don't let inode grow too big */
        return(EFBIG);
+  if (rip->i_size == newsize)
+       return(OK);
 
   /* Free the actual space if truncating. */
   if (newsize < rip->i_size) {
index f43e2e945e7a3fd22352186e4b314809d189345d..580988e2cddba5e427dc3a351efef0f89177b291 100644 (file)
@@ -525,17 +525,19 @@ off_t newsize;                    /* inode must become this size */
   file_type = rip->i_mode & I_TYPE;    /* check to see if file is special */
   if (file_type == I_CHAR_SPECIAL || file_type == I_BLOCK_SPECIAL)
        return(EINVAL);
-  if(newsize > rip->i_sp->s_max_size)  /* don't let inode grow too big */
+  if (rip->i_size == newsize)
+       return(OK);
+  if (newsize > rip->i_sp->s_max_size) /* don't let inode grow too big */
        return(EFBIG);
 
   /* Free the actual space if truncating. */
-  if(newsize < rip->i_size) {
+  if (newsize < rip->i_size) {
        if ((r = freesp_inode(rip, newsize, rip->i_size)) != OK)
                return(r);
   }
 
   /* Clear the rest of the last zone if expanding. */
-  if(newsize > rip->i_size) clear_zone(rip, rip->i_size, 0);
+  if (newsize > rip->i_size) clear_zone(rip, rip->i_size, 0);
 
   /* Next correct the inode size. */
   rip->i_size = newsize;
index ac5a1e40d65ed9fa77dfb313de049df9721eb775..033bdcff00a66300931398b6aa0fc7486d502f36 100644 (file)
@@ -204,6 +204,15 @@ void test16a()
   if (unlink("T16.i1") != 0) e(84); 
   if (unlink("T16.j") != 0) e(85); 
   if (unlink("T16.k") != 0) e(86); 
+
+  /* Test the times for truncate. */
+  if (system("echo 1 > T16.l") != 0) e(87);
+  stat("T16.l", &s);
+  get_times("T16.l", &a, &c, &m);
+  sleep(1);
+  truncate("T16.l", s.st_size);
+  get_times("T16.l", &ta, &tc, &tm);
+  if (a != ta || c != tc || m != tm) e(88);
 }
 
 void get_times(name, a, c, m)