On Tue, Jul 30, 2019 at 3:28 PM Anton Altaparmakov anton@tuxera.com wrote:
Hi Deepa,
On 30 Jul 2019, at 18:26, Deepa Dinamani deepa.kernel@gmail.com wrote:
On Tue, Jul 30, 2019 at 1:27 AM OGAWA Hirofumi hirofumi@mail.parknet.co.jp wrote:
Deepa Dinamani deepa.kernel@gmail.com writes:
diff --git a/fs/fat/misc.c b/fs/fat/misc.c index 1e08bd54c5fb..53bb7c6bf993 100644 --- a/fs/fat/misc.c +++ b/fs/fat/misc.c @@ -307,8 +307,9 @@ int fat_truncate_time(struct inode *inode, struct timespec64 *now, int flags) inode->i_atime = (struct timespec64){ seconds, 0 }; } if (flags & S_CTIME) {
if (sbi->options.isvfat)
inode->i_ctime = timespec64_trunc(*now, 10000000);
if (sbi->options.isvfat) {
inode->i_ctime = timestamp_truncate(*now, inode);
}} else inode->i_ctime = fat_timespec64_trunc_2secs(*now);
Looks like broken. It changed to sb->s_time_gran from 10000000, and changed coding style.
This is using a new api: timestamp_truncate(). granularity is gotten by inode->sb->s_time_gran. See Patch [2/20]: https://lkml.org/lkml/2019/7/29/1853
So this is not broken if fat is filling in the right granularity in the sb.
It is broken for FAT because FAT has different granularities for different timestamps so it cannot put the correct value in the sb as that only allows one granularity. Your patch is totally broken for fat as it would be immediately obvious if you spent a few minutes looking at the code...
It seemed to me that FAT had already covered the special cases (2s and 1d) granularities by using internal functions. This one could also be an inlined calculation, but I will just drop the FAT part from this patch and leave it as is for now.
Thanks, Deepa