Merge branch 'stable/for-jens-4.15' of git://git.kernel.org/pub/scm/linux/kernel...
authorJens Axboe <axboe@kernel.dk>
Thu, 8 Mar 2018 16:24:52 +0000 (09:24 -0700)
committerJens Axboe <axboe@kernel.dk>
Thu, 8 Mar 2018 16:24:52 +0000 (09:24 -0700)
Pull a xen_blkfront fix from Konrad:

"It has one simple fix for the multi-queue support not showing up after
a block device was detached/re-attached."

* 'stable/for-jens-4.15' of git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen:
  xen-blkfront: move negotiate_mq to cover all cases of new VBDs

1  2 
drivers/block/xen-blkfront.c

index e126e4cac2ca499566da91a6e3da01d0b1e4381e,7d23225f79ed3e5975ade384cfde7bdae6097224..92ec1bbece51d31c44f88eb6a2037333dd7a9f40
@@@ -262,6 -262,7 +262,7 @@@ static DEFINE_SPINLOCK(minor_lock)
  
  static int blkfront_setup_indirect(struct blkfront_ring_info *rinfo);
  static void blkfront_gather_backend_features(struct blkfront_info *info);
+ static int negotiate_mq(struct blkfront_info *info);
  
  static int get_id_from_freelist(struct blkfront_ring_info *rinfo)
  {
@@@ -911,7 -912,7 +912,7 @@@ out_err
  out_busy:
        blk_mq_stop_hw_queue(hctx);
        spin_unlock_irqrestore(&rinfo->ring_lock, flags);
 -      return BLK_STS_RESOURCE;
 +      return BLK_STS_DEV_RESOURCE;
  }
  
  static void blkif_complete_rq(struct request *rq)
@@@ -1774,11 -1775,18 +1775,18 @@@ static int talk_to_blkback(struct xenbu
        unsigned int i, max_page_order;
        unsigned int ring_page_order;
  
+       if (!info)
+               return -ENODEV;
        max_page_order = xenbus_read_unsigned(info->xbdev->otherend,
                                              "max-ring-page-order", 0);
        ring_page_order = min(xen_blkif_max_ring_order, max_page_order);
        info->nr_ring_pages = 1 << ring_page_order;
  
+       err = negotiate_mq(info);
+       if (err)
+               goto destroy_blkring;
        for (i = 0; i < info->nr_rings; i++) {
                struct blkfront_ring_info *rinfo = &info->rinfo[i];
  
@@@ -1978,11 -1986,6 +1986,6 @@@ static int blkfront_probe(struct xenbus
        }
  
        info->xbdev = dev;
-       err = negotiate_mq(info);
-       if (err) {
-               kfree(info);
-               return err;
-       }
  
        mutex_init(&info->mutex);
        info->vdevice = vdevice;
@@@ -2099,10 -2102,6 +2102,6 @@@ static int blkfront_resume(struct xenbu
  
        blkif_free(info, info->connected == BLKIF_STATE_CONNECTED);
  
-       err = negotiate_mq(info);
-       if (err)
-               return err;
        err = talk_to_blkback(dev, info);
        if (!err)
                blk_mq_update_nr_hw_queues(&info->tag_set, info->nr_rings);