mirror of
https://github.com/kdave/btrfs-progs
synced 2025-01-07 14:09:35 +00:00
Btrfs-progs: mkfs: make sure we can deal with hard links with -r option
Steps to reproduce: # mkdir -p /tmp/test # touch /tmp/test/file # ln /tmp/test/file /tmp/test/hardlinks # mkfs.btrfs -f /dev/sda13 -r /tmp/test # btrfs check /dev/sda13 To deal with hard link, we must deal with inode with same inode id rather than increase inode id by ourselves. Signed-off-by: Wang Shilong <wangsl.fnst@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.cz> Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:
parent
3bb703dcae
commit
a2524a784d
21
mkfs.c
21
mkfs.c
@ -380,7 +380,10 @@ static int add_directory_items(struct btrfs_trans_handle *trans,
|
|||||||
ret = btrfs_insert_dir_item(trans, root, name, name_len,
|
ret = btrfs_insert_dir_item(trans, root, name, name_len,
|
||||||
parent_inum, &location,
|
parent_inum, &location,
|
||||||
filetype, index_cnt);
|
filetype, index_cnt);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
ret = btrfs_insert_inode_ref(trans, root, name, name_len,
|
||||||
|
objectid, parent_inum, index_cnt);
|
||||||
*dir_index_cnt = index_cnt;
|
*dir_index_cnt = index_cnt;
|
||||||
index_cnt++;
|
index_cnt++;
|
||||||
|
|
||||||
@ -493,9 +496,7 @@ static int add_inode_items(struct btrfs_trans_handle *trans,
|
|||||||
struct btrfs_inode_item btrfs_inode;
|
struct btrfs_inode_item btrfs_inode;
|
||||||
u64 objectid;
|
u64 objectid;
|
||||||
u64 inode_size = 0;
|
u64 inode_size = 0;
|
||||||
int name_len;
|
|
||||||
|
|
||||||
name_len = strlen(name);
|
|
||||||
fill_inode_item(trans, root, &btrfs_inode, st);
|
fill_inode_item(trans, root, &btrfs_inode, st);
|
||||||
objectid = self_objectid;
|
objectid = self_objectid;
|
||||||
|
|
||||||
@ -509,16 +510,8 @@ static int add_inode_items(struct btrfs_trans_handle *trans,
|
|||||||
btrfs_set_key_type(&inode_key, BTRFS_INODE_ITEM_KEY);
|
btrfs_set_key_type(&inode_key, BTRFS_INODE_ITEM_KEY);
|
||||||
|
|
||||||
ret = btrfs_insert_inode(trans, root, objectid, &btrfs_inode);
|
ret = btrfs_insert_inode(trans, root, objectid, &btrfs_inode);
|
||||||
if (ret)
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
ret = btrfs_insert_inode_ref(trans, root, name, name_len,
|
|
||||||
objectid, parent_inum, dir_index_cnt);
|
|
||||||
if (ret)
|
|
||||||
goto fail;
|
|
||||||
|
|
||||||
*inode_ret = btrfs_inode;
|
*inode_ret = btrfs_inode;
|
||||||
fail:
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -826,7 +819,7 @@ static int traverse_directory(struct btrfs_trans_handle *trans,
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_inum = ++highest_inum + BTRFS_FIRST_FREE_OBJECTID;
|
cur_inum = st.st_ino;
|
||||||
ret = add_directory_items(trans, root,
|
ret = add_directory_items(trans, root,
|
||||||
cur_inum, parent_inum,
|
cur_inum, parent_inum,
|
||||||
cur_file->d_name,
|
cur_file->d_name,
|
||||||
@ -840,6 +833,10 @@ static int traverse_directory(struct btrfs_trans_handle *trans,
|
|||||||
cur_file->d_name, cur_inum,
|
cur_file->d_name, cur_inum,
|
||||||
parent_inum, dir_index_cnt,
|
parent_inum, dir_index_cnt,
|
||||||
&cur_inode);
|
&cur_inode);
|
||||||
|
if (ret == -EEXIST) {
|
||||||
|
BUG_ON(st.st_nlink <= 1);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (ret) {
|
if (ret) {
|
||||||
fprintf(stderr, "add_inode_items failed\n");
|
fprintf(stderr, "add_inode_items failed\n");
|
||||||
goto fail;
|
goto fail;
|
||||||
|
Loading…
Reference in New Issue
Block a user