|
@@ -1369,6 +1369,8 @@ int bch_flash_dev_create(struct cache_set *c, uint64_t size)
|
|
|
|
|
|
bool bch_cached_dev_error(struct cached_dev *dc)
|
|
bool bch_cached_dev_error(struct cached_dev *dc)
|
|
{
|
|
{
|
|
|
|
+ struct cache_set *c;
|
|
|
|
+
|
|
if (!dc || test_bit(BCACHE_DEV_CLOSING, &dc->disk.flags))
|
|
if (!dc || test_bit(BCACHE_DEV_CLOSING, &dc->disk.flags))
|
|
return false;
|
|
return false;
|
|
|
|
|
|
@@ -1379,6 +1381,21 @@ bool bch_cached_dev_error(struct cached_dev *dc)
|
|
pr_err("stop %s: too many IO errors on backing device %s\n",
|
|
pr_err("stop %s: too many IO errors on backing device %s\n",
|
|
dc->disk.disk->disk_name, dc->backing_dev_name);
|
|
dc->disk.disk->disk_name, dc->backing_dev_name);
|
|
|
|
|
|
|
|
+ /*
|
|
|
|
+ * If the cached device is still attached to a cache set,
|
|
|
|
+ * even dc->io_disable is true and no more I/O requests
|
|
|
|
+ * accepted, cache device internal I/O (writeback scan or
|
|
|
|
+ * garbage collection) may still prevent bcache device from
|
|
|
|
+ * being stopped. So here CACHE_SET_IO_DISABLE should be
|
|
|
|
+ * set to c->flags too, to make the internal I/O to cache
|
|
|
|
+ * device rejected and stopped immediately.
|
|
|
|
+ * If c is NULL, that means the bcache device is not attached
|
|
|
|
+ * to any cache set, then no CACHE_SET_IO_DISABLE bit to set.
|
|
|
|
+ */
|
|
|
|
+ c = dc->disk.c;
|
|
|
|
+ if (c && test_and_set_bit(CACHE_SET_IO_DISABLE, &c->flags))
|
|
|
|
+ pr_info("CACHE_SET_IO_DISABLE already set");
|
|
|
|
+
|
|
bcache_device_stop(&dc->disk);
|
|
bcache_device_stop(&dc->disk);
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|