summaryrefslogtreecommitdiffstats
path: root/fs/btrfs/volumes.c
diff options
context:
space:
mode:
authorIlya Dryomov2012-03-27 16:09:18 +0200
committerIlya Dryomov2012-03-27 16:09:18 +0200
commit213e64da90d14537cd63f7090d6c4d1fcc75d9f8 (patch)
treec7603bcc554d033ef0521a0a7898c924930721e7 /fs/btrfs/volumes.c
parentBtrfs: fix memory leak in resolver code (diff)
downloadkernel-qcow2-linux-213e64da90d14537cd63f7090d6c4d1fcc75d9f8.tar.gz
kernel-qcow2-linux-213e64da90d14537cd63f7090d6c4d1fcc75d9f8.tar.xz
kernel-qcow2-linux-213e64da90d14537cd63f7090d6c4d1fcc75d9f8.zip
Btrfs: fix infinite loop in btrfs_shrink_device()
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 <idryomov@gmail.com>
Diffstat (limited to 'fs/btrfs/volumes.c')
-rw-r--r--fs/btrfs/volumes.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index bcc0acda8691..be2d4e0e6cfb 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;