On Mon, Jan 09, 2012 at 03:44:18PM +0200, Ilya Dryomov wrote: > On Mon, Jan 09, 2012 at 01:50:34AM -0500, Marios Titas wrote: > > I tried this for many different scenarios and it seems to work pretty > > well. I only ran into one problematic case: If you remove a device > > from a multidevice filesystem it crashes. Here's how to reproduce it: > > > > truncate -s1g /tmp/test1 > > truncate -s1g /tmp/test2 > > losetup /dev/loop1 /tmp/test1 > > losetup /dev/loop2 /tmp/test2 > > mkdir /tmp/test > > ./mkfs.btrfs -L test -d single -m single /dev/loop1 /dev/loop2 > > mount -o noatime /dev/loop1 /tmp/test > > ./btrfs dev del /dev/loop1 /tmp/test > > ./btrfs fi bal start /tmp/test > > > > There is no actual restriping involved but the above example does work > > corretly under 3.1+for-linus whereas it fails with your patches. > > Thanks for your testing. The good news is that I put that BUG() there > simply for debugging so it's nothing major: > > 2520 if (ret) > 2521 BUG(); /* FIXME break ? */ > > It used to be just a break out of the loop there, so that's the reason > it doesn't panic with 3.1+for-linus. I'll investigate further and fix > this.
I force-rebased my tree, removed two other BUG_ONs along with this one. Thanks, Ilya diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index d7c5c7d..9b3d03d 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -2312,7 +2312,8 @@ static int chunk_drange_filter(struct extent_buffer *leaf, int factor; int i; - BUG_ON(!(bargs->flags & BTRFS_BALANCE_ARGS_DEVID)); + if (!(bargs->flags & BTRFS_BALANCE_ARGS_DEVID)) + return 0; if (btrfs_chunk_type(leaf, chunk) & (BTRFS_BLOCK_GROUP_DUP | BTRFS_BLOCK_GROUP_RAID1 | BTRFS_BLOCK_GROUP_RAID10)) @@ -2355,7 +2356,8 @@ static int chunk_vrange_filter(struct extent_buffer *leaf, static int chunk_soft_convert_filter(u64 chunk_profile, struct btrfs_balance_args *bargs) { - BUG_ON(!(bargs->flags & BTRFS_BALANCE_ARGS_CONVERT)); + if (!(bargs->flags & BTRFS_BALANCE_ARGS_CONVERT)) + return 0; chunk_profile &= BTRFS_BLOCK_GROUP_PROFILE_MASK; @@ -2518,7 +2520,7 @@ again: ret = btrfs_previous_item(chunk_root, path, 0, BTRFS_CHUNK_ITEM_KEY); if (ret) - BUG(); /* FIXME break ? */ + break; leaf = path->nodes[0]; slot = path->slots[0]; -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html