diff options
author | Alexey Dobriyan <adobriyan@gmail.com> | 2010-01-14 06:10:54 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-01-14 06:10:54 -0500 |
commit | 9a58a80a701bdb2d220cdab4914218df5b48d781 (patch) | |
tree | 01eeb65ec70f22ec326d0938d002cc6a2aec73e8 /net/bluetooth | |
parent | 508e14b4a4fb1a824a14f2c5b8d7df67b313f8e4 (diff) |
proc_fops: convert drivers/isdn/ to seq_file
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"
[akpm@linux-foundation.org: CONFIG_PROC_FS=n build fix]
Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: Tilman Schmidt <tilman@imap.cc>
Signed-off-by: Karsten Keil <keil@b1-systems.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/bluetooth')
-rw-r--r-- | net/bluetooth/cmtp/capi.c | 37 |
1 files changed, 21 insertions, 16 deletions
diff --git a/net/bluetooth/cmtp/capi.c b/net/bluetooth/cmtp/capi.c index 97f8d68d574d..3487cfe74aec 100644 --- a/net/bluetooth/cmtp/capi.c +++ b/net/bluetooth/cmtp/capi.c | |||
@@ -21,7 +21,8 @@ | |||
21 | */ | 21 | */ |
22 | 22 | ||
23 | #include <linux/module.h> | 23 | #include <linux/module.h> |
24 | 24 | #include <linux/proc_fs.h> | |
25 | #include <linux/seq_file.h> | ||
25 | #include <linux/types.h> | 26 | #include <linux/types.h> |
26 | #include <linux/errno.h> | 27 | #include <linux/errno.h> |
27 | #include <linux/kernel.h> | 28 | #include <linux/kernel.h> |
@@ -516,33 +517,37 @@ static char *cmtp_procinfo(struct capi_ctr *ctrl) | |||
516 | return "CAPI Message Transport Protocol"; | 517 | return "CAPI Message Transport Protocol"; |
517 | } | 518 | } |
518 | 519 | ||
519 | static int cmtp_ctr_read_proc(char *page, char **start, off_t off, int count, int *eof, struct capi_ctr *ctrl) | 520 | static int cmtp_proc_show(struct seq_file *m, void *v) |
520 | { | 521 | { |
522 | struct capi_ctr *ctrl = m->private; | ||
521 | struct cmtp_session *session = ctrl->driverdata; | 523 | struct cmtp_session *session = ctrl->driverdata; |
522 | struct cmtp_application *app; | 524 | struct cmtp_application *app; |
523 | struct list_head *p, *n; | 525 | struct list_head *p, *n; |
524 | int len = 0; | ||
525 | 526 | ||
526 | len += sprintf(page + len, "%s\n\n", cmtp_procinfo(ctrl)); | 527 | seq_printf(m, "%s\n\n", cmtp_procinfo(ctrl)); |
527 | len += sprintf(page + len, "addr %s\n", session->name); | 528 | seq_printf(m, "addr %s\n", session->name); |
528 | len += sprintf(page + len, "ctrl %d\n", session->num); | 529 | seq_printf(m, "ctrl %d\n", session->num); |
529 | 530 | ||
530 | list_for_each_safe(p, n, &session->applications) { | 531 | list_for_each_safe(p, n, &session->applications) { |
531 | app = list_entry(p, struct cmtp_application, list); | 532 | app = list_entry(p, struct cmtp_application, list); |
532 | len += sprintf(page + len, "appl %d -> %d\n", app->appl, app->mapping); | 533 | seq_printf(m, "appl %d -> %d\n", app->appl, app->mapping); |
533 | } | 534 | } |
534 | 535 | ||
535 | if (off + count >= len) | 536 | return 0; |
536 | *eof = 1; | 537 | } |
537 | |||
538 | if (len < off) | ||
539 | return 0; | ||
540 | |||
541 | *start = page + off; | ||
542 | 538 | ||
543 | return ((count < len - off) ? count : len - off); | 539 | static int cmtp_proc_open(struct inode *inode, struct file *file) |
540 | { | ||
541 | return single_open(file, cmtp_proc_show, PDE(inode)->data); | ||
544 | } | 542 | } |
545 | 543 | ||
544 | static const struct file_operations cmtp_proc_fops = { | ||
545 | .owner = THIS_MODULE, | ||
546 | .open = cmtp_proc_open, | ||
547 | .read = seq_read, | ||
548 | .llseek = seq_lseek, | ||
549 | .release = single_release, | ||
550 | }; | ||
546 | 551 | ||
547 | int cmtp_attach_device(struct cmtp_session *session) | 552 | int cmtp_attach_device(struct cmtp_session *session) |
548 | { | 553 | { |
@@ -582,7 +587,7 @@ int cmtp_attach_device(struct cmtp_session *session) | |||
582 | session->ctrl.send_message = cmtp_send_message; | 587 | session->ctrl.send_message = cmtp_send_message; |
583 | 588 | ||
584 | session->ctrl.procinfo = cmtp_procinfo; | 589 | session->ctrl.procinfo = cmtp_procinfo; |
585 | session->ctrl.ctr_read_proc = cmtp_ctr_read_proc; | 590 | session->ctrl.proc_fops = &cmtp_proc_fops; |
586 | 591 | ||
587 | if (attach_capi_ctr(&session->ctrl) < 0) { | 592 | if (attach_capi_ctr(&session->ctrl) < 0) { |
588 | BT_ERR("Can't attach new controller"); | 593 | BT_ERR("Can't attach new controller"); |