diff options
| author | Li Zefan <lizf@cn.fujitsu.com> | 2010-02-08 18:21:22 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2010-02-10 15:31:10 -0500 |
| commit | a2b79b414df97a70c33f874b631e06830431d233 (patch) | |
| tree | 62d3e8f664b5935534bddb96114bef8a3fa3318a /net/ipx | |
| parent | 216437eb8b5adf12ab91e1f0c046ffba22c63431 (diff) | |
net: ipx: use seq_list_foo() helpers
Simplify seq_file code.
Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipx')
| -rw-r--r-- | net/ipx/ipx_proc.c | 90 |
1 files changed, 12 insertions, 78 deletions
diff --git a/net/ipx/ipx_proc.c b/net/ipx/ipx_proc.c index 576178482f89..26b5bfcf1d03 100644 --- a/net/ipx/ipx_proc.c +++ b/net/ipx/ipx_proc.c | |||
| @@ -13,45 +13,15 @@ | |||
| 13 | #include <net/tcp_states.h> | 13 | #include <net/tcp_states.h> |
| 14 | #include <net/ipx.h> | 14 | #include <net/ipx.h> |
| 15 | 15 | ||
| 16 | static __inline__ struct ipx_interface *ipx_get_interface_idx(loff_t pos) | ||
| 17 | { | ||
| 18 | struct ipx_interface *i; | ||
| 19 | |||
| 20 | list_for_each_entry(i, &ipx_interfaces, node) | ||
| 21 | if (!pos--) | ||
| 22 | goto out; | ||
| 23 | i = NULL; | ||
| 24 | out: | ||
| 25 | return i; | ||
| 26 | } | ||
| 27 | |||
| 28 | static struct ipx_interface *ipx_interfaces_next(struct ipx_interface *i) | ||
| 29 | { | ||
| 30 | struct ipx_interface *rc = NULL; | ||
| 31 | |||
| 32 | if (i->node.next != &ipx_interfaces) | ||
| 33 | rc = list_entry(i->node.next, struct ipx_interface, node); | ||
| 34 | return rc; | ||
| 35 | } | ||
| 36 | |||
| 37 | static void *ipx_seq_interface_start(struct seq_file *seq, loff_t *pos) | 16 | static void *ipx_seq_interface_start(struct seq_file *seq, loff_t *pos) |
| 38 | { | 17 | { |
| 39 | loff_t l = *pos; | ||
| 40 | |||
| 41 | spin_lock_bh(&ipx_interfaces_lock); | 18 | spin_lock_bh(&ipx_interfaces_lock); |
| 42 | return l ? ipx_get_interface_idx(--l) : SEQ_START_TOKEN; | 19 | return seq_list_start_head(&ipx_interfaces, *pos); |
| 43 | } | 20 | } |
| 44 | 21 | ||
| 45 | static void *ipx_seq_interface_next(struct seq_file *seq, void *v, loff_t *pos) | 22 | static void *ipx_seq_interface_next(struct seq_file *seq, void *v, loff_t *pos) |
| 46 | { | 23 | { |
| 47 | struct ipx_interface *i; | 24 | return seq_list_next(v, &ipx_interfaces, pos); |
| 48 | |||
| 49 | ++*pos; | ||
| 50 | if (v == SEQ_START_TOKEN) | ||
| 51 | i = ipx_interfaces_head(); | ||
| 52 | else | ||
| 53 | i = ipx_interfaces_next(v); | ||
| 54 | return i; | ||
| 55 | } | 25 | } |
| 56 | 26 | ||
| 57 | static void ipx_seq_interface_stop(struct seq_file *seq, void *v) | 27 | static void ipx_seq_interface_stop(struct seq_file *seq, void *v) |
| @@ -63,7 +33,7 @@ static int ipx_seq_interface_show(struct seq_file *seq, void *v) | |||
| 63 | { | 33 | { |
| 64 | struct ipx_interface *i; | 34 | struct ipx_interface *i; |
| 65 | 35 | ||
| 66 | if (v == SEQ_START_TOKEN) { | 36 | if (v == &ipx_interfaces) { |
| 67 | seq_puts(seq, "Network Node_Address Primary Device " | 37 | seq_puts(seq, "Network Node_Address Primary Device " |
| 68 | "Frame_Type"); | 38 | "Frame_Type"); |
| 69 | #ifdef IPX_REFCNT_DEBUG | 39 | #ifdef IPX_REFCNT_DEBUG |
| @@ -73,7 +43,7 @@ static int ipx_seq_interface_show(struct seq_file *seq, void *v) | |||
| 73 | goto out; | 43 | goto out; |
| 74 | } | 44 | } |
| 75 | 45 | ||
| 76 | i = v; | 46 | i = list_entry(v, struct ipx_interface, node); |
| 77 | seq_printf(seq, "%08lX ", (unsigned long int)ntohl(i->if_netnum)); | 47 | seq_printf(seq, "%08lX ", (unsigned long int)ntohl(i->if_netnum)); |
| 78 | seq_printf(seq, "%02X%02X%02X%02X%02X%02X ", | 48 | seq_printf(seq, "%02X%02X%02X%02X%02X%02X ", |
| 79 | i->if_node[0], i->if_node[1], i->if_node[2], | 49 | i->if_node[0], i->if_node[1], i->if_node[2], |
| @@ -89,53 +59,15 @@ out: | |||
| 89 | return 0; | 59 | return 0; |
| 90 | } | 60 | } |
| 91 | 61 | ||
| 92 | static struct ipx_route *ipx_routes_head(void) | ||
| 93 | { | ||
| 94 | struct ipx_route *rc = NULL; | ||
| 95 | |||
| 96 | if (!list_empty(&ipx_routes)) | ||
| 97 | rc = list_entry(ipx_routes.next, struct ipx_route, node); | ||
| 98 | return rc; | ||
| 99 | } | ||
| 100 | |||
| 101 | static struct ipx_route *ipx_routes_next(struct ipx_route *r) | ||
| 102 | { | ||
| 103 | struct ipx_route *rc = NULL; | ||
| 104 | |||
| 105 | if (r->node.next != &ipx_routes) | ||
| 106 | rc = list_entry(r->node.next, struct ipx_route, node); | ||
| 107 | return rc; | ||
| 108 | } | ||
| 109 | |||
| 110 | static __inline__ struct ipx_route *ipx_get_route_idx(loff_t pos) | ||
| 111 | { | ||
| 112 | struct ipx_route *r; | ||
| 113 | |||
| 114 | list_for_each_entry(r, &ipx_routes, node) | ||
| 115 | if (!pos--) | ||
| 116 | goto out; | ||
| 117 | r = NULL; | ||
| 118 | out: | ||
| 119 | return r; | ||
| 120 | } | ||
| 121 | |||
| 122 | static void *ipx_seq_route_start(struct seq_file *seq, loff_t *pos) | 62 | static void *ipx_seq_route_start(struct seq_file *seq, loff_t *pos) |
| 123 | { | 63 | { |
| 124 | loff_t l = *pos; | ||
| 125 | read_lock_bh(&ipx_routes_lock); | 64 | read_lock_bh(&ipx_routes_lock); |
| 126 | return l ? ipx_get_route_idx(--l) : SEQ_START_TOKEN; | 65 | return seq_list_start_head(&ipx_routes, *pos); |
| 127 | } | 66 | } |
| 128 | 67 | ||
| 129 | static void *ipx_seq_route_next(struct seq_file *seq, void *v, loff_t *pos) | 68 | static void *ipx_seq_route_next(struct seq_file *seq, void *v, loff_t *pos) |
| 130 | { | 69 | { |
| 131 | struct ipx_route *r; | 70 | return seq_list_next(v, &ipx_routes, pos); |
| 132 | |||
| 133 | ++*pos; | ||
| 134 | if (v == SEQ_START_TOKEN) | ||
| 135 | r = ipx_routes_head(); | ||
| 136 | else | ||
| 137 | r = ipx_routes_next(v); | ||
| 138 | return r; | ||
| 139 | } | 71 | } |
| 140 | 72 | ||
| 141 | static void ipx_seq_route_stop(struct seq_file *seq, void *v) | 73 | static void ipx_seq_route_stop(struct seq_file *seq, void *v) |
| @@ -147,11 +79,13 @@ static int ipx_seq_route_show(struct seq_file *seq, void *v) | |||
| 147 | { | 79 | { |
| 148 | struct ipx_route *rt; | 80 | struct ipx_route *rt; |
| 149 | 81 | ||
| 150 | if (v == SEQ_START_TOKEN) { | 82 | if (v == &ipx_routes) { |
| 151 | seq_puts(seq, "Network Router_Net Router_Node\n"); | 83 | seq_puts(seq, "Network Router_Net Router_Node\n"); |
| 152 | goto out; | 84 | goto out; |
| 153 | } | 85 | } |
| 154 | rt = v; | 86 | |
| 87 | rt = list_entry(v, struct ipx_route, node); | ||
| 88 | |||
| 155 | seq_printf(seq, "%08lX ", (unsigned long int)ntohl(rt->ir_net)); | 89 | seq_printf(seq, "%08lX ", (unsigned long int)ntohl(rt->ir_net)); |
| 156 | if (rt->ir_routed) | 90 | if (rt->ir_routed) |
| 157 | seq_printf(seq, "%08lX %02X%02X%02X%02X%02X%02X\n", | 91 | seq_printf(seq, "%08lX %02X%02X%02X%02X%02X%02X\n", |
| @@ -226,9 +160,9 @@ static void *ipx_seq_socket_next(struct seq_file *seq, void *v, loff_t *pos) | |||
| 226 | spin_unlock_bh(&i->if_sklist_lock); | 160 | spin_unlock_bh(&i->if_sklist_lock); |
| 227 | sk = NULL; | 161 | sk = NULL; |
| 228 | for (;;) { | 162 | for (;;) { |
| 229 | i = ipx_interfaces_next(i); | 163 | if (i->node.next == &ipx_interfaces) |
| 230 | if (!i) | ||
| 231 | break; | 164 | break; |
| 165 | i = list_entry(i->node.next, struct ipx_interface, node); | ||
| 232 | spin_lock_bh(&i->if_sklist_lock); | 166 | spin_lock_bh(&i->if_sklist_lock); |
| 233 | if (!hlist_empty(&i->if_sklist)) { | 167 | if (!hlist_empty(&i->if_sklist)) { |
| 234 | sk = sk_head(&i->if_sklist); | 168 | sk = sk_head(&i->if_sklist); |
