Merge tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64...
[linux-2.6-microblaze.git] / drivers / md / md.c
index 3bea45e..fc692b7 100644 (file)
@@ -193,10 +193,10 @@ struct bio *bio_alloc_mddev(gfp_t gfp_mask, int nr_iovecs,
 {
        struct bio *b;
 
-       if (!mddev || !mddev->bio_set)
+       if (!mddev || !bioset_initialized(&mddev->bio_set))
                return bio_alloc(gfp_mask, nr_iovecs);
 
-       b = bio_alloc_bioset(gfp_mask, nr_iovecs, mddev->bio_set);
+       b = bio_alloc_bioset(gfp_mask, nr_iovecs, &mddev->bio_set);
        if (!b)
                return NULL;
        return b;
@@ -205,10 +205,10 @@ EXPORT_SYMBOL_GPL(bio_alloc_mddev);
 
 static struct bio *md_bio_alloc_sync(struct mddev *mddev)
 {
-       if (!mddev || !mddev->sync_set)
+       if (!mddev || !bioset_initialized(&mddev->sync_set))
                return bio_alloc(GFP_NOIO, 1);
 
-       return bio_alloc_bioset(GFP_NOIO, 1, mddev->sync_set);
+       return bio_alloc_bioset(GFP_NOIO, 1, &mddev->sync_set);
 }
 
 /*
@@ -510,7 +510,10 @@ static void mddev_delayed_delete(struct work_struct *ws);
 
 static void mddev_put(struct mddev *mddev)
 {
-       struct bio_set *bs = NULL, *sync_bs = NULL;
+       struct bio_set bs, sync_bs;
+
+       memset(&bs, 0, sizeof(bs));
+       memset(&sync_bs, 0, sizeof(sync_bs));
 
        if (!atomic_dec_and_lock(&mddev->active, &all_mddevs_lock))
                return;
@@ -521,8 +524,8 @@ static void mddev_put(struct mddev *mddev)
                list_del_init(&mddev->all_mddevs);
                bs = mddev->bio_set;
                sync_bs = mddev->sync_set;
-               mddev->bio_set = NULL;
-               mddev->sync_set = NULL;
+               memset(&mddev->bio_set, 0, sizeof(mddev->bio_set));
+               memset(&mddev->sync_set, 0, sizeof(mddev->sync_set));
                if (mddev->gendisk) {
                        /* We did a probe so need to clean up.  Call
                         * queue_work inside the spinlock so that
@@ -535,10 +538,8 @@ static void mddev_put(struct mddev *mddev)
                        kfree(mddev);
        }
        spin_unlock(&all_mddevs_lock);
-       if (bs)
-               bioset_free(bs);
-       if (sync_bs)
-               bioset_free(sync_bs);
+       bioset_exit(&bs);
+       bioset_exit(&sync_bs);
 }
 
 static void md_safemode_timeout(struct timer_list *t);
@@ -2123,7 +2124,7 @@ int md_integrity_register(struct mddev *mddev)
                               bdev_get_integrity(reference->bdev));
 
        pr_debug("md: data integrity enabled on %s\n", mdname(mddev));
-       if (bioset_integrity_create(mddev->bio_set, BIO_POOL_SIZE)) {
+       if (bioset_integrity_create(&mddev->bio_set, BIO_POOL_SIZE)) {
                pr_err("md: failed to create integrity pool for %s\n",
                       mdname(mddev));
                return -EINVAL;
@@ -5497,17 +5498,15 @@ int md_run(struct mddev *mddev)
                sysfs_notify_dirent_safe(rdev->sysfs_state);
        }
 
-       if (mddev->bio_set == NULL) {
-               mddev->bio_set = bioset_create(BIO_POOL_SIZE, 0, BIOSET_NEED_BVECS);
-               if (!mddev->bio_set)
-                       return -ENOMEM;
+       if (!bioset_initialized(&mddev->bio_set)) {
+               err = bioset_init(&mddev->bio_set, BIO_POOL_SIZE, 0, BIOSET_NEED_BVECS);
+               if (err)
+                       return err;
        }
-       if (mddev->sync_set == NULL) {
-               mddev->sync_set = bioset_create(BIO_POOL_SIZE, 0, BIOSET_NEED_BVECS);
-               if (!mddev->sync_set) {
-                       err = -ENOMEM;
+       if (!bioset_initialized(&mddev->sync_set)) {
+               err = bioset_init(&mddev->sync_set, BIO_POOL_SIZE, 0, BIOSET_NEED_BVECS);
+               if (err)
                        goto abort;
-               }
        }
 
        spin_lock(&pers_lock);
@@ -5668,14 +5667,8 @@ int md_run(struct mddev *mddev)
        return 0;
 
 abort:
-       if (mddev->bio_set) {
-               bioset_free(mddev->bio_set);
-               mddev->bio_set = NULL;
-       }
-       if (mddev->sync_set) {
-               bioset_free(mddev->sync_set);
-               mddev->sync_set = NULL;
-       }
+       bioset_exit(&mddev->bio_set);
+       bioset_exit(&mddev->sync_set);
 
        return err;
 }
@@ -5888,14 +5881,8 @@ void md_stop(struct mddev *mddev)
         * This is called from dm-raid
         */
        __md_stop(mddev);
-       if (mddev->bio_set) {
-               bioset_free(mddev->bio_set);
-               mddev->bio_set = NULL;
-       }
-       if (mddev->sync_set) {
-               bioset_free(mddev->sync_set);
-               mddev->sync_set = NULL;
-       }
+       bioset_exit(&mddev->bio_set);
+       bioset_exit(&mddev->sync_set);
 }
 
 EXPORT_SYMBOL_GPL(md_stop);
@@ -9256,8 +9243,10 @@ void md_reload_sb(struct mddev *mddev, int nr)
        check_sb_changes(mddev, rdev);
 
        /* Read all rdev's to update recovery_offset */
-       rdev_for_each_rcu(rdev, mddev)
-               read_rdev(mddev, rdev);
+       rdev_for_each_rcu(rdev, mddev) {
+               if (!test_bit(Faulty, &rdev->flags))
+                       read_rdev(mddev, rdev);
+       }
 }
 EXPORT_SYMBOL(md_reload_sb);