Commit 0b13efec authored by Coly Li's avatar Coly Li Committed by Jens Axboe

bcache: add return value check to bch_cached_dev_run()

This patch adds return value check to bch_cached_dev_run(), now if there
is error happens inside bch_cached_dev_run(), it can be catched.
Signed-off-by: default avatarColy Li <colyli@suse.de>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 89e0341a
...@@ -1006,7 +1006,7 @@ int bch_flash_dev_create(struct cache_set *c, uint64_t size); ...@@ -1006,7 +1006,7 @@ int bch_flash_dev_create(struct cache_set *c, uint64_t size);
int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c, int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c,
uint8_t *set_uuid); uint8_t *set_uuid);
void bch_cached_dev_detach(struct cached_dev *dc); void bch_cached_dev_detach(struct cached_dev *dc);
void bch_cached_dev_run(struct cached_dev *dc); int bch_cached_dev_run(struct cached_dev *dc);
void bcache_device_stop(struct bcache_device *d); void bcache_device_stop(struct bcache_device *d);
void bch_cache_set_unregister(struct cache_set *c); void bch_cache_set_unregister(struct cache_set *c);
......
...@@ -910,7 +910,7 @@ static int cached_dev_status_update(void *arg) ...@@ -910,7 +910,7 @@ static int cached_dev_status_update(void *arg)
} }
void bch_cached_dev_run(struct cached_dev *dc) int bch_cached_dev_run(struct cached_dev *dc)
{ {
struct bcache_device *d = &dc->disk; struct bcache_device *d = &dc->disk;
char *buf = kmemdup_nul(dc->sb.label, SB_LABEL_SIZE, GFP_KERNEL); char *buf = kmemdup_nul(dc->sb.label, SB_LABEL_SIZE, GFP_KERNEL);
...@@ -921,11 +921,14 @@ void bch_cached_dev_run(struct cached_dev *dc) ...@@ -921,11 +921,14 @@ void bch_cached_dev_run(struct cached_dev *dc)
NULL, NULL,
}; };
if (dc->io_disable)
return -EIO;
if (atomic_xchg(&dc->running, 1)) { if (atomic_xchg(&dc->running, 1)) {
kfree(env[1]); kfree(env[1]);
kfree(env[2]); kfree(env[2]);
kfree(buf); kfree(buf);
return; return -EBUSY;
} }
if (!d->c && if (!d->c &&
...@@ -951,8 +954,11 @@ void bch_cached_dev_run(struct cached_dev *dc) ...@@ -951,8 +954,11 @@ void bch_cached_dev_run(struct cached_dev *dc)
kfree(buf); kfree(buf);
if (sysfs_create_link(&d->kobj, &disk_to_dev(d->disk)->kobj, "dev") || if (sysfs_create_link(&d->kobj, &disk_to_dev(d->disk)->kobj, "dev") ||
sysfs_create_link(&disk_to_dev(d->disk)->kobj, &d->kobj, "bcache")) sysfs_create_link(&disk_to_dev(d->disk)->kobj,
&d->kobj, "bcache")) {
pr_debug("error creating sysfs link"); pr_debug("error creating sysfs link");
return -ENOMEM;
}
dc->status_update_thread = kthread_run(cached_dev_status_update, dc->status_update_thread = kthread_run(cached_dev_status_update,
dc, "bcache_status_update"); dc, "bcache_status_update");
...@@ -961,6 +967,8 @@ void bch_cached_dev_run(struct cached_dev *dc) ...@@ -961,6 +967,8 @@ void bch_cached_dev_run(struct cached_dev *dc)
"continue to run without monitoring backing " "continue to run without monitoring backing "
"device status"); "device status");
} }
return 0;
} }
/* /*
...@@ -1056,6 +1064,7 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c, ...@@ -1056,6 +1064,7 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c,
uint32_t rtime = cpu_to_le32((u32)ktime_get_real_seconds()); uint32_t rtime = cpu_to_le32((u32)ktime_get_real_seconds());
struct uuid_entry *u; struct uuid_entry *u;
struct cached_dev *exist_dc, *t; struct cached_dev *exist_dc, *t;
int ret = 0;
if ((set_uuid && memcmp(set_uuid, c->sb.set_uuid, 16)) || if ((set_uuid && memcmp(set_uuid, c->sb.set_uuid, 16)) ||
(!set_uuid && memcmp(dc->sb.set_uuid, c->sb.set_uuid, 16))) (!set_uuid && memcmp(dc->sb.set_uuid, c->sb.set_uuid, 16)))
...@@ -1165,7 +1174,12 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c, ...@@ -1165,7 +1174,12 @@ int bch_cached_dev_attach(struct cached_dev *dc, struct cache_set *c,
bch_sectors_dirty_init(&dc->disk); bch_sectors_dirty_init(&dc->disk);
bch_cached_dev_run(dc); ret = bch_cached_dev_run(dc);
if (ret && (ret != -EBUSY)) {
up_write(&dc->writeback_lock);
return ret;
}
bcache_device_link(&dc->disk, c, "bdev"); bcache_device_link(&dc->disk, c, "bdev");
atomic_inc(&c->attached_dev_nr); atomic_inc(&c->attached_dev_nr);
...@@ -1292,6 +1306,7 @@ static int register_bdev(struct cache_sb *sb, struct page *sb_page, ...@@ -1292,6 +1306,7 @@ static int register_bdev(struct cache_sb *sb, struct page *sb_page,
{ {
const char *err = "cannot allocate memory"; const char *err = "cannot allocate memory";
struct cache_set *c; struct cache_set *c;
int ret = -ENOMEM;
bdevname(bdev, dc->backing_dev_name); bdevname(bdev, dc->backing_dev_name);
memcpy(&dc->sb, sb, sizeof(struct cache_sb)); memcpy(&dc->sb, sb, sizeof(struct cache_sb));
...@@ -1321,14 +1336,18 @@ static int register_bdev(struct cache_sb *sb, struct page *sb_page, ...@@ -1321,14 +1336,18 @@ static int register_bdev(struct cache_sb *sb, struct page *sb_page,
bch_cached_dev_attach(dc, c, NULL); bch_cached_dev_attach(dc, c, NULL);
if (BDEV_STATE(&dc->sb) == BDEV_STATE_NONE || if (BDEV_STATE(&dc->sb) == BDEV_STATE_NONE ||
BDEV_STATE(&dc->sb) == BDEV_STATE_STALE) BDEV_STATE(&dc->sb) == BDEV_STATE_STALE) {
bch_cached_dev_run(dc); err = "failed to run cached device";
ret = bch_cached_dev_run(dc);
if (ret)
goto err;
}
return 0; return 0;
err: err:
pr_notice("error %s: %s", dc->backing_dev_name, err); pr_notice("error %s: %s", dc->backing_dev_name, err);
bcache_device_stop(&dc->disk); bcache_device_stop(&dc->disk);
return -EIO; return ret;
} }
/* Flash only volumes */ /* Flash only volumes */
......
...@@ -325,8 +325,11 @@ STORE(__cached_dev) ...@@ -325,8 +325,11 @@ STORE(__cached_dev)
bch_cache_accounting_clear(&dc->accounting); bch_cache_accounting_clear(&dc->accounting);
if (attr == &sysfs_running && if (attr == &sysfs_running &&
strtoul_or_return(buf)) strtoul_or_return(buf)) {
bch_cached_dev_run(dc); v = bch_cached_dev_run(dc);
if (v)
return v;
}
if (attr == &sysfs_cache_mode) { if (attr == &sysfs_cache_mode) {
v = sysfs_match_string(bch_cache_modes, buf); v = sysfs_match_string(bch_cache_modes, buf);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment