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
ab91f980
Commit
ab91f980
authored
Apr 02, 2002
by
Dave Jones
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[PATCH] seq_file for /proc/partitions (take 2)
Original from Randy Dunlap <rddunlap@osdl.org>...
parent
dab4075e
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
59 additions
and
36 deletions
+59
-36
drivers/block/genhd.c
drivers/block/genhd.c
+46
-26
fs/proc/proc_misc.c
fs/proc/proc_misc.c
+13
-10
No files found.
drivers/block/genhd.c
View file @
ab91f980
...
...
@@ -22,6 +22,7 @@
#include <linux/blk.h>
#include <linux/init.h>
#include <linux/spinlock.h>
#include <linux/seq_file.h>
static
rwlock_t
gendisk_lock
;
...
...
@@ -142,39 +143,58 @@ get_nr_sects(kdev_t dev)
}
#ifdef CONFIG_PROC_FS
int
get_partition_list
(
char
*
page
,
char
**
start
,
off_t
offset
,
int
count
)
/* iterator */
static
void
*
part_start
(
struct
seq_file
*
part
,
loff_t
*
pos
)
{
struct
gendisk
*
gp
;
char
buf
[
64
];
int
len
,
n
;
loff_t
k
=
*
pos
;
struct
gendisk
*
sgp
;
len
=
sprintf
(
page
,
"major minor #blocks name
\n\n
"
);
read_lock
(
&
gendisk_lock
);
for
(
gp
=
gendisk_head
;
gp
;
gp
=
gp
->
next
)
{
for
(
n
=
0
;
n
<
(
gp
->
nr_real
<<
gp
->
minor_shift
);
n
++
)
{
if
(
gp
->
part
[
n
].
nr_sects
==
0
)
continue
;
len
+=
snprintf
(
page
+
len
,
63
,
"%4d %4d %10d %s
\n
"
,
gp
->
major
,
n
,
gp
->
sizes
[
n
],
disk_name
(
gp
,
n
,
buf
));
if
(
len
<
offset
)
offset
-=
len
,
len
=
0
;
else
if
(
len
>=
offset
+
count
)
goto
out
;
}
for
(
sgp
=
gendisk_head
;
sgp
;
sgp
=
sgp
->
next
)
{
if
(
!
k
--
)
return
sgp
;
}
return
NULL
;
}
out:
static
void
*
part_next
(
struct
seq_file
*
part
,
void
*
v
,
loff_t
*
pos
)
{
++*
pos
;
return
((
struct
gendisk
*
)
v
)
->
next
;
}
static
void
part_stop
(
struct
seq_file
*
part
,
void
*
v
)
{
read_unlock
(
&
gendisk_lock
);
*
start
=
page
+
offset
;
len
-=
offset
;
if
(
len
<
0
)
len
=
0
;
return
len
>
count
?
count
:
len
;
}
static
int
show_partition
(
struct
seq_file
*
part
,
void
*
v
)
{
struct
gendisk
*
sgp
=
v
;
int
n
;
char
buf
[
64
];
if
(
sgp
==
gendisk_head
)
seq_puts
(
part
,
"major minor #blocks name
\n\n
"
);
/* show all non-0 size partitions of this disk */
for
(
n
=
0
;
n
<
(
sgp
->
nr_real
<<
sgp
->
minor_shift
);
n
++
)
{
if
(
sgp
->
part
[
n
].
nr_sects
==
0
)
continue
;
seq_printf
(
part
,
"%4d %4d %10d %s
\n
"
,
sgp
->
major
,
n
,
sgp
->
sizes
[
n
],
disk_name
(
sgp
,
n
,
buf
));
}
return
0
;
}
struct
seq_operations
partitions_op
=
{
start:
part_start
,
next:
part_next
,
stop:
part_stop
,
show:
show_partition
};
#endif
...
...
fs/proc/proc_misc.c
View file @
ab91f980
...
...
@@ -51,7 +51,6 @@
* wrappers, but this needs further analysis wrt potential overflows.
*/
extern
int
get_device_list
(
char
*
);
extern
int
get_partition_list
(
char
*
,
char
**
,
off_t
,
int
);
extern
int
get_filesystem_list
(
char
*
);
extern
int
get_exec_domain_list
(
char
*
);
extern
int
get_dma_list
(
char
*
);
...
...
@@ -199,6 +198,18 @@ static struct file_operations proc_cpuinfo_operations = {
release:
seq_release
,
};
extern
struct
seq_operations
partitions_op
;
static
int
partitions_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
return
seq_open
(
file
,
&
partitions_op
);
}
static
struct
file_operations
proc_partitions_operations
=
{
open:
partitions_open
,
read:
seq_read
,
llseek:
seq_lseek
,
release:
seq_release
,
};
#ifdef CONFIG_MODULES
extern
struct
seq_operations
modules_op
;
static
int
modules_open
(
struct
inode
*
inode
,
struct
file
*
file
)
...
...
@@ -323,14 +334,6 @@ static int devices_read_proc(char *page, char **start, off_t off,
return
proc_calc_metrics
(
page
,
start
,
off
,
count
,
eof
,
len
);
}
static
int
partitions_read_proc
(
char
*
page
,
char
**
start
,
off_t
off
,
int
count
,
int
*
eof
,
void
*
data
)
{
int
len
=
get_partition_list
(
page
,
start
,
off
,
count
);
if
(
len
<
count
)
*
eof
=
1
;
return
len
;
}
static
void
*
single_start
(
struct
seq_file
*
p
,
loff_t
*
pos
)
{
return
NULL
+
(
*
pos
==
0
);
...
...
@@ -538,7 +541,6 @@ void __init proc_misc_init(void)
{
"version"
,
version_read_proc
},
{
"stat"
,
kstat_read_proc
},
{
"devices"
,
devices_read_proc
},
{
"partitions"
,
partitions_read_proc
},
{
"filesystems"
,
filesystems_read_proc
},
{
"dma"
,
dma_read_proc
},
{
"ioports"
,
ioports_read_proc
},
...
...
@@ -562,6 +564,7 @@ void __init proc_misc_init(void)
if
(
entry
)
entry
->
proc_fops
=
&
proc_kmsg_operations
;
create_seq_entry
(
"cpuinfo"
,
0
,
&
proc_cpuinfo_operations
);
create_seq_entry
(
"partitions"
,
0
,
&
proc_partitions_operations
);
create_seq_entry
(
"interrupts"
,
0
,
&
proc_interrupts_operations
);
create_seq_entry
(
"slabinfo"
,
S_IWUSR
|
S_IRUGO
,
&
proc_slabinfo_operations
);
#ifdef CONFIG_MODULES
...
...
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