Merge tag 'dm-4.9-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/device...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 28 Oct 2016 16:27:58 +0000 (09:27 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 28 Oct 2016 16:27:58 +0000 (09:27 -0700)
Pull device mapper fixes from Mike Snitzer:

 - a couple DM raid and DM mirror fixes

 - a couple .request_fn request-based DM NULL pointer fixes

 - a fix for a DM target reference count leak, on target load error,
   that prevented associated DM target kernel module(s) from being
   removed

* tag 'dm-4.9-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/device-mapper/linux-dm:
  dm table: fix missing dm_put_target_type() in dm_table_add_target()
  dm rq: clear kworker_task if kthread_run() returned an error
  dm: free io_barrier after blk_cleanup_queue call
  dm raid: fix activation of existing raid4/10 devices
  dm mirror: use all available legs on multiple failures
  dm mirror: fix read error on recovery after default leg failure
  dm raid: fix compat_features validation

1  2 
drivers/md/dm-rq.c
drivers/md/dm.c

diff --combined drivers/md/dm-rq.c
@@@ -581,7 -581,7 +581,7 @@@ static void init_tio(struct dm_rq_targe
        if (!md->init_tio_pdu)
                memset(&tio->info, 0, sizeof(tio->info));
        if (md->kworker_task)
 -              init_kthread_work(&tio->work, map_tio_request);
 +              kthread_init_work(&tio->work, map_tio_request);
  }
  
  static struct dm_rq_target_io *dm_old_prep_tio(struct request *rq,
@@@ -831,7 -831,7 +831,7 @@@ static void dm_old_request_fn(struct re
                tio = tio_from_request(rq);
                /* Establish tio->ti before queuing work (map_tio_request) */
                tio->ti = ti;
 -              queue_kthread_work(&md->kworker, &tio->work);
 +              kthread_queue_work(&md->kworker, &tio->work);
                BUG_ON(!irqs_disabled());
        }
  }
@@@ -853,11 -853,14 +853,14 @@@ int dm_old_init_request_queue(struct ma
        blk_queue_prep_rq(md->queue, dm_old_prep_fn);
  
        /* Initialize the request-based DM worker thread */
 -      init_kthread_worker(&md->kworker);
 +      kthread_init_worker(&md->kworker);
        md->kworker_task = kthread_run(kthread_worker_fn, &md->kworker,
                                       "kdmwork-%s", dm_device_name(md));
-       if (IS_ERR(md->kworker_task))
-               return PTR_ERR(md->kworker_task);
+       if (IS_ERR(md->kworker_task)) {
+               int error = PTR_ERR(md->kworker_task);
+               md->kworker_task = NULL;
+               return error;
+       }
  
        elv_register_queue(md->queue);
  
diff --combined drivers/md/dm.c
@@@ -1423,8 -1423,6 +1423,6 @@@ static void cleanup_mapped_device(struc
        if (md->bs)
                bioset_free(md->bs);
  
-       cleanup_srcu_struct(&md->io_barrier);
        if (md->disk) {
                spin_lock(&_minor_lock);
                md->disk->private_data = NULL;
        if (md->queue)
                blk_cleanup_queue(md->queue);
  
+       cleanup_srcu_struct(&md->io_barrier);
        if (md->bdev) {
                bdput(md->bdev);
                md->bdev = NULL;
@@@ -1891,7 -1891,7 +1891,7 @@@ static void __dm_destroy(struct mapped_
        spin_unlock_irq(q->queue_lock);
  
        if (dm_request_based(md) && md->kworker_task)
 -              flush_kthread_worker(&md->kworker);
 +              kthread_flush_worker(&md->kworker);
  
        /*
         * Take suspend_lock so that presuspend and postsuspend methods
@@@ -2147,7 -2147,7 +2147,7 @@@ static int __dm_suspend(struct mapped_d
        if (dm_request_based(md)) {
                dm_stop_queue(md->queue);
                if (md->kworker_task)
 -                      flush_kthread_worker(&md->kworker);
 +                      kthread_flush_worker(&md->kworker);
        }
  
        flush_workqueue(md->wq);