summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Bottomley <jejb@mulgrave.(none)>2002-07-02 02:44:28 -0400
committerJames Bottomley <jejb@mulgrave.(none)>2002-07-02 02:44:28 -0400
commit978c6cc56c456355235883cd80480fe216aeedf0 (patch)
tree3bb7ed976c2d8368ca9db69ad316bc2340becfd9
parent2ffe5f2f17d6698d1b0e78c43a4b9eb91426340d (diff)
parent853466130b58e008fb9a309129cf9150a7b2e533 (diff)
Merge mulgrave.(none):/home/jejb/BK/scsi-new-tag-2.5
into mulgrave.(none):/home/jejb/BK/scsi-for-linus-2.5
-rw-r--r--drivers/scsi/aha1542.c4
-rw-r--r--drivers/scsi/constants.c4
-rw-r--r--drivers/scsi/eata.c16
-rw-r--r--drivers/scsi/hosts.c1
-rw-r--r--drivers/scsi/hosts.h27
-rw-r--r--drivers/scsi/ide-scsi.c2
-rw-r--r--drivers/scsi/osst.c20
-rw-r--r--drivers/scsi/qla1280.c4
-rw-r--r--drivers/scsi/scsi.c67
-rw-r--r--drivers/scsi/scsi.h90
-rw-r--r--drivers/scsi/scsi_debug.c2
-rw-r--r--drivers/scsi/scsi_error.c8
-rw-r--r--drivers/scsi/scsi_lib.c80
-rw-r--r--drivers/scsi/scsi_merge.c2
-rw-r--r--drivers/scsi/sd.c38
-rw-r--r--drivers/scsi/sg.c4
-rw-r--r--drivers/scsi/sr.c36
-rw-r--r--drivers/scsi/sr_ioctl.c4
-rw-r--r--drivers/scsi/st.c20
-rw-r--r--drivers/scsi/sun3_NCR5380.c8
-rw-r--r--drivers/scsi/sun3_scsi.c2
-rw-r--r--drivers/scsi/u14-34f.c16
22 files changed, 293 insertions, 162 deletions
diff --git a/drivers/scsi/aha1542.c b/drivers/scsi/aha1542.c
index 865a02c08711..ad1af6379ffb 100644
--- a/drivers/scsi/aha1542.c
+++ b/drivers/scsi/aha1542.c
@@ -1635,14 +1635,14 @@ static int aha1542_old_abort(Scsi_Cmnd * SCpnt)
if (HOSTDATA(SCpnt->host)->SCint[i]) {
if (HOSTDATA(SCpnt->host)->SCint[i] == SCpnt) {
printk(KERN_ERR "Timed out command pending for %s\n",
- kdevname(SCpnt->request.rq_dev));
+ kdevname(SCpnt->request->rq_dev));
if (HOSTDATA(SCpnt->host)->mb[i].status) {
printk(KERN_ERR "OGMB still full - restarting\n");
aha1542_out(SCpnt->host->io_port, &ahacmd, 1);
};
} else
printk(KERN_ERR "Other pending command %s\n",
- kdevname(SCpnt->request.rq_dev));
+ kdevname(SCpnt->request->rq_dev));
}
#endif
diff --git a/drivers/scsi/constants.c b/drivers/scsi/constants.c
index 57d3f82b80c4..530247392207 100644
--- a/drivers/scsi/constants.c
+++ b/drivers/scsi/constants.c
@@ -1006,13 +1006,13 @@ print_sense_internal(const char * devclass,
void print_sense(const char * devclass, Scsi_Cmnd * SCpnt)
{
print_sense_internal(devclass, SCpnt->sense_buffer,
- SCpnt->request.rq_dev);
+ SCpnt->request->rq_dev);
}
void print_req_sense(const char * devclass, Scsi_Request * SRpnt)
{
print_sense_internal(devclass, SRpnt->sr_sense_buffer,
- SRpnt->sr_request.rq_dev);
+ SRpnt->sr_request->rq_dev);
}
#if (CONSTANTS & CONST_MSG)
diff --git a/drivers/scsi/eata.c b/drivers/scsi/eata.c
index 5a84221d5d5c..cc73354accc6 100644
--- a/drivers/scsi/eata.c
+++ b/drivers/scsi/eata.c
@@ -1563,7 +1563,7 @@ static inline int do_qcomm(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) {
if (linked_comm && SCpnt->device->queue_depth > 2
&& TLDEV(SCpnt->device->type)) {
HD(j)->cp_stat[i] = READY;
- flush_dev(SCpnt->device, SCpnt->request.sector, j, FALSE);
+ flush_dev(SCpnt->device, SCpnt->request->sector, j, FALSE);
return 0;
}
@@ -1875,11 +1875,11 @@ static inline int reorder(unsigned int j, unsigned long cursec,
if (!cpp->din) input_only = FALSE;
- if (SCpnt->request.sector < minsec) minsec = SCpnt->request.sector;
- if (SCpnt->request.sector > maxsec) maxsec = SCpnt->request.sector;
+ if (SCpnt->request->sector < minsec) minsec = SCpnt->request->sector;
+ if (SCpnt->request->sector > maxsec) maxsec = SCpnt->request->sector;
- sl[n] = SCpnt->request.sector;
- ioseek += SCpnt->request.nr_sectors;
+ sl[n] = SCpnt->request->sector;
+ ioseek += SCpnt->request->nr_sectors;
if (!n) continue;
@@ -1907,7 +1907,7 @@ static inline int reorder(unsigned int j, unsigned long cursec,
if (!input_only) for (n = 0; n < n_ready; n++) {
k = il[n]; cpp = &HD(j)->cp[k]; SCpnt = cpp->SCpnt;
- ll[n] = SCpnt->request.nr_sectors; pl[n] = SCpnt->pid;
+ ll[n] = SCpnt->request->nr_sectors; pl[n] = SCpnt->pid;
if (!n) continue;
@@ -1935,7 +1935,7 @@ static inline int reorder(unsigned int j, unsigned long cursec,
" cur %ld s:%c r:%c rev:%c in:%c ov:%c xd %d.\n",
(ihdlr ? "ihdlr" : "qcomm"), SCpnt->channel, SCpnt->target,
SCpnt->lun, SCpnt->pid, k, flushcount, n_ready,
- SCpnt->request.sector, SCpnt->request.nr_sectors, cursec,
+ SCpnt->request->sector, SCpnt->request->nr_sectors, cursec,
YESNO(s), YESNO(r), YESNO(rev), YESNO(input_only),
YESNO(overlap), cpp->din);
}
@@ -2073,7 +2073,7 @@ static inline void ihdlr(int irq, unsigned int j) {
if (linked_comm && SCpnt->device->queue_depth > 2
&& TLDEV(SCpnt->device->type))
- flush_dev(SCpnt->device, SCpnt->request.sector, j, TRUE);
+ flush_dev(SCpnt->device, SCpnt->request->sector, j, TRUE);
tstatus = status_byte(spp->target_status);
diff --git a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
index e276376771ae..2b0ab4e4e0b4 100644
--- a/drivers/scsi/hosts.c
+++ b/drivers/scsi/hosts.c
@@ -230,6 +230,7 @@ struct Scsi_Host * scsi_register(Scsi_Host_Template * tpnt, int j)
retval->select_queue_depths = tpnt->select_queue_depths;
retval->max_sectors = tpnt->max_sectors;
+ retval->use_blk_tcq = tpnt->use_blk_tcq;
if(!scsi_hostlist)
scsi_hostlist = retval;
diff --git a/drivers/scsi/hosts.h b/drivers/scsi/hosts.h
index 8604eb35140a..95edfbd10ccd 100644
--- a/drivers/scsi/hosts.h
+++ b/drivers/scsi/hosts.h
@@ -286,6 +286,12 @@ typedef struct SHT
unsigned highmem_io:1;
+ /*
+ * True if the driver wishes to use the generic block layer
+ * tag queueing functions
+ */
+ unsigned use_blk_tcq:1;
+
/*
* Name of proc directory
*/
@@ -386,6 +392,7 @@ struct Scsi_Host
unsigned unchecked_isa_dma:1;
unsigned use_clustering:1;
unsigned highmem_io:1;
+ unsigned use_blk_tcq:1;
/*
* Host has rejected a command because it was busy.
@@ -555,6 +562,26 @@ extern int scsi_unregister_host(Scsi_Host_Template *);
#define SD_EXTRA_DEVS CONFIG_SD_EXTRA_DEVS
#define SR_EXTRA_DEVS CONFIG_SR_EXTRA_DEVS
+
+/**
+ * scsi_find_device - find a device given the host
+ * @channel: SCSI channel (zero if only one channel)
+ * @pun: SCSI target number (physical unit number)
+ * @lun: SCSI Logical Unit Number
+ **/
+static inline Scsi_Device *scsi_find_device(struct Scsi_Host *host,
+ int channel, int pun, int lun) {
+ Scsi_Device *SDpnt;
+
+ for(SDpnt = host->host_queue;
+ SDpnt != NULL;
+ SDpnt = SDpnt->next)
+ if(SDpnt->channel == channel && SDpnt->id == pun
+ && SDpnt->lun ==lun)
+ break;
+ return SDpnt;
+}
+
#endif
/*
* Overrides for Emacs so that we follow Linus's tabbing style.
diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c
index 9652a0f71616..14960822b3e6 100644
--- a/drivers/scsi/ide-scsi.c
+++ b/drivers/scsi/ide-scsi.c
@@ -668,7 +668,7 @@ static inline int should_transform(struct ata_device *drive, Scsi_Cmnd *cmd)
struct Scsi_Host *host = drive->driver_data;
idescsi_scsi_t *scsi = idescsi_private(host);
- if (major(cmd->request.rq_dev) == SCSI_GENERIC_MAJOR)
+ if (major(cmd->request->rq_dev) == SCSI_GENERIC_MAJOR)
return test_bit(IDESCSI_SG_TRANSFORM, &scsi->transform);
return test_bit(IDESCSI_TRANSFORM, &scsi->transform);
}
diff --git a/drivers/scsi/osst.c b/drivers/scsi/osst.c
index 8c91af6f7900..9ea4f1b68ca7 100644
--- a/drivers/scsi/osst.c
+++ b/drivers/scsi/osst.c
@@ -270,7 +270,7 @@ static int osst_chk_result(OS_Scsi_Tape * STp, Scsi_Request * SRpnt)
/* Wakeup from interrupt */
static void osst_sleep_done (Scsi_Cmnd * SCpnt)
{
- unsigned int dev = TAPE_NR(SCpnt->request.rq_dev);
+ unsigned int dev = TAPE_NR(SCpnt->request->rq_dev);
OS_Scsi_Tape * STp;
if (os_scsi_tapes && (STp = os_scsi_tapes[dev])) {
@@ -285,13 +285,13 @@ static void osst_sleep_done (Scsi_Cmnd * SCpnt)
}
else
(STp->buffer)->midlevel_result = SCpnt->result;
- SCpnt->request.rq_status = RQ_SCSI_DONE;
+ SCpnt->request->rq_status = RQ_SCSI_DONE;
(STp->buffer)->last_SRpnt = SCpnt->sc_request;
#if DEBUG
STp->write_pending = 0;
#endif
- complete(SCpnt->request.waiting);
+ complete(SCpnt->request->waiting);
}
#if DEBUG
else if (debugging)
@@ -313,7 +313,7 @@ static Scsi_Request * osst_do_scsi(Scsi_Request *SRpnt, OS_Scsi_Tape *STp,
#endif
if (SRpnt == NULL) {
if ((SRpnt = scsi_allocate_request(STp->device)) == NULL) {
- printk(KERN_ERR "osst%d:E: Can't get SCSI request.\n", TAPE_NR(STp->devt));
+ printk(KERN_ERR "osst%d:E: Can't get SCSI request->\n", TAPE_NR(STp->devt));
if (signal_pending(current))
(STp->buffer)->syscall_result = (-EINTR);
else
@@ -336,15 +336,15 @@ static Scsi_Request * osst_do_scsi(Scsi_Request *SRpnt, OS_Scsi_Tape *STp,
bp = (STp->buffer)->b_data;
SRpnt->sr_data_direction = direction;
SRpnt->sr_cmd_len = 0;
- SRpnt->sr_request.waiting = &(STp->wait);
- SRpnt->sr_request.rq_status = RQ_SCSI_BUSY;
- SRpnt->sr_request.rq_dev = STp->devt;
+ SRpnt->sr_request->waiting = &(STp->wait);
+ SRpnt->sr_request->rq_status = RQ_SCSI_BUSY;
+ SRpnt->sr_request->rq_dev = STp->devt;
scsi_do_req(SRpnt, (void *)cmd, bp, bytes, osst_sleep_done, timeout, retries);
if (do_wait) {
- wait_for_completion(SRpnt->sr_request.waiting);
- SRpnt->sr_request.waiting = NULL;
+ wait_for_completion(SRpnt->sr_request->waiting);
+ SRpnt->sr_request->waiting = NULL;
STp->buffer->syscall_result = osst_chk_result(STp, SRpnt);
#ifdef OSST_INJECT_ERRORS
if (STp->buffer->syscall_result == 0 &&
@@ -377,7 +377,7 @@ static void osst_write_behind_check(OS_Scsi_Tape *STp)
STp->nbr_finished++;
#endif
wait_for_completion(&(STp->wait));
- (STp->buffer)->last_SRpnt->sr_request.waiting = NULL;
+ (STp->buffer)->last_SRpnt->sr_request->waiting = NULL;
STp->buffer->syscall_result = osst_chk_result(STp, STp->buffer->last_SRpnt);
diff --git a/drivers/scsi/qla1280.c b/drivers/scsi/qla1280.c
index a008f3dd87b0..9debb242fe73 100644
--- a/drivers/scsi/qla1280.c
+++ b/drivers/scsi/qla1280.c
@@ -4236,7 +4236,7 @@ qla1280_32bit_start_scsi(struct scsi_qla_host *ha, srb_t * sp)
/* Set transfer direction (READ and WRITE) */
/* Linux doesn't tell us */
/*
- * For block devices, cmd->request.cmd has the operation
+ * For block devices, cmd->request->cmd has the operation
* For character devices, this isn't always set properly, so
* we need to check data_cmnd[0]. This catches the conditions
* for st.c, but not sg. Generic commands are pass down to us.
@@ -6241,7 +6241,7 @@ qla1280_print_scsi_cmd(Scsi_Cmnd * cmd)
cmd->tag, cmd->flags, cmd->transfersize);
printk(" Pid=%li, SP=0x%p\n", cmd->pid, CMD_SP(cmd));
printk(" underflow size = 0x%x, direction=0x%x, req.cmd=0x%x \n",
- cmd->underflow, sp->dir, cmd->request.cmd);
+ cmd->underflow, sp->dir, cmd->request->cmd);
}
/**************************************************************************
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index 0215c45cbd37..8e9df60cecaa 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -253,11 +253,20 @@ __setup("scsi_logging=", scsi_logging_setup);
static void scsi_wait_done(Scsi_Cmnd * SCpnt)
{
- struct request *req;
+ struct request *req = SCpnt->request;
+ struct request_queue *q = &SCpnt->device->request_queue;
+ unsigned long flags;
- req = &SCpnt->request;
+ ASSERT_LOCK(q->queue_lock, 0);
req->rq_status = RQ_SCSI_DONE; /* Busy, but indicate request done */
+ spin_lock_irqsave(q->queue_lock, flags);
+
+ if(blk_rq_tagged(req))
+ blk_queue_end_tag(q, req);
+
+ spin_unlock_irqrestore(q->queue_lock, flags);
+
if (req->waiting)
complete(req->waiting);
}
@@ -296,17 +305,19 @@ static spinlock_t scsi_bhqueue_lock = SPIN_LOCK_UNLOCKED;
Scsi_Request *scsi_allocate_request(Scsi_Device * device)
{
Scsi_Request *SRpnt = NULL;
+ const int offset = ALIGN(sizeof(Scsi_Request), 4);
+ const int size = offset + sizeof(struct request);
if (!device)
panic("No device passed to scsi_allocate_request().\n");
- SRpnt = (Scsi_Request *) kmalloc(sizeof(Scsi_Request), GFP_ATOMIC);
+ SRpnt = (Scsi_Request *) kmalloc(size, GFP_ATOMIC);
if( SRpnt == NULL )
{
return NULL;
}
-
- memset(SRpnt, 0, sizeof(Scsi_Request));
+ memset(SRpnt, 0, size);
+ SRpnt->sr_request = (struct request *)(((char *)SRpnt) + offset);
SRpnt->sr_device = device;
SRpnt->sr_host = device->host;
SRpnt->sr_magic = SCSI_REQ_MAGIC;
@@ -434,7 +445,7 @@ Scsi_Cmnd *scsi_allocate_device(Scsi_Device * device, int wait,
* Now we can check for a free command block for this device.
*/
for (SCpnt = device->device_queue; SCpnt; SCpnt = SCpnt->next) {
- if (SCpnt->request.rq_status == RQ_INACTIVE)
+ if (SCpnt->request == NULL)
break;
}
}
@@ -503,9 +514,7 @@ Scsi_Cmnd *scsi_allocate_device(Scsi_Device * device, int wait,
}
}
- SCpnt->request.rq_status = RQ_SCSI_BUSY;
- SCpnt->request.waiting = NULL; /* And no one is waiting for this
- * to complete */
+ SCpnt->request = NULL;
atomic_inc(&SCpnt->host->host_active);
atomic_inc(&SCpnt->device->device_active);
@@ -548,7 +557,7 @@ inline void __scsi_release_command(Scsi_Cmnd * SCpnt)
SDpnt = SCpnt->device;
- SCpnt->request.rq_status = RQ_INACTIVE;
+ SCpnt->request = NULL;
SCpnt->state = SCSI_STATE_UNUSED;
SCpnt->owner = SCSI_OWNER_NOBODY;
atomic_dec(&SCpnt->host->host_active);
@@ -771,13 +780,13 @@ void scsi_wait_req (Scsi_Request * SRpnt, const void *cmnd ,
DECLARE_COMPLETION(wait);
request_queue_t *q = &SRpnt->sr_device->request_queue;
- SRpnt->sr_request.waiting = &wait;
- SRpnt->sr_request.rq_status = RQ_SCSI_BUSY;
+ SRpnt->sr_request->waiting = &wait;
+ SRpnt->sr_request->rq_status = RQ_SCSI_BUSY;
scsi_do_req (SRpnt, (void *) cmnd,
buffer, bufflen, scsi_wait_done, timeout, retries);
generic_unplug_device(q);
wait_for_completion(&wait);
- SRpnt->sr_request.waiting = NULL;
+ SRpnt->sr_request->waiting = NULL;
if( SRpnt->sr_command != NULL )
{
scsi_release_command(SRpnt->sr_command);
@@ -928,8 +937,7 @@ void scsi_init_cmd_from_req(Scsi_Cmnd * SCpnt, Scsi_Request * SRpnt)
SCpnt->cmd_len = SRpnt->sr_cmd_len;
SCpnt->use_sg = SRpnt->sr_use_sg;
- memcpy((void *) &SCpnt->request, (const void *) &SRpnt->sr_request,
- sizeof(SRpnt->sr_request));
+ SCpnt->request = SRpnt->sr_request;
memcpy((void *) SCpnt->data_cmnd, (const void *) SRpnt->sr_cmnd,
sizeof(SCpnt->data_cmnd));
SCpnt->reset_chain = NULL;
@@ -1490,7 +1498,7 @@ void scsi_build_commandblocks(Scsi_Device * SDpnt)
SCpnt->target = SDpnt->id;
SCpnt->lun = SDpnt->lun;
SCpnt->channel = SDpnt->channel;
- SCpnt->request.rq_status = RQ_INACTIVE;
+ SCpnt->request = NULL;
SCpnt->use_sg = 0;
SCpnt->old_use_sg = 0;
SCpnt->old_cmd_len = 0;
@@ -2062,16 +2070,16 @@ int scsi_unregister_host(Scsi_Host_Template * tpnt)
SCpnt = SCpnt->next) {
online_status = SDpnt->online;
SDpnt->online = FALSE;
- if (SCpnt->request.rq_status != RQ_INACTIVE) {
+ if (SCpnt->request && SCpnt->request->rq_status != RQ_INACTIVE) {
printk(KERN_ERR "SCSI device not inactive - rq_status=%d, target=%d, pid=%ld, state=%d, owner=%d.\n",
- SCpnt->request.rq_status, SCpnt->target, SCpnt->pid,
+ SCpnt->request->rq_status, SCpnt->target, SCpnt->pid,
SCpnt->state, SCpnt->owner);
for (SDpnt1 = shpnt->host_queue; SDpnt1;
SDpnt1 = SDpnt1->next) {
for (SCpnt = SDpnt1->device_queue; SCpnt;
SCpnt = SCpnt->next)
- if (SCpnt->request.rq_status == RQ_SCSI_DISCONNECTING)
- SCpnt->request.rq_status = RQ_INACTIVE;
+ if (SCpnt->request->rq_status == RQ_SCSI_DISCONNECTING)
+ SCpnt->request->rq_status = RQ_INACTIVE;
}
SDpnt->online = online_status;
printk(KERN_ERR "Device busy???\n");
@@ -2082,7 +2090,8 @@ int scsi_unregister_host(Scsi_Host_Template * tpnt)
* continue on.
*/
SCpnt->state = SCSI_STATE_DISCONNECTING;
- SCpnt->request.rq_status = RQ_SCSI_DISCONNECTING; /* Mark as busy */
+ if(SCpnt->request)
+ SCpnt->request->rq_status = RQ_SCSI_DISCONNECTING; /* Mark as busy */
}
}
}
@@ -2392,11 +2401,11 @@ static void scsi_dump_status(int level)
SCpnt->target,
SCpnt->lun,
- kdevname(SCpnt->request.rq_dev),
- SCpnt->request.sector,
- SCpnt->request.nr_sectors,
- (long)SCpnt->request.current_nr_sectors,
- SCpnt->request.rq_status,
+ kdevname(SCpnt->request->rq_dev),
+ SCpnt->request->sector,
+ SCpnt->request->nr_sectors,
+ (long)SCpnt->request->current_nr_sectors,
+ SCpnt->request->rq_status,
SCpnt->use_sg,
SCpnt->retries,
@@ -2708,16 +2717,18 @@ int
scsi_reset_provider(Scsi_Device *dev, int flag)
{
Scsi_Cmnd SC, *SCpnt = &SC;
+ struct request req;
int rtn;
+ SCpnt->request = &req;
memset(&SCpnt->eh_timeout, 0, sizeof(SCpnt->eh_timeout));
SCpnt->host = dev->host;
SCpnt->device = dev;
SCpnt->target = dev->id;
SCpnt->lun = dev->lun;
SCpnt->channel = dev->channel;
- SCpnt->request.rq_status = RQ_SCSI_BUSY;
- SCpnt->request.waiting = NULL;
+ SCpnt->request->rq_status = RQ_SCSI_BUSY;
+ SCpnt->request->waiting = NULL;
SCpnt->use_sg = 0;
SCpnt->old_use_sg = 0;
SCpnt->old_cmd_len = 0;
diff --git a/drivers/scsi/scsi.h b/drivers/scsi/scsi.h
index cd1df44e19a6..c14b1c497a0a 100644
--- a/drivers/scsi/scsi.h
+++ b/drivers/scsi/scsi.h
@@ -566,6 +566,7 @@ struct scsi_device {
atomic_t device_active; /* commands checked out for device */
volatile unsigned short device_busy; /* commands actually active on low-level */
Scsi_Cmnd *device_queue; /* queue of SCSI Command structures */
+ Scsi_Cmnd *current_cmnd; /* currently active command */
unsigned int id, lun, channel;
@@ -662,7 +663,7 @@ struct scsi_request {
struct Scsi_Host *sr_host;
Scsi_Device *sr_device;
Scsi_Cmnd *sr_command;
- struct request sr_request; /* A copy of the command we are
+ struct request *sr_request; /* A copy of the command we are
working on */
unsigned sr_bufflen; /* Size of data buffer */
void *sr_buffer; /* Data buffer */
@@ -773,8 +774,8 @@ struct scsi_cmnd {
transferred less actual number
transferred (0 if not supported) */
- struct request request; /* A copy of the command we are
- working on */
+ struct request *request; /* The command we are
+ working on */
unsigned char sense_buffer[SCSI_SENSE_BUFFERSIZE]; /* obtained by REQUEST SENSE
* when CHECK CONDITION is
@@ -856,4 +857,87 @@ struct scsi_cmnd {
extern int scsi_reset_provider(Scsi_Device *, int);
+/**
+ * scsi_activate_tcq - turn on tag command queueing
+ * @SDpnt: device to turn on TCQ for
+ * @depth: queue depth
+ *
+ * Notes:
+ * Eventually, I hope depth would be the maximum depth
+ * the device could cope with and the real queue depth
+ * would be adjustable from 0 to depth.
+ **/
+static inline void scsi_activate_tcq(Scsi_Device *SDpnt, int depth) {
+ request_queue_t *q = &SDpnt->request_queue;
+
+ if(SDpnt->tagged_supported && !blk_queue_tagged(q)) {
+ blk_queue_init_tags(q, depth);
+ SDpnt->tagged_queue = 1;
+ }
+}
+
+/**
+ * scsi_deactivate_tcq - turn off tag command queueing
+ * @SDpnt: device to turn off TCQ for
+ **/
+static inline void scsi_deactivate_tcq(Scsi_Device *SDpnt) {
+ blk_queue_free_tags(&SDpnt->request_queue);
+ SDpnt->tagged_queue = 0;
+}
+#define MSG_SIMPLE_TAG 0x20
+#define MSG_HEAD_TAG 0x21
+#define MSG_ORDERED_TAG 0x22
+
+#define SCSI_NO_TAG (-1) /* identify no tag in use */
+
+/**
+ * scsi_populate_tag_msg - place a tag message in a buffer
+ * @SCpnt: pointer to the Scsi_Cmnd for the tag
+ * @msg: pointer to the area to place the tag
+ *
+ * Notes:
+ * designed to create the correct type of tag message for the
+ * particular request. Returns the size of the tag message.
+ * May return 0 if TCQ is disabled for this device.
+ **/
+static inline int scsi_populate_tag_msg(Scsi_Cmnd *SCpnt, char *msg) {
+ struct request *req = SCpnt->request;
+
+ if(!blk_rq_tagged(req))
+ return 0;
+
+ if(req->flags & REQ_BARRIER)
+ *msg++ = MSG_ORDERED_TAG;
+ else
+ *msg++ = MSG_SIMPLE_TAG;
+
+ *msg++ = SCpnt->request->tag;
+
+ return 2;
+}
+
+/**
+ * scsi_find_tag - find a tagged command by device
+ * @SDpnt: pointer to the ScSI device
+ * @tag: the tag number
+ *
+ * Notes:
+ * Only works with tags allocated by the generic blk layer.
+ **/
+static inline Scsi_Cmnd *scsi_find_tag(Scsi_Device *SDpnt, int tag) {
+
+ struct request *req;
+
+ if(tag == SCSI_NO_TAG)
+ /* single command, look in space */
+ return SDpnt->current_cmnd;
+
+ req = blk_queue_find_tag(&SDpnt->request_queue, tag);
+
+ if(req == NULL)
+ return NULL;
+
+ return (Scsi_Cmnd *)req->special;
+}
+
#endif
diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c
index 328875a71815..058688349f5d 100644
--- a/drivers/scsi/scsi_debug.c
+++ b/drivers/scsi/scsi_debug.c
@@ -694,7 +694,7 @@ static int scsi_debug_read(Scsi_Cmnd * SCpnt, int upper_blk, int block,
{
int delay = SCSI_SETUP_LATENCY;
- delay += SCpnt->request.nr_sectors * SCSI_DATARATE;
+ delay += SCpnt->request->nr_sectors * SCSI_DATARATE;
if (delay)
usleep(delay);
}
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index 311f4a6fd149..11d9307d20f0 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -319,7 +319,7 @@ void scsi_eh_done(Scsi_Cmnd * SCpnt)
return;
}
- SCpnt->request.rq_status = RQ_SCSI_DONE;
+ SCpnt->request->rq_status = RQ_SCSI_DONE;
SCpnt->owner = SCSI_OWNER_ERROR_HANDLER;
SCpnt->eh_state = SUCCESS;
@@ -346,7 +346,7 @@ void scsi_eh_done(Scsi_Cmnd * SCpnt)
STATIC
void scsi_eh_action_done(Scsi_Cmnd * SCpnt, int answer)
{
- SCpnt->request.rq_status = RQ_SCSI_DONE;
+ SCpnt->request->rq_status = RQ_SCSI_DONE;
SCpnt->owner = SCSI_OWNER_ERROR_HANDLER;
SCpnt->eh_state = (answer ? SUCCESS : FAILED);
@@ -601,7 +601,7 @@ retry:
* Set up the semaphore so we wait for the command to complete.
*/
SCpnt->host->eh_action = &sem;
- SCpnt->request.rq_status = RQ_SCSI_BUSY;
+ SCpnt->request->rq_status = RQ_SCSI_BUSY;
spin_lock_irqsave(SCpnt->host->host_lock, flags);
host->hostt->queuecommand(SCpnt, scsi_eh_done);
@@ -633,7 +633,7 @@ retry:
SCpnt->host->hostt->eh_abort_handler(SCpnt);
spin_unlock_irqrestore(SCpnt->host->host_lock, flags);
- SCpnt->request.rq_status = RQ_SCSI_DONE;
+ SCpnt->request->rq_status = RQ_SCSI_DONE;
SCpnt->owner = SCSI_OWNER_ERROR_HANDLER;
SCpnt->eh_state = FAILED;
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index bede96547efb..5fbe664e65ea 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -76,12 +76,10 @@ static void __scsi_insert_special(request_queue_t *q, struct request *rq,
* must not attempt merges on this) and that it acts as a soft
* barrier
*/
- rq->flags = REQ_SPECIAL | REQ_BARRIER;
+ rq->flags &= REQ_QUEUED;
+ rq->flags |= REQ_SPECIAL | REQ_BARRIER;
rq->special = data;
- rq->q = NULL;
- rq->bio = rq->biotail = NULL;
- rq->nr_phys_segments = 0;
/*
* We have the option of inserting the head or the tail of the queue.
@@ -90,6 +88,9 @@ static void __scsi_insert_special(request_queue_t *q, struct request *rq,
* device, or a host that is unable to accept a particular command.
*/
spin_lock_irqsave(q->queue_lock, flags);
+ /* If command is tagged, release the tag */
+ if(blk_rq_tagged(rq))
+ blk_queue_end_tag(q, rq);
_elv_add_request(q, rq, !at_head, 0);
q->request_fn(q);
spin_unlock_irqrestore(q->queue_lock, flags);
@@ -120,7 +121,7 @@ int scsi_insert_special_cmd(Scsi_Cmnd * SCpnt, int at_head)
{
request_queue_t *q = &SCpnt->device->request_queue;
- __scsi_insert_special(q, &SCpnt->request, SCpnt, at_head);
+ __scsi_insert_special(q, SCpnt->request, SCpnt, at_head);
return 0;
}
@@ -148,7 +149,7 @@ int scsi_insert_special_req(Scsi_Request * SRpnt, int at_head)
{
request_queue_t *q = &SRpnt->sr_device->request_queue;
- __scsi_insert_special(q, &SRpnt->sr_request, SRpnt, at_head);
+ __scsi_insert_special(q, SRpnt->sr_request, SRpnt, at_head);
return 0;
}
@@ -259,8 +260,10 @@ void scsi_queue_next_request(request_queue_t * q, Scsi_Cmnd * SCpnt)
* in which case we need to request the blocks that come after
* the bad sector.
*/
- SCpnt->request.special = (void *) SCpnt;
- _elv_add_request(q, &SCpnt->request, 0, 0);
+ SCpnt->request->special = (void *) SCpnt;
+ if(blk_rq_tagged(SCpnt->request))
+ blk_queue_end_tag(q, SCpnt->request);
+ _elv_add_request(q, SCpnt->request, 0, 0);
}
/*
@@ -356,15 +359,18 @@ static Scsi_Cmnd *__scsi_end_request(Scsi_Cmnd * SCpnt,
int frequeue)
{
request_queue_t *q = &SCpnt->device->request_queue;
- struct request *req = &SCpnt->request;
+ struct request *req = SCpnt->request;
+ int flags;
ASSERT_LOCK(q->queue_lock, 0);
+ spin_lock_irqsave(q->queue_lock, flags);
/*
* If there are blocks left over at the end, set up the command
* to queue the remainder of them.
*/
if (end_that_request_first(req, uptodate, sectors)) {
+ spin_unlock_irqrestore(q->queue_lock, flags);
if (!requeue)
return SCpnt;
@@ -376,15 +382,15 @@ static Scsi_Cmnd *__scsi_end_request(Scsi_Cmnd * SCpnt,
return SCpnt;
}
- /*
- * This request is done. If there is someone blocked waiting for this
- * request, wake them up.
- */
- if (req->waiting)
- complete(req->waiting);
-
add_blkdev_randomness(major(req->rq_dev));
+ if(blk_rq_tagged(req))
+ blk_queue_end_tag(q, req);
+
+ end_that_request_last(req);
+
+ spin_unlock_irqrestore(q->queue_lock, flags);
+
/*
* This will goose the queue request function at the end, so we don't
* need to worry about launching another command.
@@ -441,7 +447,7 @@ Scsi_Cmnd *scsi_end_request(Scsi_Cmnd * SCpnt, int uptodate, int sectors)
*/
static void scsi_release_buffers(Scsi_Cmnd * SCpnt)
{
- struct request *req = &SCpnt->request;
+ struct request *req = SCpnt->request;
ASSERT_LOCK(SCpnt->host->host_lock, 0);
@@ -491,7 +497,7 @@ void scsi_io_completion(Scsi_Cmnd * SCpnt, int good_sectors,
int result = SCpnt->result;
int this_count = SCpnt->bufflen >> 9;
request_queue_t *q = &SCpnt->device->request_queue;
- struct request *req = &SCpnt->request;
+ struct request *req = SCpnt->request;
/*
* We must do one of several things here:
@@ -675,7 +681,7 @@ void scsi_io_completion(Scsi_Cmnd * SCpnt, int good_sectors,
if (result) {
struct Scsi_Device_Template *STpnt;
- STpnt = scsi_get_request_dev(&SCpnt->request);
+ STpnt = scsi_get_request_dev(SCpnt->request);
printk("SCSI %s error : host %d channel %d id %d lun %d return code = %x\n",
(STpnt ? STpnt->name : "device"),
SCpnt->device->host->host_no,
@@ -868,7 +874,7 @@ void scsi_request_fn(request_queue_t * q)
* the remainder of a partially fulfilled request that can
* come up when there is a medium error. We have to treat
* these two cases differently. We differentiate by looking
- * at request.cmd, as this tells us the real story.
+ * at request->cmd, as this tells us the real story.
*/
if (req->flags & REQ_SPECIAL) {
STpnt = NULL;
@@ -904,6 +910,9 @@ void scsi_request_fn(request_queue_t * q)
*/
if (!SCpnt)
break;
+
+ /* pull a tag out of the request if we have one */
+ SCpnt->tag = req->tag;
} else {
blk_dump_rq_flags(req, "SCSI bad req");
break;
@@ -924,18 +933,15 @@ void scsi_request_fn(request_queue_t * q)
* reason to search the list, because all of the commands
* in this queue are for the same device.
*/
- blkdev_dequeue_request(req);
+ if(!(blk_queue_tagged(q) && (blk_queue_start_tag(q, req) == 0)))
+ blkdev_dequeue_request(req);
- if (req != &SCpnt->request && req != &SRpnt->sr_request ) {
- memcpy(&SCpnt->request, req, sizeof(struct request));
+ /* note the overloading of req->special. When the tag
+ * is active it always means SCpnt. If the tag goes
+ * back for re-queueing, it may be reset */
+ req->special = SCpnt;
+ SCpnt->request = req;
- /*
- * We have copied the data out of the request block -
- * it is now in a field in SCpnt. Release the request
- * block.
- */
- blkdev_release_request(req);
- }
/*
* Now it is finally safe to release the lock. We are
* not going to noodle the request list until this
@@ -945,7 +951,7 @@ void scsi_request_fn(request_queue_t * q)
req = NULL;
spin_unlock_irq(q->queue_lock);
- if (SCpnt->request.flags & REQ_CMD) {
+ if (SCpnt->request->flags & REQ_CMD) {
/*
* This will do a couple of things:
* 1) Fill in the actual SCSI command.
@@ -959,7 +965,7 @@ void scsi_request_fn(request_queue_t * q)
* request to be rejected immediately.
*/
if (STpnt == NULL)
- STpnt = scsi_get_request_dev(&SCpnt->request);
+ STpnt = scsi_get_request_dev(SCpnt->request);
/*
* This sets up the scatter-gather table (allocating if
@@ -973,9 +979,11 @@ void scsi_request_fn(request_queue_t * q)
SDpnt->starved = 1;
SHpnt->some_device_starved = 1;
}
- SCpnt->request.special = SCpnt;
- SCpnt->request.flags |= REQ_SPECIAL;
- _elv_add_request(q, &SCpnt->request, 0, 0);
+ SCpnt->request->special = SCpnt;
+ SCpnt->request->flags |= REQ_SPECIAL;
+ if(blk_rq_tagged(SCpnt->request))
+ blk_queue_end_tag(q, SCpnt->request);
+ _elv_add_request(q, SCpnt->request, 0, 0);
break;
}
@@ -985,7 +993,7 @@ void scsi_request_fn(request_queue_t * q)
if (!STpnt->init_command(SCpnt)) {
scsi_release_buffers(SCpnt);
SCpnt = __scsi_end_request(SCpnt, 0,
- SCpnt->request.nr_sectors, 0, 0);
+ SCpnt->request->nr_sectors, 0, 0);
if( SCpnt != NULL )
{
panic("Should not have leftover blocks\n");
diff --git a/drivers/scsi/scsi_merge.c b/drivers/scsi/scsi_merge.c
index 82c3a17235bc..b29b763bd38a 100644
--- a/drivers/scsi/scsi_merge.c
+++ b/drivers/scsi/scsi_merge.c
@@ -57,7 +57,7 @@
*/
int scsi_init_io(Scsi_Cmnd *SCpnt)
{
- struct request *req = &SCpnt->request;
+ struct request *req = SCpnt->request;
struct scatterlist *sgpnt;
int count, gfp_mask;
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index 63fe305e4342..e350a3292ed2 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -327,13 +327,13 @@ static int sd_init_command(Scsi_Cmnd * SCpnt)
/*
* don't support specials for nwo
*/
- if (!(SCpnt->request.flags & REQ_CMD))
+ if (!(SCpnt->request->flags & REQ_CMD))
return 0;
- part_nr = SD_PARTITION(SCpnt->request.rq_dev);
- dsk_nr = DEVICE_NR(SCpnt->request.rq_dev);
+ part_nr = SD_PARTITION(SCpnt->request->rq_dev);
+ dsk_nr = DEVICE_NR(SCpnt->request->rq_dev);
- block = SCpnt->request.sector;
+ block = SCpnt->request->sector;
this_count = SCpnt->request_bufflen >> 9;
SCSI_LOG_HLQUEUE(1, printk("sd_command_init: dsk_nr=%d, block=%d, "
@@ -344,9 +344,9 @@ static int sd_init_command(Scsi_Cmnd * SCpnt)
/* >>>>> this change is not in the lk 2.5 series */
if (part_nr >= (sd_template.dev_max << 4) || (part_nr & 0xf) ||
!sdp || !sdp->online ||
- block + SCpnt->request.nr_sectors > sd[part_nr].nr_sects) {
+ block + SCpnt->request->nr_sectors > sd[part_nr].nr_sects) {
SCSI_LOG_HLQUEUE(2, printk("Finishing %ld sectors\n",
- SCpnt->request.nr_sectors));
+ SCpnt->request->nr_sectors));
SCSI_LOG_HLQUEUE(2, printk("Retry with 0x%p\n", SCpnt));
return 0;
}
@@ -375,7 +375,7 @@ static int sd_init_command(Scsi_Cmnd * SCpnt)
* for this.
*/
if (sdp->sector_size == 1024) {
- if ((block & 1) || (SCpnt->request.nr_sectors & 1)) {
+ if ((block & 1) || (SCpnt->request->nr_sectors & 1)) {
printk(KERN_ERR "sd: Bad block number requested");
return 0;
} else {
@@ -384,7 +384,7 @@ static int sd_init_command(Scsi_Cmnd * SCpnt)
}
}
if (sdp->sector_size == 2048) {
- if ((block & 3) || (SCpnt->request.nr_sectors & 3)) {
+ if ((block & 3) || (SCpnt->request->nr_sectors & 3)) {
printk(KERN_ERR "sd: Bad block number requested");
return 0;
} else {
@@ -393,7 +393,7 @@ static int sd_init_command(Scsi_Cmnd * SCpnt)
}
}
if (sdp->sector_size == 4096) {
- if ((block & 7) || (SCpnt->request.nr_sectors & 7)) {
+ if ((block & 7) || (SCpnt->request->nr_sectors & 7)) {
printk(KERN_ERR "sd: Bad block number requested");
return 0;
} else {
@@ -401,25 +401,25 @@ static int sd_init_command(Scsi_Cmnd * SCpnt)
this_count = this_count >> 3;
}
}
- if (rq_data_dir(&SCpnt->request) == WRITE) {
+ if (rq_data_dir(SCpnt->request) == WRITE) {
if (!sdp->writeable) {
return 0;
}
SCpnt->cmnd[0] = WRITE_6;
SCpnt->sc_data_direction = SCSI_DATA_WRITE;
- } else if (rq_data_dir(&SCpnt->request) == READ) {
+ } else if (rq_data_dir(SCpnt->request) == READ) {
SCpnt->cmnd[0] = READ_6;
SCpnt->sc_data_direction = SCSI_DATA_READ;
} else {
printk(KERN_ERR "sd: Unknown command %lx\n",
- SCpnt->request.flags);
-/* overkill panic("Unknown sd command %lx\n", SCpnt->request.flags); */
+ SCpnt->request->flags);
+/* overkill panic("Unknown sd command %lx\n", SCpnt->request->flags); */
return 0;
}
SCSI_LOG_HLQUEUE(2, printk("%s : %s %d/%ld 512 byte blocks.\n",
- nbuff, (rq_data_dir(&SCpnt->request) == WRITE) ?
- "writing" : "reading", this_count, SCpnt->request.nr_sectors));
+ nbuff, (rq_data_dir(SCpnt->request) == WRITE) ?
+ "writing" : "reading", this_count, SCpnt->request->nr_sectors));
SCpnt->cmnd[1] = (SCpnt->device->scsi_level <= SCSI_2) ?
((SCpnt->lun << 5) & 0xe0) : 0;
@@ -664,7 +664,7 @@ static void sd_rw_intr(Scsi_Cmnd * SCpnt)
#if CONFIG_SCSI_LOGGING
char nbuff[6];
- SCSI_LOG_HLCOMPLETE(1, sd_dskname(DEVICE_NR(SCpnt->request.rq_dev),
+ SCSI_LOG_HLCOMPLETE(1, sd_dskname(DEVICE_NR(SCpnt->request->rq_dev),
nbuff));
SCSI_LOG_HLCOMPLETE(1, printk("sd_rw_intr: %s: res=0x%x\n",
nbuff, result));
@@ -690,8 +690,8 @@ static void sd_rw_intr(Scsi_Cmnd * SCpnt)
(SCpnt->sense_buffer[4] << 16) |
(SCpnt->sense_buffer[5] << 8) |
SCpnt->sense_buffer[6];
- if (SCpnt->request.bio != NULL)
- block_sectors = bio_sectors(SCpnt->request.bio);
+ if (SCpnt->request->bio != NULL)
+ block_sectors = bio_sectors(SCpnt->request->bio);
switch (SCpnt->device->sector_size) {
case 1024:
error_sector <<= 1;
@@ -716,7 +716,7 @@ static void sd_rw_intr(Scsi_Cmnd * SCpnt)
}
error_sector &= ~(block_sectors - 1);
- good_sectors = error_sector - SCpnt->request.sector;
+ good_sectors = error_sector - SCpnt->request->sector;
if (good_sectors < 0 || good_sectors >= this_count)
good_sectors = 0;
break;
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c
index 9b5e51229c09..0d052876234a 100644
--- a/drivers/scsi/sg.c
+++ b/drivers/scsi/sg.c
@@ -695,7 +695,7 @@ static int sg_common_write(Sg_fd * sfp, Sg_request * srp,
srp->my_cmdp = SRpnt;
q = &SRpnt->sr_device->request_queue;
- SRpnt->sr_request.rq_dev = sdp->i_rdev;
+ SRpnt->sr_request->rq_dev = sdp->i_rdev;
SRpnt->sr_sense_buffer[0] = 0;
SRpnt->sr_cmd_len = hp->cmd_len;
if (! (hp->flags & SG_FLAG_LUN_INHIBIT)) {
@@ -1222,7 +1222,7 @@ static void sg_cmd_done_bh(Scsi_Cmnd * SCpnt)
SRpnt->sr_bufflen = 0;
SRpnt->sr_buffer = NULL;
SRpnt->sr_underflow = 0;
- SRpnt->sr_request.rq_dev = mk_kdev(0, 0); /* "sg" _disowns_ request blk */
+ SRpnt->sr_request->rq_dev = mk_kdev(0, 0); /* "sg" _disowns_ request blk */
srp->my_cmdp = NULL;
srp->done = 1;
diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c
index 0e28dc69652b..2fb8f0fe0f6a 100644
--- a/drivers/scsi/sr.c
+++ b/drivers/scsi/sr.c
@@ -197,11 +197,11 @@ static void rw_intr(Scsi_Cmnd * SCpnt)
int this_count = SCpnt->bufflen >> 9;
int good_sectors = (result == 0 ? this_count : 0);
int block_sectors = 0;
- int device_nr = DEVICE_NR(SCpnt->request.rq_dev);
+ int device_nr = DEVICE_NR(SCpnt->request->rq_dev);
Scsi_CD *SCp = &scsi_CDs[device_nr];
#ifdef DEBUG
- printk("sr.c done: %x %p\n", result, SCpnt->request.bh->b_data);
+ printk("sr.c done: %x %p\n", result, SCpnt->request->bh->b_data);
#endif
/*
Handle MEDIUM ERRORs or VOLUME OVERFLOWs that indicate partial success.
@@ -219,14 +219,14 @@ static void rw_intr(Scsi_Cmnd * SCpnt)
(SCpnt->sense_buffer[4] << 16) |
(SCpnt->sense_buffer[5] << 8) |
SCpnt->sense_buffer[6];
- if (SCpnt->request.bio != NULL)
- block_sectors = bio_sectors(SCpnt->request.bio);
+ if (SCpnt->request->bio != NULL)
+ block_sectors = bio_sectors(SCpnt->request->bio);
if (block_sectors < 4)
block_sectors = 4;
if (SCp->device->sector_size == 2048)
error_sector <<= 2;
error_sector &= ~(block_sectors - 1);
- good_sectors = error_sector - SCpnt->request.sector;
+ good_sectors = error_sector - SCpnt->request->sector;
if (good_sectors < 0 || good_sectors >= this_count)
good_sectors = 0;
/*
@@ -266,14 +266,14 @@ static int sr_init_command(Scsi_Cmnd * SCpnt)
int dev, devm, block=0, this_count, s_size;
Scsi_CD *SCp;
- devm = minor(SCpnt->request.rq_dev);
- dev = DEVICE_NR(SCpnt->request.rq_dev);
+ devm = minor(SCpnt->request->rq_dev);
+ dev = DEVICE_NR(SCpnt->request->rq_dev);
SCp = &scsi_CDs[dev];
SCSI_LOG_HLQUEUE(1, printk("Doing sr request, dev = %d, block = %d\n", devm, block));
if (dev >= sr_template.nr_dev || !SCp->device || !SCp->device->online) {
- SCSI_LOG_HLQUEUE(2, printk("Finishing %ld sectors\n", SCpnt->request.nr_sectors));
+ SCSI_LOG_HLQUEUE(2, printk("Finishing %ld sectors\n", SCpnt->request->nr_sectors));
SCSI_LOG_HLQUEUE(2, printk("Retry with 0x%p\n", SCpnt));
return 0;
}
@@ -286,8 +286,8 @@ static int sr_init_command(Scsi_Cmnd * SCpnt)
return 0;
}
- if (!(SCpnt->request.flags & REQ_CMD)) {
- blk_dump_rq_flags(&SCpnt->request, "sr unsup command");
+ if (!(SCpnt->request->flags & REQ_CMD)) {
+ blk_dump_rq_flags(SCpnt->request, "sr unsup command");
return 0;
}
@@ -308,23 +308,23 @@ static int sr_init_command(Scsi_Cmnd * SCpnt)
return 0;
}
- if (rq_data_dir(&SCpnt->request) == WRITE) {
+ if (rq_data_dir(SCpnt->request) == WRITE) {
if (!SCp->device->writeable)
return 0;
SCpnt->cmnd[0] = WRITE_10;
SCpnt->sc_data_direction = SCSI_DATA_WRITE;
- } else if (rq_data_dir(&SCpnt->request) == READ) {
+ } else if (rq_data_dir(SCpnt->request) == READ) {
SCpnt->cmnd[0] = READ_10;
SCpnt->sc_data_direction = SCSI_DATA_READ;
} else {
- blk_dump_rq_flags(&SCpnt->request, "Unknown sr command");
+ blk_dump_rq_flags(SCpnt->request, "Unknown sr command");
return 0;
}
/*
* request doesn't start on hw block boundary, add scatter pads
*/
- if ((SCpnt->request.sector % (s_size >> 9)) || (SCpnt->request_bufflen % s_size)) {
+ if ((SCpnt->request->sector % (s_size >> 9)) || (SCpnt->request_bufflen % s_size)) {
printk("sr: unaligned transfer\n");
return 0;
}
@@ -334,13 +334,13 @@ static int sr_init_command(Scsi_Cmnd * SCpnt)
SCSI_LOG_HLQUEUE(2, printk("sr%d : %s %d/%ld 512 byte blocks.\n",
devm,
- (rq_data_dir(&SCpnt->request) == WRITE) ? "writing" : "reading",
- this_count, SCpnt->request.nr_sectors));
+ (rq_data_dir(SCpnt->request) == WRITE) ? "writing" : "reading",
+ this_count, SCpnt->request->nr_sectors));
SCpnt->cmnd[1] = (SCpnt->device->scsi_level <= SCSI_2) ?
((SCpnt->lun << 5) & 0xe0) : 0;
- block = SCpnt->request.sector / (s_size >> 9);
+ block = SCpnt->request->sector / (s_size >> 9);
if (this_count > 0xffff)
this_count = 0xffff;
@@ -496,7 +496,7 @@ void get_sectorsize(int i)
cmd[1] = (SCp->device->scsi_level <= SCSI_2) ?
((SCp->device->lun << 5) & 0xe0) : 0;
memset((void *) &cmd[2], 0, 8);
- SRpnt->sr_request.rq_status = RQ_SCSI_BUSY; /* Mark as really busy */
+ SRpnt->sr_request->rq_status = RQ_SCSI_BUSY; /* Mark as really busy */
SRpnt->sr_cmd_len = 0;
memset(buffer, 0, 8);
diff --git a/drivers/scsi/sr_ioctl.c b/drivers/scsi/sr_ioctl.c
index ebf2474d7067..85ba7a66a237 100644
--- a/drivers/scsi/sr_ioctl.c
+++ b/drivers/scsi/sr_ioctl.c
@@ -93,7 +93,7 @@ int sr_do_ioctl(int target, unsigned char *sr_cmd, void *buffer, unsigned buflen
SRpnt->sr_data_direction = readwrite;
/* use ISA DMA buffer if necessary */
- SRpnt->sr_request.buffer = buffer;
+ SRpnt->sr_request->buffer = buffer;
if (buffer && SRpnt->sr_host->unchecked_isa_dma &&
(virt_to_phys(buffer) + buflength - 1 > ISA_DMA_THRESHOLD)) {
bounce_buffer = (char *) kmalloc(buflength, GFP_DMA);
@@ -112,7 +112,7 @@ int sr_do_ioctl(int target, unsigned char *sr_cmd, void *buffer, unsigned buflen
scsi_wait_req(SRpnt, (void *) sr_cmd, (void *) buffer, buflength,
IOCTL_TIMEOUT, IOCTL_RETRIES);
- req = &SRpnt->sr_request;
+ req = SRpnt->sr_request;
if (SRpnt->sr_buffer && req->buffer && SRpnt->sr_buffer != req->buffer) {
memcpy(req->buffer, SRpnt->sr_buffer, SRpnt->sr_bufflen);
kfree(SRpnt->sr_buffer);
diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c
index 7342c3e661f3..087aa6f3fe48 100644
--- a/drivers/scsi/st.c
+++ b/drivers/scsi/st.c
@@ -229,7 +229,7 @@ static int st_chk_result(Scsi_Tape *STp, Scsi_Request * SRpnt)
scode = 0;
}
- dev = TAPE_NR(SRpnt->sr_request.rq_dev);
+ dev = TAPE_NR(SRpnt->sr_request->rq_dev);
DEB(
if (debugging) {
printk(ST_DEB_MSG "st%d: Error: %x, cmd: %x %x %x %x %x %x Len: %d\n",
@@ -306,7 +306,7 @@ static void st_sleep_done(Scsi_Cmnd * SCpnt)
int remainder;
Scsi_Tape *STp;
- st_nbr = TAPE_NR(SCpnt->request.rq_dev);
+ st_nbr = TAPE_NR(SCpnt->request->rq_dev);
read_lock(&st_dev_arr_lock);
STp = scsi_tapes[st_nbr];
read_unlock(&st_dev_arr_lock);
@@ -328,11 +328,11 @@ static void st_sleep_done(Scsi_Cmnd * SCpnt)
(STp->buffer)->midlevel_result = INT_MAX; /* OK */
} else
(STp->buffer)->midlevel_result = SCpnt->result;
- SCpnt->request.rq_status = RQ_SCSI_DONE;
+ SCpnt->request->rq_status = RQ_SCSI_DONE;
(STp->buffer)->last_SRpnt = SCpnt->sc_request;
DEB( STp->write_pending = 0; )
- complete(SCpnt->request.waiting);
+ complete(SCpnt->request->waiting);
}
@@ -371,16 +371,16 @@ static Scsi_Request *
bp = (STp->buffer)->b_data;
SRpnt->sr_data_direction = direction;
SRpnt->sr_cmd_len = 0;
- SRpnt->sr_request.waiting = &(STp->wait);
- SRpnt->sr_request.rq_status = RQ_SCSI_BUSY;
- SRpnt->sr_request.rq_dev = STp->devt;
+ SRpnt->sr_request->waiting = &(STp->wait);
+ SRpnt->sr_request->rq_status = RQ_SCSI_BUSY;
+ SRpnt->sr_request->rq_dev = STp->devt;
scsi_do_req(SRpnt, (void *) cmd, bp, bytes,
st_sleep_done, timeout, retries);
if (do_wait) {
- wait_for_completion(SRpnt->sr_request.waiting);
- SRpnt->sr_request.waiting = NULL;
+ wait_for_completion(SRpnt->sr_request->waiting);
+ SRpnt->sr_request->waiting = NULL;
(STp->buffer)->syscall_result = st_chk_result(STp, SRpnt);
}
return SRpnt;
@@ -403,7 +403,7 @@ static void write_behind_check(Scsi_Tape * STp)
) /* end DEB */
wait_for_completion(&(STp->wait));
- (STp->buffer)->last_SRpnt->sr_request.waiting = NULL;
+ (STp->buffer)->last_SRpnt->sr_request->waiting = NULL;
(STp->buffer)->syscall_result = st_chk_result(STp, (STp->buffer)->last_SRpnt);
scsi_release_request((STp->buffer)->last_SRpnt);
diff --git a/drivers/scsi/sun3_NCR5380.c b/drivers/scsi/sun3_NCR5380.c
index 88ecf5d92a56..b4d0903a79a9 100644
--- a/drivers/scsi/sun3_NCR5380.c
+++ b/drivers/scsi/sun3_NCR5380.c
@@ -1217,7 +1217,7 @@ static void NCR5380_dma_complete( struct Scsi_Host *instance )
HOSTNO, NCR5380_read(BUS_AND_STATUS_REG),
NCR5380_read(STATUS_REG));
- if((sun3scsi_dma_finish(hostdata->connected->request.cmd))) {
+ if((sun3scsi_dma_finish(hostdata->connected->request->cmd))) {
printk("scsi%d: overrun in UDC counter -- not prepared to deal with this!\n", HOSTNO);
printk("please e-mail sammy@oh.verio.com with a description of how this\n");
printk("error was produced.\n");
@@ -2016,9 +2016,9 @@ static void NCR5380_information_transfer (struct Scsi_Host *instance)
if((count > SUN3_DMA_MINSIZE) && (sun3_dma_setup_done
!= cmd))
{
- if((cmd->request.cmd == 0) || (cmd->request.cmd == 1)) {
+ if((cmd->request->cmd == 0) || (cmd->request->cmd == 1)) {
sun3scsi_dma_setup(d, count,
- cmd->request.cmd);
+ cmd->request->cmd);
sun3_dma_setup_done = cmd;
}
}
@@ -2628,7 +2628,7 @@ static void NCR5380_reselect (struct Scsi_Host *instance)
!= tmp))
{
sun3scsi_dma_setup(d, count,
- tmp->request.cmd);
+ tmp->request->cmd);
sun3_dma_setup_done = tmp;
}
#endif
diff --git a/drivers/scsi/sun3_scsi.c b/drivers/scsi/sun3_scsi.c
index 3eae7cee2490..457a5518b34e 100644
--- a/drivers/scsi/sun3_scsi.c
+++ b/drivers/scsi/sun3_scsi.c
@@ -518,7 +518,7 @@ static inline unsigned long sun3scsi_dma_residual(struct Scsi_Host *instance)
static inline unsigned long sun3scsi_dma_xfer_len(unsigned long wanted, Scsi_Cmnd *cmd,
int write_flag)
{
- if((cmd->request.cmd == 0) || (cmd->request.cmd == 1))
+ if((cmd->request->cmd == 0) || (cmd->request->cmd == 1))
return wanted;
else
return 0;
diff --git a/drivers/scsi/u14-34f.c b/drivers/scsi/u14-34f.c
index 5ae088c86547..6de097b8368b 100644
--- a/drivers/scsi/u14-34f.c
+++ b/drivers/scsi/u14-34f.c
@@ -1206,7 +1206,7 @@ static inline int do_qcomm(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) {
if (linked_comm && SCpnt->device->queue_depth > 2
&& TLDEV(SCpnt->device->type)) {
HD(j)->cp_stat[i] = READY;
- flush_dev(SCpnt->device, SCpnt->request.sector, j, FALSE);
+ flush_dev(SCpnt->device, SCpnt->request->sector, j, FALSE);
return 0;
}
@@ -1529,11 +1529,11 @@ static inline int reorder(unsigned int j, unsigned long cursec,
if (!(cpp->xdir == DTD_IN)) input_only = FALSE;
- if (SCpnt->request.sector < minsec) minsec = SCpnt->request.sector;
- if (SCpnt->request.sector > maxsec) maxsec = SCpnt->request.sector;
+ if (SCpnt->request->sector < minsec) minsec = SCpnt->request->sector;
+ if (SCpnt->request->sector > maxsec) maxsec = SCpnt->request->sector;
- sl[n] = SCpnt->request.sector;
- ioseek += SCpnt->request.nr_sectors;
+ sl[n] = SCpnt->request->sector;
+ ioseek += SCpnt->request->nr_sectors;
if (!n) continue;
@@ -1561,7 +1561,7 @@ static inline int reorder(unsigned int j, unsigned long cursec,
if (!input_only) for (n = 0; n < n_ready; n++) {
k = il[n]; cpp = &HD(j)->cp[k]; SCpnt = cpp->SCpnt;
- ll[n] = SCpnt->request.nr_sectors; pl[n] = SCpnt->pid;
+ ll[n] = SCpnt->request->nr_sectors; pl[n] = SCpnt->pid;
if (!n) continue;
@@ -1589,7 +1589,7 @@ static inline int reorder(unsigned int j, unsigned long cursec,
" cur %ld s:%c r:%c rev:%c in:%c ov:%c xd %d.\n",
(ihdlr ? "ihdlr" : "qcomm"), SCpnt->channel, SCpnt->target,
SCpnt->lun, SCpnt->pid, k, flushcount, n_ready,
- SCpnt->request.sector, SCpnt->request.nr_sectors, cursec,
+ SCpnt->request->sector, SCpnt->request->nr_sectors, cursec,
YESNO(s), YESNO(r), YESNO(rev), YESNO(input_only),
YESNO(overlap), cpp->xdir);
}
@@ -1718,7 +1718,7 @@ static inline void ihdlr(int irq, unsigned int j) {
if (linked_comm && SCpnt->device->queue_depth > 2
&& TLDEV(SCpnt->device->type))
- flush_dev(SCpnt->device, SCpnt->request.sector, j, TRUE);
+ flush_dev(SCpnt->device, SCpnt->request->sector, j, TRUE);
tstatus = status_byte(spp->target_status);