On Sat, May 06, 2017 at 07:17:54AM +0800, Anand Jain wrote: > This adds comments to the flush error handling part of > the code, and hopes to maintain the same logic with a > framework which can be used to handle the errors at the > volume level. > > Signed-off-by: Anand Jain <anand.j...@oracle.com>
Reviewed-by: David Sterba <dste...@suse.com> So the next step is to preallocate the flush_bio and remove the ENOMEM handling. I think we can skip the error handling on the submission path, even if submit_bio can fail, the error code will be stored to the bio and this will be checked in the waiting side. Then write_dev_flush can be split into 2 functions by the parameter 'wait', as the paths are completely independent. > +static int check_barrier_error(struct btrfs_fs_devices *fsdevs) > +{ > + int submit_flush_error = 0; > + int dev_flush_error = 0; > + struct btrfs_device *dev; > + int tolerance; > + > + list_for_each_entry_rcu(dev, &fsdevs->devices, dev_list) { > + if (!dev->bdev) { > + submit_flush_error++; > + dev_flush_error++; > + continue; > + } > + if (dev->last_flush_error == -ENOMEM) > + submit_flush_error++; > + if (dev->last_flush_error && dev->last_flush_error != -ENOMEM) > + dev_flush_error++; > + } > + > + tolerance = fsdevs->fs_info->num_tolerated_disk_barrier_failures; > + if (submit_flush_error > tolerance || dev_flush_error > tolerance) > + return -EIO; Actually, after reading submit_bio and the comment above, do we need to care about the submission errors? As submit_bio could return -EIO immeditaelly, but does not help us anyway. We'll wait and check again later. It's the bio completion what counts. This should simplify the code. -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html