bcache: add error check for calling register_bdev()
authorColy Li <colyli@suse.de>
Wed, 24 Apr 2019 16:48:37 +0000 (00:48 +0800)
committerJens Axboe <axboe@kernel.dk>
Wed, 24 Apr 2019 16:56:28 +0000 (10:56 -0600)
This patch adds return value to register_bdev(). Then if failure happens
inside register_bdev(), its caller register_bcache() may detect and
handle the failure more properly.

Signed-off-by: Coly Li <colyli@suse.de>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
drivers/md/bcache/super.c

index f8d80ad..fde3349 100644 (file)
@@ -1279,7 +1279,7 @@ static int cached_dev_init(struct cached_dev *dc, unsigned int block_size)
 
 /* Cached device - bcache superblock */
 
-static void register_bdev(struct cache_sb *sb, struct page *sb_page,
+static int register_bdev(struct cache_sb *sb, struct page *sb_page,
                                 struct block_device *bdev,
                                 struct cached_dev *dc)
 {
@@ -1317,10 +1317,11 @@ static void register_bdev(struct cache_sb *sb, struct page *sb_page,
            BDEV_STATE(&dc->sb) == BDEV_STATE_STALE)
                bch_cached_dev_run(dc);
 
-       return;
+       return 0;
 err:
        pr_notice("error %s: %s", dc->backing_dev_name, err);
        bcache_device_stop(&dc->disk);
+       return -EIO;
 }
 
 /* Flash only volumes */
@@ -2271,7 +2272,7 @@ static bool bch_is_open(struct block_device *bdev)
 static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr,
                               const char *buffer, size_t size)
 {
-       ssize_t ret = size;
+       ssize_t ret = -EINVAL;
        const char *err = "cannot allocate memory";
        char *path = NULL;
        struct cache_sb *sb = NULL;
@@ -2305,7 +2306,7 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr,
                        if (!IS_ERR(bdev))
                                bdput(bdev);
                        if (attr == &ksysfs_register_quiet)
-                               goto out;
+                               goto quiet_out;
                }
                goto err;
        }
@@ -2326,8 +2327,10 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr,
                        goto err_close;
 
                mutex_lock(&bch_register_lock);
-               register_bdev(sb, sb_page, bdev, dc);
+               ret = register_bdev(sb, sb_page, bdev, dc);
                mutex_unlock(&bch_register_lock);
+               if (ret < 0)
+                       goto err;
        } else {
                struct cache *ca = kzalloc(sizeof(*ca), GFP_KERNEL);
 
@@ -2337,6 +2340,8 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr,
                if (register_cache(sb, sb_page, bdev, ca) != 0)
                        goto err;
        }
+quiet_out:
+       ret = size;
 out:
        if (sb_page)
                put_page(sb_page);
@@ -2349,7 +2354,6 @@ err_close:
        blkdev_put(bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL);
 err:
        pr_info("error %s: %s", path, err);
-       ret = -EINVAL;
        goto out;
 }