diff options
Diffstat (limited to 'net/wireless/wext.c')
-rw-r--r-- | net/wireless/wext.c | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/net/wireless/wext.c b/net/wireless/wext.c index 0e59f9ae9b81..252c2010c2e2 100644 --- a/net/wireless/wext.c +++ b/net/wireless/wext.c | |||
@@ -636,8 +636,10 @@ static void wireless_seq_printf_stats(struct seq_file *seq, | |||
636 | /* | 636 | /* |
637 | * Print info for /proc/net/wireless (print all entries) | 637 | * Print info for /proc/net/wireless (print all entries) |
638 | */ | 638 | */ |
639 | static int wireless_seq_show(struct seq_file *seq, void *v) | 639 | static int wireless_dev_seq_show(struct seq_file *seq, void *v) |
640 | { | 640 | { |
641 | might_sleep(); | ||
642 | |||
641 | if (v == SEQ_START_TOKEN) | 643 | if (v == SEQ_START_TOKEN) |
642 | seq_printf(seq, "Inter-| sta-| Quality | Discarded " | 644 | seq_printf(seq, "Inter-| sta-| Quality | Discarded " |
643 | "packets | Missed | WE\n" | 645 | "packets | Missed | WE\n" |
@@ -649,14 +651,46 @@ static int wireless_seq_show(struct seq_file *seq, void *v) | |||
649 | return 0; | 651 | return 0; |
650 | } | 652 | } |
651 | 653 | ||
654 | static void *wireless_dev_seq_start(struct seq_file *seq, loff_t *pos) | ||
655 | { | ||
656 | struct net *net = seq_file_net(seq); | ||
657 | loff_t off; | ||
658 | struct net_device *dev; | ||
659 | |||
660 | rtnl_lock(); | ||
661 | if (!*pos) | ||
662 | return SEQ_START_TOKEN; | ||
663 | |||
664 | off = 1; | ||
665 | for_each_netdev(net, dev) | ||
666 | if (off++ == *pos) | ||
667 | return dev; | ||
668 | return NULL; | ||
669 | } | ||
670 | |||
671 | static void *wireless_dev_seq_next(struct seq_file *seq, void *v, loff_t *pos) | ||
672 | { | ||
673 | struct net *net = seq_file_net(seq); | ||
674 | |||
675 | ++*pos; | ||
676 | |||
677 | return v == SEQ_START_TOKEN ? | ||
678 | first_net_device(net) : next_net_device(v); | ||
679 | } | ||
680 | |||
681 | static void wireless_dev_seq_stop(struct seq_file *seq, void *v) | ||
682 | { | ||
683 | rtnl_unlock(); | ||
684 | } | ||
685 | |||
652 | static const struct seq_operations wireless_seq_ops = { | 686 | static const struct seq_operations wireless_seq_ops = { |
653 | .start = dev_seq_start, | 687 | .start = wireless_dev_seq_start, |
654 | .next = dev_seq_next, | 688 | .next = wireless_dev_seq_next, |
655 | .stop = dev_seq_stop, | 689 | .stop = wireless_dev_seq_stop, |
656 | .show = wireless_seq_show, | 690 | .show = wireless_dev_seq_show, |
657 | }; | 691 | }; |
658 | 692 | ||
659 | static int wireless_seq_open(struct inode *inode, struct file *file) | 693 | static int seq_open_wireless(struct inode *inode, struct file *file) |
660 | { | 694 | { |
661 | return seq_open_net(inode, file, &wireless_seq_ops, | 695 | return seq_open_net(inode, file, &wireless_seq_ops, |
662 | sizeof(struct seq_net_private)); | 696 | sizeof(struct seq_net_private)); |
@@ -664,7 +698,7 @@ static int wireless_seq_open(struct inode *inode, struct file *file) | |||
664 | 698 | ||
665 | static const struct file_operations wireless_seq_fops = { | 699 | static const struct file_operations wireless_seq_fops = { |
666 | .owner = THIS_MODULE, | 700 | .owner = THIS_MODULE, |
667 | .open = wireless_seq_open, | 701 | .open = seq_open_wireless, |
668 | .read = seq_read, | 702 | .read = seq_read, |
669 | .llseek = seq_lseek, | 703 | .llseek = seq_lseek, |
670 | .release = seq_release_net, | 704 | .release = seq_release_net, |