mirror of
https://github.com/kdave/btrfs-progs
synced 2025-01-11 16:29:42 +00:00
btrfs-progs: convert: access name_len and file_type the old way
We can't use ext2_dir_entry_2 typecast on big endian machines directly. The bytes do not get converted during extX block read due to missing flag EXT2_DIRBLOCK_V2_STRUCT passed down to ext2fs_read_dir_block4 from ext2fs_process_dir_block. Fixing on the ext2 side needs updating callers and (maybe) the library interfaces. We'll fix it on the convert side for now. CC: Jan Kara <jack@suse.cz> Signed-off-by: David Sterba <dsterba@suse.cz>
This commit is contained in:
parent
7854c8b667
commit
35ba8fc39e
18
convert.c
18
convert.c
@ -252,7 +252,7 @@ static u8 filetype_conversion_table[EXT2_FT_MAX] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static int dir_iterate_proc(ext2_ino_t dir, int entry,
|
static int dir_iterate_proc(ext2_ino_t dir, int entry,
|
||||||
struct ext2_dir_entry *old,
|
struct ext2_dir_entry *dirent,
|
||||||
int offset, int blocksize,
|
int offset, int blocksize,
|
||||||
char *buf,void *priv_data)
|
char *buf,void *priv_data)
|
||||||
{
|
{
|
||||||
@ -262,12 +262,14 @@ static int dir_iterate_proc(ext2_ino_t dir, int entry,
|
|||||||
u64 inode_size;
|
u64 inode_size;
|
||||||
char dotdot[] = "..";
|
char dotdot[] = "..";
|
||||||
struct btrfs_key location;
|
struct btrfs_key location;
|
||||||
struct ext2_dir_entry_2 *dirent = (struct ext2_dir_entry_2 *)old;
|
|
||||||
struct dir_iterate_data *idata = (struct dir_iterate_data *)priv_data;
|
struct dir_iterate_data *idata = (struct dir_iterate_data *)priv_data;
|
||||||
|
int name_len;
|
||||||
|
|
||||||
|
name_len = dirent->name_len & 0xFF;
|
||||||
|
|
||||||
objectid = dirent->inode + INO_OFFSET;
|
objectid = dirent->inode + INO_OFFSET;
|
||||||
if (!strncmp(dirent->name, dotdot, dirent->name_len)) {
|
if (!strncmp(dirent->name, dotdot, name_len)) {
|
||||||
if (dirent->name_len == 2) {
|
if (name_len == 2) {
|
||||||
BUG_ON(idata->parent != 0);
|
BUG_ON(idata->parent != 0);
|
||||||
idata->parent = objectid;
|
idata->parent = objectid;
|
||||||
}
|
}
|
||||||
@ -280,24 +282,24 @@ static int dir_iterate_proc(ext2_ino_t dir, int entry,
|
|||||||
location.offset = 0;
|
location.offset = 0;
|
||||||
btrfs_set_key_type(&location, BTRFS_INODE_ITEM_KEY);
|
btrfs_set_key_type(&location, BTRFS_INODE_ITEM_KEY);
|
||||||
|
|
||||||
file_type = dirent->file_type;
|
file_type = dirent->name_len >> 8;
|
||||||
BUG_ON(file_type > EXT2_FT_SYMLINK);
|
BUG_ON(file_type > EXT2_FT_SYMLINK);
|
||||||
ret = btrfs_insert_dir_item(idata->trans, idata->root,
|
ret = btrfs_insert_dir_item(idata->trans, idata->root,
|
||||||
dirent->name, dirent->name_len,
|
dirent->name, name_len,
|
||||||
idata->objectid, &location,
|
idata->objectid, &location,
|
||||||
filetype_conversion_table[file_type],
|
filetype_conversion_table[file_type],
|
||||||
idata->index_cnt);
|
idata->index_cnt);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto fail;
|
goto fail;
|
||||||
ret = btrfs_insert_inode_ref(idata->trans, idata->root,
|
ret = btrfs_insert_inode_ref(idata->trans, idata->root,
|
||||||
dirent->name, dirent->name_len,
|
dirent->name, name_len,
|
||||||
objectid, idata->objectid,
|
objectid, idata->objectid,
|
||||||
idata->index_cnt);
|
idata->index_cnt);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto fail;
|
goto fail;
|
||||||
idata->index_cnt++;
|
idata->index_cnt++;
|
||||||
inode_size = btrfs_stack_inode_size(idata->inode) +
|
inode_size = btrfs_stack_inode_size(idata->inode) +
|
||||||
dirent->name_len * 2;
|
name_len * 2;
|
||||||
btrfs_set_stack_inode_size(idata->inode, inode_size);
|
btrfs_set_stack_inode_size(idata->inode, inode_size);
|
||||||
return 0;
|
return 0;
|
||||||
fail:
|
fail:
|
||||||
|
Loading…
Reference in New Issue
Block a user