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
28d1aea6
Commit
28d1aea6
authored
May 30, 2003
by
Christoph Hellwig
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[PATCH] switch /proc/scsi/scsi to seq_file and proper device model
parent
0859138b
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
64 additions
and
82 deletions
+64
-82
drivers/scsi/scsi_priv.h
drivers/scsi/scsi_priv.h
+1
-0
drivers/scsi/scsi_proc.c
drivers/scsi/scsi_proc.c
+62
-81
drivers/scsi/scsi_sysfs.c
drivers/scsi/scsi_sysfs.c
+1
-1
No files found.
drivers/scsi/scsi_priv.h
View file @
28d1aea6
...
@@ -130,5 +130,6 @@ extern struct class_device_attribute *scsi_sysfs_shost_attrs[];
...
@@ -130,5 +130,6 @@ extern struct class_device_attribute *scsi_sysfs_shost_attrs[];
extern
struct
device_attribute
*
scsi_sysfs_sdev_attrs
[];
extern
struct
device_attribute
*
scsi_sysfs_sdev_attrs
[];
extern
struct
class
shost_class
;
extern
struct
class
shost_class
;
extern
struct
bus_type
scsi_bus_type
;
#endif
/* _SCSI_PRIV_H */
#endif
/* _SCSI_PRIV_H */
drivers/scsi/scsi_proc.c
View file @
28d1aea6
...
@@ -24,6 +24,7 @@
...
@@ -24,6 +24,7 @@
#include <linux/proc_fs.h>
#include <linux/proc_fs.h>
#include <linux/errno.h>
#include <linux/errno.h>
#include <linux/blk.h>
#include <linux/blk.h>
#include <linux/seq_file.h>
#include <asm/uaccess.h>
#include <asm/uaccess.h>
#include "scsi.h"
#include "scsi.h"
...
@@ -86,7 +87,7 @@ static int proc_scsi_read(char *buffer, char **start, off_t offset,
...
@@ -86,7 +87,7 @@ static int proc_scsi_read(char *buffer, char **start, off_t offset,
return
n
;
return
n
;
}
}
static
int
proc_scsi_write
(
struct
file
*
file
,
const
char
*
buf
,
static
int
proc_scsi_write
_proc
(
struct
file
*
file
,
const
char
*
buf
,
unsigned
long
count
,
void
*
data
)
unsigned
long
count
,
void
*
data
)
{
{
struct
Scsi_Host
*
shost
=
data
;
struct
Scsi_Host
*
shost
=
data
;
...
@@ -137,7 +138,7 @@ void scsi_proc_host_add(struct Scsi_Host *shost)
...
@@ -137,7 +138,7 @@ void scsi_proc_host_add(struct Scsi_Host *shost)
return
;
return
;
}
}
p
->
write_proc
=
proc_scsi_write
;
p
->
write_proc
=
proc_scsi_write
_proc
;
p
->
owner
=
shost
->
hostt
->
module
;
p
->
owner
=
shost
->
hostt
->
module
;
}
}
...
@@ -152,96 +153,52 @@ void scsi_proc_host_rm(struct Scsi_Host *shost)
...
@@ -152,96 +153,52 @@ void scsi_proc_host_rm(struct Scsi_Host *shost)
remove_proc_entry
(
shost
->
hostt
->
proc_name
,
proc_scsi
);
remove_proc_entry
(
shost
->
hostt
->
proc_name
,
proc_scsi
);
}
}
static
void
proc_print_scsidevice
(
struct
scsi_device
*
sdev
,
char
*
buffer
,
static
int
proc_print_scsidevice
(
struct
device
*
dev
,
void
*
data
)
int
*
size
,
int
len
)
{
{
struct
scsi_device
*
sdev
=
to_scsi_device
(
dev
);
struct
seq_file
*
s
=
data
;
int
i
;
int
x
,
y
=
*
size
;
seq_printf
(
s
,
extern
const
char
*
const
scsi_device_types
[
MAX_SCSI_DEVICE_CODE
];
y
=
sprintf
(
buffer
+
len
,
"Host: scsi%d Channel: %02d Id: %02d Lun: %02d
\n
Vendor: "
,
"Host: scsi%d Channel: %02d Id: %02d Lun: %02d
\n
Vendor: "
,
sdev
->
host
->
host_no
,
sdev
->
channel
,
sdev
->
id
,
sdev
->
lun
);
sdev
->
host
->
host_no
,
sdev
->
channel
,
sdev
->
id
,
sdev
->
lun
);
for
(
x
=
0
;
x
<
8
;
x
++
)
{
for
(
i
=
0
;
i
<
8
;
i
++
)
{
if
(
sdev
->
vendor
[
x
]
>=
0x20
)
if
(
sdev
->
vendor
[
i
]
>=
0x20
)
y
+=
sprintf
(
buffer
+
len
+
y
,
"%c"
,
sdev
->
vendor
[
x
]);
seq_printf
(
s
,
"%c"
,
sdev
->
vendor
[
i
]);
else
else
y
+=
sprintf
(
buffer
+
len
+
y
,
" "
);
seq_printf
(
s
,
" "
);
}
}
y
+=
sprintf
(
buffer
+
len
+
y
,
" Model: "
);
for
(
x
=
0
;
x
<
16
;
x
++
)
{
seq_printf
(
s
,
" Model: "
);
if
(
sdev
->
model
[
x
]
>=
0x20
)
for
(
i
=
0
;
i
<
16
;
i
++
)
{
y
+=
sprintf
(
buffer
+
len
+
y
,
"%c"
,
sdev
->
model
[
x
]);
if
(
sdev
->
model
[
i
]
>=
0x20
)
seq_printf
(
s
,
"%c"
,
sdev
->
model
[
i
]);
else
else
y
+=
sprintf
(
buffer
+
len
+
y
,
" "
);
seq_printf
(
s
,
" "
);
}
}
y
+=
sprintf
(
buffer
+
len
+
y
,
" Rev: "
);
for
(
x
=
0
;
x
<
4
;
x
++
)
{
seq_printf
(
s
,
" Rev: "
);
if
(
sdev
->
rev
[
x
]
>=
0x20
)
for
(
i
=
0
;
i
<
4
;
i
++
)
{
y
+=
sprintf
(
buffer
+
len
+
y
,
"%c"
,
sdev
->
rev
[
x
]);
if
(
sdev
->
rev
[
i
]
>=
0x20
)
seq_printf
(
s
,
"%c"
,
sdev
->
rev
[
i
]);
else
else
y
+=
sprintf
(
buffer
+
len
+
y
,
" "
);
seq_printf
(
s
,
" "
);
}
}
y
+=
sprintf
(
buffer
+
len
+
y
,
"
\n
"
);
y
+=
sprintf
(
buffer
+
len
+
y
,
" Type: %s "
,
seq_printf
(
s
,
"
\n
"
);
seq_printf
(
s
,
" Type: %s "
,
sdev
->
type
<
MAX_SCSI_DEVICE_CODE
?
sdev
->
type
<
MAX_SCSI_DEVICE_CODE
?
scsi_device_types
[(
int
)
sdev
->
type
]
:
"Unknown "
);
scsi_device_types
[(
int
)
sdev
->
type
]
:
"Unknown "
);
y
+=
sprintf
(
buffer
+
len
+
y
,
" ANSI"
seq_printf
(
s
,
" ANSI"
" SCSI revision: %02x"
,
(
sdev
->
scsi_level
-
1
)
?
" SCSI revision: %02x"
,
(
sdev
->
scsi_level
-
1
)
?
sdev
->
scsi_level
-
1
:
1
);
sdev
->
scsi_level
-
1
:
1
);
if
(
sdev
->
scsi_level
==
2
)
if
(
sdev
->
scsi_level
==
2
)
y
+=
sprintf
(
buffer
+
len
+
y
,
" CCS
\n
"
);
seq_printf
(
s
,
" CCS
\n
"
);
else
else
y
+=
sprintf
(
buffer
+
len
+
y
,
"
\n
"
);
seq_printf
(
s
,
"
\n
"
);
*
size
=
y
;
return
0
;
return
;
}
static
int
scsi_proc_info
(
char
*
buffer
,
char
**
start
,
off_t
offset
,
int
length
)
{
struct
Scsi_Host
*
shost
;
Scsi_Device
*
sdev
;
int
size
,
len
=
0
;
off_t
begin
=
0
;
off_t
pos
=
0
;
/*
* First, see if there are any attached devices or not.
*/
for
(
shost
=
scsi_host_get_next
(
NULL
);
shost
;
shost
=
scsi_host_get_next
(
shost
))
{
if
(
!
list_empty
(
&
shost
->
my_devices
))
{
break
;
}
}
size
=
sprintf
(
buffer
+
len
,
"Attached devices: %s
\n
"
,
(
shost
)
?
""
:
"none"
);
len
+=
size
;
pos
=
begin
+
len
;
for
(
shost
=
scsi_host_get_next
(
NULL
);
shost
;
shost
=
scsi_host_get_next
(
shost
))
{
list_for_each_entry
(
sdev
,
&
shost
->
my_devices
,
siblings
)
{
proc_print_scsidevice
(
sdev
,
buffer
,
&
size
,
len
);
len
+=
size
;
pos
=
begin
+
len
;
if
(
pos
<
offset
)
{
len
=
0
;
begin
=
pos
;
}
if
(
pos
>
offset
+
length
)
goto
stop_output
;
}
}
stop_output:
*
start
=
buffer
+
(
offset
-
begin
);
/* Start of wanted data */
len
-=
(
offset
-
begin
);
/* Start slop */
if
(
len
>
length
)
len
=
length
;
/* Ending slop */
return
(
len
);
}
}
static
int
scsi_add_single_device
(
uint
host
,
uint
channel
,
uint
id
,
uint
lun
)
static
int
scsi_add_single_device
(
uint
host
,
uint
channel
,
uint
id
,
uint
lun
)
...
@@ -287,8 +244,8 @@ static int scsi_remove_single_device(uint host, uint channel, uint id, uint lun)
...
@@ -287,8 +244,8 @@ static int scsi_remove_single_device(uint host, uint channel, uint id, uint lun)
return
error
;
return
error
;
}
}
static
int
proc_scsi_
gen_write
(
struct
file
*
file
,
const
char
*
buf
,
static
int
proc_scsi_
write
(
struct
file
*
file
,
const
char
*
buf
,
unsigned
long
length
,
void
*
data
)
size_t
length
,
loff_t
*
ppos
)
{
{
int
host
,
channel
,
id
,
lun
;
int
host
,
channel
,
id
,
lun
;
char
*
buffer
,
*
p
;
char
*
buffer
,
*
p
;
...
@@ -431,6 +388,30 @@ static int proc_scsi_gen_write(struct file * file, const char * buf,
...
@@ -431,6 +388,30 @@ static int proc_scsi_gen_write(struct file * file, const char * buf,
return
err
;
return
err
;
}
}
static
int
proc_scsi_show
(
struct
seq_file
*
s
,
void
*
p
)
{
seq_printf
(
s
,
"Attached devices:
\n
"
);
bus_for_each_dev
(
&
scsi_bus_type
,
NULL
,
s
,
proc_print_scsidevice
);
return
0
;
}
static
int
proc_scsi_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
/*
* We don't really needs this for the write case but it doesn't
* harm either.
*/
return
single_open
(
file
,
proc_scsi_show
,
NULL
);
}
static
struct
file_operations
proc_scsi_operations
=
{
.
open
=
proc_scsi_open
,
.
read
=
seq_read
,
.
write
=
proc_scsi_write
,
.
llseek
=
seq_lseek
,
.
release
=
single_release
,
};
int
__init
scsi_init_procfs
(
void
)
int
__init
scsi_init_procfs
(
void
)
{
{
struct
proc_dir_entry
*
pde
;
struct
proc_dir_entry
*
pde
;
...
@@ -439,10 +420,10 @@ int __init scsi_init_procfs(void)
...
@@ -439,10 +420,10 @@ int __init scsi_init_procfs(void)
if
(
!
proc_scsi
)
if
(
!
proc_scsi
)
goto
err1
;
goto
err1
;
pde
=
create_proc_
info_entry
(
"scsi/scsi"
,
0
,
0
,
scsi_proc_info
);
pde
=
create_proc_
entry
(
"scsi/scsi"
,
0
,
NULL
);
if
(
!
pde
)
if
(
!
pde
)
goto
err2
;
goto
err2
;
pde
->
write_proc
=
proc_scsi_gen_write
;
pde
->
proc_fops
=
&
proc_scsi_operations
;
return
0
;
return
0
;
...
...
drivers/scsi/scsi_sysfs.c
View file @
28d1aea6
...
@@ -68,7 +68,7 @@ static int scsi_bus_match(struct device *dev, struct device_driver *gendrv)
...
@@ -68,7 +68,7 @@ static int scsi_bus_match(struct device *dev, struct device_driver *gendrv)
return
1
;
return
1
;
}
}
st
atic
st
ruct
bus_type
scsi_bus_type
=
{
struct
bus_type
scsi_bus_type
=
{
.
name
=
"scsi"
,
.
name
=
"scsi"
,
.
match
=
scsi_bus_match
,
.
match
=
scsi_bus_match
,
};
};
...
...
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