scsi: fnic: replace gross legacy tag hack with blk-mq hack
authorJens Axboe <axboe@kernel.dk>
Tue, 16 Oct 2018 14:37:23 +0000 (08:37 -0600)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 18 Oct 2018 02:06:04 +0000 (22:06 -0400)
Would be nice to fix up the SCSI midlayer instead, but this will do for
now.

Cc: Christoph Hellwig <hch@lst.de>
Cc: Satish Kharat <satishkh@cisco.com>
Cc: linux-scsi@vger.kernel.org
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/fnic/fnic_scsi.c

index 12a2f8f..96acfce 100644 (file)
@@ -2266,33 +2266,17 @@ clean_pending_aborts_end:
 static inline int
 fnic_scsi_host_start_tag(struct fnic *fnic, struct scsi_cmnd *sc)
 {
-       struct blk_queue_tag *bqt = fnic->lport->host->bqt;
-       int tag, ret = SCSI_NO_TAG;
+       struct request_queue *q = sc->request->q;
+       struct request *dummy;
 
-       BUG_ON(!bqt);
-       if (!bqt) {
-               pr_err("Tags are not supported\n");
-               goto end;
-       }
-
-       do {
-               tag = find_next_zero_bit(bqt->tag_map, bqt->max_depth, 1);
-               if (tag >= bqt->max_depth) {
-                       pr_err("Tag allocation failure\n");
-                       goto end;
-               }
-       } while (test_and_set_bit(tag, bqt->tag_map));
+       dummy = blk_mq_alloc_request(q, REQ_OP_WRITE, BLK_MQ_REQ_NOWAIT);
+       if (IS_ERR(dummy))
+               return SCSI_NO_TAG;
 
-       bqt->tag_index[tag] = sc->request;
-       sc->request->tag = tag;
-       sc->tag = tag;
-       if (!sc->request->special)
-               sc->request->special = sc;
+       sc->tag = sc->request->tag = dummy->tag;
+       sc->request->special = sc;
 
-       ret = tag;
-
-end:
-       return ret;
+       return dummy->tag;
 }
 
 /**
@@ -2302,20 +2286,9 @@ end:
 static inline void
 fnic_scsi_host_end_tag(struct fnic *fnic, struct scsi_cmnd *sc)
 {
-       struct blk_queue_tag *bqt = fnic->lport->host->bqt;
-       int tag = sc->request->tag;
-
-       if (tag == SCSI_NO_TAG)
-               return;
-
-       BUG_ON(!bqt || !bqt->tag_index[tag]);
-       if (!bqt)
-               return;
+       struct request *dummy = sc->request->special;
 
-       bqt->tag_index[tag] = NULL;
-       clear_bit(tag, bqt->tag_map);
-
-       return;
+       blk_mq_free_request(dummy);
 }
 
 /*
@@ -2374,19 +2347,9 @@ int fnic_device_reset(struct scsi_cmnd *sc)
        tag = sc->request->tag;
        if (unlikely(tag < 0)) {
                /*
-                * XXX(hch): current the midlayer fakes up a struct
-                * request for the explicit reset ioctls, and those
-                * don't have a tag allocated to them.  The below
-                * code pokes into midlayer structures to paper over
-                * this design issue, but that won't work for blk-mq.
-                *
-                * Either someone who can actually test the hardware
-                * will have to come up with a similar hack for the
-                * blk-mq case, or we'll have to bite the bullet and
-                * fix the way the EH ioctls work for real, but until
-                * that happens we fail these explicit requests here.
+                * Really should fix the midlayer to pass in a proper
+                * request for ioctls...
                 */
-
                tag = fnic_scsi_host_start_tag(fnic, sc);
                if (unlikely(tag == SCSI_NO_TAG))
                        goto fnic_device_reset_end;