Commit c1fccc06 authored by Theodore Ts'o's avatar Theodore Ts'o

ext4: Fix time encoding with extra epoch bits

"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: default avatar"Theodore Ts'o" <tytso@mit.edu>
parent 0ef12249
...@@ -525,8 +525,8 @@ struct move_extent { ...@@ -525,8 +525,8 @@ struct move_extent {
static inline __le32 ext4_encode_extra_time(struct timespec *time) static inline __le32 ext4_encode_extra_time(struct timespec *time)
{ {
return cpu_to_le32((sizeof(time->tv_sec) > 4 ? return cpu_to_le32((sizeof(time->tv_sec) > 4 ?
time->tv_sec >> 32 : 0) | (time->tv_sec >> 32) & EXT4_EPOCH_MASK : 0) |
((time->tv_nsec << 2) & EXT4_NSEC_MASK)); ((time->tv_nsec << EXT4_EPOCH_BITS) & EXT4_NSEC_MASK));
} }
static inline void ext4_decode_extra_time(struct timespec *time, __le32 extra) static inline void ext4_decode_extra_time(struct timespec *time, __le32 extra)
...@@ -534,7 +534,7 @@ static inline void ext4_decode_extra_time(struct timespec *time, __le32 extra) ...@@ -534,7 +534,7 @@ static inline void ext4_decode_extra_time(struct timespec *time, __le32 extra)
if (sizeof(time->tv_sec) > 4) if (sizeof(time->tv_sec) > 4)
time->tv_sec |= (__u64)(le32_to_cpu(extra) & EXT4_EPOCH_MASK) time->tv_sec |= (__u64)(le32_to_cpu(extra) & EXT4_EPOCH_MASK)
<< 32; << 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) \ #define EXT4_INODE_SET_XTIME(xtime, inode, raw_inode) \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment