|
@@ -1835,11 +1835,12 @@ static int cache_alloc(struct cache_sb *sb, struct cache *ca)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static void register_cache(struct cache_sb *sb, struct page *sb_page,
|
|
|
+static int register_cache(struct cache_sb *sb, struct page *sb_page,
|
|
|
struct block_device *bdev, struct cache *ca)
|
|
|
{
|
|
|
char name[BDEVNAME_SIZE];
|
|
|
- const char *err = "cannot allocate memory";
|
|
|
+ const char *err = NULL;
|
|
|
+ int ret = 0;
|
|
|
|
|
|
memcpy(&ca->sb, sb, sizeof(struct cache_sb));
|
|
|
ca->bdev = bdev;
|
|
@@ -1854,27 +1855,35 @@ static void register_cache(struct cache_sb *sb, struct page *sb_page,
|
|
|
if (blk_queue_discard(bdev_get_queue(ca->bdev)))
|
|
|
ca->discard = CACHE_DISCARD(&ca->sb);
|
|
|
|
|
|
- if (cache_alloc(sb, ca) != 0)
|
|
|
+ ret = cache_alloc(sb, ca);
|
|
|
+ if (ret != 0)
|
|
|
goto err;
|
|
|
|
|
|
- err = "error creating kobject";
|
|
|
- if (kobject_add(&ca->kobj, &part_to_dev(bdev->bd_part)->kobj, "bcache"))
|
|
|
- goto err;
|
|
|
+ if (kobject_add(&ca->kobj, &part_to_dev(bdev->bd_part)->kobj, "bcache")) {
|
|
|
+ err = "error calling kobject_add";
|
|
|
+ ret = -ENOMEM;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
|
|
|
mutex_lock(&bch_register_lock);
|
|
|
err = register_cache_set(ca);
|
|
|
mutex_unlock(&bch_register_lock);
|
|
|
|
|
|
- if (err)
|
|
|
- goto err;
|
|
|
+ if (err) {
|
|
|
+ ret = -ENODEV;
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
|
|
|
pr_info("registered cache device %s", bdevname(bdev, name));
|
|
|
+
|
|
|
out:
|
|
|
kobject_put(&ca->kobj);
|
|
|
- return;
|
|
|
+
|
|
|
err:
|
|
|
- pr_notice("error opening %s: %s", bdevname(bdev, name), err);
|
|
|
- goto out;
|
|
|
+ if (err)
|
|
|
+ pr_notice("error opening %s: %s", bdevname(bdev, name), err);
|
|
|
+
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
/* Global interfaces/init */
|
|
@@ -1972,7 +1981,8 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr,
|
|
|
if (!ca)
|
|
|
goto err_close;
|
|
|
|
|
|
- register_cache(sb, sb_page, bdev, ca);
|
|
|
+ if (register_cache(sb, sb_page, bdev, ca) != 0)
|
|
|
+ goto err_close;
|
|
|
}
|
|
|
out:
|
|
|
if (sb_page)
|