Btrfs: fix off by one while setting block groups readonly
authorChris Mason <chris.mason@oracle.com>
Fri, 24 Dec 2010 11:41:52 +0000 (06:41 -0500)
committerChris Mason <chris.mason@oracle.com>
Tue, 4 Jan 2011 21:41:39 +0000 (16:41 -0500)
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>
fs/btrfs/extent-tree.c

index 7e5162e5c4116c54fb67339462c421ae8ea0a59f..b180efdc8b68e9f648b7255dd010498c166fecf5 100644 (file)
@@ -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;