On 04/19/2019 11:24 AM, Coly Li wrote:
> 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 <[email protected]>
> ---
>   drivers/md/bcache/super.c | 16 ++++++++++------
>   1 file changed, 10 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c
> index 400af446c372..a435c506edba 100644
> --- a/drivers/md/bcache/super.c
> +++ b/drivers/md/bcache/super.c
> @@ -1281,7 +1281,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)
>   {
> @@ -1319,10 +1319,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);
So register_bdev has couple of goto err; calls where kobject interface 
is used directly :-

register_bdev
        kobject_add

and

indirectly :-
register_bdev
        bch_cache_accounting_add_kobjs

                kobject_add
Here we return -EIO, we should catch the error code from kobject calls 
and return that error instead of -EIO. Any thoughts ?

> +     return -EIO;
>   }
>
>   /* Flash only volumes */
> @@ -2273,7 +2274,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;
> @@ -2307,7 +2308,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;
>       }
> @@ -2328,8 +2329,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);
>
> @@ -2339,6 +2342,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);
> @@ -2351,7 +2356,6 @@ static ssize_t register_bcache(struct kobject *k, 
> struct kobj_attribute *attr,
>       blkdev_put(bdev, FMODE_READ|FMODE_WRITE|FMODE_EXCL);
>   err:
>       pr_info("error %s: %s", path, err);
> -     ret = -EINVAL;
>       goto out;
>   }
>
>

Reply via email to