Commit f144c7fc authored by Jeff Garzik's avatar Jeff Garzik

Merge redhat.com:/home/jgarzik/repo/linus-2.5

into redhat.com:/home/jgarzik/repo/misc-2.5
parents 22dda8bf 697eaec7
...@@ -296,6 +296,18 @@ static struct file_operations proc_partitions_operations = { ...@@ -296,6 +296,18 @@ static struct file_operations proc_partitions_operations = {
.release = seq_release, .release = seq_release,
}; };
extern struct seq_operations swaps_op;
static int swaps_open(struct inode *inode, struct file *file)
{
return seq_open(file, &swaps_op);
}
static struct file_operations proc_swaps_operations = {
.open = swaps_open,
.read = seq_read,
.llseek = seq_lseek,
.release = seq_release,
};
#ifdef CONFIG_MODULES #ifdef CONFIG_MODULES
extern struct seq_operations modules_op; extern struct seq_operations modules_op;
static int modules_open(struct inode *inode, struct file *file) static int modules_open(struct inode *inode, struct file *file)
...@@ -508,13 +520,6 @@ static int execdomains_read_proc(char *page, char **start, off_t off, ...@@ -508,13 +520,6 @@ static int execdomains_read_proc(char *page, char **start, off_t off,
return proc_calc_metrics(page, start, off, count, eof, len); return proc_calc_metrics(page, start, off, count, eof, len);
} }
static int swaps_read_proc(char *page, char **start, off_t off,
int count, int *eof, void *data)
{
int len = get_swaparea_info(page);
return proc_calc_metrics(page, start, off, count, eof, len);
}
static int memory_read_proc(char *page, char **start, off_t off, static int memory_read_proc(char *page, char **start, off_t off,
int count, int *eof, void *data) int count, int *eof, void *data)
{ {
...@@ -621,7 +626,6 @@ void __init proc_misc_init(void) ...@@ -621,7 +626,6 @@ void __init proc_misc_init(void)
{"rtc", ds1286_read_proc}, {"rtc", ds1286_read_proc},
#endif #endif
{"locks", locks_read_proc}, {"locks", locks_read_proc},
{"swaps", swaps_read_proc},
{"iomem", memory_read_proc}, {"iomem", memory_read_proc},
{"execdomains", execdomains_read_proc}, {"execdomains", execdomains_read_proc},
{NULL,} {NULL,}
...@@ -637,6 +641,7 @@ void __init proc_misc_init(void) ...@@ -637,6 +641,7 @@ void __init proc_misc_init(void)
entry->proc_fops = &proc_kmsg_operations; entry->proc_fops = &proc_kmsg_operations;
create_seq_entry("cpuinfo", 0, &proc_cpuinfo_operations); create_seq_entry("cpuinfo", 0, &proc_cpuinfo_operations);
create_seq_entry("partitions", 0, &proc_partitions_operations); create_seq_entry("partitions", 0, &proc_partitions_operations);
create_seq_entry("swaps", 0, &proc_swaps_operations);
#if !defined(CONFIG_ARCH_S390) #if !defined(CONFIG_ARCH_S390)
create_seq_entry("interrupts", 0, &proc_interrupts_operations); create_seq_entry("interrupts", 0, &proc_interrupts_operations);
#endif #endif
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
* Swap reorganised 29.12.95, Stephen Tweedie * Swap reorganised 29.12.95, Stephen Tweedie
*/ */
#include <linux/config.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/kernel_stat.h> #include <linux/kernel_stat.h>
...@@ -15,6 +16,7 @@ ...@@ -15,6 +16,7 @@
#include <linux/shm.h> #include <linux/shm.h>
#include <linux/blkdev.h> #include <linux/blkdev.h>
#include <linux/buffer_head.h> #include <linux/buffer_head.h>
#include <linux/seq_file.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <linux/swapops.h> #include <linux/swapops.h>
...@@ -1041,27 +1043,67 @@ asmlinkage long sys_swapoff(const char * specialfile) ...@@ -1041,27 +1043,67 @@ asmlinkage long sys_swapoff(const char * specialfile)
return err; return err;
} }
int get_swaparea_info(char *buf) #ifdef CONFIG_PROC_FS
/* iterator */
static void *swap_start(struct seq_file *swap, loff_t *pos)
{ {
char * page = (char *) __get_free_page(GFP_KERNEL);
struct swap_info_struct *ptr = swap_info; struct swap_info_struct *ptr = swap_info;
int i, len; int i;
loff_t l = *pos;
char * page = (char *) __get_free_page(GFP_KERNEL);
swap->private = page; /* save for swap_show */
swap_list_lock();
if (!page) if (!page)
return -ENOMEM; return ERR_PTR(-ENOMEM);
for (i = 0; i < nr_swapfiles; i++, ptr++) {
if (!(ptr->flags & SWP_USED) || !ptr->swap_map)
continue;
if (!l--)
return ptr;
}
return NULL;
}
static void *swap_next(struct seq_file *swap, void *v, loff_t *pos)
{
struct swap_info_struct *ptr = v;
void *endptr = (void *) swap_info + nr_swapfiles * sizeof(struct swap_info_struct);
for (++ptr; ptr < (struct swap_info_struct *) endptr; ptr++) {
if (!(ptr->flags & SWP_USED) || !ptr->swap_map)
continue;
++*pos;
return ptr;
}
return NULL;
}
static void swap_stop(struct seq_file *swap, void *v)
{
swap_list_unlock();
free_page((unsigned long) swap->private);
swap->private = NULL;
}
len = sprintf(buf, "Filename\t\t\t\tType\t\tSize\tUsed\tPriority\n"); static int swap_show(struct seq_file *swap, void *v)
for (i = 0 ; i < nr_swapfiles ; i++, ptr++) { {
struct swap_info_struct *ptr = v;
int j, usedswap; int j, usedswap;
struct file *file; struct file *file;
char *path; char *path;
if (!(ptr->flags & SWP_USED) || !ptr->swap_map) if (v == swap_info)
continue; seq_puts(swap, "Filename\t\t\t\tType\t\tSize\tUsed\tPriority\n");
file = ptr->swap_file; file = ptr->swap_file;
path = d_path(file->f_dentry, file->f_vfsmnt, page, PAGE_SIZE); path = d_path(file->f_dentry, file->f_vfsmnt, swap->private, PAGE_SIZE);
for (j = 0,usedswap = 0; j < ptr->max; ++j)
for (j = 0, usedswap = 0; j < ptr->max; ++j)
switch (ptr->swap_map[j]) { switch (ptr->swap_map[j]) {
case SWAP_MAP_BAD: case SWAP_MAP_BAD:
case 0: case 0:
...@@ -1069,18 +1111,24 @@ int get_swaparea_info(char *buf) ...@@ -1069,18 +1111,24 @@ int get_swaparea_info(char *buf)
default: default:
usedswap++; usedswap++;
} }
len += sprintf(buf + len, "%-39s %s\t%d\t%d\t%d\n", seq_printf(swap, "%-39s %s\t%d\t%d\t%d\n",
path, path,
S_ISBLK(file->f_dentry->d_inode->i_mode) ? S_ISBLK(file->f_dentry->d_inode->i_mode) ?
"partition" : "file\t", "partition" : "file\t",
ptr->pages << (PAGE_SHIFT - 10), ptr->pages << (PAGE_SHIFT - 10),
usedswap << (PAGE_SHIFT - 10), usedswap << (PAGE_SHIFT - 10),
ptr->prio); ptr->prio);
} return 0;
free_page((unsigned long) page);
return len;
} }
struct seq_operations swaps_op = {
.start = swap_start,
.next = swap_next,
.stop = swap_stop,
.show = swap_show
};
#endif /* CONFIG_PROC_FS */
/* /*
* Written 01/25/92 by Simmule Turner, heavily changed by Linus. * Written 01/25/92 by Simmule Turner, heavily changed by Linus.
* *
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment