make file's timestamp more accurate
RFC PATCH 1/1 make file's timestamp more accurate
Hi,
linux has supported nanosecond order file's timestamp since 2.5.48. However current file timestamp is got by current_fs_time() and is only updated once a tick. It can't say true nanosecond accuracy. In addition, gettimeofday() before a file operation updating {a,c,m}time would outstrip file's timestamp because of the difference about time source between gettimeofday() and file's timestamp. A certain kind of application would corrupted by this problem.
I attached a most simple patch fixing this problem here. However it has several problems and I don't say it can be applied as is. The most big two problems is the following:
- It would cause performance regression, especially in not TSC capable system.
- Is gettimeofday()'s monotonicity reliable on all systems?
The relative discussion:
http://lkml.org/lkml/2010/7/13/443
Does anybody have good idea? Should it be tunable, for example?
Thanks,
Satoru
kernel/time.c 2010-08-31 16:08:11.000000000 +0900 renamed from kernel/time.c 2010-08-31 16:07:43.000000000 +0900 +2 -1
@@ -227,7 +227,8 @@ SYSCALL_DEFINE1(adjtimex, struct timex _ */ struct timespec current_fs_time(struct super_block *sb) { - struct timespec now = current_kernel_time(); + struct timespec now; + getnstimeofday(&now); return timespec_trunc(now, sb->s_time_gran); } EXPORT_SYMBOL(current_fs_time);
Quoted 7 lines · Satoru Takeuchi
linux has supported nanosecond order file's timestamp since 2.5.48. However current file timestamp is got by
current_fs_time()and is only updated once a tick. It can't say true nanosecond accuracy. In addition,gettimeofday()before a file operation updating {a,c,m}time would outstrip file's timestamp because of the difference about time source betweengettimeofday()and file's timestamp. A certain kind of application would corrupted by this problem.
Applications mixing gettimeofday and filesystem timesamps can currently use clock_gettime(CLOCK_REALTIME_COARSE,...) - which returns tick granular timestamps, the same as the filesystem timestamps - method to avoid this issue.
However, Patrick LoPresti (cc'ed) was working on a similar issue here connected to nfs.
Quoted 7 lines
I attached a most simple patch fixing this problem here. However it has several problems and I don't say it can be applied as is. The most big two problems is the following:
- It would cause performance regression, especially in not TSC capable system.
- Is gettimeofday()'s monotonicity reliable on all systems?
It *should* be. But hardware issues can cause trouble here.
Quoted 4 lines
The relative discussion:
http://lkml.org/lkml/2010/7/13/443Does anybody have good idea? Should it be tunable, for example?
I think the discussion from earlier suggested that this be configurable from a mount option so the performance/granularity trade-off can be managed there.
Potential pot-holes on the road here: Although I guess doing this on a per-mount basis in the future could make it difficult for apps that use CLOCK_REALTIME_COARSE to function if fs granularity is increased. Some sort of CLOCK_REALTIME_FS could be introduced to map to whichever granularity is right, but that can only be done on a global basis. Hrm...
thanks
-john
Hi John,
Quoted 9 lines · john stultz
Quoted 7 lines · Satoru Takeuchi
linux has supported nanosecond order file's timestamp since 2.5.48. However current file timestamp is got by
current_fs_time()and is only updated once a tick. It can't say true nanosecond accuracy. In addition,gettimeofday()before a file operation updating {a,c,m}time would outstrip file's timestamp because of the difference about time source betweengettimeofday()and file's timestamp. A certain kind of application would corrupted by this problem.
Quoted 7 lines
Applications mixing gettimeofday and filesystem timesamps can currently use
clock_gettime(CLOCK_REALTIME_COARSE,...)- which returns tick granular timestamps, the same as the filesystem timestamps - method to avoid this issue.However, Patrick LoPresti (cc'ed) was working on a similar issue here connected to nfs.
Thank you for your comment.
Does it the following one? I overlooked it ;-(
http://lkml.org/lkml/2010/8/13/199
Quoted 14 lines
Consider the following "revision 2" of my proposal:
1) Add a function pointer "
current_fs_time" to structsuper_block.2) Replace all calls of the form:
current_fs_time(sb);with
sb->current_fs_time(sb);3) Arrange for the default value to point to the current implementation.
Quoted 7 lines
These first three could be one patch. They change no functionality; they just enable the next step.
Finally:
4) Add a mount option to cause
sb->current_fs_time(sb)to use the
hi-res implementation.
I like this Patrick's idea. Patrick, are you trying this patch now? If so, I wait for you, and if no, I'll try to implement it.
Thanks,
Satoru
Quoted 37 lines
Quoted 8 lines
I attached a most simple patch fixing this problem here. However it has several problems and I don't say it can be applied as is. The most big two problems is the following:
- It would cause performance regression, especially in not TSC capable system.
- Is gettimeofday()'s monotonicity reliable on all systems?It *should* be. But hardware issues can cause trouble here.
Quoted 4 lines
The relative discussion:
http://lkml.org/lkml/2010/7/13/443Does anybody have good idea? Should it be tunable, for example?
I think the discussion from earlier suggested that this be configurable from a mount option so the performance/granularity trade-off can be managed there.
Potential pot-holes on the road here: Although I guess doing this on a per-mount basis in the future could make it difficult for apps that use
CLOCK_REALTIME_COARSEto function if fs granularity is increased. Some sort ofCLOCK_REALTIME_FScould be introduced to map to whichever granularity is right, but that can only be done on a global basis. Hrm...thanks
-john--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/