Fix time modification on truncate()
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.
This commit is contained in:
parent
902e0e27e0
commit
255ae85b1e
3 changed files with 16 additions and 3 deletions
|
@ -563,6 +563,8 @@ off_t newsize; /* inode must become this size */
|
||||||
return(EINVAL);
|
return(EINVAL);
|
||||||
if (newsize > rip->i_sp->s_max_size) /* don't let inode grow too big */
|
if (newsize > rip->i_sp->s_max_size) /* don't let inode grow too big */
|
||||||
return(EFBIG);
|
return(EFBIG);
|
||||||
|
if (rip->i_size == newsize)
|
||||||
|
return(OK);
|
||||||
|
|
||||||
/* Free the actual space if truncating. */
|
/* Free the actual space if truncating. */
|
||||||
if (newsize < rip->i_size) {
|
if (newsize < rip->i_size) {
|
||||||
|
|
|
@ -525,6 +525,8 @@ off_t newsize; /* inode must become this size */
|
||||||
file_type = rip->i_mode & I_TYPE; /* check to see if file is special */
|
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)
|
if (file_type == I_CHAR_SPECIAL || file_type == I_BLOCK_SPECIAL)
|
||||||
return(EINVAL);
|
return(EINVAL);
|
||||||
|
if (rip->i_size == newsize)
|
||||||
|
return(OK);
|
||||||
if (newsize > rip->i_sp->s_max_size) /* don't let inode grow too big */
|
if (newsize > rip->i_sp->s_max_size) /* don't let inode grow too big */
|
||||||
return(EFBIG);
|
return(EFBIG);
|
||||||
|
|
||||||
|
|
|
@ -204,6 +204,15 @@ void test16a()
|
||||||
if (unlink("T16.i1") != 0) e(84);
|
if (unlink("T16.i1") != 0) e(84);
|
||||||
if (unlink("T16.j") != 0) e(85);
|
if (unlink("T16.j") != 0) e(85);
|
||||||
if (unlink("T16.k") != 0) e(86);
|
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)
|
void get_times(name, a, c, m)
|
||||||
|
|
Loading…
Reference in a new issue