Commit 08694199 authored by Mike Christie's avatar Mike Christie Committed by Martin K. Petersen
Browse files

scsi: target: core: Add gfp_t arg to target_cmd_init_cdb()

tcm_loop could be used like a normal block device, so we can't use
GFP_KERNEL and should use GFP_NOIO. This adds a gfp_t arg to
target_cmd_init_cdb() and converts the users. For every driver but loop
GFP_KERNEL is kept.

This will also be useful in subsequent patches where loop needs to do
target_submit_prep() from interrupt context to get a ref to the se_device,
and so it will need to use GFP_ATOMIC.

Link: https://lore.kernel.org/r/20210227170006.5077-16-michael.christie@oracle.com


Tested-by: default avatarLaurence Oberman <loberman@redhat.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarMike Christie <michael.christie@oracle.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 0fa50a8b
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -1537,7 +1537,8 @@ static void srpt_handle_cmd(struct srpt_rdma_ch *ch,
		goto busy;
	}

	if (target_submit_prep(cmd, srp_cmd->cdb, sg, sg_cnt, NULL, 0, NULL, 0))
	if (target_submit_prep(cmd, srp_cmd->cdb, sg, sg_cnt, NULL, 0, NULL, 0,
			       GFP_KERNEL))
		return;

	target_submit(cmd);
+2 −1
Original line number Diff line number Diff line
@@ -492,7 +492,8 @@ static int tcm_qla2xxx_handle_cmd(scsi_qla_host_t *vha, struct qla_tgt_cmd *cmd,
	if (rc)
		return rc;

	if (target_submit_prep(se_cmd, cdb, NULL, 0, NULL, 0, NULL, 0))
	if (target_submit_prep(se_cmd, cdb, NULL, 0, NULL, 0, NULL, 0,
			       GFP_KERNEL))
		return 0;

	target_submit(se_cmd);
+2 −1
Original line number Diff line number Diff line
@@ -1166,7 +1166,8 @@ int iscsit_setup_scsi_cmd(struct iscsi_conn *conn, struct iscsi_cmd *cmd,

	target_get_sess_cmd(&cmd->se_cmd, true);

	cmd->sense_reason = target_cmd_init_cdb(&cmd->se_cmd, hdr->cdb);
	cmd->sense_reason = target_cmd_init_cdb(&cmd->se_cmd, hdr->cdb,
						GFP_KERNEL);
	if (cmd->sense_reason) {
		if (cmd->sense_reason == TCM_OUT_OF_RESOURCES) {
			return iscsit_add_reject_cmd(cmd,
+2 −1
Original line number Diff line number Diff line
@@ -156,7 +156,8 @@ static void tcm_loop_submission_work(struct work_struct *work)

	if (target_submit_prep(se_cmd, sc->cmnd, scsi_sglist(sc),
			       scsi_sg_count(sc), sgl_bidi, sgl_bidi_count,
			       scsi_prot_sglist(sc), scsi_prot_sg_count(sc)))
			       scsi_prot_sglist(sc), scsi_prot_sg_count(sc),
			       GFP_NOIO))
		return;

	target_submit(se_cmd);
+8 −6
Original line number Diff line number Diff line
@@ -1429,7 +1429,7 @@ transport_check_alloc_task_attr(struct se_cmd *cmd)
}

sense_reason_t
target_cmd_init_cdb(struct se_cmd *cmd, unsigned char *cdb)
target_cmd_init_cdb(struct se_cmd *cmd, unsigned char *cdb, gfp_t gfp)
{
	sense_reason_t ret;

@@ -1450,8 +1450,7 @@ target_cmd_init_cdb(struct se_cmd *cmd, unsigned char *cdb)
	 * setup the pointer from __t_task_cdb to t_task_cdb.
	 */
	if (scsi_command_size(cdb) > sizeof(cmd->__t_task_cdb)) {
		cmd->t_task_cdb = kzalloc(scsi_command_size(cdb),
						GFP_KERNEL);
		cmd->t_task_cdb = kzalloc(scsi_command_size(cdb), gfp);
		if (!cmd->t_task_cdb) {
			pr_err("Unable to allocate cmd->t_task_cdb"
				" %u > sizeof(cmd->__t_task_cdb): %lu ops\n",
@@ -1640,6 +1639,7 @@ EXPORT_SYMBOL_GPL(target_init_cmd);
 * @sgl_bidi_count: scatterlist count for bidirectional READ mapping
 * @sgl_prot: struct scatterlist memory protection information
 * @sgl_prot_count: scatterlist count for protection information
 * @gfp: gfp allocation type
 *
 * Returns:
 *	- less than zero to signal failure.
@@ -1650,11 +1650,12 @@ EXPORT_SYMBOL_GPL(target_init_cmd);
int target_submit_prep(struct se_cmd *se_cmd, unsigned char *cdb,
		       struct scatterlist *sgl, u32 sgl_count,
		       struct scatterlist *sgl_bidi, u32 sgl_bidi_count,
		       struct scatterlist *sgl_prot, u32 sgl_prot_count)
		       struct scatterlist *sgl_prot, u32 sgl_prot_count,
		       gfp_t gfp)
{
	sense_reason_t rc;

	rc = target_cmd_init_cdb(se_cmd, cdb);
	rc = target_cmd_init_cdb(se_cmd, cdb, gfp);
	if (rc)
		goto send_cc_direct;

@@ -1790,7 +1791,8 @@ void target_submit_cmd(struct se_cmd *se_cmd, struct se_session *se_sess,
	if (rc)
		return;

	if (target_submit_prep(se_cmd, cdb, NULL, 0, NULL, 0, NULL, 0))
	if (target_submit_prep(se_cmd, cdb, NULL, 0, NULL, 0, NULL, 0,
			       GFP_KERNEL))
		return;

	target_submit(se_cmd);
Loading