Line data Source code
1 : // SPDX-License-Identifier: GPL-2.0 2 : #include <linux/fs.h> 3 : #include <linux/init.h> 4 : #include <linux/proc_fs.h> 5 : #include <linux/seq_file.h> 6 : #include <linux/blkdev.h> 7 : 8 0 : static int devinfo_show(struct seq_file *f, void *v) 9 : { 10 0 : int i = *(loff_t *) v; 11 : 12 0 : if (i < CHRDEV_MAJOR_MAX) { 13 0 : if (i == 0) 14 0 : seq_puts(f, "Character devices:\n"); 15 0 : chrdev_show(f, i); 16 : } 17 : #ifdef CONFIG_BLOCK 18 : else { 19 0 : i -= CHRDEV_MAJOR_MAX; 20 0 : if (i == 0) 21 0 : seq_puts(f, "\nBlock devices:\n"); 22 0 : blkdev_show(f, i); 23 : } 24 : #endif 25 0 : return 0; 26 : } 27 : 28 0 : static void *devinfo_start(struct seq_file *f, loff_t *pos) 29 : { 30 0 : if (*pos < (BLKDEV_MAJOR_MAX + CHRDEV_MAJOR_MAX)) 31 0 : return pos; 32 : return NULL; 33 : } 34 : 35 0 : static void *devinfo_next(struct seq_file *f, void *v, loff_t *pos) 36 : { 37 0 : (*pos)++; 38 0 : if (*pos >= (BLKDEV_MAJOR_MAX + CHRDEV_MAJOR_MAX)) 39 0 : return NULL; 40 : return pos; 41 : } 42 : 43 0 : static void devinfo_stop(struct seq_file *f, void *v) 44 : { 45 : /* Nothing to do */ 46 0 : } 47 : 48 : static const struct seq_operations devinfo_ops = { 49 : .start = devinfo_start, 50 : .next = devinfo_next, 51 : .stop = devinfo_stop, 52 : .show = devinfo_show 53 : }; 54 : 55 1 : static int __init proc_devices_init(void) 56 : { 57 1 : proc_create_seq("devices", 0, NULL, &devinfo_ops); 58 1 : return 0; 59 : } 60 : fs_initcall(proc_devices_init);