Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
SUSE:SLE-12:GA
btrfsprogs
2007-btrfs-convert-factor-out-adding-dirent-int...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 2007-btrfs-convert-factor-out-adding-dirent-into-convert.patch of Package btrfsprogs
From: Jeff Mahoney <jeffm@suse.com> Subject: btrfs-convert: factor out adding dirent into convert_insert_dirent Adding a dirent consists of multiple steps that will need to be taken by any converter. Signed-off-by: Jeff Mahoney <jeffm@suse.com> --- btrfs-convert.c | 61 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 24 deletions(-) --- a/btrfs-convert.c +++ b/btrfs-convert.c @@ -296,6 +296,34 @@ static struct btrfs_extent_ops extent_op .free_extent = custom_free_extent, }; +static int convert_insert_dirent(struct btrfs_trans_handle *trans, + struct btrfs_root *root, + const char *name, size_t name_len, + u64 dir, u64 objectid, + u8 file_type, u64 index_cnt, + struct btrfs_inode_item *inode) +{ + int ret; + u64 inode_size; + struct btrfs_key location = { + .objectid = objectid, + .offset = 0, + .type = BTRFS_INODE_ITEM_KEY, + }; + + ret = btrfs_insert_dir_item(trans, root, name, name_len, + dir, &location, file_type, index_cnt); + if (ret) + return ret; + ret = btrfs_insert_inode_ref(trans, root, name, name_len, + objectid, dir, index_cnt); + if (ret) + return ret; + inode_size = btrfs_stack_inode_size(inode) + name_len * 2; + btrfs_set_stack_inode_size(inode, inode_size); + return 0; +} + struct dir_iterate_data { struct btrfs_trans_handle *trans; struct btrfs_root *root; @@ -325,9 +353,7 @@ static int dir_iterate_proc(ext2_ino_t d int ret; int file_type; u64 objectid; - u64 inode_size; char dotdot[] = ".."; - struct btrfs_key location; struct dir_iterate_data *idata = (struct dir_iterate_data *)priv_data; int name_len; @@ -344,33 +370,20 @@ static int dir_iterate_proc(ext2_ino_t d if (dirent->inode < EXT2_GOOD_OLD_FIRST_INO) return 0; - location.objectid = objectid; - location.offset = 0; - btrfs_set_key_type(&location, BTRFS_INODE_ITEM_KEY); - file_type = dirent->name_len >> 8; BUG_ON(file_type > EXT2_FT_SYMLINK); - ret = btrfs_insert_dir_item(idata->trans, idata->root, - dirent->name, name_len, - idata->objectid, &location, + + ret = convert_insert_dirent(idata->trans, idata->root, dirent->name, + name_len, idata->objectid, objectid, filetype_conversion_table[file_type], - idata->index_cnt); - if (ret) - goto fail; - ret = btrfs_insert_inode_ref(idata->trans, idata->root, - dirent->name, name_len, - objectid, idata->objectid, - idata->index_cnt); - if (ret) - goto fail; + idata->index_cnt, idata->inode); + if (ret < 0) { + idata->errcode = ret; + return BLOCK_ABORT; + } + idata->index_cnt++; - inode_size = btrfs_stack_inode_size(idata->inode) + - name_len * 2; - btrfs_set_stack_inode_size(idata->inode, inode_size); return 0; -fail: - idata->errcode = ret; - return BLOCK_ABORT; } static int create_dir_entries(struct btrfs_trans_handle *trans,
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor