diff options
author | Kay Sievers <kay.sievers@vrfy.org> | 2005-12-18 19:42:56 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-01-04 19:18:10 -0500 |
commit | fd586bacf439f36dea9b9bf6e6133ac87df2730c (patch) | |
tree | 2d0ea08194e086851b4a35d1003aa8be376ab683 | |
parent | 1f1bf132d81ed723bc5fefbcec7d0779ce683a4f (diff) |
[PATCH] net: swich device attribute creation to default attrs
Recent udev versions don't longer cover bad sysfs timing with built-in
logic. Explicit rules are required to do that. For net devices, the
following is needed:
ACTION=="add", SUBSYSTEM=="net", WAIT_FOR_SYSFS="address"
to handle access to net device properties from an event handler without
races.
This patch changes the main net attributes to be created by the driver
core, which is done _before_ the event is sent out and will not require
the stat() loop of the WAIT_FOR_SYSFS key.
Signed-off-by: Kay Sievers <kay.sievers@suse.de>
Acked-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | net/core/net-sysfs.c | 68 |
1 files changed, 21 insertions, 47 deletions
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index 198655dd9a77..e1da81d261d1 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c | |||
@@ -84,16 +84,11 @@ static ssize_t netdev_store(struct class_device *dev, | |||
84 | return ret; | 84 | return ret; |
85 | } | 85 | } |
86 | 86 | ||
87 | /* generate a read-only network device class attribute */ | 87 | NETDEVICE_SHOW(addr_len, fmt_dec); |
88 | #define NETDEVICE_ATTR(field, format_string) \ | 88 | NETDEVICE_SHOW(iflink, fmt_dec); |
89 | NETDEVICE_SHOW(field, format_string) \ | 89 | NETDEVICE_SHOW(ifindex, fmt_dec); |
90 | static CLASS_DEVICE_ATTR(field, S_IRUGO, show_##field, NULL) \ | 90 | NETDEVICE_SHOW(features, fmt_long_hex); |
91 | 91 | NETDEVICE_SHOW(type, fmt_dec); | |
92 | NETDEVICE_ATTR(addr_len, fmt_dec); | ||
93 | NETDEVICE_ATTR(iflink, fmt_dec); | ||
94 | NETDEVICE_ATTR(ifindex, fmt_dec); | ||
95 | NETDEVICE_ATTR(features, fmt_long_hex); | ||
96 | NETDEVICE_ATTR(type, fmt_dec); | ||
97 | 92 | ||
98 | /* use same locking rules as GIFHWADDR ioctl's */ | 93 | /* use same locking rules as GIFHWADDR ioctl's */ |
99 | static ssize_t format_addr(char *buf, const unsigned char *addr, int len) | 94 | static ssize_t format_addr(char *buf, const unsigned char *addr, int len) |
@@ -136,10 +131,6 @@ static ssize_t show_carrier(struct class_device *dev, char *buf) | |||
136 | return -EINVAL; | 131 | return -EINVAL; |
137 | } | 132 | } |
138 | 133 | ||
139 | static CLASS_DEVICE_ATTR(address, S_IRUGO, show_address, NULL); | ||
140 | static CLASS_DEVICE_ATTR(broadcast, S_IRUGO, show_broadcast, NULL); | ||
141 | static CLASS_DEVICE_ATTR(carrier, S_IRUGO, show_carrier, NULL); | ||
142 | |||
143 | /* read-write attributes */ | 134 | /* read-write attributes */ |
144 | NETDEVICE_SHOW(mtu, fmt_dec); | 135 | NETDEVICE_SHOW(mtu, fmt_dec); |
145 | 136 | ||
@@ -153,8 +144,6 @@ static ssize_t store_mtu(struct class_device *dev, const char *buf, size_t len) | |||
153 | return netdev_store(dev, buf, len, change_mtu); | 144 | return netdev_store(dev, buf, len, change_mtu); |
154 | } | 145 | } |
155 | 146 | ||
156 | static CLASS_DEVICE_ATTR(mtu, S_IRUGO | S_IWUSR, show_mtu, store_mtu); | ||
157 | |||
158 | NETDEVICE_SHOW(flags, fmt_hex); | 147 | NETDEVICE_SHOW(flags, fmt_hex); |
159 | 148 | ||
160 | static int change_flags(struct net_device *net, unsigned long new_flags) | 149 | static int change_flags(struct net_device *net, unsigned long new_flags) |
@@ -167,8 +156,6 @@ static ssize_t store_flags(struct class_device *dev, const char *buf, size_t len | |||
167 | return netdev_store(dev, buf, len, change_flags); | 156 | return netdev_store(dev, buf, len, change_flags); |
168 | } | 157 | } |
169 | 158 | ||
170 | static CLASS_DEVICE_ATTR(flags, S_IRUGO | S_IWUSR, show_flags, store_flags); | ||
171 | |||
172 | NETDEVICE_SHOW(tx_queue_len, fmt_ulong); | 159 | NETDEVICE_SHOW(tx_queue_len, fmt_ulong); |
173 | 160 | ||
174 | static int change_tx_queue_len(struct net_device *net, unsigned long new_len) | 161 | static int change_tx_queue_len(struct net_device *net, unsigned long new_len) |
@@ -182,9 +169,6 @@ static ssize_t store_tx_queue_len(struct class_device *dev, const char *buf, siz | |||
182 | return netdev_store(dev, buf, len, change_tx_queue_len); | 169 | return netdev_store(dev, buf, len, change_tx_queue_len); |
183 | } | 170 | } |
184 | 171 | ||
185 | static CLASS_DEVICE_ATTR(tx_queue_len, S_IRUGO | S_IWUSR, show_tx_queue_len, | ||
186 | store_tx_queue_len); | ||
187 | |||
188 | NETDEVICE_SHOW(weight, fmt_dec); | 172 | NETDEVICE_SHOW(weight, fmt_dec); |
189 | 173 | ||
190 | static int change_weight(struct net_device *net, unsigned long new_weight) | 174 | static int change_weight(struct net_device *net, unsigned long new_weight) |
@@ -198,24 +182,21 @@ static ssize_t store_weight(struct class_device *dev, const char *buf, size_t le | |||
198 | return netdev_store(dev, buf, len, change_weight); | 182 | return netdev_store(dev, buf, len, change_weight); |
199 | } | 183 | } |
200 | 184 | ||
201 | static CLASS_DEVICE_ATTR(weight, S_IRUGO | S_IWUSR, show_weight, | 185 | static struct class_device_attribute net_class_attributes[] = { |
202 | store_weight); | 186 | __ATTR(addr_len, S_IRUGO, show_addr_len, NULL), |
203 | 187 | __ATTR(iflink, S_IRUGO, show_iflink, NULL), | |
204 | 188 | __ATTR(ifindex, S_IRUGO, show_ifindex, NULL), | |
205 | static struct class_device_attribute *net_class_attributes[] = { | 189 | __ATTR(features, S_IRUGO, show_features, NULL), |
206 | &class_device_attr_ifindex, | 190 | __ATTR(type, S_IRUGO, show_type, NULL), |
207 | &class_device_attr_iflink, | 191 | __ATTR(address, S_IRUGO, show_address, NULL), |
208 | &class_device_attr_addr_len, | 192 | __ATTR(broadcast, S_IRUGO, show_broadcast, NULL), |
209 | &class_device_attr_tx_queue_len, | 193 | __ATTR(carrier, S_IRUGO, show_carrier, NULL), |
210 | &class_device_attr_features, | 194 | __ATTR(mtu, S_IRUGO | S_IWUSR, show_mtu, store_mtu), |
211 | &class_device_attr_mtu, | 195 | __ATTR(flags, S_IRUGO | S_IWUSR, show_flags, store_flags), |
212 | &class_device_attr_flags, | 196 | __ATTR(tx_queue_len, S_IRUGO | S_IWUSR, show_tx_queue_len, |
213 | &class_device_attr_weight, | 197 | store_tx_queue_len), |
214 | &class_device_attr_type, | 198 | __ATTR(weight, S_IRUGO | S_IWUSR, show_weight, store_weight), |
215 | &class_device_attr_address, | 199 | {} |
216 | &class_device_attr_broadcast, | ||
217 | &class_device_attr_carrier, | ||
218 | NULL | ||
219 | }; | 200 | }; |
220 | 201 | ||
221 | /* Show a given an attribute in the statistics group */ | 202 | /* Show a given an attribute in the statistics group */ |
@@ -407,6 +388,7 @@ static void netdev_release(struct class_device *cd) | |||
407 | static struct class net_class = { | 388 | static struct class net_class = { |
408 | .name = "net", | 389 | .name = "net", |
409 | .release = netdev_release, | 390 | .release = netdev_release, |
391 | .class_dev_attrs = net_class_attributes, | ||
410 | #ifdef CONFIG_HOTPLUG | 392 | #ifdef CONFIG_HOTPLUG |
411 | .uevent = netdev_uevent, | 393 | .uevent = netdev_uevent, |
412 | #endif | 394 | #endif |
@@ -431,8 +413,6 @@ void netdev_unregister_sysfs(struct net_device * net) | |||
431 | int netdev_register_sysfs(struct net_device *net) | 413 | int netdev_register_sysfs(struct net_device *net) |
432 | { | 414 | { |
433 | struct class_device *class_dev = &(net->class_dev); | 415 | struct class_device *class_dev = &(net->class_dev); |
434 | int i; | ||
435 | struct class_device_attribute *attr; | ||
436 | int ret; | 416 | int ret; |
437 | 417 | ||
438 | class_dev->class = &net_class; | 418 | class_dev->class = &net_class; |
@@ -442,12 +422,6 @@ int netdev_register_sysfs(struct net_device *net) | |||
442 | if ((ret = class_device_register(class_dev))) | 422 | if ((ret = class_device_register(class_dev))) |
443 | goto out; | 423 | goto out; |
444 | 424 | ||
445 | for (i = 0; (attr = net_class_attributes[i]) != NULL; i++) { | ||
446 | if ((ret = class_device_create_file(class_dev, attr))) | ||
447 | goto out_unreg; | ||
448 | } | ||
449 | |||
450 | |||
451 | if (net->get_stats && | 425 | if (net->get_stats && |
452 | (ret = sysfs_create_group(&class_dev->kobj, &netstat_group))) | 426 | (ret = sysfs_create_group(&class_dev->kobj, &netstat_group))) |
453 | goto out_unreg; | 427 | goto out_unreg; |