| From f88ba6a2a44ee98e8d59654463dc157bb6d13c43 Mon Sep 17 00:00:00 2001 |
| From: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com> |
| Date: Wed, 5 Feb 2014 16:34:38 +0900 |
| Subject: Btrfs: skip submitting barrier for missing device |
| |
| From: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com> |
| |
| commit f88ba6a2a44ee98e8d59654463dc157bb6d13c43 upstream. |
| |
| I got an error on v3.13: |
| BTRFS error (device sdf1) in write_all_supers:3378: errno=-5 IO failure (errors while submitting device barriers.) |
| |
| how to reproduce: |
| > mkfs.btrfs -f -d raid1 /dev/sdf1 /dev/sdf2 |
| > wipefs -a /dev/sdf2 |
| > mount -o degraded /dev/sdf1 /mnt |
| > btrfs balance start -f -sconvert=single -mconvert=single -dconvert=single /mnt |
| |
| The reason of the error is that barrier_all_devices() failed to submit |
| barrier to the missing device. However it is clear that we cannot do |
| anything on missing device, and also it is not necessary to care chunks |
| on the missing device. |
| |
| This patch stops sending/waiting barrier if device is missing. |
| |
| Signed-off-by: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com> |
| Signed-off-by: Josef Bacik <jbacik@fb.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/btrfs/disk-io.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| --- a/fs/btrfs/disk-io.c |
| +++ b/fs/btrfs/disk-io.c |
| @@ -3161,6 +3161,8 @@ static int barrier_all_devices(struct bt |
| /* send down all the barriers */ |
| head = &info->fs_devices->devices; |
| list_for_each_entry_rcu(dev, head, dev_list) { |
| + if (dev->missing) |
| + continue; |
| if (!dev->bdev) { |
| errors_send++; |
| continue; |
| @@ -3175,6 +3177,8 @@ static int barrier_all_devices(struct bt |
| |
| /* wait for all the barriers */ |
| list_for_each_entry_rcu(dev, head, dev_list) { |
| + if (dev->missing) |
| + continue; |
| if (!dev->bdev) { |
| errors_wait++; |
| continue; |