diff options
author | Ilya Dryomov <idryomov@gmail.com> | 2012-03-27 17:09:18 +0300 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2012-03-27 17:09:18 +0300 |
commit | 213e64da90d14537cd63f7090d6c4d1fcc75d9f8 (patch) | |
tree | c7603bcc554d033ef0521a0a7898c924930721e7 | |
parent | 5eb56d2520fe16f00756ccdf8eebc277398e0f44 (diff) | |
download | op-kernel-dev-213e64da90d14537cd63f7090d6c4d1fcc75d9f8.zip op-kernel-dev-213e64da90d14537cd63f7090d6c4d1fcc75d9f8.tar.gz |
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>
-rw-r--r-- | 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; |