summaryrefslogtreecommitdiff
path: root/fs/btrfs/volumes.h
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2010-12-13 14:56:23 -0500
committerChris Mason <chris.mason@oracle.com>2010-12-13 20:06:52 -0500
commitcd02dca56442e1504fd6bc5b96f7f1870162b266 (patch)
tree1a38d99fc581974ba6d8136c42ca81f3b1216ea3 /fs/btrfs/volumes.h
parent68433b73b104bff388aac376631d32abbbd872b0 (diff)
downloadlinux-3.10-cd02dca56442e1504fd6bc5b96f7f1870162b266.tar.gz
linux-3.10-cd02dca56442e1504fd6bc5b96f7f1870162b266.tar.bz2
linux-3.10-cd02dca56442e1504fd6bc5b96f7f1870162b266.zip
Btrfs: account for missing devices in RAID allocation profiles
When we mount in RAID degraded mode without adding a new device to replace the failed one, we can end up using the wrong RAID flags for allocations. This results in strange combinations of block groups (raid1 in a raid10 filesystem) and corruptions when we try to allocate blocks from single spindle chunks on drives that are actually missing. The first device has two small 4MB chunks in it that mkfs creates and these are usually unused in a raid1 or raid10 setup. But, in -o degraded, the allocator will fall back to these because the mask of desired raid groups isn't correct. The fix here is to count the missing devices as we build up the list of devices in the system. This count is used when picking the raid level to make sure we continue using the same levels that were in place before we lost a drive. Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/volumes.h')
-rw-r--r--fs/btrfs/volumes.h2
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h
index 31b0fabdd2e..a668c011698 100644
--- a/fs/btrfs/volumes.h
+++ b/fs/btrfs/volumes.h
@@ -45,6 +45,7 @@ struct btrfs_device {
int barriers;
int writeable;
int in_fs_metadata;
+ int missing;
spinlock_t io_lock;
@@ -94,6 +95,7 @@ struct btrfs_fs_devices {
u64 num_devices;
u64 open_devices;
u64 rw_devices;
+ u64 missing_devices;
u64 total_rw_bytes;
struct block_device *latest_bdev;