| From 49a528d30e81c05dea7208bb4c1fcb30dfbf898f Mon Sep 17 00:00:00 2001 |
| From: Theodore Ts'o <tytso@mit.edu> |
| Date: Wed, 30 Sep 2009 01:13:55 -0400 |
| Subject: [PATCH 49/85] ext4: Fix time encoding with extra epoch bits |
| |
| (cherry picked from commit c1fccc0696bcaff6008c11865091f5ec4b0937ab) |
| |
| "Looking at ext4.h, I think the setting of extra time fields forgets to |
| mask the epoch bits so the epoch part overwrites nsec part. The second |
| change is only for coherency (2 -> EXT4_EPOCH_BITS)." |
| |
| Thanks to Damien Guibouret for pointing out this problem. |
| |
| Signed-off-by: "Theodore Ts'o" <tytso@mit.edu> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| --- |
| fs/ext4/ext4.h | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| --- a/fs/ext4/ext4.h |
| +++ b/fs/ext4/ext4.h |
| @@ -522,8 +522,8 @@ struct move_extent { |
| static inline __le32 ext4_encode_extra_time(struct timespec *time) |
| { |
| return cpu_to_le32((sizeof(time->tv_sec) > 4 ? |
| - time->tv_sec >> 32 : 0) | |
| - ((time->tv_nsec << 2) & EXT4_NSEC_MASK)); |
| + (time->tv_sec >> 32) & EXT4_EPOCH_MASK : 0) | |
| + ((time->tv_nsec << EXT4_EPOCH_BITS) & EXT4_NSEC_MASK)); |
| } |
| |
| static inline void ext4_decode_extra_time(struct timespec *time, __le32 extra) |
| @@ -531,7 +531,7 @@ static inline void ext4_decode_extra_tim |
| if (sizeof(time->tv_sec) > 4) |
| time->tv_sec |= (__u64)(le32_to_cpu(extra) & EXT4_EPOCH_MASK) |
| << 32; |
| - time->tv_nsec = (le32_to_cpu(extra) & EXT4_NSEC_MASK) >> 2; |
| + time->tv_nsec = (le32_to_cpu(extra) & EXT4_NSEC_MASK) >> EXT4_EPOCH_BITS; |
| } |
| |
| #define EXT4_INODE_SET_XTIME(xtime, inode, raw_inode) \ |