mirror of https://gitee.com/openkylin/linux.git
[SCSI] st: add st_scsi_kern_execute helper function
st_scsi_kern_execute is a helper function to perform SCSI commands synchronously. It supports data transfer with a liner in-kernel buffer (not scatter gather). st_scsi_kern_execute internally uses scsi_execute(). The majority of st_do_scsi can be replaced with st_scsi_kern_execute. This is a preparation for rewriting st_do_scsi to remove obsolete scsi_execute_async(). Signed-off-by: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp> Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
This commit is contained in:
parent
4deba245d0
commit
ffb4349499
|
@ -533,6 +533,28 @@ st_do_scsi(struct st_request * SRpnt, struct scsi_tape * STp, unsigned char *cmd
|
|||
return SRpnt;
|
||||
}
|
||||
|
||||
static int st_scsi_kern_execute(struct st_request *streq,
|
||||
const unsigned char *cmd, int data_direction,
|
||||
void *buffer, unsigned bufflen, int timeout,
|
||||
int retries)
|
||||
{
|
||||
struct scsi_tape *stp = streq->stp;
|
||||
int ret, resid;
|
||||
|
||||
stp->buffer->cmdstat.have_sense = 0;
|
||||
memcpy(streq->cmd, cmd, sizeof(streq->cmd));
|
||||
|
||||
ret = scsi_execute(stp->device, cmd, data_direction, buffer, bufflen,
|
||||
streq->sense, timeout, retries, 0, &resid);
|
||||
if (driver_byte(ret) & DRIVER_ERROR)
|
||||
return -EBUSY;
|
||||
|
||||
stp->buffer->cmdstat.midlevel_result = streq->result = ret;
|
||||
stp->buffer->cmdstat.residual = resid;
|
||||
stp->buffer->syscall_result = st_chk_result(stp, streq);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Handle the write-behind checking (waits for completion). Returns -ENOSPC if
|
||||
write has been correct but EOM early warning reached, -EIO if write ended in
|
||||
|
|
Loading…
Reference in New Issue