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: Coly Li <colyli@suse.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Родитель
89e0341af0
Коммит
0b13efecf5
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
"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,
|
||||||
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,
|
||||||
|
|
||||||
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,
|
||||||
{
|
{
|
||||||
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,
|
||||||
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)
|
||||||
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);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче