Commit a118c6c1 authored by Christoph Hellwig's avatar Christoph Hellwig
Browse files

sd: don't use scsi_setup_blk_pc_cmnd for flush requests



Simplify handling of flush requests by setting up the command directly
instead of initializing request fields and then calling
scsi_setup_blk_pc_cmnd to propagate the information into the command.

Also rename scsi_setup_flush_cmnd to sd_setup_flush_cmnd for consistency.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
parent 5158a899
Loading
Loading
Loading
Loading
+13 −7
Original line number Diff line number Diff line
@@ -844,14 +844,20 @@ static int sd_setup_write_same_cmnd(struct scsi_device *sdp, struct request *rq)
	return ret;
}

static int scsi_setup_flush_cmnd(struct scsi_device *sdp, struct request *rq)
static int sd_setup_flush_cmnd(struct scsi_cmnd *cmd)
{
	rq->timeout *= SD_FLUSH_TIMEOUT_MULTIPLIER;
	rq->retries = SD_MAX_RETRIES;
	rq->cmd[0] = SYNCHRONIZE_CACHE;
	rq->cmd_len = 10;
	struct request *rq = cmd->request;

	/* flush requests don't perform I/O, zero the S/G table */
	memset(&cmd->sdb, 0, sizeof(cmd->sdb));

	return scsi_setup_blk_pc_cmnd(sdp, rq);
	cmd->cmnd[0] = SYNCHRONIZE_CACHE;
	cmd->cmd_len = 10;
	cmd->transfersize = 0;
	cmd->allowed = SD_MAX_RETRIES;

	rq->timeout *= SD_FLUSH_TIMEOUT_MULTIPLIER;
	return BLKPREP_OK;
}

static void sd_uninit_command(struct scsi_cmnd *SCpnt)
@@ -891,7 +897,7 @@ static int sd_init_command(struct scsi_cmnd *SCpnt)
		ret = sd_setup_write_same_cmnd(sdp, rq);
		goto out;
	} else if (rq->cmd_flags & REQ_FLUSH) {
		ret = scsi_setup_flush_cmnd(sdp, rq);
		ret = sd_setup_flush_cmnd(SCpnt);
		goto out;
	}
	ret = scsi_init_io(SCpnt, GFP_ATOMIC);