btrfs-progs: convert: Add larger device support

With larger file system (in this case its 22TB), ext2fs_open() returns
EXT2_ET_CANT_USE_LEGACY_BITMAPS error message with
ext2fs_read_block_bitmap().

To overcome this issue,
(a) we need pass EXT2_FLAG_64BITS flag with ext2fs_open.
(b) use 64-bit functions like ext2fs_get_block_bitmap_range2,
    ext2fs_inode_data_blocks2,ext2fs_read_ext_attr2
(c) use 64bit types with btrfs_convert_context fields

Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=194795
Signed-off-by: Lakshmipathi.G <lakshmipathi.g@giis.co.in>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Lakshmipathi.G 2017-06-03 15:27:45 +05:30 committed by David Sterba
parent 8636132c6d
commit 324d4c1857
1 changed files with 6 additions and 5 deletions

View File

@ -34,8 +34,9 @@ static int ext2_open_fs(struct btrfs_convert_context *cctx, const char *name)
ext2_filsys ext2_fs; ext2_filsys ext2_fs;
ext2_ino_t ino; ext2_ino_t ino;
u32 ro_feature; u32 ro_feature;
int open_flag = EXT2_FLAG_SOFTSUPP_FEATURES | EXT2_FLAG_64BITS;
ret = ext2fs_open(name, 0, 0, 0, unix_io_manager, &ext2_fs); ret = ext2fs_open(name, open_flag, 0, 0, unix_io_manager, &ext2_fs);
if (ret) { if (ret) {
fprintf(stderr, "ext2fs_open: %s\n", error_message(ret)); fprintf(stderr, "ext2fs_open: %s\n", error_message(ret));
return -1; return -1;
@ -148,7 +149,7 @@ static int ext2_read_used_space(struct btrfs_convert_context *cctx)
return -ENOMEM; return -ENOMEM;
for (i = 0; i < fs->group_desc_count; i++) { for (i = 0; i < fs->group_desc_count; i++) {
ret = ext2fs_get_block_bitmap_range(fs->block_map, blk_itr, ret = ext2fs_get_block_bitmap_range2(fs->block_map, blk_itr,
block_nbytes * 8, block_bitmap); block_nbytes * 8, block_bitmap);
if (ret) { if (ret) {
error("fail to get bitmap from ext2, %s", error("fail to get bitmap from ext2, %s",
@ -353,7 +354,7 @@ static int ext2_create_symlink(struct btrfs_trans_handle *trans,
int ret; int ret;
char *pathname; char *pathname;
u64 inode_size = btrfs_stack_inode_size(btrfs_inode); u64 inode_size = btrfs_stack_inode_size(btrfs_inode);
if (ext2fs_inode_data_blocks(ext2_fs, ext2_inode)) { if (ext2fs_inode_data_blocks2(ext2_fs, ext2_inode)) {
btrfs_set_stack_inode_size(btrfs_inode, inode_size + 1); btrfs_set_stack_inode_size(btrfs_inode, inode_size + 1);
ret = ext2_create_file_extents(trans, root, objectid, ret = ext2_create_file_extents(trans, root, objectid,
btrfs_inode, ext2_fs, ext2_ino, btrfs_inode, ext2_fs, ext2_ino,
@ -627,9 +628,9 @@ static int ext2_copy_extended_attrs(struct btrfs_trans_handle *trans,
ret = -ENOMEM; ret = -ENOMEM;
goto out; goto out;
} }
err = ext2fs_read_ext_attr(ext2_fs, ext2_inode->i_file_acl, buffer); err = ext2fs_read_ext_attr2(ext2_fs, ext2_inode->i_file_acl, buffer);
if (err) { if (err) {
fprintf(stderr, "ext2fs_read_ext_attr: %s\n", fprintf(stderr, "ext2fs_read_ext_attr2: %s\n",
error_message(err)); error_message(err));
ret = -1; ret = -1;
goto out; goto out;