summaryrefslogtreecommitdiffstats
path: root/fs/btrfs/disk-io.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2008-04-29 09:38:00 -0400
committerChris Mason <chris.mason@oracle.com>2008-09-25 11:04:02 -0400
commita236aed14ccb0661611d4416f6b573d892bdc60a (patch)
treeb275333ab5bfaa9ea68756aa0a5c6d5c6fef5405 /fs/btrfs/disk-io.c
parent4235298e4fc3c1a09f659cfe2fd285024eeb2241 (diff)
downloadop-kernel-dev-a236aed14ccb0661611d4416f6b573d892bdc60a.zip
op-kernel-dev-a236aed14ccb0661611d4416f6b573d892bdc60a.tar.gz
Btrfs: Deal with failed writes in mirrored configurations
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/disk-io.c')
-rw-r--r--fs/btrfs/disk-io.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c
index 1c7d84a..e35e701 100644
--- a/fs/btrfs/disk-io.c
+++ b/fs/btrfs/disk-io.c
@@ -1385,7 +1385,10 @@ int write_all_supers(struct btrfs_root *root)
struct buffer_head *bh;
int ret;
int do_barriers;
+ int max_errors;
+ int total_errors = 0;
+ max_errors = btrfs_super_num_devices(&root->fs_info->super_copy) - 1;
do_barriers = !btrfs_test_opt(root, NOBARRIER);
sb = root->fs_info->sb_buffer;
@@ -1433,8 +1436,14 @@ int write_all_supers(struct btrfs_root *root)
} else {
ret = submit_bh(WRITE, bh);
}
- BUG_ON(ret);
+ if (ret)
+ total_errors++;
}
+ if (total_errors > max_errors) {
+ printk("btrfs: %d errors while writing supers\n", total_errors);
+ BUG();
+ }
+ total_errors = 0;
list_for_each(cur, head) {
dev = list_entry(cur, struct btrfs_device, dev_list);
@@ -1454,13 +1463,17 @@ int write_all_supers(struct btrfs_root *root)
wait_on_buffer(bh);
BUG_ON(!buffer_uptodate(bh));
} else {
- BUG();
+ total_errors++;
}
}
dev->pending_io = NULL;
brelse(bh);
}
+ if (total_errors > max_errors) {
+ printk("btrfs: %d errors while writing supers\n", total_errors);
+ BUG();
+ }
return 0;
}
OpenPOWER on IntegriCloud