diff options
Diffstat (limited to 'drivers/connector/connector.c')
| -rw-r--r-- | drivers/connector/connector.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c index 85e2ba7fcfba..bf4830082a13 100644 --- a/drivers/connector/connector.c +++ b/drivers/connector/connector.c | |||
| @@ -27,6 +27,8 @@ | |||
| 27 | #include <linux/moduleparam.h> | 27 | #include <linux/moduleparam.h> |
| 28 | #include <linux/connector.h> | 28 | #include <linux/connector.h> |
| 29 | #include <linux/mutex.h> | 29 | #include <linux/mutex.h> |
| 30 | #include <linux/proc_fs.h> | ||
| 31 | #include <linux/spinlock.h> | ||
| 30 | 32 | ||
| 31 | #include <net/sock.h> | 33 | #include <net/sock.h> |
| 32 | 34 | ||
| @@ -403,6 +405,40 @@ static void cn_callback(void *data) | |||
| 403 | mutex_unlock(¬ify_lock); | 405 | mutex_unlock(¬ify_lock); |
| 404 | } | 406 | } |
| 405 | 407 | ||
| 408 | static int cn_proc_show(struct seq_file *m, void *v) | ||
| 409 | { | ||
| 410 | struct cn_queue_dev *dev = cdev.cbdev; | ||
| 411 | struct cn_callback_entry *cbq; | ||
| 412 | |||
| 413 | seq_printf(m, "Name ID\n"); | ||
| 414 | |||
| 415 | spin_lock_bh(&dev->queue_lock); | ||
| 416 | |||
| 417 | list_for_each_entry(cbq, &dev->queue_list, callback_entry) { | ||
| 418 | seq_printf(m, "%-15s %u:%u\n", | ||
| 419 | cbq->id.name, | ||
| 420 | cbq->id.id.idx, | ||
| 421 | cbq->id.id.val); | ||
| 422 | } | ||
| 423 | |||
| 424 | spin_unlock_bh(&dev->queue_lock); | ||
| 425 | |||
| 426 | return 0; | ||
| 427 | } | ||
| 428 | |||
| 429 | static int cn_proc_open(struct inode *inode, struct file *file) | ||
| 430 | { | ||
| 431 | return single_open(file, cn_proc_show, NULL); | ||
| 432 | } | ||
| 433 | |||
| 434 | static const struct file_operations cn_file_ops = { | ||
| 435 | .owner = THIS_MODULE, | ||
| 436 | .open = cn_proc_open, | ||
| 437 | .read = seq_read, | ||
| 438 | .llseek = seq_lseek, | ||
| 439 | .release = single_release | ||
| 440 | }; | ||
| 441 | |||
| 406 | static int __devinit cn_init(void) | 442 | static int __devinit cn_init(void) |
| 407 | { | 443 | { |
| 408 | struct cn_dev *dev = &cdev; | 444 | struct cn_dev *dev = &cdev; |
| @@ -434,6 +470,8 @@ static int __devinit cn_init(void) | |||
| 434 | return -EINVAL; | 470 | return -EINVAL; |
| 435 | } | 471 | } |
| 436 | 472 | ||
| 473 | proc_net_fops_create(&init_net, "connector", S_IRUGO, &cn_file_ops); | ||
| 474 | |||
| 437 | return 0; | 475 | return 0; |
| 438 | } | 476 | } |
| 439 | 477 | ||
| @@ -443,6 +481,8 @@ static void __devexit cn_fini(void) | |||
| 443 | 481 | ||
| 444 | cn_already_initialized = 0; | 482 | cn_already_initialized = 0; |
| 445 | 483 | ||
| 484 | proc_net_remove(&init_net, "connector"); | ||
| 485 | |||
| 446 | cn_del_callback(&dev->id); | 486 | cn_del_callback(&dev->id); |
| 447 | cn_queue_free_dev(dev->cbdev); | 487 | cn_queue_free_dev(dev->cbdev); |
| 448 | netlink_kernel_release(dev->nls); | 488 | netlink_kernel_release(dev->nls); |
