diff options
author | Chris Mason <chris.mason@oracle.com> | 2010-12-24 12:41:52 +0100 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2011-01-04 22:41:39 +0100 |
commit | 65e5341b9a0c39767ae1fecc727d70eda0dd6d83 (patch) | |
tree | 09f54177bfb8c93b2320d84317705bec6dcc42a6 | |
parent | Btrfs: prevent RAID level downgrades when space is low (diff) | |
download | linux-65e5341b9a0c39767ae1fecc727d70eda0dd6d83.tar.xz linux-65e5341b9a0c39767ae1fecc727d70eda0dd6d83.zip |
Btrfs: fix off by one while setting block groups readonly
When we read in block groups, we'll set non-redundant groups
readonly if we find a raid1, DUP or raid10 group. But the
ro code has an off by one bug in the math around testing to
make sure out accounting doesn't go wrong.
Signed-off-by: Chris Mason <chris.mason@oracle.com>
-rw-r--r-- | fs/btrfs/extent-tree.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 7e5162e5c411..b180efdc8b68 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -7971,13 +7971,14 @@ static int set_block_group_ro(struct btrfs_block_group_cache *cache) if (sinfo->bytes_used + sinfo->bytes_reserved + sinfo->bytes_pinned + sinfo->bytes_may_use + sinfo->bytes_readonly + - cache->reserved_pinned + num_bytes < sinfo->total_bytes) { + cache->reserved_pinned + num_bytes <= sinfo->total_bytes) { sinfo->bytes_readonly += num_bytes; sinfo->bytes_reserved += cache->reserved_pinned; cache->reserved_pinned = 0; cache->ro = 1; ret = 0; } + spin_unlock(&cache->lock); spin_unlock(&sinfo->lock); return ret; |