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

Reply via email to