On 6 May 2014 15:12, Vadim Zhukov <[email protected]> wrote:
> 06.05.2014 19:36 пользователь "Philip Guenther" <[email protected]>
> написал:
>>
>> On Tue, 6 May 2014, Vadim Zhukov wrote:
>> > This fixes a bug with mtime not updated after file creation on ext2+
>> > file systems. Try it yourself:
>> >
>> > # mount -t ext2fs /dev/sd0o /mnt
>> > # cp /tmp/qq /mnt
>> > # ls -l /mnt/qq
>> > -rw-r--r--  1 root  wheel     10 Jan  1  1970 qq
>> > # touch /mnt/qq
>> > -rw-r--r--  1 root  wheel     10 May  6 14:36 qq
>> >
>> > This probably does more than needed - I suspect that sometimes
>> > the updated mtime could be already there, but I don't see any real
>> > downside and it makes EX2FS_ITIMES() look more similar to
>> > ufs_itimies(). Opinions? Okays?
>>
>> As the person who broke this (sorry!), I think the diff should go a couple
>> steps further and restore the IN_ACCESS handling too and mirror
>> ufs_itimes() by bumping i_modrev on ctime change.
>>
>>
>> Philip
>>
>> Index: ufs/ufs/inode.h
>> ===================================================================
>> RCS file: /cvs/src/sys/ufs/ufs/inode.h,v
>> retrieving revision 1.44
>> diff -u -p -r1.44 inode.h
>> --- ufs/ufs/inode.h     14 Apr 2014 22:25:40 -0000      1.44
>> +++ ufs/ufs/inode.h     6 May 2014 15:31:24 -0000
>> @@ -316,8 +316,14 @@ struct indir {
>>  #define        EXT2FS_ITIMES(ip) do {
>        \
>>         if ((ip)->i_flag & (IN_ACCESS | IN_CHANGE | IN_UPDATE)) {       \
>>                 (ip)->i_flag |= IN_MODIFIED;                            \
>> -               if ((ip)->i_flag & IN_CHANGE)                           \
>> +               if ((ip)->i_flag & IN_ACCESS)                           \
>> +                       (ip)->i_e2fs_atime = time_second;               \
>> +               if ((ip)->i_flag & IN_UPDATE)                           \
>> +                       (ip)->i_e2fs_mtime = time_second;               \
>> +               if ((ip)->i_flag & IN_CHANGE) {                         \
>>                         (ip)->i_e2fs_ctime = time_second;               \
>> +                       (ip)->i_modrev++;                               \
>> +               }                                                       \
>>                 (ip)->i_flag &= ~(IN_ACCESS | IN_CHANGE | IN_UPDATE);   \
>>         }                                                               \
>>  } while (0)
>
> Works for me here, on i386. The patch itself looks better too. Not that my
> opinion counts here but okay zhuk@. :)

ok krw@

.... Ken

Reply via email to