Go to file
Filipe Manana 555b7feaeb Btrfs-progs: check, ability to detect and fix outdated snapshot root items
This change adds code to detect and fix the issue introduced in the kernel
release 3.17, where creation of read-only snapshots lead to a corrupted
filesystem if they were created at a moment when the source subvolume/snapshot
had orphan items. The issue was that the on-disk root items became incorrect,
referring to the pre orphan cleanup root node instead of the post orphan
cleanup root node.

A test filesystem can be generated with the test case recently submitted for
xfstests/fstests, which is essencially the following (bash script):

    workout()
    {
	ops=$1
	procs=$2
	num_snapshots=$3

	_scratch_mkfs >> $seqres.full 2>&1
	_scratch_mount

	snapshot_cmd="$BTRFS_UTIL_PROG subvolume snapshot -r $SCRATCH_MNT"
	snapshot_cmd="$snapshot_cmd $SCRATCH_MNT/snap_\`date +'%H_%M_%S_%N'\`"
	run_check $FSSTRESS_PROG -p $procs \
	    -x "$snapshot_cmd" -X $num_snapshots -d $SCRATCH_MNT -n $ops
    }

    ops=10000
    procs=4
    snapshots=500
    workout $ops $procs $snapshots

Example of btrfsck's (btrfs check) behaviour against such filesystem:

  $ btrfsck /dev/loop0
  root item for root 311, current bytenr 44630016, current gen 60, current level 1, new bytenr 44957696, new gen 61, new level 1
  root item for root 1480, current bytenr 1003569152, current gen 1271, current level 1, new bytenr 1004175360, new gen 1272, new level 1
  root item for root 1509, current bytenr 1037434880, current gen 1300, current level 1, new bytenr 1038467072, new gen 1301, new level 1
  root item for root 1562, current bytenr 33636352, current gen 1354, current level 1, new bytenr 34455552, new gen 1355, new level 1
  root item for root 3094, current bytenr 1011712000, current gen 2935, current level 1, new bytenr 1008484352, new gen 2936, new level 1
  root item for root 3716, current bytenr 80805888, current gen 3578, current level 1, new bytenr 73515008, new gen 3579, new level 1
  root item for root 4085, current bytenr 714031104, current gen 3958, current level 1, new bytenr 716816384, new gen 3959, new level 1
  Found 7 roots with an outdated root item.
  Please run a filesystem check with the option --repair to fix them.

  $ echo $?
  1

  $ btrfsck --repair /dev/loop0
  enabling repair mode
  fixing root item for root 311, current bytenr 44630016, current gen 60, current level 1, new bytenr 44957696, new gen 61, new level 1
  fixing root item for root 1480, current bytenr 1003569152, current gen 1271, current level 1, new bytenr 1004175360, new gen 1272, new level 1
  fixing root item for root 1509, current bytenr 1037434880, current gen 1300, current level 1, new bytenr 1038467072, new gen 1301, new level 1
  fixing root item for root 1562, current bytenr 33636352, current gen 1354, current level 1, new bytenr 34455552, new gen 1355, new level 1
  fixing root item for root 3094, current bytenr 1011712000, current gen 2935, current level 1, new bytenr 1008484352, new gen 2936, new level 1
  fixing root item for root 3716, current bytenr 80805888, current gen 3578, current level 1, new bytenr 73515008, new gen 3579, new level 1
  fixing root item for root 4085, current bytenr 714031104, current gen 3958, current level 1, new bytenr 716816384, new gen 3959, new level 1
  Fixed 7 roots.
  Checking filesystem on /dev/loop0
  UUID: 2186e9b9-c977-4a35-9c7b-69c6609d4620
  checking extents
  checking free space cache
  cache and super generation don't match, space cache will be invalidated
  checking fs roots
  checking csums
  checking root refs
  found 618537000 bytes used err is 0
  total csum bytes: 130824
  total tree bytes: 601620480
  total fs tree bytes: 580288512
  total extent tree bytes: 18464768
  btree space waste bytes: 136939144
  file data blocks allocated: 34150318080
   referenced 27815415808
  Btrfs v3.17-rc3-2-gbbe1dd8

  $ echo $?
  0

