diff options
-rw-r--r-- | btrfs-convert.c | 27 | ||||
-rw-r--r-- | configure.ac | 6 |
2 files changed, 32 insertions, 1 deletions
diff --git a/btrfs-convert.c b/btrfs-convert.c index 9f906510..e9e6d0b3 100644 --- a/btrfs-convert.c +++ b/btrfs-convert.c @@ -44,6 +44,18 @@ #define INO_OFFSET (BTRFS_FIRST_FREE_OBJECTID - EXT2_ROOT_INO) #define CONV_IMAGE_SUBVOL_OBJECTID BTRFS_FIRST_FREE_OBJECTID +/* + * Compatibility code for e2fsprogs 1.41 which doesn't support RO compat flag + * BIGALLOC. + * Unlike normal RO compat flag, BIGALLOC affects how e2fsprogs check used + * space, and btrfs-convert heavily relies on it. + */ +#ifdef HAVE_OLD_E2FSPROGS +#define EXT2FS_CLUSTER_RATIO(fs) (1) +#define EXT2_CLUSTERS_PER_GROUP(s) (EXT2_BLOCKS_PER_GROUP(s)) +#define EXT2FS_B2C(fs, blk) (blk) +#endif + struct task_ctx { uint32_t max_copy_inodes; uint32_t cur_copy_inodes; @@ -183,9 +195,23 @@ static int ext2_open_fs(struct btrfs_convert_context *cctx, const char *name) errcode_t ret; ext2_filsys ext2_fs; ext2_ino_t ino; + u32 ro_feature; + ret = ext2fs_open(name, 0, 0, 0, unix_io_manager, &ext2_fs); if (ret) { fprintf(stderr, "ext2fs_open: %s\n", error_message(ret)); + return -1; + } + /* + * We need to know exactly the used space, some RO compat flags like + * BIGALLOC will affect how used space is present. + * So we need manuall check any unsupported RO compat flags + */ + ro_feature = ext2_fs->super->s_feature_ro_compat; + if (ro_feature & ~EXT2_LIB_FEATURE_RO_COMPAT_SUPP) { + error( +"unsupported RO features detected: %x, abort convert to avoid possible corruption", + ro_feature & ~EXT2_LIB_FEATURE_COMPAT_SUPP); goto fail; } ret = ext2fs_read_inode_bitmap(ext2_fs); @@ -227,6 +253,7 @@ static int ext2_open_fs(struct btrfs_convert_context *cctx, const char *name) cctx->free_inodes_count = ext2_fs->super->s_free_inodes_count; return 0; fail: + ext2fs_close(ext2_fs); return -1; } diff --git a/configure.ac b/configure.ac index 6b68c090..c79472cc 100644 --- a/configure.ac +++ b/configure.ac @@ -105,7 +105,11 @@ AS_IF([test "x$enable_convert" = xyes], [DISABLE_BTRFSCONVERT=0], [DISABLE_BTRFS AC_SUBST([DISABLE_BTRFSCONVERT]) if test "x$enable_convert" = xyes; then - PKG_CHECK_MODULES(EXT2FS, [ext2fs >= 1.41]) + PKG_CHECK_MODULES(EXT2FS, [ext2fs >= 1.42],, + [PKG_CHECK_MODULES(EXT2FS, [ext2fs], + [AC_DEFINE([HAVE_OLD_E2FSPROGS], [1], + [E2fsprogs does not support BIGALLOC])] + )]) PKG_CHECK_MODULES(COM_ERR, [com_err]) fi |