Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/shli/md
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 9 Jun 2018 19:01:36 +0000 (12:01 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 9 Jun 2018 19:01:36 +0000 (12:01 -0700)
Pull MD updates from Shaohua Li:
 "A few fixes of MD for this merge window. Mostly bug fixes:

   - raid5 stripe batch fix from Amy

   - Read error handling for raid1 FailFast device from Gioh

   - raid10 recovery NULL pointer dereference fix from Guoqing

   - Support write hint for raid5 stripe cache from Mariusz

   - Fixes for device hot add/remove from Neil and Yufen

   - Improve flush bio scalability from Xiao"

* 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/shli/md:
  MD: fix lock contention for flush bios
  md/raid5: Assigning NULL to sh->batch_head before testing bit R5_Overlap of a stripe
  md/raid1: add error handling of read error from FailFast device
  md: fix NULL dereference of mddev->pers in remove_and_add_spares()
  raid5: copy write hint from origin bio to stripe
  md: fix two problems with setting the "re-add" device state.
  raid10: check bio in r10buf_pool_free to void NULL pointer dereference
  md: fix an error code format and remove unsed bio_sector

1  2 
drivers/md/md.c
drivers/md/md.h
drivers/md/raid1.c
drivers/md/raid10.c
drivers/md/raid5.c
drivers/md/raid5.h

diff --cc drivers/md/md.c
@@@ -5489,16 -5518,34 +5510,32 @@@ 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;
 -                      goto abort;
 -              }
 +      if (!bioset_initialized(&mddev->sync_set)) {
 +              err = bioset_init(&mddev->sync_set, BIO_POOL_SIZE, 0, BIOSET_NEED_BVECS);
 +              if (err)
 +                      return err;
        }
+       if (mddev->flush_pool == NULL) {
+               mddev->flush_pool = mempool_create(NR_FLUSH_INFOS, flush_info_alloc,
+                                               flush_info_free, mddev);
+               if (!mddev->flush_pool) {
+                       err = -ENOMEM;
+                       goto abort;
+               }
+       }
+       if (mddev->flush_bio_pool == NULL) {
+               mddev->flush_bio_pool = mempool_create(NR_FLUSH_BIOS, flush_bio_alloc,
+                                               flush_bio_free, mddev);
+               if (!mddev->flush_bio_pool) {
+                       err = -ENOMEM;
+                       goto abort;
+               }
+       }
  
        spin_lock(&pers_lock);
        pers = find_pers(mddev->level, mddev->clevel);
        sysfs_notify_dirent_safe(mddev->sysfs_action);
        sysfs_notify(&mddev->kobj, NULL, "degraded");
        return 0;
 -      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;
 -      }
+ abort:
+       if (mddev->flush_bio_pool) {
+               mempool_destroy(mddev->flush_bio_pool);
+               mddev->flush_bio_pool = NULL;
+       }
+       if (mddev->flush_pool){
+               mempool_destroy(mddev->flush_pool);
+               mddev->flush_pool = NULL;
+       }
+       return err;
  }
  EXPORT_SYMBOL_GPL(md_run);
  
@@@ -5864,8 -5933,22 +5913,16 @@@ 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;
 -      }
+       if (mddev->flush_bio_pool) {
+               mempool_destroy(mddev->flush_bio_pool);
+               mddev->flush_bio_pool = NULL;
+       }
+       if (mddev->flush_pool) {
+               mempool_destroy(mddev->flush_pool);
+               mddev->flush_pool = NULL;
+       }
 +      bioset_exit(&mddev->bio_set);
 +      bioset_exit(&mddev->sync_set);
  }
  
  EXPORT_SYMBOL_GPL(md_stop);
diff --cc drivers/md/md.h
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge