Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 127893
b: refs/heads/master
c: 02ae2c0
h: refs/heads/master
i:
  127891: eed5b37
v: v3
  • Loading branch information
Kai Makisara authored and James Bottomley committed Jan 2, 2009
1 parent d08a50e commit 950c80a
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 137 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: edf69c58c74eeeb48f62f267ce41f7827cb4dd06
refs/heads/master: 02ae2c0e844e2864a877d1da8a92fe5e63778a18
202 changes: 66 additions & 136 deletions trunk/drivers/scsi/st.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
Last modified: 18-JAN-1998 Richard Gooch <rgooch@atnf.csiro.au> Devfs support
*/

static const char *verstr = "20080504";
static const char *verstr = "20081215";

#include <linux/module.h>

Expand Down Expand Up @@ -491,10 +491,13 @@ static int st_scsi_execute(struct st_request *SRpnt, const unsigned char *cmd,

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;
if (bufflen) {
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;
Expand Down Expand Up @@ -577,28 +580,6 @@ 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
Expand Down Expand Up @@ -671,7 +652,6 @@ static int cross_eof(struct scsi_tape * STp, int forward)
{
struct st_request *SRpnt;
unsigned char cmd[MAX_COMMAND_SIZE];
int ret;

cmd[0] = SPACE;
cmd[1] = 0x01; /* Space FileMarks */
Expand All @@ -685,26 +665,20 @@ static int cross_eof(struct scsi_tape * STp, int forward)
DEBC(printk(ST_DEB_MSG "%s: Stepping over filemark %s.\n",
tape_name(STp), forward ? "forward" : "backward"));

SRpnt = st_allocate_request(STp);
SRpnt = st_do_scsi(NULL, STp, cmd, 0, DMA_NONE,
STp->device->request_queue->rq_timeout,
MAX_RETRIES, 1);
if (!SRpnt)
return STp->buffer->syscall_result;

ret = st_scsi_kern_execute(SRpnt, cmd, DMA_NONE, NULL, 0,
STp->device->request_queue->rq_timeout,
MAX_RETRIES);
if (ret)
goto out;
return (STp->buffer)->syscall_result;

ret = STp->buffer->syscall_result;
st_release_request(SRpnt);
SRpnt = NULL;

if ((STp->buffer)->cmdstat.midlevel_result != 0)
printk(KERN_ERR "%s: Stepping over filemark %s failed.\n",
tape_name(STp), forward ? "forward" : "backward");

out:
st_release_request(SRpnt);

return ret;
return (STp->buffer)->syscall_result;
}


Expand Down Expand Up @@ -925,24 +899,21 @@ static int test_ready(struct scsi_tape *STp, int do_wait)
int attentions, waits, max_wait, scode;
int retval = CHKRES_READY, new_session = 0;
unsigned char cmd[MAX_COMMAND_SIZE];
struct st_request *SRpnt;
struct st_request *SRpnt = NULL;
struct st_cmdstatus *cmdstatp = &STp->buffer->cmdstat;

SRpnt = st_allocate_request(STp);
if (!SRpnt)
return STp->buffer->syscall_result;

max_wait = do_wait ? ST_BLOCK_SECONDS : 0;

for (attentions=waits=0; ; ) {
memset((void *) &cmd[0], 0, MAX_COMMAND_SIZE);
cmd[0] = TEST_UNIT_READY;
SRpnt = st_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE,
STp->long_timeout, MAX_READY_RETRIES, 1);

retval = st_scsi_kern_execute(SRpnt, cmd, DMA_NONE, NULL, 0,
STp->long_timeout,
MAX_READY_RETRIES);
if (retval)
if (!SRpnt) {
retval = (STp->buffer)->syscall_result;
break;
}

if (cmdstatp->have_sense) {

Expand Down Expand Up @@ -986,8 +957,8 @@ static int test_ready(struct scsi_tape *STp, int do_wait)
break;
}

st_release_request(SRpnt);

if (SRpnt != NULL)
st_release_request(SRpnt);
return retval;
}

Expand Down Expand Up @@ -1064,24 +1035,17 @@ static int check_tape(struct scsi_tape *STp, struct file *filp)
}
}

SRpnt = st_allocate_request(STp);
if (!SRpnt) {
retval = STp->buffer->syscall_result;
goto err_out;
}