Signed-off-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: David Sterba <dsterba@suse.cz>
2014-10-17 18:24:54 +02:00
Documentation btrfs-progs: document the limit balance filter 2014-10-10 19:30:22 +02:00
tests Btrfs-progs: check, ability to detect and fix outdated snapshot root items 2014-10-17 18:24:54 +02:00
.gitignore btrfs-progs: Introduce asciidoc based man page and btrfs man page. 2014-04-22 14:15:19 +02:00
COPYING fix COPYING 2007-06-12 15:41:08 -04:00
INSTALL btrfs-progs: Add information about libblkid requirement to INSTALL file 2014-08-22 14:39:31 +02:00
Makefile Btrfs-progs: break out rbtree util functions 2014-10-14 10:39:39 +02:00
backref.c Btrfs-progs: pull back backref.c and fix it up 2014-10-14 10:39:38 +02:00
backref.h Btrfs-progs: pull back backref.c and fix it up 2014-10-14 10:39:38 +02:00
bcp Btrfs-progs: Correct path munging in bcp 2011-10-25 09:18:58 -04:00
bitops.h Btrfs-progs: add a free space cache checker to fsck V2 2013-04-23 18:56:21 +02:00
btrfs-calc-size.c btrfs-progs: use check_argc_* to check arg number for all tools 2014-08-22 15:07:02 +02:00
btrfs-convert.c btrfs-progs: convert: set label or copy from origin 2014-10-10 19:06:57 +02:00
btrfs-corrupt-block.c btrfs-progs: add shift_items to btrfs-corrupt-block 2014-10-14 11:01:35 +02:00
btrfs-crc.c btrfs-progs: use check_argc_* to check arg number for all tools 2014-08-22 15:07:02 +02:00
btrfs-debug-tree.c btrfs-progs: use check_argc_* to check arg number for all tools 2014-08-22 15:07:02 +02:00
btrfs-find-root.c btrfs-progs: introduce a proper structure on which cli will call register-device ioctl 2014-10-16 12:02:00 +02:00
btrfs-fragments.c btrfs-progs: use check_argc_* to check arg number for all tools 2014-08-22 15:07:02 +02:00
btrfs-image.c btrfs-progs: add mount status check for btrfs-image 2014-08-22 15:07:03 +02:00
btrfs-list.c Btrfs-progs: break out rbtree util functions 2014-10-14 10:39:39 +02:00
btrfs-list.h btrfs-progs: Add -R to list UUIDs of original received subvolume 2014-09-14 13:09:52 +02:00
btrfs-map-logical.c btrfs-progs: use check_argc_* to check arg number for all tools 2014-08-22 15:07:02 +02:00
btrfs-select-super.c btrfs-progs: use check_argc_* to check arg number for all tools 2014-08-22 15:07:02 +02:00
btrfs-show-super.c btrfs-progs: fix show super unknown flag output 2014-10-16 13:38:35 +02:00
btrfs-zero-log.c btrfs-progs: use check_argc_* to check arg number for all tools 2014-08-22 15:07:02 +02:00
btrfs.c btrfs-progs: move the check_argc_* functions into utils.c 2014-08-22 14:55:27 +02:00
btrfsck.h btrfs-progs: Copyright string update 2014-03-21 06:23:24 -07:00
btrfstune.c btrfs-progs: add ask_user confirmation for btrfstune clear seeding flag 2014-08-22 16:09:55 +02:00
chunk-recover.c btrfs-progs: introduce a proper structure on which cli will call register-device ioctl 2014-10-16 12:02:00 +02:00
cmds-balance.c btrfs-progs: balance filter: add limit of processed chunks 2014-08-22 14:55:26 +02:00
cmds-check.c Btrfs-progs: check, ability to detect and fix outdated snapshot root items 2014-10-17 18:24:54 +02:00
cmds-device.c btrfs-progs: remove BTRFS_SCAN_PROC scan method 2014-10-10 10:38:34 +02:00
cmds-filesystem.c btrfs-progs: add options to tune units for fi df output 2014-10-10 18:58:28 +02:00
cmds-inspect.c Btrfs-progs: fix some build warnings on 32bit platform 2014-08-22 15:07:03 +02:00
cmds-property.c btrfs-progs: remove unnecessary return value check in btrfs-property 2014-08-22 15:07:03 +02:00
cmds-qgroup.c btrfs-progs: qgroup destroy says create failed 2014-01-31 08:22:12 -08:00
cmds-quota.c Btrfs-progs: fix magic return value in cmds-quota.c 2013-10-16 08:20:41 -04:00
cmds-receive.c btrfs-progs: add missing descriptions of '--max-errors' in btrfs-receive documentation 2014-08-22 15:07:04 +02:00
cmds-replace.c btrfs-progs: return error when canonicalize_path failed 2014-10-10 10:51:57 +02:00
cmds-rescue.c btrfs-progs: use check_argc_exact to check arg number of btrfs-rescue 2014-08-22 14:39:31 +02:00
cmds-restore.c btrfs-progs: remove wrong set_argv0 for restore 2014-09-14 19:06:12 +02:00
cmds-scrub.c btrfs-progs: scrub, detect stale information in the status file 2014-10-10 10:38:36 +02:00
cmds-send.c btrfs-progs: Check fstype in find_mount_root() 2014-08-22 15:07:02 +02:00
cmds-subvolume.c btrfs-progs: wait until all subvolumes are cleaned 2014-10-10 09:32:05 +02:00
commands.h btrfs-progs: move the check_argc_* functions into utils.c 2014-08-22 14:55:27 +02:00
crc32c.c btrfs-progs: make many private symbols static 2013-09-03 19:41:08 +02:00
crc32c.h btrfs-progs: libify some parts of btrfs-progs 2013-02-27 15:24:25 +01:00
ctree.c Btrfs-progs: pull back backref.c and fix it up 2014-10-14 10:39:38 +02:00
ctree.h Btrfs-progs: delete bogus dir indexes 2014-10-14 10:45:03 +02:00
dir-item.c Btrfs-progs: delete bogus dir indexes 2014-10-14 10:45:03 +02:00
dir-test.c Btrfs-progs: fix magic return value in dir-test.c 2013-10-16 08:20:42 -04:00
disk-io.c Btrfs-progs: check, ability to detect and fix outdated snapshot root items 2014-10-17 18:24:54 +02:00
disk-io.h btrfs-progs: introduce a proper structure on which cli will call register-device ioctl 2014-10-16 12:02:00 +02:00
extent-cache.c Btrfs-progs: break out rbtree util functions 2014-10-14 10:39:39 +02:00
extent-cache.h Btrfs-progs: extend the extent cache for the device extent 2013-07-03 14:06:54 -04:00
extent-tree.c Btrfs-progs: check, ability to detect and fix outdated snapshot root items 2014-10-17 18:24:54 +02:00
extent_io.c Btrfs-progs: pull back backref.c and fix it up 2014-10-14 10:39:38 +02:00
extent_io.h Btrfs-progs: pull back backref.c and fix it up 2014-10-14 10:39:38 +02:00
file-item.c btrfs-progs: remove btrfs_release_path before btrfs_free_path 2014-09-14 19:06:12 +02:00
free-space-cache.c btrfs-progs: make free space checker work on non-4k sectorsize filesystems 2014-10-10 10:38:31 +02:00
free-space-cache.h btrfs-progs: make free space checker work on non-4k sectorsize filesystems 2014-10-10 10:38:31 +02:00
fsck.btrfs btrfs-progs: add fsck.btrfs stub and manpage 2014-01-31 08:22:13 -08:00
hash.h Switch btrfs_name_hash() to crc32c 2008-08-20 20:11:23 -04:00
hasher.c Unaligned access fixes 2008-02-15 11:19:58 -05:00
help.c btrfs-progs: move the check_argc_* functions into utils.c 2014-08-22 14:55:27 +02:00
inode-item.c btrfs-progs: mark static & remove unused from shared kernel code 2013-09-03 19:40:53 +02:00
inode-map.c btrfs-progs: remove btrfs_release_path before btrfs_free_path 2014-09-14 19:06:12 +02:00
ioctl-test.c btrfs-progs: mark static & remove unused from non-kernel code 2013-09-03 19:40:54 +02:00
ioctl.h btrfs-progs: balance filter: add limit of processed chunks 2014-08-22 14:55:26 +02:00
kerncompat.h Btrfs-progs: update rbtree libs 2014-10-14 10:39:40 +02:00
list.h Btrfs-progs: introduce list_{first, next}_entry/list_splice_tail{_init} 2013-07-03 14:06:55 -04:00
list_sort.c btrfs-progs: add list_sort and use it to sort devices by id 2013-10-16 08:22:26 -04:00
list_sort.h btrfs-progs: add list_sort and use it to sort devices by id 2013-10-16 08:22:26 -04:00
math.h btrfs-progs: Copyright string update 2014-03-21 06:23:24 -07:00
mkfs.c btrfs-progs: mkfs should be consistent in calling register device 2014-10-16 12:02:00 +02:00
print-tree.c btrfs-progs: debug: print more info about inode 2014-10-10 18:15:28 +02:00
print-tree.h btrfs-progs: add quota group verify code 2014-08-22 14:39:33 +02:00
props.c Btrfs-progs: set string end sing '\0' for property 2014-05-02 17:05:37 +02:00
props.h Btrfs-progs: introduce btrfs property subgroup 2014-01-31 08:22:31 -08:00
qgroup-verify.c Btrfs-progs: break out rbtree util functions 2014-10-14 10:39:39 +02:00
qgroup-verify.h btrfs-progs: show extent state for a subvolume 2014-08-22 15:04:16 +02:00
qgroup.c btrfs-progs: print qgroup excl as unsigned 2014-08-22 14:39:32 +02:00
qgroup.h Btrfs-progs: enhance btrfs qgroup show to sort qgroups 2013-10-16 08:23:12 -04:00
quick-test.c Btrfs-progs: rework open_ctree to take flags, add a new one V2 2013-11-07 16:10:40 -05:00
radix-tree.c btrfs-progs: Fix undefined behavior in radix-tree.c. 2014-08-22 14:39:34 +02:00
radix-tree.h btrfs-progs: libify some parts of btrfs-progs 2013-02-27 15:24:25 +01:00
raid6.c btrfs-progs: give raid6.c its exported prototypes 2013-09-03 19:41:11 +02:00
random-test.c Btrfs-progs: fix magic return value in random-test.c 2013-10-16 08:20:42 -04:00
rbtree-utils.c Btrfs-progs: break out rbtree util functions 2014-10-14 10:39:39 +02:00
rbtree-utils.h Btrfs-progs: break out rbtree util functions 2014-10-14 10:39:39 +02:00
rbtree.c Btrfs-progs: update rbtree libs 2014-10-14 10:39:40 +02:00
rbtree.h Btrfs-progs: update rbtree libs 2014-10-14 10:39:40 +02:00
rbtree_augmented.h Btrfs-progs: update rbtree libs 2014-10-14 10:39:40 +02:00
repair.c Btrfs-progs: introduce common insert/search/delete functions for rb-tree 2013-07-03 14:06:54 -04:00
repair.h Btrfsck: add the ability to prune corrupt extent allocation tree blocks 2012-02-21 14:37:21 -05:00
root-tree.c Btrfs-progs: free path if we don't find root item 2014-03-21 06:23:32 -07:00
send-stream.c btrfs-progs: fix unaligned loads in receive 2014-08-22 16:09:55 +02:00
send-stream.h btrfs-progs: library version defines 2014-09-02 17:04:15 +02:00
send-test.c Btrfs-progs: remove unsed pthread attribute objects 2014-04-22 14:33:35 +02:00
send-utils.c btrfs-progs: Init root_item to avoid gcc 4.8.2 warning 2014-03-21 06:23:29 -07:00
send-utils.h btrfs-progs: enclose uuid tree compat code with ifdefs 2014-03-21 06:23:07 -07:00
send.h btrfs-progs: make libbtrfs usable from C++ 2013-02-19 11:15:30 +01:00
show-blocks Fix showblocks to display different colors for different metadata roots 2009-03-09 13:00:44 -04:00
super-recover.c btrfs-progs: introduce a proper structure on which cli will call register-device ioctl 2014-10-16 12:02:00 +02:00
transaction.h btrfs-progs: add malloc check in transaction.h/btrfs_start_transaction 2013-01-18 18:27:21 +01:00
ulist.c btrfs-progs: import ulist 2014-08-22 14:39:33 +02:00
ulist.h Btrfs-progs: pull back backref.c and fix it up 2014-10-14 10:39:38 +02:00
utils-lib.c btrfs-progs: move arg_strtou64 to a separate file for library 2014-05-02 17:04:28 +02:00
utils.c Btrfs-progs: check, ability to detect and fix outdated snapshot root items 2014-10-17 18:24:54 +02:00
utils.h Btrfs-progs: check, ability to detect and fix outdated snapshot root items 2014-10-17 18:24:54 +02:00
uuid-tree.c btrfs-progs: fix in-place byte swapping 2013-09-03 19:41:06 +02:00
version.sh Btrfs progs v3.16.2 2014-10-01 18:07:59 +02:00
volumes.c btrfs-progs: fix device missing of btrfs fi show with seed devices 2014-10-10 10:52:41 +02:00
volumes.h btrfs-progs: fix device missing of btrfs fi show with seed devices 2014-10-10 10:52:41 +02:00