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
4b0991ad
Commit
4b0991ad
authored
Oct 22, 2003
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://linux-scsi.bkbits.net/scsi-bugfixes-2.6
into home.osdl.org:/home/torvalds/v2.5/linux
parents
d1d8f3b6
e2d02589
Changes
15
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
174 additions
and
55 deletions
+174
-55
drivers/block/scsi_ioctl.c
drivers/block/scsi_ioctl.c
+2
-0
drivers/scsi/aacraid/aacraid.h
drivers/scsi/aacraid/aacraid.h
+2
-0
drivers/scsi/aacraid/comminit.c
drivers/scsi/aacraid/comminit.c
+15
-1
drivers/scsi/constants.c
drivers/scsi/constants.c
+37
-25
drivers/scsi/scsi.c
drivers/scsi/scsi.c
+1
-3
drivers/scsi/scsi_devinfo.c
drivers/scsi/scsi_devinfo.c
+11
-4
drivers/scsi/scsi_priv.h
drivers/scsi/scsi_priv.h
+2
-1
drivers/scsi/scsi_scan.c
drivers/scsi/scsi_scan.c
+18
-5
drivers/scsi/scsi_sysfs.c
drivers/scsi/scsi_sysfs.c
+1
-2
drivers/scsi/sd.c
drivers/scsi/sd.c
+64
-8
drivers/scsi/sg.c
drivers/scsi/sg.c
+2
-0
drivers/usb/storage/scsiglue.c
drivers/usb/storage/scsiglue.c
+4
-4
include/scsi/scsi_device.h
include/scsi/scsi_device.h
+2
-0
include/scsi/scsi_devinfo.h
include/scsi/scsi_devinfo.h
+7
-2
include/scsi/scsi_host.h
include/scsi/scsi_host.h
+6
-0
No files found.
drivers/block/scsi_ioctl.c
View file @
4b0991ad
...
@@ -124,6 +124,8 @@ static int sg_set_reserved_size(request_queue_t *q, int *p)
...
@@ -124,6 +124,8 @@ static int sg_set_reserved_size(request_queue_t *q, int *p)
if
(
err
)
if
(
err
)
return
err
;
return
err
;
if
(
size
<
0
)
return
-
EINVAL
;
if
(
size
>
(
q
->
max_sectors
<<
9
))
if
(
size
>
(
q
->
max_sectors
<<
9
))
return
-
EINVAL
;
return
-
EINVAL
;
...
...
drivers/scsi/aacraid/aacraid.h
View file @
4b0991ad
...
@@ -14,6 +14,8 @@
...
@@ -14,6 +14,8 @@
#define AAC_MAX_TARGET (MAXIMUM_NUM_CONTAINERS+1)
#define AAC_MAX_TARGET (MAXIMUM_NUM_CONTAINERS+1)
#define AAC_MAX_LUN (8)
#define AAC_MAX_LUN (8)
#define AAC_MAX_HOSTPHYSMEMPAGES (0xfffff)
/*
/*
* These macros convert from physical channels to virtual channels
* These macros convert from physical channels to virtual channels
*/
*/
...
...
drivers/scsi/aacraid/comminit.c
View file @
4b0991ad
...
@@ -92,7 +92,21 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co
...
@@ -92,7 +92,21 @@ static int aac_alloc_comm(struct aac_dev *dev, void **commaddr, unsigned long co
init
->
AdapterFibsPhysicalAddress
=
cpu_to_le32
((
u32
)
phys
);
init
->
AdapterFibsPhysicalAddress
=
cpu_to_le32
((
u32
)
phys
);
init
->
AdapterFibsSize
=
cpu_to_le32
(
fibsize
);
init
->
AdapterFibsSize
=
cpu_to_le32
(
fibsize
);
init
->
AdapterFibAlign
=
cpu_to_le32
(
sizeof
(
struct
hw_fib
));
init
->
AdapterFibAlign
=
cpu_to_le32
(
sizeof
(
struct
hw_fib
));
init
->
HostPhysMemPages
=
cpu_to_le32
(
num_physpages
);
// number of 4k pages of host physical memory
/*
* number of 4k pages of host physical memory. The aacraid fw needs
* this number to be less than 4gb worth of pages. num_physpages is in
* system page units. New firmware doesn't have any issues with the
* mapping system, but older Firmware did, and had *troubles* dealing
* with the math overloading past 32 bits, thus we must limit this
* field.
*/
if
((
num_physpages
<<
(
PAGE_SHIFT
-
12
))
<=
AAC_MAX_HOSTPHYSMEMPAGES
)
{
init
->
HostPhysMemPages
=
cpu_to_le32
(
num_physpages
<<
(
PAGE_SHIFT
-
12
));
}
else
{
init
->
HostPhysMemPages
=
cpu_to_le32
(
AAC_MAX_HOSTPHYSMEMPAGES
);
}
/*
/*
* Increment the base address by the amount already used
* Increment the base address by the amount already used
...
...
drivers/scsi/constants.c
View file @
4b0991ad
...
@@ -62,42 +62,54 @@ static const char *group_1_commands[] = {
...
@@ -62,42 +62,54 @@ static const char *group_1_commands[] = {
static
const
char
*
group_2_commands
[]
=
{
static
const
char
*
group_2_commands
[]
=
{
/* 40-41 */
"Change Definition"
,
"Write Same"
,
/* 40-41 */
"Change Definition"
,
"Write Same"
,
/* 42-48 */
"Read sub-channel"
,
"Read TOC"
,
"Read header"
,
/* 42-48 */
"Read sub-channel"
,
"Read TOC"
,
"Read header"
,
"Play audio (10)"
,
unknown
,
"Play audio msf"
,
"Play audio (10)"
,
"Get configuration"
,
"Play audio msf"
,
"Play audio track/index"
,
"Play audio track/index"
,
/* 49-4f */
"Play track relative (10)"
,
unknown
,
"Pause/resume"
,
/* 49-4f */
"Play track relative (10)"
,
"Get event status notification"
,
"Log Select"
,
"Log Sense"
,
unknown
,
unknown
,
"Pause/resume"
,
"Log Select"
,
"Log Sense"
,
"Stop play/scan"
,
/* 50-55 */
unknown
,
unknown
,
unknown
,
unknown
,
unknown
,
"Mode Select (10)"
,
unknown
,
/* 56-5b */
unknown
,
unknown
,
unknown
,
unknown
,
"Mode Sense (10)"
,
unknown
,
/* 50-55 */
"Xdwrite"
,
"Xpwrite, Read disk info"
,
"Xdread, Read track info"
,
/* 5c-5f */
unknown
,
unknown
,
unknown
,
"Reserve track"
,
"Send OPC onfo"
,
"Mode Select (10)"
,
/* 56-5b */
"Reserve (10)"
,
"Release (10)"
,
"Repair track"
,
"Read master cue"
,
"Mode Sense (10)"
,
"Close track/session"
,
/* 5c-5f */
"Read buffer capacity"
,
"Send cue sheet"
,
"Persistent reserve in"
,
"Persistent reserve out"
,
};
};
/* The following are 16 byte commands in group 4 */
/* The following are 16 byte commands in group 4 */
static
const
char
*
group_4_commands
[]
=
{
static
const
char
*
group_4_commands
[]
=
{
/* 80-84 */
unknown
,
unknown
,
unknown
,
unknown
,
unknown
,
/* 80-84 */
"Xdwrite (16)"
,
"Rebuild (16)"
,
"Regenerate (16)"
,
"Extended copy"
,
/* 85-89 */
"Memory Export In (16)"
,
unknown
,
unknown
,
unknown
,
"Receive copy results"
,
"Memory Export Out (16)"
,
/* 85-89 */
"Memory Export In (16)"
,
"Access control in"
,
"Access control out"
,
/* 8a-8f */
unknown
,
unknown
,
unknown
,
unknown
,
unknown
,
unknown
,
"Read (16)"
,
"Memory Export Out (16)"
,
/* 90-94 */
unknown
,
unknown
,
unknown
,
unknown
,
unknown
,
/* 8a-8f */
"Write (16)"
,
unknown
,
"Read attributes"
,
"Write attributes"
,
"Write and verify (16)"
,
"Verify (16)"
,
/* 90-94 */
"Pre-fetch (16)"
,
"Synchronize cache (16)"
,
"Lock/unlock cache (16)"
,
"Write same (16)"
,
unknown
,
/* 95-99 */
unknown
,
unknown
,
unknown
,
unknown
,
unknown
,
/* 95-99 */
unknown
,
unknown
,
unknown
,
unknown
,
unknown
,
/* 9a-9f */
unknown
,
unknown
,
unknown
,
unknown
,
unknown
,
unknown
,
/* 9a-9f */
unknown
,
unknown
,
unknown
,
unknown
,
"Service action in"
,
"Service action out"
,
};
};
/* The following are 12 byte commands in group 5 */
/* The following are 12 byte commands in group 5 */
static
const
char
*
group_5_commands
[]
=
{
static
const
char
*
group_5_commands
[]
=
{
/* a0-a5 */
unknown
,
unknown
,
unknown
,
unknown
,
unknown
,
/* a0-a5 */
"Report luns"
,
"Blank"
,
"Send event"
,
"Maintenance (in)"
,
"Move medium/play audio(12)"
,
"Maintenance (out)"
,
"Move medium/play audio(12)"
,
/* a6-a9 */
"Exchange medium"
,
unknown
,
"Read(12)"
,
"Play track relative(12)"
,
/* a6-a9 */
"Exchange medium"
,
"Move medium attached"
,
"Read(12)"
,
/* aa-ae */
"Write(12)"
,
unknown
,
"Erase(12)"
,
unknown
,
"Play track relative(12)"
,
"Write and verify(12)"
,
/* aa-ae */
"Write(12)"
,
unknown
,
"Erase(12), Get Performance"
,
"Read DVD structure"
,
"Write and verify(12)"
,
/* af-b1 */
"Verify(12)"
,
"Search data high(12)"
,
"Search data equal(12)"
,
/* af-b1 */
"Verify(12)"
,
"Search data high(12)"
,
"Search data equal(12)"
,
/* b2-b4 */
"Search data low(12)"
,
"Set limits(12)"
,
unknown
,
/* b2-b4 */
"Search data low(12)"
,
"Set limits(12)"
,
/* b5-b6 */
"Request volume element address"
,
"Send volume tag"
,
"Read element status attached"
,
/* b7-b9 */
"Read defect data(12)"
,
"Read element status"
,
unknown
,
/* b5-b6 */
"Request volume element address"
,
"Send volume tag, set streaming"
,
/* ba-bf */
unknown
,
unknown
,
unknown
,
unknown
,
unknown
,
unknown
,
/* b7-b9 */
"Read defect data(12)"
,
"Read element status"
,
"Read CD msf"
,
/* ba-bc */
"Redundancy group (in), Scan"
,
"Redundancy group (out), Set cd-rom speed"
,
"Spare (in), Play cd"
,
/* bd-bf */
"Spare (out), Mechanism status"
,
"Volume set (in), Read cd"
,
"Volume set (out), Send DVD structure"
,
};
};
...
...
drivers/scsi/scsi.c
View file @
4b0991ad
...
@@ -914,9 +914,7 @@ void scsi_device_put(struct scsi_device *sdev)
...
@@ -914,9 +914,7 @@ void scsi_device_put(struct scsi_device *sdev)
return
;
return
;
module_put
(
sdev
->
host
->
hostt
->
module
);
module_put
(
sdev
->
host
->
hostt
->
module
);
if
(
atomic_dec_and_test
(
&
sdev
->
access_count
))
atomic_dec
(
&
sdev
->
access_count
);
if
(
test_bit
(
SDEV_DEL
,
&
sdev
->
sdev_state
))
device_del
(
&
sdev
->
sdev_gendev
);
put_device
(
&
sdev
->
sdev_gendev
);
put_device
(
&
sdev
->
sdev_gendev
);
class_put
(
&
sdev_class
);
class_put
(
&
sdev_class
);
}
}
...
...
drivers/scsi/scsi_devinfo.c
View file @
4b0991ad
...
@@ -6,10 +6,11 @@
...
@@ -6,10 +6,11 @@
#include <linux/moduleparam.h>
#include <linux/moduleparam.h>
#include <linux/proc_fs.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/seq_file.h>
#include <scsi/scsi_devinfo.h>
#include "scsi.h"
#include "scsi.h"
#include "hosts.h"
#include "scsi_priv.h"
#include "scsi_priv.h"
#include "scsi_devinfo.h"
/*
/*
* scsi_dev_info_list: structure to hold black/white listed devices.
* scsi_dev_info_list: structure to hold black/white listed devices.
...
@@ -322,11 +323,17 @@ static int scsi_dev_info_list_add_str(char *dev_list)
...
@@ -322,11 +323,17 @@ static int scsi_dev_info_list_add_str(char *dev_list)
* Description:
* Description:
* Search the scsi_dev_info_list for an entry matching @vendor and
* Search the scsi_dev_info_list for an entry matching @vendor and
* @model, if found, return the matching flags value, else return
* @model, if found, return the matching flags value, else return
*
scsi_default_dev_fla
gs.
*
the host or global default settin
gs.
**/
**/
int
scsi_get_device_flags
(
unsigned
char
*
vendor
,
unsigned
char
*
model
)
int
scsi_get_device_flags
(
struct
scsi_device
*
sdev
,
unsigned
char
*
vendor
,
unsigned
char
*
model
)
{
{
struct
scsi_dev_info_list
*
devinfo
;
struct
scsi_dev_info_list
*
devinfo
;
unsigned
int
bflags
;
bflags
=
sdev
->
host
->
hostt
->
flags
;
if
(
!
bflags
)
bflags
=
scsi_default_dev_flags
;
list_for_each_entry
(
devinfo
,
&
scsi_dev_info_list
,
dev_info_list
)
{
list_for_each_entry
(
devinfo
,
&
scsi_dev_info_list
,
dev_info_list
)
{
if
(
devinfo
->
compatible
)
{
if
(
devinfo
->
compatible
)
{
...
@@ -378,7 +385,7 @@ int scsi_get_device_flags(unsigned char *vendor, unsigned char *model)
...
@@ -378,7 +385,7 @@ int scsi_get_device_flags(unsigned char *vendor, unsigned char *model)
return
devinfo
->
flags
;
return
devinfo
->
flags
;
}
}
}
}
return
scsi_default_dev_
flags
;
return
b
flags
;
}
}
#ifdef CONFIG_SCSI_PROC_FS
#ifdef CONFIG_SCSI_PROC_FS
...
...
drivers/scsi/scsi_priv.h
View file @
4b0991ad
...
@@ -85,7 +85,8 @@ extern void scsi_init_cmd_from_req(struct scsi_cmnd *cmd,
...
@@ -85,7 +85,8 @@ extern void scsi_init_cmd_from_req(struct scsi_cmnd *cmd,
extern
void
__scsi_release_request
(
struct
scsi_request
*
sreq
);
extern
void
__scsi_release_request
(
struct
scsi_request
*
sreq
);
/* scsi_devinfo.c */
/* scsi_devinfo.c */
extern
int
scsi_get_device_flags
(
unsigned
char
*
vendor
,
unsigned
char
*
model
);
extern
int
scsi_get_device_flags
(
struct
scsi_device
*
sdev
,
unsigned
char
*
vendor
,
unsigned
char
*
model
);
extern
int
scsi_init_devinfo
(
void
);
extern
int
scsi_init_devinfo
(
void
);
extern
void
scsi_exit_devinfo
(
void
);
extern
void
scsi_exit_devinfo
(
void
);
...
...
drivers/scsi/scsi_scan.c
View file @
4b0991ad
...
@@ -35,10 +35,10 @@
...
@@ -35,10 +35,10 @@
#include "scsi.h"
#include "scsi.h"
#include "hosts.h"
#include "hosts.h"
#include <scsi/scsi_driver.h>
#include <scsi/scsi_driver.h>
#include <scsi/scsi_devinfo.h>
#include "scsi_priv.h"
#include "scsi_priv.h"
#include "scsi_logging.h"
#include "scsi_logging.h"
#include "scsi_devinfo.h"
#define ALLOC_FAILURE_MSG KERN_ERR "%s: Allocation failure during" \
#define ALLOC_FAILURE_MSG KERN_ERR "%s: Allocation failure during" \
" SCSI scanning, some SCSI devices might not be configured\n"
" SCSI scanning, some SCSI devices might not be configured\n"
...
@@ -365,7 +365,7 @@ static void scsi_probe_lun(struct scsi_request *sreq, char *inq_result,
...
@@ -365,7 +365,7 @@ static void scsi_probe_lun(struct scsi_request *sreq, char *inq_result,
* bit fields in Scsi_Device, so bflags need not be passed as an
* bit fields in Scsi_Device, so bflags need not be passed as an
* argument.
* argument.
*/
*/
*
bflags
|=
scsi_get_device_flags
(
&
inq_result
[
8
],
&
inq_result
[
16
]);
*
bflags
|=
scsi_get_device_flags
(
sdev
,
&
inq_result
[
8
],
&
inq_result
[
16
]);
possible_inq_resp_len
=
(
unsigned
char
)
inq_result
[
4
]
+
5
;
possible_inq_resp_len
=
(
unsigned
char
)
inq_result
[
4
]
+
5
;
if
(
BLIST_INQUIRY_36
&
*
bflags
)
if
(
BLIST_INQUIRY_36
&
*
bflags
)
...
@@ -625,7 +625,15 @@ static int scsi_add_lun(struct scsi_device *sdev, char *inq_result, int *bflags)
...
@@ -625,7 +625,15 @@ static int scsi_add_lun(struct scsi_device *sdev, char *inq_result, int *bflags)
sdev
->
max_device_blocked
=
SCSI_DEFAULT_DEVICE_BLOCKED
;
sdev
->
max_device_blocked
=
SCSI_DEFAULT_DEVICE_BLOCKED
;
sdev
->
use_10_for_rw
=
1
;
sdev
->
use_10_for_rw
=
1
;
sdev
->
use_10_for_ms
=
0
;
if
(
*
bflags
&
BLIST_MS_SKIP_PAGE_08
)
sdev
->
skip_ms_page_8
=
1
;
if
(
*
bflags
&
BLIST_MS_SKIP_PAGE_3F
)
sdev
->
skip_ms_page_3f
=
1
;
if
(
*
bflags
&
BLIST_USE_10_BYTE_MS
)
sdev
->
use_10_for_ms
=
1
;
if
(
sdev
->
host
->
hostt
->
slave_configure
)
if
(
sdev
->
host
->
hostt
->
slave_configure
)
sdev
->
host
->
hostt
->
slave_configure
(
sdev
);
sdev
->
host
->
hostt
->
slave_configure
(
sdev
);
...
@@ -678,7 +686,8 @@ static int scsi_probe_and_add_lun(struct Scsi_Host *host,
...
@@ -678,7 +686,8 @@ static int scsi_probe_and_add_lun(struct Scsi_Host *host,
if
(
sdevp
)
if
(
sdevp
)
*
sdevp
=
sdev
;
*
sdevp
=
sdev
;
if
(
bflagsp
)
if
(
bflagsp
)
*
bflagsp
=
scsi_get_device_flags
(
sdev
->
vendor
,
*
bflagsp
=
scsi_get_device_flags
(
sdev
,
sdev
->
vendor
,
sdev
->
model
);
sdev
->
model
);
return
SCSI_SCAN_LUN_PRESENT
;
return
SCSI_SCAN_LUN_PRESENT
;
}
}
...
@@ -1080,8 +1089,12 @@ struct scsi_device *scsi_add_device(struct Scsi_Host *shost,
...
@@ -1080,8 +1089,12 @@ struct scsi_device *scsi_add_device(struct Scsi_Host *shost,
void
scsi_rescan_device
(
struct
device
*
dev
)
void
scsi_rescan_device
(
struct
device
*
dev
)
{
{
struct
scsi_driver
*
drv
=
to_scsi_driver
(
dev
->
driver
);
struct
scsi_driver
*
drv
;
if
(
!
dev
->
driver
)
return
;
drv
=
to_scsi_driver
(
dev
->
driver
);
if
(
try_module_get
(
drv
->
owner
))
{
if
(
try_module_get
(
drv
->
owner
))
{
if
(
drv
->
rescan
)
if
(
drv
->
rescan
)
drv
->
rescan
(
dev
);
drv
->
rescan
(
dev
);
...
...
drivers/scsi/scsi_sysfs.c
View file @
4b0991ad
...
@@ -412,8 +412,7 @@ void scsi_remove_device(struct scsi_device *sdev)
...
@@ -412,8 +412,7 @@ void scsi_remove_device(struct scsi_device *sdev)
set_bit
(
SDEV_DEL
,
&
sdev
->
sdev_state
);
set_bit
(
SDEV_DEL
,
&
sdev
->
sdev_state
);
if
(
sdev
->
host
->
hostt
->
slave_destroy
)
if
(
sdev
->
host
->
hostt
->
slave_destroy
)
sdev
->
host
->
hostt
->
slave_destroy
(
sdev
);
sdev
->
host
->
hostt
->
slave_destroy
(
sdev
);
if
(
!
atomic_read
(
&
sdev
->
access_count
))
device_del
(
&
sdev
->
sdev_gendev
);
device_del
(
&
sdev
->
sdev_gendev
);
up_write
(
&
class
->
subsys
.
rwsem
);
up_write
(
&
class
->
subsys
.
rwsem
);
}
}
...
...
drivers/scsi/sd.c
View file @
4b0991ad
...
@@ -74,9 +74,16 @@
...
@@ -74,9 +74,16 @@
*/
*/
#define SD_MAX_RETRIES 5
#define SD_MAX_RETRIES 5
static
void
scsi_disk_release
(
struct
kobject
*
kobj
);
static
struct
kobj_type
scsi_disk_kobj_type
=
{
.
release
=
scsi_disk_release
,
};
struct
scsi_disk
{
struct
scsi_disk
{
struct
scsi_driver
*
driver
;
/* always &sd_template */
struct
scsi_driver
*
driver
;
/* always &sd_template */
struct
scsi_device
*
device
;
struct
scsi_device
*
device
;
struct
kobject
kobj
;
struct
gendisk
*
disk
;
struct
gendisk
*
disk
;
unsigned
int
openers
;
/* protected by BKL for now, yuck */
unsigned
int
openers
;
/* protected by BKL for now, yuck */
sector_t
capacity
;
/* size in 512-byte sectors */
sector_t
capacity
;
/* size in 512-byte sectors */
...
@@ -87,6 +94,7 @@ struct scsi_disk {
...
@@ -87,6 +94,7 @@ struct scsi_disk {
unsigned
RCD
:
1
;
/* state of disk RCD bit, unused */
unsigned
RCD
:
1
;
/* state of disk RCD bit, unused */
};
};
static
unsigned
long
sd_index_bits
[
SD_DISKS
/
BITS_PER_LONG
];
static
unsigned
long
sd_index_bits
[
SD_DISKS
/
BITS_PER_LONG
];
static
spinlock_t
sd_index_lock
=
SPIN_LOCK_UNLOCKED
;
static
spinlock_t
sd_index_lock
=
SPIN_LOCK_UNLOCKED
;
...
@@ -128,11 +136,33 @@ static int sd_major(int major_idx)
...
@@ -128,11 +136,33 @@ static int sd_major(int major_idx)
}
}
}
}
#define to_scsi_disk(obj) container_of(obj,struct scsi_disk,kobj);
static
inline
struct
scsi_disk
*
scsi_disk
(
struct
gendisk
*
disk
)
static
inline
struct
scsi_disk
*
scsi_disk
(
struct
gendisk
*
disk
)
{
{
return
container_of
(
disk
->
private_data
,
struct
scsi_disk
,
driver
);
return
container_of
(
disk
->
private_data
,
struct
scsi_disk
,
driver
);
}
}
static
int
scsi_disk_get
(
struct
scsi_disk
*
sdkp
)
{
if
(
!
kobject_get
(
&
sdkp
->
kobj
))
goto
out
;
if
(
scsi_device_get
(
sdkp
->
device
))
goto
out_put_kobj
;
return
0
;
out_put_kobj:
kobject_put
(
&
sdkp
->
kobj
);
out:
return
-
ENXIO
;
}
static
void
scsi_disk_put
(
struct
scsi_disk
*
sdkp
)
{
scsi_device_put
(
sdkp
->
device
);
kobject_put
(
&
sdkp
->
kobj
);
}
/**
/**
* sd_init_command - build a scsi (read or write) command from
* sd_init_command - build a scsi (read or write) command from
* information in the request structure.
* information in the request structure.
...
@@ -352,15 +382,17 @@ static int sd_open(struct inode *inode, struct file *filp)
...
@@ -352,15 +382,17 @@ static int sd_open(struct inode *inode, struct file *filp)
{
{
struct
gendisk
*
disk
=
inode
->
i_bdev
->
bd_disk
;
struct
gendisk
*
disk
=
inode
->
i_bdev
->
bd_disk
;
struct
scsi_disk
*
sdkp
=
scsi_disk
(
disk
);
struct
scsi_disk
*
sdkp
=
scsi_disk
(
disk
);
struct
scsi_device
*
sdev
=
sdkp
->
device
;
struct
scsi_device
*
sdev
;
int
retval
;
int
retval
;
SCSI_LOG_HLQUEUE
(
3
,
printk
(
"sd_open: disk=%s
\n
"
,
disk
->
disk_name
));
SCSI_LOG_HLQUEUE
(
3
,
printk
(
"sd_open: disk=%s
\n
"
,
disk
->
disk_name
));
retval
=
scsi_d
evice_get
(
sdev
);
retval
=
scsi_d
isk_get
(
sdkp
);
if
(
retval
)
if
(
retval
)
return
retval
;
return
retval
;
sdev
=
sdkp
->
device
;
/*
/*
* If the device is in error recovery, wait until it is done.
* If the device is in error recovery, wait until it is done.
* If the device is offline, then disallow any access to it.
* If the device is offline, then disallow any access to it.
...
@@ -406,7 +438,7 @@ static int sd_open(struct inode *inode, struct file *filp)
...
@@ -406,7 +438,7 @@ static int sd_open(struct inode *inode, struct file *filp)
return
0
;
return
0
;
error_out:
error_out:
scsi_d
evice_put
(
sdev
);
scsi_d
isk_put
(
sdkp
);
return
retval
;
return
retval
;
}
}
...
@@ -438,7 +470,7 @@ static int sd_release(struct inode *inode, struct file *filp)
...
@@ -438,7 +470,7 @@ static int sd_release(struct inode *inode, struct file *filp)
* XXX and what if there are packets in flight and this close()
* XXX and what if there are packets in flight and this close()
* XXX is followed by a "rmmod sd_mod"?
* XXX is followed by a "rmmod sd_mod"?
*/
*/
scsi_d
evice_put
(
sdev
);
scsi_d
isk_put
(
sdkp
);
return
0
;
return
0
;
}
}
...
@@ -1057,6 +1089,11 @@ sd_read_write_protect_flag(struct scsi_disk *sdkp, char *diskname,
...
@@ -1057,6 +1089,11 @@ sd_read_write_protect_flag(struct scsi_disk *sdkp, char *diskname,
int
res
;
int
res
;
struct
scsi_mode_data
data
;
struct
scsi_mode_data
data
;
if
(
sdkp
->
device
->
skip_ms_page_3f
)
{
printk
(
KERN_NOTICE
"%s: assuming Write Enabled
\n
"
,
diskname
);
return
;
}
/*
/*
* First attempt: ask for all pages (0x3F), but only 4 bytes.
* First attempt: ask for all pages (0x3F), but only 4 bytes.
* We have to start carefully: some devices hang if we ask
* We have to start carefully: some devices hang if we ask
...
@@ -1103,6 +1140,8 @@ sd_read_cache_type(struct scsi_disk *sdkp, char *diskname,
...
@@ -1103,6 +1140,8 @@ sd_read_cache_type(struct scsi_disk *sdkp, char *diskname,
const
int
modepage
=
0x08
;
/* current values, cache page */
const
int
modepage
=
0x08
;
/* current values, cache page */
struct
scsi_mode_data
data
;
struct
scsi_mode_data
data
;
if
(
sdkp
->
device
->
skip_ms_page_8
)
goto
defaults
;
/* cautiously ask */
/* cautiously ask */
res
=
sd_do_mode_sense
(
SRpnt
,
dbd
,
modepage
,
buffer
,
4
,
&
data
);
res
=
sd_do_mode_sense
(
SRpnt
,
dbd
,
modepage
,
buffer
,
4
,
&
data
);
...
@@ -1160,6 +1199,8 @@ sd_read_cache_type(struct scsi_disk *sdkp, char *diskname,
...
@@ -1160,6 +1199,8 @@ sd_read_cache_type(struct scsi_disk *sdkp, char *diskname,
printk
(
KERN_ERR
"%s: asking for cache data failed
\n
"
,
printk
(
KERN_ERR
"%s: asking for cache data failed
\n
"
,
diskname
);
diskname
);
}
}
defaults:
printk
(
KERN_ERR
"%s: assuming drive cache: write through
\n
"
,
printk
(
KERN_ERR
"%s: assuming drive cache: write through
\n
"
,
diskname
);
diskname
);
sdkp
->
WCE
=
0
;
sdkp
->
WCE
=
0
;
...
@@ -1270,6 +1311,10 @@ static int sd_probe(struct device *dev)
...
@@ -1270,6 +1311,10 @@ static int sd_probe(struct device *dev)
if
(
!
sdkp
)
if
(
!
sdkp
)
goto
out
;
goto
out
;
memset
(
sdkp
,
0
,
sizeof
(
*
sdkp
));
kobject_init
(
&
sdkp
->
kobj
);
sdkp
->
kobj
.
ktype
=
&
scsi_disk_kobj_type
;
gd
=
alloc_disk
(
16
);
gd
=
alloc_disk
(
16
);
if
(
!
gd
)
if
(
!
gd
)
goto
out_free
;
goto
out_free
;
...
@@ -1348,16 +1393,27 @@ static int sd_remove(struct device *dev)
...
@@ -1348,16 +1393,27 @@ static int sd_remove(struct device *dev)
struct
scsi_disk
*
sdkp
=
dev_get_drvdata
(
dev
);
struct
scsi_disk
*
sdkp
=
dev_get_drvdata
(
dev
);
del_gendisk
(
sdkp
->
disk
);
del_gendisk
(
sdkp
->
disk
);
sd_shutdown
(
dev
);
kobject_put
(
&
sdkp
->
kobj
);
return
0
;
}
/**
* scsi_disk_release - Called to free the scsi_disk structure
* @kobj: pointer to embedded kobject
**/
static
void
scsi_disk_release
(
struct
kobject
*
kobj
)
{
struct
scsi_disk
*
sdkp
=
to_scsi_disk
(
kobj
);
put_disk
(
sdkp
->
disk
);
spin_lock
(
&
sd_index_lock
);
spin_lock
(
&
sd_index_lock
);
clear_bit
(
sdkp
->
index
,
sd_index_bits
);
clear_bit
(
sdkp
->
index
,
sd_index_bits
);
spin_unlock
(
&
sd_index_lock
);
spin_unlock
(
&
sd_index_lock
);
sd_shutdown
(
dev
);
put_disk
(
sdkp
->
disk
);
kfree
(
sdkp
);
kfree
(
sdkp
);
return
0
;
}
}
/*
/*
...
...
drivers/scsi/sg.c
View file @
4b0991ad
...
@@ -877,6 +877,8 @@ sg_ioctl(struct inode *inode, struct file *filp,
...
@@ -877,6 +877,8 @@ sg_ioctl(struct inode *inode, struct file *filp,
result
=
get_user
(
val
,
(
int
*
)
arg
);
result
=
get_user
(
val
,
(
int
*
)
arg
);
if
(
result
)
if
(
result
)
return
result
;
return
result
;
if
(
val
<
0
)
return
-
EINVAL
;
if
(
val
!=
sfp
->
reserve
.
bufflen
)
{
if
(
val
!=
sfp
->
reserve
.
bufflen
)
{
if
(
sg_res_in_use
(
sfp
)
||
sfp
->
mmap_called
)
if
(
sg_res_in_use
(
sfp
)
||
sfp
->
mmap_called
)
return
-
EBUSY
;
return
-
EBUSY
;
...
...
drivers/usb/storage/scsiglue.c
View file @
4b0991ad
...
@@ -51,6 +51,7 @@
...
@@ -51,6 +51,7 @@
#include <linux/slab.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/module.h>
#include <scsi/scsi_devinfo.h>
/***********************************************************************
/***********************************************************************
...
@@ -64,10 +65,6 @@ static const char* host_info(struct Scsi_Host *host)
...
@@ -64,10 +65,6 @@ static const char* host_info(struct Scsi_Host *host)
static
int
slave_configure
(
struct
scsi_device
*
sdev
)
static
int
slave_configure
(
struct
scsi_device
*
sdev
)
{
{
/* set device to use 10-byte commands where possible */
sdev
->
use_10_for_ms
=
1
;
sdev
->
use_10_for_rw
=
1
;
/* this is to satisify the compiler, tho I don't think the
/* this is to satisify the compiler, tho I don't think the
* return code is ever checked anywhere. */
* return code is ever checked anywhere. */
return
0
;
return
0
;
...
@@ -324,6 +321,9 @@ struct scsi_host_template usb_stor_host_template = {
...
@@ -324,6 +321,9 @@ struct scsi_host_template usb_stor_host_template = {
/* emulated HBA */
/* emulated HBA */
.
emulated
=
TRUE
,
.
emulated
=
TRUE
,
/* modify scsi_device bits on probe */
.
flags
=
(
BLIST_MS_SKIP_PAGE_08
|
BLIST_USE_10_BYTE_MS
),
/* module management */
/* module management */
.
module
=
THIS_MODULE
.
module
=
THIS_MODULE
};
};
...
...
include/scsi/scsi_device.h
View file @
4b0991ad
...
@@ -86,6 +86,8 @@ struct scsi_device {
...
@@ -86,6 +86,8 @@ struct scsi_device {
* because we did a bus reset. */
* because we did a bus reset. */
unsigned
use_10_for_rw
:
1
;
/* first try 10-byte read / write */
unsigned
use_10_for_rw
:
1
;
/* first try 10-byte read / write */
unsigned
use_10_for_ms
:
1
;
/* first try 10-byte mode sense/select */
unsigned
use_10_for_ms
:
1
;
/* first try 10-byte mode sense/select */
unsigned
skip_ms_page_8
:
1
;
/* do not use MODE SENSE page 0x08 */
unsigned
skip_ms_page_3f
:
1
;
/* do not use MODE SENSE page 0x3f */
unsigned
no_start_on_add
:
1
;
/* do not issue start on add */
unsigned
no_start_on_add
:
1
;
/* do not issue start on add */
unsigned
int
device_blocked
;
/* Device returned QUEUE_FULL. */
unsigned
int
device_blocked
;
/* Device returned QUEUE_FULL. */
...
...
drivers
/scsi/scsi_devinfo.h
→
include
/scsi/scsi_devinfo.h
View file @
4b0991ad
#ifndef _SCSI_SCSI_DEVINFO_H
#define _SCSI_SCSI_DEVINFO_H
/*
/*
* Flags for SCSI devices that need special treatment
* Flags for SCSI devices that need special treatment
*/
*/
...
@@ -14,4 +15,8 @@
...
@@ -14,4 +15,8 @@
#define BLIST_LARGELUN 0x200
/* LUNs past 7 on a SCSI-2 device */
#define BLIST_LARGELUN 0x200
/* LUNs past 7 on a SCSI-2 device */
#define BLIST_INQUIRY_36 0x400
/* override additional length field */
#define BLIST_INQUIRY_36 0x400
/* override additional length field */
#define BLIST_INQUIRY_58 0x800
/* ... for broken inquiry responses */
#define BLIST_INQUIRY_58 0x800
/* ... for broken inquiry responses */
#define BLIST_NOSTARTONADD 0x1000
/* do not do automatic start on add */
#define BLIST_NOSTARTONADD 0x1000
/* do not do automatic start on add */
#define BLIST_MS_SKIP_PAGE_08 0x2000
/* do not send ms page 0x08 */
#define BLIST_MS_SKIP_PAGE_3F 0x4000
/* do not send ms page 0x3f */
#define BLIST_USE_10_BYTE_MS 0x8000
/* use 10 byte ms before 6 byte ms */
#endif
include/scsi/scsi_host.h
View file @
4b0991ad
...
@@ -344,6 +344,12 @@ struct scsi_host_template {
...
@@ -344,6 +344,12 @@ struct scsi_host_template {
* module_init/module_exit.
* module_init/module_exit.
*/
*/
struct
list_head
legacy_hosts
;
struct
list_head
legacy_hosts
;
/*
* Default flags settings, these modify the setting of scsi_device
* bits.
*/
unsigned
int
flags
;
};
};
/*
/*
...
...
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