if (STp->omit_blklims)
STp->min_block = STp->max_block = (-1);
else {
memset((void *) &cmd[0], 0, MAX_COMMAND_SIZE);
cmd[0] = READ_BLOCK_LIMITS;

retval = st_scsi_kern_execute(SRpnt, cmd, DMA_FROM_DEVICE,
STp->buffer->b_data, 6,
STp->device->request_queue->rq_timeout,
MAX_READY_RETRIES);
if (retval) {
st_release_request(SRpnt);
SRpnt = st_do_scsi(SRpnt, STp, cmd, 6, DMA_FROM_DEVICE,
STp->device->request_queue->rq_timeout,
MAX_READY_RETRIES, 1);
if (!SRpnt) {
retval = (STp->buffer)->syscall_result;
goto err_out;
}

Expand All @@ -1105,12 +1069,11 @@ static int check_tape(struct scsi_tape *STp, struct file *filp)
cmd[0] = MODE_SENSE;
cmd[4] = 12;

retval = st_scsi_kern_execute(SRpnt, cmd, DMA_FROM_DEVICE,
STp->buffer->b_data, 12,
STp->device->request_queue->rq_timeout,
MAX_READY_RETRIES);
if (retval) {
st_release_request(SRpnt);
SRpnt = st_do_scsi(SRpnt, STp, cmd, 12, DMA_FROM_DEVICE,
STp->device->request_queue->rq_timeout,
MAX_READY_RETRIES, 1);
if (!SRpnt) {
retval = (STp->buffer)->syscall_result;
goto err_out;
}

Expand Down Expand Up @@ -1340,17 +1303,11 @@ static int st_flush(struct file *filp, fl_owner_t id)
cmd[0] = WRITE_FILEMARKS;
cmd[4] = 1 + STp->two_fm;

SRpnt = st_allocate_request(STp);
SRpnt = st_do_scsi(NULL, STp, cmd, 0, DMA_NONE,
STp->device->request_queue->rq_timeout,
MAX_WRITE_RETRIES, 1);
if (!SRpnt) {
result = STp->buffer->syscall_result;
goto out;
}

result = st_scsi_kern_execute(SRpnt, cmd, DMA_NONE, NULL, 0,
STp->device->request_queue->rq_timeout,
MAX_WRITE_RETRIES);
if (result) {
st_release_request(SRpnt);
result = (STp->buffer)->syscall_result;
goto out;
}

Expand Down Expand Up @@ -2415,7 +2372,6 @@ static int read_mode_page(struct scsi_tape *STp, int page, int omit_block_descs)
{
unsigned char cmd[MAX_COMMAND_SIZE];
struct st_request *SRpnt;
int ret;

memset(cmd, 0, MAX_COMMAND_SIZE);
cmd[0] = MODE_SENSE;
Expand All @@ -2424,27 +2380,25 @@ static int read_mode_page(struct scsi_tape *STp, int page, int omit_block_descs)
cmd[2] = page;
cmd[4] = 255;

SRpnt = st_allocate_request(STp);
if (!SRpnt)
return STp->buffer->syscall_result;
SRpnt = st_do_scsi(NULL, STp, cmd, cmd[4], DMA_FROM_DEVICE,
STp->device->request_queue->rq_timeout, 0, 1);
if (SRpnt == NULL)
return (STp->buffer)->syscall_result;

ret = st_scsi_kern_execute(SRpnt, cmd, DMA_FROM_DEVICE,
STp->buffer->b_data, cmd[4],
STp->device->request_queue->rq_timeout,
MAX_RETRIES);
st_release_request(SRpnt);

return ret ? : STp->buffer->syscall_result;
return STp->buffer->syscall_result;
}


/* Send the mode page in the tape buffer to the drive. Assumes that the mode data
in the buffer is correctly formatted. The long timeout is used if slow is non-zero. */
static int write_mode_page(struct scsi_tape *STp, int page, int slow)
{
int pgo, timeout, ret = 0;
int pgo;
unsigned char cmd[MAX_COMMAND_SIZE];
struct st_request *SRpnt;
int timeout;

memset(cmd, 0, MAX_COMMAND_SIZE);
cmd[0] = MODE_SELECT;
Expand All @@ -2458,21 +2412,16 @@ static int write_mode_page(struct scsi_tape *STp, int page, int slow)
(STp->buffer)->b_data[MH_OFF_DEV_SPECIFIC] &= ~MH_BIT_WP;
(STp->buffer)->b_data[pgo + MP_OFF_PAGE_NBR] &= MP_MSK_PAGE_NBR;

SRpnt = st_allocate_request(STp);
if (!SRpnt)
return ret;

timeout = slow ? STp->long_timeout :
STp->device->request_queue->rq_timeout;

ret = st_scsi_kern_execute(SRpnt, cmd, DMA_TO_DEVICE,
STp->buffer->b_data, cmd[4], timeout, 0);
if (!ret)
ret = STp->buffer->syscall_result;
timeout = slow ?
STp->long_timeout : STp->device->request_queue->rq_timeout;
SRpnt = st_do_scsi(NULL, STp, cmd, cmd[4], DMA_TO_DEVICE,
timeout, 0, 1);
if (SRpnt == NULL)
return (STp->buffer)->syscall_result;

st_release_request(SRpnt);

return ret;
return STp->buffer->syscall_result;
}


Expand Down Expand Up @@ -2590,16 +2539,13 @@ static int do_load_unload(struct scsi_tape *STp, struct file *filp, int load_cod
printk(ST_DEB_MSG "%s: Loading tape.\n", name);
);

SRpnt = st_allocate_request(STp);
SRpnt = st_do_scsi(NULL, STp, cmd, 0, DMA_NONE,
timeout, MAX_RETRIES, 1);
if (!SRpnt)
return STp->buffer->syscall_result;

retval = st_scsi_kern_execute(SRpnt, cmd, DMA_NONE, NULL, 0, timeout,
MAX_RETRIES);
if (retval)
goto out;
return (STp->buffer)->syscall_result;

retval = (STp->buffer)->syscall_result;
st_release_request(SRpnt);

if (!retval) { /* SCSI command successful */

Expand All @@ -2618,8 +2564,6 @@ static int do_load_unload(struct scsi_tape *STp, struct file *filp, int load_cod
STps = &(STp->ps[STp->partition]);
STps->drv_file = STps->drv_block = (-1);
}
out:
st_release_request(SRpnt);

return retval;
}
Expand Down Expand Up @@ -2895,15 +2839,12 @@ static int st_int_ioctl(struct scsi_tape *STp, unsigned int cmd_in, unsigned lon
return (-ENOSYS);
}

SRpnt = st_allocate_request(STp);
SRpnt = st_do_scsi(NULL, STp, cmd, datalen, direction,
timeout, MAX_RETRIES, 1);
if (!SRpnt)
return (STp->buffer)->syscall_result;

ioctl_result = st_scsi_kern_execute(SRpnt, cmd, direction,
STp->buffer->b_data, datalen,
timeout, MAX_RETRIES);
if (!ioctl_result)
ioctl_result = (STp->buffer)->syscall_result;
ioctl_result = (STp->buffer)->syscall_result;

if (!ioctl_result) { /* SCSI command successful */
st_release_request(SRpnt);
Expand Down Expand Up @@ -3065,17 +3006,11 @@ static int get_location(struct scsi_tape *STp, unsigned int *block, int *partiti
if (!logical && !STp->scsi2_logical)
scmd[1] = 1;
}

SRpnt = st_allocate_request(STp);
SRpnt = st_do_scsi(NULL, STp, scmd, 20, DMA_FROM_DEVICE,
STp->device->request_queue->rq_timeout,
MAX_READY_RETRIES, 1);
if (!SRpnt)
return STp->buffer->syscall_result;

result = st_scsi_kern_execute(SRpnt, scmd, DMA_FROM_DEVICE,
STp->buffer->b_data, 20,
STp->device->request_queue->rq_timeout,
MAX_READY_RETRIES);
if (result)
goto out;
return (STp->buffer)->syscall_result;

if ((STp->buffer)->syscall_result != 0 ||
(STp->device->scsi_level >= SCSI_2 &&
Expand Down Expand Up @@ -3103,7 +3038,6 @@ static int get_location(struct scsi_tape *STp, unsigned int *block, int *partiti
DEBC(printk(ST_DEB_MSG "%s: Got tape pos. blk %d part %d.\n", name,
*block, *partition));
}
out:
st_release_request(SRpnt);
SRpnt = NULL;

Expand Down Expand Up @@ -3178,14 +3112,10 @@ static int set_location(struct scsi_tape *STp, unsigned int block, int partition
timeout = STp->device->request_queue->rq_timeout;
}

SRpnt = st_allocate_request(STp);
SRpnt = st_do_scsi(NULL, STp, scmd, 0, DMA_NONE,
timeout, MAX_READY_RETRIES, 1);
if (!SRpnt)
return STp->buffer->syscall_result;

result = st_scsi_kern_execute(SRpnt, scmd, DMA_NONE, NULL, 0,
timeout, MAX_READY_RETRIES);
if (result)
goto out;
return (STp->buffer)->syscall_result;

STps->drv_block = STps->drv_file = (-1);
STps->eof = ST_NOEOF;
Expand All @@ -3210,7 +3140,7 @@ static int set_location(struct scsi_tape *STp, unsigned int block, int partition
STps->drv_block = STps->drv_file = 0;
result = 0;
}
out:

st_release_request(SRpnt);
SRpnt = NULL;

Expand Down

0 comments on commit 950c80a

Please sign in to comment.