Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 127884
b: refs/heads/master
c: 13b53b4
h: refs/heads/master
v: v3
  • Loading branch information
FUJITA Tomonori authored and James Bottomley committed Jan 2, 2009
1 parent 743ffea commit 79b7ce4
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: d0e1ae31be226e83cdd0684625bf1535518ee0d3
refs/heads/master: 13b53b443482623d33fd9446289d320e1c719f02
54 changes: 54 additions & 0 deletions trunk/drivers/scsi/st.c
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,60 @@ static void st_release_request(struct st_request *streq)
kfree(streq);
}

static void st_scsi_execute_end(struct request *req, int uptodate)
{
struct st_request *SRpnt = req->end_io_data;
struct scsi_tape *STp = SRpnt->stp;

STp->buffer->cmdstat.midlevel_result = SRpnt->result = req->errors;
STp->buffer->cmdstat.residual = req->data_len;

if (SRpnt->waiting)
complete(SRpnt->waiting);

blk_rq_unmap_user(SRpnt->bio);
__blk_put_request(req->q, req);
}

static int st_scsi_execute(struct st_request *SRpnt, const unsigned char *cmd,
int data_direction, void *buffer, unsigned bufflen,
int timeout, int retries)
{
struct request *req;
struct rq_map_data *mdata = &SRpnt->stp->buffer->map_data;
int err = 0;
int write = (data_direction == DMA_TO_DEVICE);

req = blk_get_request(SRpnt->stp->device->request_queue, write,
GFP_KERNEL);
if (!req)
return DRIVER_ERROR << 24;

req->cmd_type = REQ_TYPE_BLOCK_PC;
req->cmd_flags |= REQ_QUIET;

mdata->null_mapped = 1;

err = blk_rq_map_user(req->q, req, mdata, NULL, bufflen, GFP_KERNEL);
if (err) {
blk_put_request(req);
return DRIVER_ERROR << 24;
}

SRpnt->bio = req->bio;
req->cmd_len = COMMAND_SIZE(cmd[0]);
memset(req->cmd, 0, BLK_MAX_CDB);
memcpy(req->cmd, cmd, req->cmd_len);
req->sense = SRpnt->sense;
req->sense_len = 0;
req->timeout = timeout;
req->retries = retries;
req->end_io_data = SRpnt;

blk_execute_rq_nowait(req->q, NULL, req, 1, st_scsi_execute_end);
return 0;
}

/* Do the scsi command. Waits until command performed if do_wait is true.
Otherwise write_behind_check() is used to check that the command
has finished. */
Expand Down
1 change: 1 addition & 0 deletions trunk/drivers/scsi/st.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ struct st_request {
int result;
struct scsi_tape *stp;
struct completion *waiting;
struct bio *bio;
};

/* The tape buffer descriptor. */
Expand Down

0 comments on commit 79b7ce4

Please sign in to comment.