btrfs-progs: convert: fix self-reference of directory

Creating a simple directory structure leads to the following error:

  $ btrfs check
  Checking filesystem on test.img
  UUID: 8f2292ad-c80e-4ab4-8a72-29aa3a83002c
  [1/7] checking root items
  [2/7] checking extents
  [3/7] checking free space cache
  [4/7] checking fs roots
	  unresolved ref dir 260 index 0 namelen 2 name .. filetype 0 errors 3, no dir item, no dir index
  ERROR: errors found in fs roots
  found 101085184 bytes used, error(s) found
  total csum bytes: 98460
  total tree bytes: 262144
  total fs tree bytes: 49152
  total extent tree bytes: 16384
  btree space waste bytes: 151864
  file data blocks allocated: 167931904
   referenced 167931904

The self-reference should exist for the toplevel directory, where the
parent directory points to itself.

Issue: #453
Author: tyan0
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
David Sterba 2022-05-30 22:21:40 +02:00
parent 31750cb120
commit 02b06b3e8d
2 changed files with 22 additions and 2 deletions

View File

@ -634,8 +634,9 @@ static int reiserfs_copy_meta(reiserfs_filsys_t fs, struct btrfs_root *root,
goto fail;
}
ret = btrfs_insert_inode_ref(trans, root, "..", 2, parent,
objectid, 0);
if (parent == objectid)
ret = btrfs_insert_inode_ref(trans, root, "..", 2, parent,
objectid, 0);
break;
case S_IFLNK:
trans = btrfs_start_transaction(root, 1);

View File

@ -0,0 +1,19 @@
#!/bin/sh
# Test that only toplevel directory self-reference is created
source "$TEST_TOP/common"
setup_root_helper
prepare_test_dev
check_global_prereq mkreiserfs
check_prereq btrfs-convert
run_check $SUDO_HELPER mkreiserfs -q -f -b 4096 "$TEST_DEV"
run_check_mount_test_dev -t reiserfs
run_check $SUDO_HELPER mkdir "$TEST_MNT/a"
run_check $SUDO_HELPER dd if=/dev/urandom of="$TEST_MNT/a/x" bs=1M count=64
run_check $SUDO_HELPER mkdir "$TEST_MNT/a/y"
run_check_umount_test_dev
run_check $SUDO_HELPER "$TOP/btrfs-convert" "$TEST_DEV"
run_check $SUDO_HELPER "$TOP/btrfs" check "$TEST_DEV"