bcache: Fix leak of bdev reference
[sfrench/cifs-2.6.git] / drivers / md / bcache / super.c
index 8352fad765f61991c9725007ecbedff323ddacdb..c3fedd265d184b2408de14ce5fd7d83653026c07 100644 (file)
@@ -257,7 +257,7 @@ void bch_write_bdev_super(struct cached_dev *dc, struct closure *parent)
        closure_init(cl, parent);
 
        bio_reset(bio);
-       bio->bi_bdev    = dc->bdev;
+       bio_set_dev(bio, dc->bdev);
        bio->bi_end_io  = write_bdev_super_endio;
        bio->bi_private = dc;
 
@@ -303,7 +303,7 @@ void bcache_write_super(struct cache_set *c)
                SET_CACHE_SYNC(&ca->sb, CACHE_SYNC(&c->sb));
 
                bio_reset(bio);
-               bio->bi_bdev    = ca->bdev;
+               bio_set_dev(bio, ca->bdev);
                bio->bi_end_io  = write_super_endio;
                bio->bi_private = ca;
 
@@ -508,7 +508,7 @@ static void prio_io(struct cache *ca, uint64_t bucket, int op,
        closure_init_stack(cl);
 
        bio->bi_iter.bi_sector  = bucket * ca->sb.bucket_size;
-       bio->bi_bdev            = ca->bdev;
+       bio_set_dev(bio, ca->bdev);
        bio->bi_iter.bi_size    = bucket_bytes(ca);
 
        bio->bi_end_io  = prio_endio;
@@ -1964,6 +1964,8 @@ static ssize_t register_bcache(struct kobject *k, struct kobj_attribute *attr,
                        else
                                err = "device busy";
                        mutex_unlock(&bch_register_lock);
+                       if (!IS_ERR(bdev))
+                               bdput(bdev);
                        if (attr == &ksysfs_register_quiet)
                                goto out;
                }