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
Kirill Smelkov
linux
Commits
1d12ef0d
Commit
1d12ef0d
authored
Nov 07, 2002
by
James Bottomley
Browse files
Options
Browse Files
Download
Plain Diff
Merge mulgrave.(none):/home/jejb/BK/linux-2.5
into mulgrave.(none):/home/jejb/BK/scsi-misc-2.5
parents
90a8d4f3
4e5ba3ff
Changes
10
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
153 additions
and
218 deletions
+153
-218
drivers/scsi/hosts.h
drivers/scsi/hosts.h
+0
-1
drivers/scsi/osst.c
drivers/scsi/osst.c
+0
-16
drivers/scsi/scsi.c
drivers/scsi/scsi.c
+2
-27
drivers/scsi/scsi.h
drivers/scsi/scsi.h
+1
-1
drivers/scsi/scsi_lib.c
drivers/scsi/scsi_lib.c
+150
-122
drivers/scsi/scsi_scan.c
drivers/scsi/scsi_scan.c
+0
-2
drivers/scsi/sd.c
drivers/scsi/sd.c
+0
-19
drivers/scsi/sg.c
drivers/scsi/sg.c
+0
-11
drivers/scsi/sr.c
drivers/scsi/sr.c
+0
-10
drivers/scsi/st.c
drivers/scsi/st.c
+0
-9
No files found.
drivers/scsi/hosts.h
View file @
1d12ef0d
...
...
@@ -554,7 +554,6 @@ struct Scsi_Device_Template
const
char
*
tag
;
struct
module
*
module
;
/* Used for loadable modules */
unsigned
char
scsi_type
;
int
(
*
detect
)(
Scsi_Device
*
);
/* Returns 1 if we can attach this device */
int
(
*
attach
)(
Scsi_Device
*
);
/* Attach devices to arrays */
void
(
*
detach
)(
Scsi_Device
*
);
int
(
*
init_command
)(
Scsi_Cmnd
*
);
/* Used by new queueing code.
...
...
drivers/scsi/osst.c
View file @
1d12ef0d
...
...
@@ -153,10 +153,8 @@ static int osst_copy_from_buffer(OSST_buffer *, unsigned char *);
static
int
osst_init
(
void
);
static
int
osst_attach
(
Scsi_Device
*
);
static
int
osst_detect
(
Scsi_Device
*
);
static
void
osst_detach
(
Scsi_Device
*
);
static
int
osst_dev_noticed
;
static
int
osst_nr_dev
;
static
int
osst_dev_max
;
...
...
@@ -166,7 +164,6 @@ struct Scsi_Device_Template osst_template =
name:
"OnStream tape"
,
tag:
"osst"
,
scsi_type:
TYPE_TAPE
,
detect:
osst_detect
,
attach:
osst_attach
,
detach:
osst_detach
};
...
...
@@ -5564,15 +5561,6 @@ static int osst_attach(Scsi_Device * SDp)
return
0
;
};
static
int
osst_detect
(
Scsi_Device
*
SDp
)
{
if
(
SDp
->
type
!=
TYPE_TAPE
)
return
0
;
if
(
!
osst_supports
(
SDp
)
)
return
0
;
osst_dev_noticed
++
;
return
1
;
}
static
int
osst_registered
=
0
;
/* Driver initialization (not __initfunc because may be called later) */
...
...
@@ -5580,9 +5568,6 @@ static int osst_init()
{
int
i
;
if
(
osst_dev_noticed
==
0
)
return
0
;
if
(
!
osst_registered
)
{
if
(
register_chrdev
(
MAJOR_NR
,
"osst"
,
&
osst_fops
))
{
printk
(
KERN_ERR
"osst :W: Unable to get major %d for OnStream tapes
\n
"
,
MAJOR_NR
);
...
...
@@ -5653,7 +5638,6 @@ static void osst_detach(Scsi_Device * SDp)
os_scsi_tapes
[
i
]
=
NULL
;
scsi_slave_detach
(
SDp
);
osst_nr_dev
--
;
osst_dev_noticed
--
;
return
;
}
}
...
...
drivers/scsi/scsi.c
View file @
1d12ef0d
...
...
@@ -226,6 +226,8 @@ void scsi_initialize_queue(Scsi_Device * SDpnt, struct Scsi_Host * SHpnt)
if
(
!
SHpnt
->
use_clustering
)
clear_bit
(
QUEUE_FLAG_CLUSTER
,
&
q
->
queue_flags
);
blk_queue_prep_rq
(
q
,
scsi_prep_fn
);
}
#ifdef MODULE
...
...
@@ -1958,17 +1960,6 @@ static int proc_scsi_gen_write(struct file * file, const char * buf,
}
#endif
void
scsi_detect_device
(
struct
scsi_device
*
sdev
)
{
struct
Scsi_Device_Template
*
sdt
;
down_read
(
&
scsi_devicelist_mutex
);
for
(
sdt
=
scsi_devicelist
;
sdt
;
sdt
=
sdt
->
next
)
if
(
sdt
->
detect
)
(
*
sdt
->
detect
)(
sdev
);
up_read
(
&
scsi_devicelist_mutex
);
}
int
scsi_attach_device
(
struct
scsi_device
*
sdev
)
{
struct
Scsi_Device_Template
*
sdt
;
...
...
@@ -2089,22 +2080,6 @@ int scsi_register_device(struct Scsi_Device_Template *tpnt)
driver_register
(
&
tpnt
->
scsi_driverfs_driver
);
/*
* First scan the devices that we know about, and see if we notice them.
*/
for
(
shpnt
=
scsi_host_get_next
(
NULL
);
shpnt
;
shpnt
=
scsi_host_get_next
(
shpnt
))
{
for
(
SDpnt
=
shpnt
->
host_queue
;
SDpnt
;
SDpnt
=
SDpnt
->
next
)
{
if
(
tpnt
->
detect
)
(
*
tpnt
->
detect
)
(
SDpnt
);
}
}
/*
* Now actually connect the devices to the new driver.
*/
for
(
shpnt
=
scsi_host_get_next
(
NULL
);
shpnt
;
shpnt
=
scsi_host_get_next
(
shpnt
))
{
for
(
SDpnt
=
shpnt
->
host_queue
;
SDpnt
;
...
...
drivers/scsi/scsi.h
View file @
1d12ef0d
...
...
@@ -455,6 +455,7 @@ extern int scsi_insert_special_cmd(Scsi_Cmnd * SCpnt, int);
extern
void
scsi_io_completion
(
Scsi_Cmnd
*
SCpnt
,
int
good_sectors
,
int
block_sectors
);
extern
void
scsi_queue_next_request
(
request_queue_t
*
q
,
Scsi_Cmnd
*
SCpnt
);
extern
int
scsi_prep_fn
(
struct
request_queue
*
q
,
struct
request
*
req
);
extern
void
scsi_request_fn
(
request_queue_t
*
q
);
extern
int
scsi_starvation_completion
(
Scsi_Device
*
SDpnt
);
...
...
@@ -480,7 +481,6 @@ extern void scsi_do_cmd(Scsi_Cmnd *, const void *cmnd,
int
timeout
,
int
retries
);
extern
int
scsi_dev_init
(
void
);
extern
int
scsi_mlqueue_insert
(
struct
scsi_cmnd
*
,
int
);
extern
void
scsi_detect_device
(
struct
scsi_device
*
);
extern
int
scsi_attach_device
(
struct
scsi_device
*
);
extern
void
scsi_detach_device
(
struct
scsi_device
*
);
...
...
drivers/scsi/scsi_lib.c
View file @
1d12ef0d
...
...
@@ -102,6 +102,13 @@ int scsi_insert_special_req(Scsi_Request * SRpnt, int at_head)
{
request_queue_t
*
q
=
&
SRpnt
->
sr_device
->
request_queue
;
/* This is used to insert SRpnt specials. Because users of
* this function are apt to reuse requests with no modification,
* we have to sanitise the request flags here
*/
SRpnt
->
sr_request
->
flags
&=
~
REQ_DONTPREP
;
blk_insert_request
(
q
,
SRpnt
->
sr_request
,
at_head
,
SRpnt
);
return
0
;
}
...
...
@@ -240,6 +247,12 @@ void scsi_queue_next_request(request_queue_t * q, Scsi_Cmnd * SCpnt)
SCpnt
->
request
->
special
=
(
void
*
)
SCpnt
;
if
(
blk_rq_tagged
(
SCpnt
->
request
))
blk_queue_end_tag
(
q
,
SCpnt
->
request
);
/* set REQ_SPECIAL - we have a command
* clear REQ_DONTPREP - we assume the sg table has been
* nuked so we need to set it up again.
*/
SCpnt
->
request
->
flags
|=
REQ_SPECIAL
;
SCpnt
->
request
->
flags
&=
~
REQ_DONTPREP
;
__elv_add_request
(
q
,
SCpnt
->
request
,
0
,
0
);
}
...
...
@@ -741,7 +754,7 @@ static int scsi_init_io(Scsi_Cmnd *SCpnt)
SCpnt
->
use_sg
=
req
->
nr_phys_segments
;
gfp_mask
=
GFP_NOIO
;
if
(
in_interrupt
(
))
{
if
(
likely
(
in_atomic
()
))
{
gfp_mask
&=
~
__GFP_WAIT
;
gfp_mask
|=
__GFP_HIGH
;
}
...
...
@@ -788,6 +801,116 @@ static int scsi_init_io(Scsi_Cmnd *SCpnt)
return
0
;
}
int
scsi_prep_fn
(
struct
request_queue
*
q
,
struct
request
*
req
)
{
struct
Scsi_Device_Template
*
STpnt
;
Scsi_Cmnd
*
SCpnt
;
Scsi_Device
*
SDpnt
;
SDpnt
=
(
Scsi_Device
*
)
q
->
queuedata
;
BUG_ON
(
!
SDpnt
);
/*
* Find the actual device driver associated with this command.
* The SPECIAL requests are things like character device or
* ioctls, which did not originate from ll_rw_blk. Note that
* the special field is also used to indicate the SCpnt for
* 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.
*/
if
(
req
->
flags
&
REQ_SPECIAL
)
{
Scsi_Request
*
SRpnt
;
STpnt
=
NULL
;
SCpnt
=
(
Scsi_Cmnd
*
)
req
->
special
;
SRpnt
=
(
Scsi_Request
*
)
req
->
special
;
if
(
SRpnt
->
sr_magic
==
SCSI_REQ_MAGIC
)
{
SCpnt
=
scsi_allocate_device
(
SRpnt
->
sr_device
,
FALSE
,
FALSE
);
if
(
!
SCpnt
)
return
BLKPREP_DEFER
;
scsi_init_cmd_from_req
(
SCpnt
,
SRpnt
);
}
}
else
if
(
req
->
flags
&
(
REQ_CMD
|
REQ_BLOCK_PC
))
{
/*
* Now try and find a command block that we can use.
*/
if
(
req
->
special
)
{
SCpnt
=
(
Scsi_Cmnd
*
)
req
->
special
;
}
else
{
SCpnt
=
scsi_allocate_device
(
SDpnt
,
FALSE
,
FALSE
);
}
/*
* if command allocation failure, wait a bit
*/
if
(
unlikely
(
!
SCpnt
))
return
BLKPREP_DEFER
;
/* pull a tag out of the request if we have one */
SCpnt
->
tag
=
req
->
tag
;
}
else
{
blk_dump_rq_flags
(
req
,
"SCSI bad req"
);
return
BLKPREP_KILL
;
}
/* 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
;
/*
* FIXME: drop the lock here because the functions below
* expect to be called without the queue lock held. Also,
* previously, we dequeued the request before dropping the
* lock. We hope REQ_STARTED prevents anything untoward from
* happening now.
*/
if
(
req
->
flags
&
(
REQ_CMD
|
REQ_BLOCK_PC
))
{
/*
* This will do a couple of things:
* 1) Fill in the actual SCSI command.
* 2) Fill in any other upper-level specific fields
* (timeout).
*
* If this returns 0, it means that the request failed
* (reading past end of disk, reading offline device,
* etc). This won't actually talk to the device, but
* some kinds of consistency checking may cause the
* request to be rejected immediately.
*/
STpnt
=
scsi_get_request_dev
(
req
);
BUG_ON
(
!
STpnt
);
/*
* This sets up the scatter-gather table (allocating if
* required).
*/
if
(
!
scsi_init_io
(
SCpnt
))
{
/* Mark it as special --- We already have an
* allocated command associated with it */
req
->
flags
|=
REQ_SPECIAL
;
return
BLKPREP_DEFER
;
}
/*
* Initialize the actual SCSI command for this request.
*/
if
(
!
STpnt
->
init_command
(
SCpnt
))
{
scsi_release_buffers
(
SCpnt
);
return
BLKPREP_KILL
;
}
}
/* The request is now prepped, no need to come back here */
req
->
flags
|=
REQ_DONTPREP
;
return
BLKPREP_OK
;
}
/*
* Function: scsi_request_fn()
*
...
...
@@ -811,10 +934,8 @@ void scsi_request_fn(request_queue_t * q)
{
struct
request
*
req
;
Scsi_Cmnd
*
SCpnt
;
Scsi_Request
*
SRpnt
;
Scsi_Device
*
SDpnt
;
struct
Scsi_Host
*
SHpnt
;
struct
Scsi_Device_Template
*
STpnt
;
ASSERT_LOCK
(
q
->
queue_lock
,
1
);
...
...
@@ -837,6 +958,14 @@ void scsi_request_fn(request_queue_t * q)
if
(
SHpnt
->
in_recovery
||
blk_queue_plugged
(
q
))
return
;
/*
* get next queueable request. We do this early to make sure
* that the request is fully prepared even if we cannot
* accept it. If there is no request, we'll detect this
* lower down.
*/
req
=
elv_next_request
(
q
);
if
(
SHpnt
->
host_busy
==
0
&&
SHpnt
->
host_blocked
)
{
/* unblock after host_blocked iterates to zero */
if
(
--
SHpnt
->
host_blocked
==
0
)
{
...
...
@@ -888,141 +1017,40 @@ void scsi_request_fn(request_queue_t * q)
if
(
blk_queue_empty
(
q
))
break
;
/*
* get next queueable request.
*/
req
=
elv_next_request
(
q
);
/*
* Find the actual device driver associated with this command.
* The SPECIAL requests are things like character device or
* ioctls, which did not originate from ll_rw_blk. Note that
* the special field is also used to indicate the SCpnt for
* 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.
*/
if
(
req
->
flags
&
REQ_SPECIAL
)
{
STpnt
=
NULL
;
SCpnt
=
(
Scsi_Cmnd
*
)
req
->
special
;
SRpnt
=
(
Scsi_Request
*
)
req
->
special
;
if
(
SRpnt
->
sr_magic
==
SCSI_REQ_MAGIC
)
{
SCpnt
=
scsi_allocate_device
(
SRpnt
->
sr_device
,
FALSE
,
FALSE
);
if
(
!
SCpnt
)
if
(
!
req
)
{
/* can happen if the prep fails
* FIXME: elv_next_request() should be plugging the
* queue */
blk_plug_device
(
q
);
break
;
scsi_init_cmd_from_req
(
SCpnt
,
SRpnt
);
}
}
else
if
(
req
->
flags
&
(
REQ_CMD
|
REQ_BLOCK_PC
))
{
SRpnt
=
NULL
;
STpnt
=
scsi_get_request_dev
(
req
);
if
(
!
STpnt
)
{
panic
(
"Unable to find device associated with request"
);
}
/*
* Now try and find a command block that we can use.
*/
if
(
req
->
special
)
{
SCpnt
=
(
Scsi_Cmnd
*
)
req
->
special
;
}
else
{
SCpnt
=
scsi_allocate_device
(
SDpnt
,
FALSE
,
FALSE
);
}
/*
* If so, we are ready to do something. Bump the count
* while the queue is locked and then break out of the
* loop. Otherwise loop around and try another request.
*/
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
;
}
SCpnt
=
(
struct
scsi_cmnd
*
)
req
->
special
;
/*
* Now bump the usage count for both the host and the
* device.
/* Should be impossible for a correctly prepared request
* please mail the stack trace to linux-scsi@vger.kernel.org
*/
SHpnt
->
host_busy
++
;
SDpnt
->
device_busy
++
;
BUG_ON
(
!
SCpnt
);
/*
* Finally, before we release the lock, we copy the
* request to the command block, and remove the
* request from the request list. Note that we always
* operate on the queue head - there is absolutely no
* reason to search the list, because all of the
commands
* in this queue are for the same device.
* 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
);
/* 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
;
/*
* Now it is finally safe to release the lock. We are
* not going to noodle the request list until this
* request has been queued and we loop back to queue
* another.
* Now bump the usage count for both the host and the
* device.
*/
req
=
NULL
;
SHpnt
->
host_busy
++
;
SDpnt
->
device_busy
++
;
spin_unlock_irq
(
q
->
queue_lock
);
if
(
!
(
SCpnt
->
request
->
flags
&
REQ_DONTPREP
)
&&
(
SCpnt
->
request
->
flags
&
(
REQ_CMD
|
REQ_BLOCK_PC
)))
{
/*
* This will do a couple of things:
* 1) Fill in the actual SCSI command.
* 2) Fill in any other upper-level specific fields
* (timeout).
*
* If this returns 0, it means that the request failed
* (reading past end of disk, reading offline device,
* etc). This won't actually talk to the device, but
* some kinds of consistency checking may cause the
* request to be rejected immediately.
*/
if
(
STpnt
==
NULL
)
STpnt
=
scsi_get_request_dev
(
SCpnt
->
request
);
/*
* This sets up the scatter-gather table (allocating if
* required).
*/
if
(
!
scsi_init_io
(
SCpnt
))
{
scsi_mlqueue_insert
(
SCpnt
,
SCSI_MLQUEUE_DEVICE_BUSY
);
spin_lock_irq
(
q
->
queue_lock
);
break
;
}
/*
* Initialize the actual SCSI command for this request.
*/
if
(
!
STpnt
->
init_command
(
SCpnt
))
{
scsi_release_buffers
(
SCpnt
);
SCpnt
=
__scsi_end_request
(
SCpnt
,
0
,
SCpnt
->
request
->
nr_sectors
,
0
,
0
);
if
(
SCpnt
!=
NULL
)
{
panic
(
"Should not have leftover blocks
\n
"
);
}
spin_lock_irq
(
q
->
queue_lock
);
SHpnt
->
host_busy
--
;
SDpnt
->
device_busy
--
;
continue
;
}
}
SCpnt
->
request
->
flags
|=
REQ_DONTPREP
;
/*
* Finally, initialize any error handling parameters, and set up
* the timers for timeouts.
...
...
drivers/scsi/scsi_scan.c
View file @
1d12ef0d
...
...
@@ -1478,8 +1478,6 @@ static int scsi_add_lun(Scsi_Device *sdevscan, Scsi_Device **sdevnew,
* function */
sdev
->
max_device_blocked
=
SCSI_DEFAULT_DEVICE_BLOCKED
;
scsi_detect_device
(
sdev
);
if
(
sdevnew
!=
NULL
)
*
sdevnew
=
sdev
;
...
...
drivers/scsi/sd.c
View file @
1d12ef0d
...
...
@@ -94,7 +94,6 @@ static void sd_init_onedisk(struct scsi_disk * sdkp, struct gendisk *disk);
static
void
sd_rw_intr
(
struct
scsi_cmnd
*
SCpnt
);
static
int
sd_attach
(
struct
scsi_device
*
);
static
int
sd_detect
(
struct
scsi_device
*
);
static
void
sd_detach
(
struct
scsi_device
*
);
static
int
sd_init_command
(
struct
scsi_cmnd
*
);
static
int
sd_synchronize_cache
(
struct
scsi_disk
*
,
int
);
...
...
@@ -107,7 +106,6 @@ static struct Scsi_Device_Template sd_template = {
.
name
=
"disk"
,
.
tag
=
"sd"
,
.
scsi_type
=
TYPE_DISK
,
.
detect
=
sd_detect
,
.
attach
=
sd_attach
,
.
detach
=
sd_detach
,
.
init_command
=
sd_init_command
,
...
...
@@ -1165,23 +1163,6 @@ sd_init_onedisk(struct scsi_disk * sdkp, struct gendisk *disk)
kfree
(
buffer
);
}
/**
* sd_detect - called at the start of driver initialization, once
* for each scsi device (not just disks) present.
*
* Returns 0 if not interested in this scsi device (e.g. scanner);
* 1 if this device is of interest (e.g. a disk).
*
* Note: this function is invoked from the scsi mid-level.
**/
static
int
sd_detect
(
struct
scsi_device
*
sdp
)
{
SCSI_LOG_HLQUEUE
(
3
,
printk
(
"sd_detect: type=%d
\n
"
,
sdp
->
type
));
if
(
sdp
->
type
!=
TYPE_DISK
&&
sdp
->
type
!=
TYPE_MOD
)
return
0
;
return
1
;
}
/**
* sd_attach - called during driver initialization and whenever a
* new scsi device is attached to the system. It is called once
...
...
drivers/scsi/sg.c
View file @
1d12ef0d
...
...
@@ -111,7 +111,6 @@ static int sg_allow_dio = SG_ALLOW_DIO_DEF;
#define SG_DEV_ARR_LUMP 6
/* amount to over allocate sg_dev_arr by */
static
int
sg_attach
(
Scsi_Device
*
);
static
int
sg_detect
(
Scsi_Device
*
);
static
void
sg_detach
(
Scsi_Device
*
);
static
Scsi_Request
*
dummy_cmdp
;
/* only used for sizeof */
...
...
@@ -124,7 +123,6 @@ static struct Scsi_Device_Template sg_template = {
.
name
=
"generic"
,
.
tag
=
"sg"
,
.
scsi_type
=
0xff
,
.
detect
=
sg_detect
,
.
attach
=
sg_attach
,
.
detach
=
sg_detach
};
...
...
@@ -233,7 +231,6 @@ static int sg_last_dev(void);
#endif
static
Sg_device
**
sg_dev_arr
=
NULL
;
static
int
sg_dev_noticed
;
static
int
sg_dev_max
;
static
int
sg_nr_dev
;
...
...
@@ -1338,13 +1335,6 @@ static struct file_operations sg_fops = {
.
fasync
=
sg_fasync
,
};
static
int
sg_detect
(
Scsi_Device
*
scsidp
)
{
sg_dev_noticed
++
;
return
1
;
}
#ifndef MODULE
static
int
__init
sg_def_reserved_size_setup
(
char
*
str
)
...
...
@@ -1563,7 +1553,6 @@ sg_detach(Scsi_Device * scsidp)
}
scsi_slave_detach
(
scsidp
);
sg_nr_dev
--
;
sg_dev_noticed
--
;
/* from <dan@lectra.fr> */
break
;
}
write_unlock_irqrestore
(
&
sg_dev_arr_lock
,
iflags
);
...
...
drivers/scsi/sr.c
View file @
1d12ef0d
...
...
@@ -66,7 +66,6 @@ MODULE_PARM(xa_test, "i"); /* see sr_ioctl.c */
CDC_CD_R|CDC_CD_RW|CDC_DVD|CDC_DVD_R|CDC_GENERIC_PACKET)
static
int
sr_attach
(
struct
scsi_device
*
);
static
int
sr_detect
(
struct
scsi_device
*
);
static
void
sr_detach
(
struct
scsi_device
*
);
static
int
sr_init_command
(
struct
scsi_cmnd
*
);
...
...
@@ -75,7 +74,6 @@ static struct Scsi_Device_Template sr_template = {
.
name
=
"cdrom"
,
.
tag
=
"sr"
,
.
scsi_type
=
TYPE_ROM
,
.
detect
=
sr_detect
,
.
attach
=
sr_attach
,
.
detach
=
sr_detach
,
.
init_command
=
sr_init_command
...
...
@@ -489,14 +487,6 @@ static int sr_open(struct cdrom_device_info *cdi, int purpose)
return
0
;
}
static
int
sr_detect
(
struct
scsi_device
*
SDp
)
{
if
(
SDp
->
type
!=
TYPE_ROM
&&
SDp
->
type
!=
TYPE_WORM
)
return
0
;
return
1
;
}
static
int
sr_attach
(
struct
scsi_device
*
sdev
)
{
struct
gendisk
*
disk
;
...
...
drivers/scsi/st.c
View file @
1d12ef0d
...
...
@@ -170,7 +170,6 @@ static int sgl_map_user_pages(struct scatterlist *, const unsigned int,
static
int
sgl_unmap_user_pages
(
struct
scatterlist
*
,
const
unsigned
int
,
int
);
static
int
st_attach
(
Scsi_Device
*
);
static
int
st_detect
(
Scsi_Device
*
);
static
void
st_detach
(
Scsi_Device
*
);
static
struct
Scsi_Device_Template
st_template
=
{
...
...
@@ -178,7 +177,6 @@ static struct Scsi_Device_Template st_template = {
.
name
=
"tape"
,
.
tag
=
"st"
,
.
scsi_type
=
TYPE_TAPE
,
.
detect
=
st_detect
,
.
attach
=
st_attach
,
.
detach
=
st_detach
};
...
...
@@ -3885,13 +3883,6 @@ static int st_attach(Scsi_Device * SDp)
return
0
;
};
static
int
st_detect
(
Scsi_Device
*
SDp
)
{
if
(
SDp
->
type
!=
TYPE_TAPE
||
st_incompatible
(
SDp
))
return
0
;
return
1
;
}
static
void
st_detach
(
Scsi_Device
*
SDp
)
{
Scsi_Tape
*
tpnt
;
...
...
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