On Thu, Apr 14, 2016 at 06:51:58PM +0800, Anand Jain wrote: > From: Anand Jain <anand.j...@oracle.com> > > This patch provides helper functions to force a device to offline > or failed, and we need this device states for the following reasons, > 1) a. it can be reported that device has failed when it does > b. close the device when it goes offline so that blocklayer can > cleanup > 2) identify the candidate for the auto replace > 3) avoid further commit error reported against the failing device and > 4) a device in the multi device btrfs may go offline from the system > (but as of now in in some system config btrfs gets unmounted in this > context, which is not a correct behavior) > > Signed-off-by: Anand Jain <anand.j...@oracle.com> > Tested-by: Austin S. Hemmelgarn <ahferro...@gmail.com> > --- > v5: > Originally we had a bug as fixed in the patch > [PATCH] btrfs: s_bdev is not null after missing replace > Incorporate those changes at force close a failed device. > To test pls have both this patch and above patch which > fixes the original issue, not introduced as part of this > patch set.
... > +void device_force_close(struct btrfs_device *device) > +{ > + struct btrfs_device *next_device; > + struct btrfs_fs_devices *fs_devices; > + > + fs_devices = device->fs_devices; > + > + mutex_lock(&fs_devices->device_list_mutex); > + mutex_lock(&fs_devices->fs_info->chunk_mutex); > + spin_lock(&fs_devices->fs_info->free_chunk_lock); > + > + next_device = list_entry(fs_devices->devices.next, > + struct btrfs_device, dev_list); > + if (fs_devices->fs_info->sb->s_bdev && > + (fs_devices->fs_info->sb->s_bdev == device->bdev)) > + fs_devices->fs_info->sb->s_bdev = next_device->bdev; > + > + if (device->bdev == fs_devices->latest_bdev) > + fs_devices->latest_bdev = next_device->bdev; latest_bdev can point to invalid bdev here if next_device is the same as closing device. -- Yauhen Kharuzhy -- 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