proc_fops: convert drivers/isdn/ to seq_file
Subsystems (4)
PATCH 1/1 proc_fops: convert drivers/isdn/ to seq_file
From: Alexey Dobriyan <[email protected]>
Convert code away from ->read_proc/->write_proc interfaces. Switch to proc_create()/proc_create_data() which make addition of proc entries reliable wrt NULL ->proc_fops, NULL ->data and so on.
Problem with ->read_proc et al is described here commit 786d7e1612f0b0adb6046f19b906609e4fe8b1ba "Fix rmmod/read/write races in /proc entries"
--- Documentation/isdn/INTERFACE.CAPI | 9 +- drivers/isdn/capi/capi.c | 99 ++++++---------- drivers/isdn/capi/capidrv.c | 55 +++------ drivers/isdn/capi/kcapi.c | 8 +- drivers/isdn/gigaset/capi.c | 75 ++++++------ drivers/isdn/hardware/avm/avmcard.h | 6 +- drivers/isdn/hardware/avm/b1.c | 54 +++++---- drivers/isdn/hardware/avm/b1dma.c | 71 ++++++------ drivers/isdn/hardware/avm/b1isa.c | 2 +- drivers/isdn/hardware/avm/b1pci.c | 4 +- drivers/isdn/hardware/avm/b1pcmcia.c | 2 +- drivers/isdn/hardware/avm/c4.c | 53 +++++---- drivers/isdn/hardware/avm/t1isa.c | 2 +- drivers/isdn/hardware/avm/t1pci.c | 2 +- drivers/isdn/hardware/eicon/capimain.c | 40 ++++--- drivers/isdn/hardware/eicon/diva_didd.c | 45 ++++---- drivers/isdn/hardware/eicon/divasi.c | 48 ++++---- drivers/isdn/hardware/eicon/divasproc.c | 198 ++++++++++++++----------------- drivers/isdn/hysdn/hycapi.c | 56 +++++----- include/linux/isdn/capilli.h | 3 +- net/bluetooth/cmtp/capi.c | 37 ++++--- 21 files changed, 411 insertions(+), 458 deletions(-)
Documentation/isdn/INTERFACE.CAPI +5 -4
@@ -149,10 +149,11 @@ char *(*procinfo)(struct capi_ctr *ctrlr) pointer to a callback function returning the entry for the device in the CAPI controller info table, /proc/capi/controller -read_proc_t *ctr_read_proc - pointer to the read_proc callback function for the device's proc file - system entry, /proc/capi/controllers/<n>; will be called with a - pointer to the device's capi_ctr structure as the last (data) argument +const struct file_operations *proc_fops + pointers to callback functions for the device's proc file + system entry, /proc/capi/controllers/<n>; pointer to the device's + capi_ctr structure is available from struct proc_dir_entry::data + which is available from struct inode. Note: Callback functions except send_message() are never called in interrupt context.
drivers/isdn/capi/capi.c +35 -64
155 lines not on this page · raw message
drivers/isdn/capi/capidrv.c +17 -38
82 lines not on this page · raw message
drivers/isdn/capi/kcapi.c +1 -7
@@ -490,13 +490,7 @@ attach_capi_ctr(struct capi_ctr *card) card->traceflag = showcapimsgs;sprintf (card->procfn,"capi/controllers/%d" , card->cnr); - card->procent =create_proc_entry (card->procfn,0 ,NULL ); -if (card->procent) { - card->procent->read_proc = - (int (*)(char *,char **,off_t ,int ,int *,void *)) - card->ctr_read_proc; - card->procent->data = card; - } + card->procent =proc_create_data (card->procfn,0 ,NULL , card->proc_fops, card); ncards++; printk(KERN_NOTICE "kcapi: Controller [%03d]: %s attached\n",
drivers/isdn/gigaset/capi.c +36 -39
127 lines not on this page · raw message
drivers/isdn/hardware/avm/avmcard.h +2 -4
@@ -556,8 +556,7 @@ u16 b1_send_message(struct capi_ctr *ctrl, struct sk_buff *skb);void b1_parse_version (avmctrl_info *card);irqreturn_t b1_interrupt (int interrupt,void *devptr); -int b1ctl_read_proc (char *page,char **start,off_t off, -int count,int *eof,struct capi_ctr *ctrl); +extern const struct file_operations b1ctl_proc_fops;avmcard_dmainfo *avmcard_dma_alloc (char *name,struct pci_dev *,long rsize,long ssize);
@@ -577,7 +576,6 @@ void b1dma_register_appl(struct capi_ctr *ctrl, capi_register_params *rp);void b1dma_release_appl (struct capi_ctr *ctrl,u16 appl);u16 b1dma_send_message (struct capi_ctr *ctrl,struct sk_buff *skb); -int b1dmactl_read_proc (char *page,char **start,off_t off, -int count,int *eof,struct capi_ctr *ctrl); +extern const struct file_operations b1dmactl_proc_fops;#endif /* _AVMCARD_H_ */
drivers/isdn/hardware/avm/b1.c +31 -23
106 lines not on this page · raw message
drivers/isdn/hardware/avm/b1dma.c +37 -34
130 lines not on this page · raw message
drivers/isdn/hardware/avm/b1isa.c +1 -1
@@ -121,7 +121,7 @@ static int b1isa_probe(struct pci_dev *pdev) cinfo->capi_ctrl.load_firmware = b1_load_firmware; cinfo->capi_ctrl.reset_ctr = b1_reset_ctr; cinfo->capi_ctrl.procinfo = b1isa_procinfo; - cinfo->capi_ctrl.ctr_read_proc = b1ctl_read_proc; + cinfo->capi_ctrl.proc_fops = &b1ctl_proc_fops;strcpy (cinfo->capi_ctrl.name, card->name); retval =attach_capi_ctr (&cinfo->capi_ctrl);
drivers/isdn/hardware/avm/b1pci.c +2 -2
@@ -112,7 +112,7 @@ static int b1pci_probe(struct capicardparams *p, struct pci_dev *pdev) cinfo->capi_ctrl.load_firmware = b1_load_firmware; cinfo->capi_ctrl.reset_ctr = b1_reset_ctr; cinfo->capi_ctrl.procinfo = b1pci_procinfo; - cinfo->capi_ctrl.ctr_read_proc = b1ctl_read_proc; + cinfo->capi_ctrl.proc_fops = &b1ctl_proc_fops;strcpy (cinfo->capi_ctrl.name, card->name); cinfo->capi_ctrl.owner =THIS_MODULE ;
@@ -251,7 +251,7 @@ static int b1pciv4_probe(struct capicardparams *p, struct pci_dev *pdev) cinfo->capi_ctrl.load_firmware = b1dma_load_firmware; cinfo->capi_ctrl.reset_ctr = b1dma_reset_ctr; cinfo->capi_ctrl.procinfo = b1pciv4_procinfo; - cinfo->capi_ctrl.ctr_read_proc = b1dmactl_read_proc; + cinfo->capi_ctrl.proc_fops = &b1dmactl_proc_fops;strcpy (cinfo->capi_ctrl.name, card->name); retval =attach_capi_ctr (&cinfo->capi_ctrl);
drivers/isdn/hardware/avm/b1pcmcia.c +1 -1
@@ -108,7 +108,7 @@ static int b1pcmcia_add_card(unsigned int port, unsigned irq, cinfo->capi_ctrl.load_firmware = b1_load_firmware; cinfo->capi_ctrl.reset_ctr = b1_reset_ctr; cinfo->capi_ctrl.procinfo = b1pcmcia_procinfo; - cinfo->capi_ctrl.ctr_read_proc = b1ctl_read_proc; + cinfo->capi_ctrl.proc_fops = &b1ctl_proc_fops;strcpy (cinfo->capi_ctrl.name, card->name); retval =attach_capi_ctr (&cinfo->capi_ctrl);
drivers/isdn/hardware/avm/c4.c +31 -22
104 lines not on this page · raw message
drivers/isdn/hardware/avm/t1isa.c +1 -1
@@ -429,7 +429,7 @@ static int t1isa_probe(struct pci_dev *pdev, int cardnr) cinfo->capi_ctrl.load_firmware = t1isa_load_firmware; cinfo->capi_ctrl.reset_ctr = t1isa_reset_ctr; cinfo->capi_ctrl.procinfo = t1isa_procinfo; - cinfo->capi_ctrl.ctr_read_proc = b1ctl_read_proc; + cinfo->capi_ctrl.proc_fops = &b1ctl_proc_fops;strcpy (cinfo->capi_ctrl.name, card->name); retval =attach_capi_ctr (&cinfo->capi_ctrl);
drivers/isdn/hardware/avm/t1pci.c +1 -1
@@ -119,7 +119,7 @@ static int t1pci_add_card(struct capicardparams *p, struct pci_dev *pdev) cinfo->capi_ctrl.load_firmware = b1dma_load_firmware; cinfo->capi_ctrl.reset_ctr = b1dma_reset_ctr; cinfo->capi_ctrl.procinfo = t1pci_procinfo; - cinfo->capi_ctrl.ctr_read_proc = b1dmactl_read_proc; + cinfo->capi_ctrl.proc_fops = &b1dmactl_proc_fops;strcpy (cinfo->capi_ctrl.name, card->name); retval =attach_capi_ctr (&cinfo->capi_ctrl);
drivers/isdn/hardware/eicon/capimain.c +24 -16
@@ -13,6 +13,7 @@#include <linux/module.h> #include <linux/init.h> #include <asm/uaccess.h> +#include <linux/seq_file.h> #include <linux/skbuff.h> #include "os_capi.h"
@@ -75,25 +76,32 @@ void diva_os_free_message_buffer(diva_os_message_buffer_s * dmb)/* * proc function for controller info */ -static int diva_ctl_read_proc (char *page,char **start,off_t off, -int count,int *eof,struct capi_ctr *ctrl) +static int diva_ctl_proc_show (struct seq_file *m,void *v) { +struct capi_ctr *ctrl = m->private;diva_card *card = (diva_card *) ctrl->driverdata; -int len =0 ; - - len +=sprintf (page + len,"%s\n" , ctrl->name); - len +=sprintf (page + len,"Serial No. : %s\n" , ctrl->serial); - len +=sprintf (page + len,"Id : %d\n" , card->Id); - len +=sprintf (page + len,"Channels : %d\n" , card->d.channels); - -if (off + count >= len) - *eof =1 ; -if (len < off) -return 0 ; - *start = page + off; -return ((count < len - off) ? count : len - off); + +seq_printf (m,"%s\n" , ctrl->name); +seq_printf (m,"Serial No. : %s\n" , ctrl->serial); +seq_printf (m,"Id : %d\n" , card->Id); +seq_printf (m,"Channels : %d\n" , card->d.channels); + +return 0 ; +} + +static int diva_ctl_proc_open (struct inode *inode,struct file *file) +{ +return single_open (file, diva_ctl_proc_show,NULL ); } +static const struct file_operations diva_ctl_proc_fops = { + .owner =THIS_MODULE , + .open = diva_ctl_proc_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; +/* * set additional os settings in capi_ctr struct */
@@ -102,7 +110,7 @@ void diva_os_set_controller_struct(struct capi_ctr *ctrl) ctrl->driver_name =DRIVERLNAME ; ctrl->load_firmware =NULL ; ctrl->reset_ctr =NULL ; - ctrl->ctr_read_proc = diva_ctl_read_proc; + ctrl->proc_fops = &diva_ctl_proc_fops; ctrl->owner =THIS_MODULE ; }
drivers/isdn/hardware/eicon/diva_didd.c +24 -21
69 lines not on this page · raw message
drivers/isdn/hardware/eicon/divasi.c +25 -23
70 lines not on this page · raw message
drivers/isdn/hardware/eicon/divasproc.c +87 -111
291 lines not on this page · raw message
drivers/isdn/hysdn/hycapi.c +28 -28
91 lines not on this page · raw message
include/linux/isdn/capilli.h +1 -2
@@ -50,8 +50,7 @@ struct capi_ctr {u16 (*send_message)(struct capi_ctr *,struct sk_buff *skb);char *(*procinfo)(struct capi_ctr *); -int (*ctr_read_proc)(char *page,char **start,off_t off, -int count,int *eof,struct capi_ctr *card); +const struct file_operations *proc_fops;/* filled in before calling ready callback */ u8 manu[CAPI_MANUFACTURER_LEN ];/* CAPI_GET_MANUFACTURER */
net/bluetooth/cmtp/capi.c +21 -16
@@ -21,7 +21,8 @@*/ #include <linux/module.h> - +#include <linux/proc_fs.h> +#include <linux/seq_file.h> #include <linux/types.h> #include <linux/errno.h> #include <linux/kernel.h>
@@ -516,33 +517,37 @@ static char *cmtp_procinfo(struct capi_ctr *ctrl)return "CAPI Message Transport Protocol" ; } -static int cmtp_ctr_read_proc (char *page,char **start,off_t off,int count,int *eof,struct capi_ctr *ctrl) +static int cmtp_proc_show (struct seq_file *m,void *v) { +struct capi_ctr *ctrl = m->private;struct cmtp_session *session = ctrl->driverdata;struct cmtp_application *app;struct list_head *p, *n; -int len =0 ; - len +=sprintf (page + len,"%s\n\n" ,cmtp_procinfo (ctrl)); - len +=sprintf (page + len,"addr %s\n" , session->name); - len +=sprintf (page + len,"ctrl %d\n" , session->num); +seq_printf (m,"%s\n\n" ,cmtp_procinfo (ctrl)); +seq_printf (m,"addr %s\n" , session->name); +seq_printf (m,"ctrl %d\n" , session->num);list_for_each_safe (p, n, &session->applications) { app = list_entry(p, struct cmtp_application, list); - len +=sprintf (page + len,"appl %d -> %d\n" , app->appl, app->mapping); +seq_printf (m,"appl %d -> %d\n" , app->appl, app->mapping); } -if (off + count >= len) - *eof =1 ; - -if (len < off) -return 0 ; - - *start = page + off; +return 0 ; +} -return ((count < len - off) ? count : len - off); +static int cmtp_proc_open (struct inode *inode,struct file *file) +{ +return single_open (file, cmtp_proc_show,PDE (inode)->data); } +static const struct file_operations cmtp_proc_fops = { + .owner =THIS_MODULE , + .open = cmtp_proc_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +};int cmtp_attach_device (struct cmtp_session *session) {
@@ -582,7 +587,7 @@ int cmtp_attach_device(struct cmtp_session *session) session->ctrl.send_message = cmtp_send_message; session->ctrl.procinfo = cmtp_procinfo; - session->ctrl.ctr_read_proc = cmtp_ctr_read_proc; + session->ctrl.proc_fops = &cmtp_proc_fops;if (attach_capi_ctr (&session->ctrl) <0 ) {BT_ERR ("Can't attach new controller" );
Signature · 1 line
1.6.0.2
From: Karsten Keil <[email protected]>
Date: Thu, 14 Jan 2010 11:27:45 +0100
Quoted 4 lines
Convert code away from ->read_proc/->write_proc interfaces. Switch to proc_create()/proc_create_data() which make addition of proc entries reliable wrt NULL ->proc_fops, NULL ->data and so on.
Quoted 8 lines
Problem with ->read_proc et al is described here commit
786d7e1612f0b0adb6046f19b906609e4fe8b1ba"Fix rmmod/read/write races in /proc entries"[[email protected]: CONFIG_PROC_FS=n build fix]Signed-off-by Alexey Dobriyan <[email protected]>Signed-off-by Tilman Schmidt <[email protected]>Signed-off-by Karsten Keil <[email protected]>
Applied.