btrfs-progs: build: fix detection of ext4 i_{a,c,a}time_extra
Running convert-tests.sh Reported that the 019-ext4-copy-timestamps test failed: ... mount -o loop -t ext4 btrfs-progs/tests/test.img btrfs-progs/tests/mnt ====== RUN CHECK touch btrfs-progs/tests/mnt/file ====== RUN CHECK stat btrfs-progs/tests/mnt/file File: 'btrfs-progs/tests/mnt/file' Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: 700h/1792d Inode: 13 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Context: unconfined_u:object_r:unlabeled_t:s0 Access: 2021-08-24 22:10:21.999209679 +0800 Modify: 2021-08-24 22:10:21.999209679 +0800 Change: 2021-08-24 22:10:21.999209679 +0800 ... btrfs-progs/btrfs-convert btrfs-progs/tests/test.img ... ====== RUN CHECK mount -t btrfs -o loop btrfs-progs/tests/test.img btrfs-progs/tests/mnt ====== RUN CHECK stat btrfs-progs/tests/mnt/file File: 'btrfs-progs/tests/mnt/file' Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: 2ch/44d Inode: 267 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Context: unconfined_u:object_r:unlabeled_t:s0 Access: 2021-08-24 22:10:21.000000000 +0800 Modify: 2021-08-24 22:10:21.000000000 +0800 Change: 2021-08-24 22:10:21.000000000 +0800 ... atime on converted inode does not match test failed for case 019-ext4-copy-timestamps Obviously, the log says that btrfs-convert does not support nanoseconds. I looked at the source code and found that only if ext2_fs.h defines EXT4_EPOCH_MASK btrfs-convert to support nanoseconds. But in e2fsprogs, EXT4_EPOCH_MASK was introduced in v1.43, but in some older versions, such as v1.40, e2fsprogs actually supports nanoseconds. It seems that if struct ext2_inode_large contains the i_atime_extra member, ext4 is supports nanoseconds, so I updated the logic to determine whether the current ext4 file system supports nanosecond precision. In addition, I imported some definitions to encode and decode tv_nsec (copied from e2fsprogs source code). Author: Li Zhang <zhanglikernel@gmail.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
325dba6432
commit
b199123b33
16
configure.ac
16
configure.ac
|
@ -253,7 +253,21 @@ AX_CHECK_DEFINE([linux/fiemap.h], [FIEMAP_EXTENT_SHARED], [],
|
|||
AX_CHECK_DEFINE([ext2fs/ext2_fs.h], [EXT4_EPOCH_MASK],
|
||||
[AC_DEFINE([HAVE_EXT4_EPOCH_MASK_DEFINE], [1],
|
||||
[Define to 1 if e2fsprogs defines EXT4_EPOCH_MASK])],
|
||||
[AC_MSG_WARN([no definition of EXT4_EPOCH_MASK found, probably old e2fsprogs, no 64bit time precision of converted images])])
|
||||
[have_ext4_epoch_mask_define=no])
|
||||
|
||||
AS_IF([test "x$have_ext4_epoch_mask_define" = xno], [
|
||||
AC_CHECK_MEMBERS([struct ext2_inode_large.i_atime_extra],
|
||||
[
|
||||
AC_DEFINE([HAVE_EXT4_EPOCH_MASK_DEFINE], [1], [Define to 1 if ext2_inode_large includes i_atime_extra])
|
||||
AC_DEFINE([EXT4_EPOCH_BITS], [2],[for encode and decode tv_nsec in ext2 inode])
|
||||
AC_DEFINE([EXT4_EPOCH_MASK], [((1 << EXT4_EPOCH_BITS) - 1)], [For encode and decode tv_nsec info in ext2 inode])
|
||||
AC_DEFINE([EXT4_NSEC_MASK], [(~0UL << EXT4_EPOCH_BITS)], [For encode and decode tv_nsec info in ext2 inode])
|
||||
AC_DEFINE([inode_includes(size, field)],[m4_normalize[(size >= (sizeof(((struct ext2_inode_large *)0)->field) + offsetof(struct ext2_inode_large, field)))]],
|
||||
[For encode and decode tv_nsec info in ext2 inode])
|
||||
],
|
||||
[AC_MSG_WARN([It seems that ext2_inode_large don't includes tv_nsec related info, probably old e2fsprogs, no 64bit time precision of converted images])],
|
||||
[[#include <ext2fs/ext2_fs.h>]])
|
||||
])
|
||||
|
||||
AC_CHECK_HEADER(linux/blkzoned.h, [blkzoned_found=yes], [blkzoned_found=no])
|
||||
AC_CHECK_MEMBER([struct blk_zone.capacity], [blkzoned_capacity=yes], [blkzoned_capacity=no], [[#include <linux/blkzoned.h>]])
|
||||
|
|
Loading…
Reference in New Issue