diff options
author | Luis Ortega Perez de Villar <luiorpe1@upv.es> | 2013-08-16 19:16:37 +0200 |
---|---|---|
committer | Javier Martinez Canillas <javier.martinez@collabora.co.uk> | 2013-09-28 13:35:44 +0200 |
commit | 3338bfb5987b487e33b04eeaf25ca87b0ca879e6 (patch) | |
tree | e47db716a2823d6cd128a644e6bcef49f2bd9cf9 /scullp | |
parent | 9b3d82f79a2a48ef97961ef917c50019667a1c25 (diff) | |
download | ldd3-3338bfb5987b487e33b04eeaf25ca87b0ca879e6.tar.gz |
scullp: main: Don't use create_proc_read_entry()
Don't use create_proc_read_entry() as it is deprecated,
but rather use proc_create() and seq_file instead.
Diffstat (limited to 'scullp')
-rw-r--r-- | scullp/main.c | 56 |
1 files changed, 25 insertions, 31 deletions
diff --git a/scullp/main.c b/scullp/main.c index 20f7c3d..6ca96a1 100644 --- a/scullp/main.c +++ b/scullp/main.c @@ -24,6 +24,7 @@ #include <linux/errno.h> /* error codes */ #include <linux/types.h> /* size_t */ #include <linux/proc_fs.h> +#include <linux/seq_file.h> #include <linux/fcntl.h> /* O_ACCMODE */ #include <linux/aio.h> #include <asm/uaccess.h> @@ -57,61 +58,54 @@ void scullp_cleanup(void); * The proc filesystem: function to read and entry */ -void scullp_proc_offset(char *buf, char **start, off_t *offset, int *len) -{ - if (*offset == 0) - return; - if (*offset >= *len) { - /* Not there yet */ - *offset -= *len; - *len = 0; - } else { - /* We're into the interesting stuff now */ - *start = buf + *offset; - *offset = 0; - } -} - /* FIXME: Do we need this here?? It be ugly */ -int scullp_read_procmem(char *buf, char **start, off_t offset, - int count, int *eof, void *data) +int scullp_read_procmem(struct seq_file *m, void *v) { - int i, j, order, qset, len = 0; - int limit = count - 80; /* Don't print more than this */ + int i, j, order, qset; + int limit = m->size - 80; /* Don't print more than this */ struct scullp_dev *d; - *start = buf; for(i = 0; i < scullp_devs; i++) { d = &scullp_devices[i]; if (down_interruptible (&d->sem)) return -ERESTARTSYS; qset = d->qset; /* retrieve the features of each device */ order = d->order; - len += sprintf(buf+len,"\nDevice %i: qset %i, order %i, sz %li\n", + seq_printf(m,"\nDevice %i: qset %i, order %i, sz %li\n", i, qset, order, (long)(d->size)); for (; d; d = d->next) { /* scan the list */ - len += sprintf(buf+len," item at %p, qset at %p\n",d,d->data); - scullp_proc_offset (buf, start, &offset, &len); - if (len > limit) + seq_printf(m," item at %p, qset at %p\n",d,d->data); + if (m->count > limit) goto out; if (d->data && !d->next) /* dump only the last item - save space */ for (j = 0; j < qset; j++) { if (d->data[j]) - len += sprintf(buf+len," % 4i:%8p\n",j,d->data[j]); - scullp_proc_offset (buf, start, &offset, &len); - if (len > limit) + seq_printf(m," % 4i:%8p\n",j,d->data[j]); + if (m->count > limit) goto out; } } out: up (&scullp_devices[i].sem); - if (len > limit) + if (m->count > limit) break; } - *eof = 1; - return len; + return 0; } +static int scullp_proc_open(struct inode *inode, struct file *file) +{ + return single_open(file, scullp_read_procmem, NULL); +} + +static struct file_operations scullp_proc_ops = { + .owner = THIS_MODULE, + .open = scullp_proc_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release +}; + #endif /* SCULLP_USE_PROC */ /* @@ -573,7 +567,7 @@ int scullp_init(void) #ifdef SCULLP_USE_PROC /* only when available */ - create_proc_read_entry("scullpmem", 0, NULL, scullp_read_procmem, NULL); + proc_create("scullpmem", 0, NULL, &scullp_proc_ops); #endif return 0; /* succeed */ |