diff options
| author | James Bottomley <jejb@mulgrave.(none)> | 2002-07-02 02:44:28 -0400 |
|---|---|---|
| committer | James Bottomley <jejb@mulgrave.(none)> | 2002-07-02 02:44:28 -0400 |
| commit | 978c6cc56c456355235883cd80480fe216aeedf0 (patch) | |
| tree | 3bb7ed976c2d8368ca9db69ad316bc2340becfd9 | |
| parent | 2ffe5f2f17d6698d1b0e78c43a4b9eb91426340d (diff) | |
| parent | 853466130b58e008fb9a309129cf9150a7b2e533 (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.c | 4 | ||||
| -rw-r--r-- | drivers/scsi/constants.c | 4 | ||||
| -rw-r--r-- | drivers/scsi/eata.c | 16 | ||||
| -rw-r--r-- | drivers/scsi/hosts.c | 1 | ||||
| -rw-r--r-- | drivers/scsi/hosts.h | 27 | ||||
| -rw-r--r-- | drivers/scsi/ide-scsi.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/osst.c | 20 | ||||
| -rw-r--r-- | drivers/scsi/qla1280.c | 4 | ||||
| -rw-r--r-- | drivers/scsi/scsi.c | 67 | ||||
| -rw-r--r-- | drivers/scsi/scsi.h | 90 | ||||
| -rw-r--r-- | drivers/scsi/scsi_debug.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/scsi_error.c | 8 | ||||
| -rw-r--r-- | drivers/scsi/scsi_lib.c | 80 | ||||
| -rw-r--r-- | drivers/scsi/scsi_merge.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/sd.c | 38 | ||||
| -rw-r--r-- | drivers/scsi/sg.c | 4 | ||||
| -rw-r--r-- | drivers/scsi/sr.c | 36 | ||||
| -rw-r--r-- | drivers/scsi/sr_ioctl.c | 4 | ||||
| -rw-r--r-- | drivers/scsi/st.c | 20 | ||||
| -rw-r--r-- | drivers/scsi/sun3_NCR5380.c | 8 | ||||
| -rw-r--r-- | drivers/scsi/sun3_scsi.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/u14-34f.c | 16 |
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); |
