If relocate of block group 0 fails with ENOSPC we end up infinitely
looping because key.offset -= 1 statement in that case brings us back to
where we started.

Signed-off-by: Ilya Dryomov <[email protected]>
---
 fs/btrfs/volumes.c |    5 ++---
 1 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index bcc0acd..be2d4e0 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -2987,7 +2987,7 @@ again:
        key.offset = (u64)-1;
        key.type = BTRFS_DEV_EXTENT_KEY;
 
-       while (1) {
+       do {
                ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
                if (ret < 0)
                        goto done;
@@ -3029,8 +3029,7 @@ again:
                        goto done;
                if (ret == -ENOSPC)
                        failed++;
-               key.offset -= 1;
-       }
+       } while (key.offset-- > 0);
 
        if (failed && !retried) {
                failed = 0;
-- 
1.7.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to