Patch replaces procfs code with debugfs Signed-off-by: Denis Kirjanov <kirjanov@xxxxxxxxx> --- --- cowloop.c.wo.debugfs 2009-09-19 18:15:05.000000000 +0400 +++ cowloop.c 2009-09-19 22:29:26.000000000 +0400 @@ -157,13 +157,13 @@ static char cowloop_version[] = "3.2"; #include <linux/slab.h> #include <linux/semaphore.h> #include <linux/uaccess.h> -#include <linux/proc_fs.h> #include <linux/blkdev.h> #include <linux/buffer_head.h> #include <linux/hdreg.h> #include <linux/genhd.h> #include <linux/statfs.h> #include <linux/kthread.h> +#include <linux/debugfs.h> #include "cowloop.h" @@ -303,9 +303,10 @@ static struct gendisk *cowctlgd; static spinlock_t cowctlrqlock; /* for req.q. of ctrl. channel */ /* -** private directory /proc/cow +** debugfs directory */ -static struct proc_dir_entry *cowlo_procdir; +static struct dentry *cowlo_dbgfs_root; +static struct dentry *cowlo_dbgfs_files[DFLCOWS]; /* ** function prototypes @@ -1628,14 +1629,27 @@ cowlo_writecowraw(struct cowloop_device /* -** readproc-function: called when the corresponding /proc-file is read +** debugfs file operations */ + static int -cowlo_readproc(char *buf, char **start, off_t pos, int cnt, int *eof, void *p) +cowlo_dbgfs_open(struct inode *inode, struct file *file) { - struct cowloop_device *cowdev = p; + file->private_data = (struct cowloop_device *)inode->i_private; + return 0; +} - return sprintf(buf, +static ssize_t +cowlo_dbgfs_read(struct file *file, char __user *userbuf, + size_t count, loff_t *ppos) +{ + struct cowloop_device *cowdev = file->private_data; + unsigned long addr = get_zeroed_page(GFP_KERNEL); + char *buf = (char *)addr; + size_t pos = 0; + int res; + + pos += sprintf(buf, " cowloop version: %9s\n\n" " device state: %s%s%s%s\n" " number of opens: %9d\n" @@ -1665,8 +1679,18 @@ cowlo_readproc(char *buf, char **start, cowdev->nrcowblocks, MAPUNIT, cowdev->cowreads, cowdev->cowwrites); + res = simple_read_from_buffer(userbuf, count, ppos, buf, pos); + free_page(addr); + + return res; } +static const struct file_operations cowlo_dbgfs_fops = { + .owner = THIS_MODULE, + .open = cowlo_dbgfs_open, + .read = cowlo_dbgfs_read, +}; + /*****************************************************************************/ /* Setup and destroy cowdevices */ /*****************************************************************************/ @@ -1814,15 +1838,15 @@ cowlo_openpair(char *rdof, char *cowf, i } /* - ** create a file below directory /proc/cow for this new cowdevice + ** create a file below /sys/kernel/debug/cow for this new cowdevice */ - if (cowlo_procdir) { + if (cowlo_dbgfs_root) { char tmpname[64]; - sprintf(tmpname, "%d", minor); + snprintf(tmpname, sizeof(tmpname), "%d", minor); - create_proc_read_entry(tmpname, 0 , cowlo_procdir, - cowlo_readproc, cowdev); + cowlo_dbgfs_files[minor] = debugfs_create_file(tmpname, 0, + cowlo_dbgfs_root, cowdev, &cowlo_dbgfs_fops); } cowdev->state |= COWDEVOPEN; @@ -1895,16 +1919,12 @@ cowlo_closepair(struct cowloop_device *c del_gendisk(cowdev->gd); /* revert the alloc_disk() */ put_disk(cowdev->gd); /* revert the add_disk() */ - if (cowlo_procdir) { - char tmpname[64]; - + if (cowlo_dbgfs_root) { for (minor = 0; minor < maxcows; minor++) { if (cowdev == cowdevall[minor]) break; } - sprintf(tmpname, "%d", minor); - - remove_proc_entry(tmpname, cowlo_procdir); + debugfs_remove(cowlo_dbgfs_files[minor]); } blk_cleanup_queue(cowdev->rqueue); @@ -2639,10 +2659,12 @@ cowlo_init_module(void) } /* - ** create a directory below /proc to allocate a file + ** create a directory below /sys/kernel/debug to allocate a file ** for each cowdevice that is allocated later on */ - cowlo_procdir = proc_mkdir("cow", NULL); + cowlo_dbgfs_root = debugfs_create_dir("cow", NULL); + if (!cowlo_dbgfs_root) + printk(KERN_ERR "cowloop: failed to create debugfs directory"); /* ** check if a cowdevice has to be opened during insmod/modprobe; @@ -2668,7 +2690,7 @@ cowlo_init_module(void) */ retval = cowlo_openpair(rdofile, cowfile, wantrecover, 0); if (retval) { - remove_proc_entry("cow", NULL); + debugfs_remove(cowlo_dbgfs_root); unregister_blkdev(COWMAJOR, DEVICE_NAME); goto error_out; } @@ -2679,7 +2701,7 @@ cowlo_init_module(void) if ((rdofile[0] != '\0') || (cowfile[0] != '\0')) { printk(KERN_ERR "cowloop - only one filename specified\n"); - remove_proc_entry("cow", NULL); + debugfs_remove(cowlo_dbgfs_root); unregister_blkdev(COWMAJOR, DEVICE_NAME); retval = -EINVAL; goto error_out; @@ -2695,7 +2717,7 @@ cowlo_init_module(void) printk(KERN_WARNING "cowloop - unable to alloc_disk for cowctl\n"); - remove_proc_entry("cow", NULL); + debugfs_remove(cowlo_dbgfs_root); (void) cowlo_closepair(cowdevall[0]); unregister_blkdev(COWMAJOR, DEVICE_NAME); retval = -ENOMEM; @@ -2757,9 +2779,9 @@ cowlo_cleanup_module(void) unregister_blkdev(COWMAJOR, DEVICE_NAME); /* - ** get rid of /proc/cow and unregister the driver + ** get rid of debugfs stuff and unregister the driver */ - remove_proc_entry("cow", NULL); + debugfs_remove(cowlo_dbgfs_root); for (minor = 0; minor < maxcows; minor++) kfree(cowdevall[minor]); _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/devel