diff options
authorZhao Lei <>2015-08-26 22:03:36 +0800
committerDavid Sterba <>2015-09-01 14:02:48 +0200
commit6425752ab29d86594ad1d2411b7efeb74b62d48d (patch)
parent9a99d2b683c23cbfb21df0557fa185b36e9e8540 (diff)
btrfs-progs: Fix infinite loop of btrfs subvolumn sync
We can trigger the bug by following operation: (no wait between commands 3~5) btrfs subvolume create /mnt/btrfs/mysubvol btrfs subvolume snapshot /mnt/btrfs/mysubvol /mnt/btrfs/mysubvol_snap btrfs subvolume delete /mnt/btrfs/mysubvol_snap btrfs subvolume delete /mnt/btrfs/mysubvol btrfs subvolume sync /mnt/btrfs The last command will not exit. Reason: List of "deleted subvolumes" are not currectly set. It caused by a typo of value assign, in detail: *ids[idx] = sh->offset; should be: (*ids)[idx] = sh->offset; So only first element is set to right memory address. If there are multiple "deleted subvolumes", program will keep wait. Above typo also caused some segment fault in my test. This patch fixed above bug. Signed-off-by: Zhao Lei <> Signed-off-by: David Sterba <>
1 files changed, 1 insertions, 1 deletions
diff --git a/cmds-subvolume.c b/cmds-subvolume.c
index 4258ea10..fd4de847 100644
--- a/cmds-subvolume.c
+++ b/cmds-subvolume.c
@@ -1201,7 +1201,7 @@ static int enumerate_dead_subvols(int fd, int count, u64 **ids)
off += sizeof(*sh);
if (sh->type == BTRFS_ORPHAN_ITEM_KEY) {
- *ids[idx] = sh->offset;
+ (*ids)[idx] = sh->offset;
if (idx >= count) {
u64 *newids;