diff options
author | Pavel Emelyanov <xemul@openvz.org> | 2008-04-16 03:48:04 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-04-16 03:48:04 -0400 |
commit | a9fde2607895667823e9d1172fc193087125ef68 (patch) | |
tree | cf5481c66e911dc43bd2c9463603562d35af4cfe | |
parent | 669f87baab90183e13b95480aecf8d7bac92ca3c (diff) |
[VLAN]: Tag vlan_group_device with net device, not ifindex.
Currently vlan group is searched using one key - the ifindex.
We'll have to lookup the vlan_group by two keys - ifindex and
net. Turning the vlan_group lookup key to struct net_device
pointer will make this process easier.
Besides, this will eliminate one more place in the networking,
that assumes that indexes are unique in the kernel.
Signed-off-by: Pavel Emelyanov <xemul@openvz.org>
Acked-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | include/linux/if_vlan.h | 4 | ||||
-rw-r--r-- | net/8021q/vlan.c | 22 |
2 files changed, 14 insertions, 12 deletions
diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h index edd55af7ebd6..15ace02b7b24 100644 --- a/include/linux/if_vlan.h +++ b/include/linux/if_vlan.h | |||
@@ -81,7 +81,9 @@ extern void vlan_ioctl_set(int (*hook)(struct net *, void __user *)); | |||
81 | #define VLAN_GROUP_ARRAY_PART_LEN (VLAN_GROUP_ARRAY_LEN/VLAN_GROUP_ARRAY_SPLIT_PARTS) | 81 | #define VLAN_GROUP_ARRAY_PART_LEN (VLAN_GROUP_ARRAY_LEN/VLAN_GROUP_ARRAY_SPLIT_PARTS) |
82 | 82 | ||
83 | struct vlan_group { | 83 | struct vlan_group { |
84 | int real_dev_ifindex; /* The ifindex of the ethernet(like) device the vlan is attached to. */ | 84 | struct net_device *real_dev; /* The ethernet(like) device |
85 | * the vlan is attached to. | ||
86 | */ | ||
85 | unsigned int nr_vlans; | 87 | unsigned int nr_vlans; |
86 | struct hlist_node hlist; /* linked list */ | 88 | struct hlist_node hlist; /* linked list */ |
87 | struct net_device **vlan_devices_arrays[VLAN_GROUP_ARRAY_SPLIT_PARTS]; | 89 | struct net_device **vlan_devices_arrays[VLAN_GROUP_ARRAY_SPLIT_PARTS]; |
diff --git a/net/8021q/vlan.c b/net/8021q/vlan.c index 5975ec3be7f3..cf8d810a130d 100644 --- a/net/8021q/vlan.c +++ b/net/8021q/vlan.c | |||
@@ -65,14 +65,14 @@ static inline unsigned int vlan_grp_hashfn(unsigned int idx) | |||
65 | } | 65 | } |
66 | 66 | ||
67 | /* Must be invoked with RCU read lock (no preempt) */ | 67 | /* Must be invoked with RCU read lock (no preempt) */ |
68 | static struct vlan_group *__vlan_find_group(int real_dev_ifindex) | 68 | static struct vlan_group *__vlan_find_group(struct net_device *real_dev) |
69 | { | 69 | { |
70 | struct vlan_group *grp; | 70 | struct vlan_group *grp; |
71 | struct hlist_node *n; | 71 | struct hlist_node *n; |
72 | int hash = vlan_grp_hashfn(real_dev_ifindex); | 72 | int hash = vlan_grp_hashfn(real_dev->ifindex); |
73 | 73 | ||
74 | hlist_for_each_entry_rcu(grp, n, &vlan_group_hash[hash], hlist) { | 74 | hlist_for_each_entry_rcu(grp, n, &vlan_group_hash[hash], hlist) { |
75 | if (grp->real_dev_ifindex == real_dev_ifindex) | 75 | if (grp->real_dev == real_dev) |
76 | return grp; | 76 | return grp; |
77 | } | 77 | } |
78 | 78 | ||
@@ -86,7 +86,7 @@ static struct vlan_group *__vlan_find_group(int real_dev_ifindex) | |||
86 | struct net_device *__find_vlan_dev(struct net_device *real_dev, | 86 | struct net_device *__find_vlan_dev(struct net_device *real_dev, |
87 | unsigned short VID) | 87 | unsigned short VID) |
88 | { | 88 | { |
89 | struct vlan_group *grp = __vlan_find_group(real_dev->ifindex); | 89 | struct vlan_group *grp = __vlan_find_group(real_dev); |
90 | 90 | ||
91 | if (grp) | 91 | if (grp) |
92 | return vlan_group_get_device(grp, VID); | 92 | return vlan_group_get_device(grp, VID); |
@@ -103,7 +103,7 @@ static void vlan_group_free(struct vlan_group *grp) | |||
103 | kfree(grp); | 103 | kfree(grp); |
104 | } | 104 | } |
105 | 105 | ||
106 | static struct vlan_group *vlan_group_alloc(int ifindex) | 106 | static struct vlan_group *vlan_group_alloc(struct net_device *real_dev) |
107 | { | 107 | { |
108 | struct vlan_group *grp; | 108 | struct vlan_group *grp; |
109 | 109 | ||
@@ -111,9 +111,9 @@ static struct vlan_group *vlan_group_alloc(int ifindex) | |||
111 | if (!grp) | 111 | if (!grp) |
112 | return NULL; | 112 | return NULL; |
113 | 113 | ||
114 | grp->real_dev_ifindex = ifindex; | 114 | grp->real_dev = real_dev; |
115 | hlist_add_head_rcu(&grp->hlist, | 115 | hlist_add_head_rcu(&grp->hlist, |
116 | &vlan_group_hash[vlan_grp_hashfn(ifindex)]); | 116 | &vlan_group_hash[vlan_grp_hashfn(real_dev->ifindex)]); |
117 | return grp; | 117 | return grp; |
118 | } | 118 | } |
119 | 119 | ||
@@ -151,7 +151,7 @@ void unregister_vlan_dev(struct net_device *dev) | |||
151 | 151 | ||
152 | ASSERT_RTNL(); | 152 | ASSERT_RTNL(); |
153 | 153 | ||
154 | grp = __vlan_find_group(real_dev->ifindex); | 154 | grp = __vlan_find_group(real_dev); |
155 | BUG_ON(!grp); | 155 | BUG_ON(!grp); |
156 | 156 | ||
157 | vlan_proc_rem_dev(dev); | 157 | vlan_proc_rem_dev(dev); |
@@ -246,9 +246,9 @@ int register_vlan_dev(struct net_device *dev) | |||
246 | struct vlan_group *grp, *ngrp = NULL; | 246 | struct vlan_group *grp, *ngrp = NULL; |
247 | int err; | 247 | int err; |
248 | 248 | ||
249 | grp = __vlan_find_group(real_dev->ifindex); | 249 | grp = __vlan_find_group(real_dev); |
250 | if (!grp) { | 250 | if (!grp) { |
251 | ngrp = grp = vlan_group_alloc(real_dev->ifindex); | 251 | ngrp = grp = vlan_group_alloc(real_dev); |
252 | if (!grp) | 252 | if (!grp) |
253 | return -ENOBUFS; | 253 | return -ENOBUFS; |
254 | } | 254 | } |
@@ -412,7 +412,7 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event, | |||
412 | goto out; | 412 | goto out; |
413 | } | 413 | } |
414 | 414 | ||
415 | grp = __vlan_find_group(dev->ifindex); | 415 | grp = __vlan_find_group(dev); |
416 | if (!grp) | 416 | if (!grp) |
417 | goto out; | 417 | goto out; |
418 | 418 | ||