All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hannes Reinecke <hare@suse.de>
To: "Martin K. Petersen" <martin.petersen@oracle.com>
Cc: Christoph Hellwig <hch@lst.de>,
	James Bottomley <james.bottomley@hansenpartnership.com>,
	Bart van Assche <bvanassche@acm.org>,
	Don Brace <don.brace@microchip.com>,
	John Garry <john.garry@huawei.com>,
	linux-scsi@vger.kernel.org, Hannes Reinecke <hare@suse.de>
Subject: [PATCH 03/22] scsi: add scsi_{get,put}_internal_cmd() helper
Date: Mon, 29 Jun 2020 09:20:02 +0200	[thread overview]
Message-ID: <20200629072021.9864-4-hare@suse.de> (raw)
In-Reply-To: <20200629072021.9864-1-hare@suse.de>

Add helper functions to allow LLDDs to allocate and free
internal commands.

Signed-off-by: Hannes Reinecke <hare@suse.de>
---
 drivers/scsi/scsi_lib.c    | 44 ++++++++++++++++++++++++++++++++++++++++++++
 include/scsi/scsi_device.h |  4 ++++
 2 files changed, 48 insertions(+)

diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 0ba7a65e7c8d..c2277eff4e06 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -1903,6 +1903,50 @@ void scsi_mq_destroy_tags(struct Scsi_Host *shost)
 	blk_mq_free_tag_set(&shost->tag_set);
 }
 
+/**
+ * scsi_get_internal_cmd - allocate an internal SCSI command
+ * @sdev: SCSI device from which to allocate the command
+ * @data_direction: Data direction for the allocated command
+ * @op_flags: request allocation flags
+ *
+ * Allocates a SCSI command for internal LLDD use.
+ */
+struct scsi_cmnd *scsi_get_internal_cmd(struct scsi_device *sdev,
+	enum dma_data_direction data_direction, int op_flags)
+{
+	struct request *rq;
+	struct scsi_cmnd *scmd;
+	blk_mq_req_flags_t flags = 0;
+	unsigned int op = REQ_INTERNAL | op_flags;
+
+	op |= (data_direction == DMA_TO_DEVICE) ?
+		REQ_OP_SCSI_OUT : REQ_OP_SCSI_IN;
+	rq = blk_mq_alloc_request(sdev->request_queue, op, flags);
+	if (IS_ERR(rq))
+		return NULL;
+	scmd = blk_mq_rq_to_pdu(rq);
+	scmd->request = rq;
+	scmd->device = sdev;
+	return scmd;
+}
+EXPORT_SYMBOL_GPL(scsi_get_internal_cmd);
+
+/**
+ * scsi_put_internal_cmd - free an internal SCSI command
+ * @scmd: SCSI command to be freed
+ *
+ * Check if @scmd is an internal command, and call
+ * blk_mq_free_request() if true.
+ */
+void scsi_put_internal_cmd(struct scsi_cmnd *scmd)
+{
+	struct request *rq = blk_mq_rq_from_pdu(scmd);
+
+	if (blk_rq_is_internal(rq))
+		blk_mq_free_request(rq);
+}
+EXPORT_SYMBOL_GPL(scsi_put_internal_cmd);
+
 /**
  * scsi_device_from_queue - return sdev associated with a request_queue
  * @q: The request queue to return the sdev from
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
index bc5909033d13..2759a538adae 100644
--- a/include/scsi/scsi_device.h
+++ b/include/scsi/scsi_device.h
@@ -8,6 +8,7 @@
 #include <linux/blkdev.h>
 #include <scsi/scsi.h>
 #include <linux/atomic.h>
+#include <linux/dma-direction.h>
 
 struct device;
 struct request_queue;
@@ -460,6 +461,9 @@ static inline int scsi_execute_req(struct scsi_device *sdev,
 	return scsi_execute(sdev, cmd, data_direction, buffer,
 		bufflen, NULL, sshdr, timeout, retries,  0, 0, resid);
 }
+struct scsi_cmnd *scsi_get_internal_cmd(struct scsi_device *sdev,
+	enum dma_data_direction data_direction, int op_flags);
+void scsi_put_internal_cmd(struct scsi_cmnd *scmd);
 extern void sdev_disable_disk_events(struct scsi_device *sdev);
 extern void sdev_enable_disk_events(struct scsi_device *sdev);
 extern int scsi_vpd_lun_id(struct scsi_device *, char *, size_t);
-- 
2.16.4


  parent reply	other threads:[~2020-06-29 19:31 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-29  7:19 [PATCHv5 00/22] scsi: enable reserved commands for LLDDs Hannes Reinecke
2020-06-29  7:20 ` [PATCH 01/22] scsi: drop gdth driver Hannes Reinecke
2020-06-29  7:20 ` [PATCH 02/22] block: add flag for internal commands Hannes Reinecke
2020-06-29  7:20 ` Hannes Reinecke [this message]
2020-06-29 12:48   ` [PATCH 03/22] scsi: add scsi_{get,put}_internal_cmd() helper John Garry
2020-07-02  7:59     ` Hannes Reinecke
2020-07-02  8:21       ` Johannes Thumshirn
2020-07-06  7:51         ` John Garry
2020-06-29  7:20 ` [PATCH 04/22] fnic: use internal commands Hannes Reinecke
2020-06-29  7:20 ` [PATCH 05/22] fnic: use scsi_host_busy_iter() to traverse commands Hannes Reinecke
2020-06-29  7:20 ` [PATCH 06/22] fnic: check for started requests in fnic_wq_copy_cleanup_handler() Hannes Reinecke
2020-06-29  7:20 ` [PATCH 07/22] csiostor: use internal command for LUN reset Hannes Reinecke
2020-06-29 13:51   ` John Garry
2020-06-29 14:59     ` Hannes Reinecke
2020-06-29  7:20 ` [PATCH 08/22] scsi: implement reserved command handling Hannes Reinecke
2020-06-29 14:11   ` John Garry
2020-06-29  7:20 ` [PATCH 09/22] scsi: use real inquiry data when initialising devices Hannes Reinecke
2020-06-29  7:20 ` [PATCH 10/22] scsi: Use dummy inquiry data for the host device Hannes Reinecke
2020-06-29  7:20 ` [PATCH 11/22] scsi: revamp host device handling Hannes Reinecke
2020-06-29  7:20 ` [PATCH 12/22] snic: use reserved commands Hannes Reinecke
2020-06-29  7:20 ` [PATCH 13/22] snic: use tagset iter for traversing commands Hannes Reinecke
2020-06-29  7:20 ` [PATCH 14/22] snic: check for started requests in snic_hba_reset_cmpl_handler() Hannes Reinecke
2020-06-29  7:20 ` [PATCH 15/22] hpsa: move hpsa_hba_inquiry after scsi_add_host() Hannes Reinecke
2020-06-29  7:20 ` [PATCH 16/22] hpsa: use reserved commands Hannes Reinecke
2020-06-29  7:20 ` [PATCH 17/22] hpsa: use scsi_host_busy_iter() to traverse outstanding commands Hannes Reinecke
2020-06-29  7:20 ` [PATCH 18/22] hpsa: drop refcount field from CommandList Hannes Reinecke
2020-06-29  7:20 ` [PATCH 19/22] aacraid: move scsi_add_host() Hannes Reinecke
2020-06-29  7:20 ` [PATCH 20/22] aacraid: store target id in host_scribble Hannes Reinecke
2020-06-29  7:20 ` [PATCH 21/22] aacraid: use scsi_get_internal_cmd() Hannes Reinecke
2020-06-29 13:08   ` John Garry
2020-06-29 14:51     ` Hannes Reinecke
2020-06-29  7:20 ` [PATCH 22/22] aacraid: use scsi_host_busy_iter() to traverse outstanding commands Hannes Reinecke
  -- strict thread matches above, loose matches on Subject: below --
2020-06-25 14:01 [PATCHv4 00/22] scsi: enable reserved commands for LLDDs Hannes Reinecke
2020-06-25 14:01 ` [PATCH 03/22] scsi: add scsi_{get,put}_internal_cmd() helper Hannes Reinecke
2020-06-28  3:48   ` Bart Van Assche
2020-06-28  9:02     ` Hannes Reinecke
2020-06-28 15:08       ` Bart Van Assche
2020-06-29  6:32         ` Hannes Reinecke
2020-06-29 14:24           ` John Garry
2020-06-29 14:38           ` Bart Van Assche

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200629072021.9864-4-hare@suse.de \
    --to=hare@suse.de \
    --cc=bvanassche@acm.org \
    --cc=don.brace@microchip.com \
    --cc=hch@lst.de \
    --cc=james.bottomley@hansenpartnership.com \
    --cc=john.garry@huawei.com \
    --cc=linux-scsi@vger.kernel.org \
    --cc=martin.petersen@oracle.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.