Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
978c6cc5
Commit
978c6cc5
authored
Jul 02, 2002
by
James Bottomley
Browse files
Options
Browse Files
Download
Plain Diff
Merge mulgrave.(none):/home/jejb/BK/scsi-new-tag-2.5
into mulgrave.(none):/home/jejb/BK/scsi-for-linus-2.5
parents
2ffe5f2f
85346613
Changes
22
Show whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
293 additions
and
162 deletions
+293
-162
drivers/scsi/aha1542.c
drivers/scsi/aha1542.c
+2
-2
drivers/scsi/constants.c
drivers/scsi/constants.c
+2
-2
drivers/scsi/eata.c
drivers/scsi/eata.c
+8
-8
drivers/scsi/hosts.c
drivers/scsi/hosts.c
+1
-0
drivers/scsi/hosts.h
drivers/scsi/hosts.h
+27
-0
drivers/scsi/ide-scsi.c
drivers/scsi/ide-scsi.c
+1
-1
drivers/scsi/osst.c
drivers/scsi/osst.c
+10
-10
drivers/scsi/qla1280.c
drivers/scsi/qla1280.c
+2
-2
drivers/scsi/scsi.c
drivers/scsi/scsi.c
+39
-28
drivers/scsi/scsi.h
drivers/scsi/scsi.h
+87
-3
drivers/scsi/scsi_debug.c
drivers/scsi/scsi_debug.c
+1
-1
drivers/scsi/scsi_error.c
drivers/scsi/scsi_error.c
+4
-4
drivers/scsi/scsi_lib.c
drivers/scsi/scsi_lib.c
+44
-36
drivers/scsi/scsi_merge.c
drivers/scsi/scsi_merge.c
+1
-1
drivers/scsi/sd.c
drivers/scsi/sd.c
+19
-19
drivers/scsi/sg.c
drivers/scsi/sg.c
+2
-2
drivers/scsi/sr.c
drivers/scsi/sr.c
+18
-18
drivers/scsi/sr_ioctl.c
drivers/scsi/sr_ioctl.c
+2
-2
drivers/scsi/st.c
drivers/scsi/st.c
+10
-10
drivers/scsi/sun3_NCR5380.c
drivers/scsi/sun3_NCR5380.c
+4
-4
drivers/scsi/sun3_scsi.c
drivers/scsi/sun3_scsi.c
+1
-1
drivers/scsi/u14-34f.c
drivers/scsi/u14-34f.c
+8
-8
No files found.
drivers/scsi/aha1542.c
View file @
978c6cc5
...
...
@@ -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
...
...
drivers/scsi/constants.c
View file @
978c6cc5
...
...
@@ -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)
...
...
drivers/scsi/eata.c
View file @
978c6cc5
...
...
@@ -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
);
...
...
drivers/scsi/hosts.c
View file @
978c6cc5
...
...
@@ -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
;
...
...
drivers/scsi/hosts.h
View file @
978c6cc5
...
...
@@ -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.
...
...
drivers/scsi/ide-scsi.c
View file @
978c6cc5
...
...
@@ -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
);
}
...
...
drivers/scsi/osst.c
View file @
978c6cc5
...
...
@@ -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
);
...
...
drivers/scsi/qla1280.c
View file @
978c6cc5
...
...
@@ -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
);
}
/**************************************************************************
...
...
drivers/scsi/scsi.c
View file @
978c6cc5
...
...
@@ -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
;
...
...
drivers/scsi/scsi.h
View file @
978c6cc5
...
...
@@ -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,7 +774,7 @@ struct scsi_cmnd {
transferred less actual number
transferred (0 if not supported) */
struct
request
request
;
/* A copy of t
he command we are
struct
request
*
request
;
/* T
he command we are
working on */
unsigned
char
sense_buffer
[
SCSI_SENSE_BUFFERSIZE
];
/* obtained by REQUEST SENSE
...
...
@@ -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
drivers/scsi/scsi_debug.c
View file @
978c6cc5
...
...
@@ -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
);
}
...
...
drivers/scsi/scsi_error.c
View file @
978c6cc5
...
...
@@ -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 @@ STATIC void scsi_send_eh_cmnd(Scsi_Cmnd * SCpnt, int timeout)
* 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 @@ STATIC void scsi_send_eh_cmnd(Scsi_Cmnd * SCpnt, int timeout)
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
;
...
...
drivers/scsi/scsi_lib.c
View file @
978c6cc5
...
...
@@ -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.
*/
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
"
);
...
...
drivers/scsi/scsi_merge.c
View file @
978c6cc5
...
...
@@ -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
;
...
...
drivers/scsi/sd.c
View file @
978c6cc5
...
...
@@ -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
;
...
...
drivers/scsi/sg.c
View file @
978c6cc5
...
...
@@ -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
;
...
...
drivers/scsi/sr.c
View file @
978c6cc5
...
...
@@ -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
);
...
...
drivers/scsi/sr_ioctl.c
View file @
978c6cc5
...
...
@@ -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
);
...
...
drivers/scsi/st.c
View file @
978c6cc5
...
...
@@ -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
);
...
...
drivers/scsi/sun3_NCR5380.c
View file @
978c6cc5
...
...
@@ -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
...
...
drivers/scsi/sun3_scsi.c
View file @
978c6cc5
...
...
@@ -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
;
...
...
drivers/scsi/u14-34f.c
View file @
978c6cc5
...
...
@@ -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
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment