diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/9p/client.c | 70 | ||||
| -rw-r--r-- | net/9p/protocol.c | 8 | ||||
| -rw-r--r-- | net/9p/trans_virtio.c | 6 | ||||
| -rw-r--r-- | net/bridge/br_sysfs_br.c | 2 | ||||
| -rw-r--r-- | net/core/dev.c | 28 | ||||
| -rw-r--r-- | net/core/drop_monitor.c | 12 | ||||
| -rw-r--r-- | net/core/net-sysfs.c | 63 | ||||
| -rw-r--r-- | net/core/net-sysfs.h | 1 | ||||
| -rw-r--r-- | net/core/skbuff.c | 38 | ||||
| -rw-r--r-- | net/dccp/options.c | 2 | ||||
| -rw-r--r-- | net/ipv4/udp.c | 8 | ||||
| -rw-r--r-- | net/iucv/iucv.c | 9 | ||||
| -rw-r--r-- | net/mac80211/sta_info.c | 2 | ||||
| -rw-r--r-- | net/netlink/af_netlink.c | 21 | ||||
| -rw-r--r-- | net/sunrpc/cache.c | 13 | ||||
| -rw-r--r-- | net/sunrpc/rpc_pipe.c | 18 | ||||
| -rw-r--r-- | net/sunrpc/rpcb_clnt.c | 2 | ||||
| -rw-r--r-- | net/sunrpc/xprt.c | 5 | ||||
| -rw-r--r-- | net/sunrpc/xprtsock.c | 29 |
19 files changed, 232 insertions, 105 deletions
diff --git a/net/9p/client.c b/net/9p/client.c index 0aa79faa9850..37c8da07a80b 100644 --- a/net/9p/client.c +++ b/net/9p/client.c | |||
| @@ -1321,7 +1321,8 @@ static int p9_client_statsize(struct p9_wstat *wst, int proto_version) | |||
| 1321 | if (wst->muid) | 1321 | if (wst->muid) |
| 1322 | ret += strlen(wst->muid); | 1322 | ret += strlen(wst->muid); |
| 1323 | 1323 | ||
| 1324 | if (proto_version == p9_proto_2000u) { | 1324 | if ((proto_version == p9_proto_2000u) || |
| 1325 | (proto_version == p9_proto_2000L)) { | ||
| 1325 | ret += 2+4+4+4; /* extension[s] n_uid[4] n_gid[4] n_muid[4] */ | 1326 | ret += 2+4+4+4; /* extension[s] n_uid[4] n_gid[4] n_muid[4] */ |
| 1326 | if (wst->extension) | 1327 | if (wst->extension) |
| 1327 | ret += strlen(wst->extension); | 1328 | ret += strlen(wst->extension); |
| @@ -1364,3 +1365,70 @@ error: | |||
| 1364 | return err; | 1365 | return err; |
| 1365 | } | 1366 | } |
| 1366 | EXPORT_SYMBOL(p9_client_wstat); | 1367 | EXPORT_SYMBOL(p9_client_wstat); |
| 1368 | |||
| 1369 | int p9_client_statfs(struct p9_fid *fid, struct p9_rstatfs *sb) | ||
| 1370 | { | ||
| 1371 | int err; | ||
| 1372 | struct p9_req_t *req; | ||
| 1373 | struct p9_client *clnt; | ||
| 1374 | |||
| 1375 | err = 0; | ||
| 1376 | clnt = fid->clnt; | ||
| 1377 | |||
| 1378 | P9_DPRINTK(P9_DEBUG_9P, ">>> TSTATFS fid %d\n", fid->fid); | ||
| 1379 | |||
| 1380 | req = p9_client_rpc(clnt, P9_TSTATFS, "d", fid->fid); | ||
| 1381 | if (IS_ERR(req)) { | ||
| 1382 | err = PTR_ERR(req); | ||
| 1383 | goto error; | ||
| 1384 | } | ||
| 1385 | |||
| 1386 | err = p9pdu_readf(req->rc, clnt->proto_version, "ddqqqqqqd", &sb->type, | ||
| 1387 | &sb->bsize, &sb->blocks, &sb->bfree, &sb->bavail, | ||
| 1388 | &sb->files, &sb->ffree, &sb->fsid, &sb->namelen); | ||
| 1389 | if (err) { | ||
| 1390 | p9pdu_dump(1, req->rc); | ||
| 1391 | p9_free_req(clnt, req); | ||
| 1392 | goto error; | ||
| 1393 | } | ||
| 1394 | |||
| 1395 | P9_DPRINTK(P9_DEBUG_9P, "<<< RSTATFS fid %d type 0x%lx bsize %ld " | ||
| 1396 | "blocks %llu bfree %llu bavail %llu files %llu ffree %llu " | ||
| 1397 | "fsid %llu namelen %ld\n", | ||
| 1398 | fid->fid, (long unsigned int)sb->type, (long int)sb->bsize, | ||
| 1399 | sb->blocks, sb->bfree, sb->bavail, sb->files, sb->ffree, | ||
| 1400 | sb->fsid, (long int)sb->namelen); | ||
| 1401 | |||
| 1402 | p9_free_req(clnt, req); | ||
| 1403 | error: | ||
| 1404 | return err; | ||
| 1405 | } | ||
| 1406 | EXPORT_SYMBOL(p9_client_statfs); | ||
| 1407 | |||
| 1408 | int p9_client_rename(struct p9_fid *fid, struct p9_fid *newdirfid, char *name) | ||
| 1409 | { | ||
| 1410 | int err; | ||
| 1411 | struct p9_req_t *req; | ||
| 1412 | struct p9_client *clnt; | ||
| 1413 | |||
| 1414 | err = 0; | ||
| 1415 | clnt = fid->clnt; | ||
| 1416 | |||
| 1417 | P9_DPRINTK(P9_DEBUG_9P, ">>> TRENAME fid %d newdirfid %d name %s\n", | ||
| 1418 | fid->fid, newdirfid->fid, name); | ||
| 1419 | |||
| 1420 | req = p9_client_rpc(clnt, P9_TRENAME, "dds", fid->fid, | ||
| 1421 | newdirfid->fid, name); | ||
| 1422 | if (IS_ERR(req)) { | ||
| 1423 | err = PTR_ERR(req); | ||
| 1424 | goto error; | ||
| 1425 | } | ||
| 1426 | |||
| 1427 | P9_DPRINTK(P9_DEBUG_9P, "<<< RRENAME fid %d\n", fid->fid); | ||
| 1428 | |||
| 1429 | p9_free_req(clnt, req); | ||
| 1430 | error: | ||
| 1431 | return err; | ||
| 1432 | } | ||
| 1433 | EXPORT_SYMBOL(p9_client_rename); | ||
| 1434 | |||
diff --git a/net/9p/protocol.c b/net/9p/protocol.c index e7541d5b0118..149f82160130 100644 --- a/net/9p/protocol.c +++ b/net/9p/protocol.c | |||
| @@ -341,7 +341,8 @@ p9pdu_vreadf(struct p9_fcall *pdu, int proto_version, const char *fmt, | |||
| 341 | } | 341 | } |
| 342 | break; | 342 | break; |
| 343 | case '?': | 343 | case '?': |
| 344 | if (proto_version != p9_proto_2000u) | 344 | if ((proto_version != p9_proto_2000u) && |
| 345 | (proto_version != p9_proto_2000L)) | ||
| 345 | return 0; | 346 | return 0; |
| 346 | break; | 347 | break; |
| 347 | default: | 348 | default: |
| @@ -393,7 +394,7 @@ p9pdu_vwritef(struct p9_fcall *pdu, int proto_version, const char *fmt, | |||
| 393 | const char *sptr = va_arg(ap, const char *); | 394 | const char *sptr = va_arg(ap, const char *); |
| 394 | int16_t len = 0; | 395 | int16_t len = 0; |
| 395 | if (sptr) | 396 | if (sptr) |
| 396 | len = MIN(strlen(sptr), USHORT_MAX); | 397 | len = MIN(strlen(sptr), USHRT_MAX); |
| 397 | 398 | ||
| 398 | errcode = p9pdu_writef(pdu, proto_version, | 399 | errcode = p9pdu_writef(pdu, proto_version, |
| 399 | "w", len); | 400 | "w", len); |
| @@ -488,7 +489,8 @@ p9pdu_vwritef(struct p9_fcall *pdu, int proto_version, const char *fmt, | |||
| 488 | } | 489 | } |
| 489 | break; | 490 | break; |
| 490 | case '?': | 491 | case '?': |
| 491 | if (proto_version != p9_proto_2000u) | 492 | if ((proto_version != p9_proto_2000u) && |
| 493 | (proto_version != p9_proto_2000L)) | ||
| 492 | return 0; | 494 | return 0; |
| 493 | break; | 495 | break; |
| 494 | default: | 496 | default: |
diff --git a/net/9p/trans_virtio.c b/net/9p/trans_virtio.c index 7eb78ecc1618..dcfbe99ff81c 100644 --- a/net/9p/trans_virtio.c +++ b/net/9p/trans_virtio.c | |||
| @@ -137,7 +137,7 @@ static void req_done(struct virtqueue *vq) | |||
| 137 | 137 | ||
| 138 | P9_DPRINTK(P9_DEBUG_TRANS, ": request done\n"); | 138 | P9_DPRINTK(P9_DEBUG_TRANS, ": request done\n"); |
| 139 | 139 | ||
| 140 | while ((rc = chan->vq->vq_ops->get_buf(chan->vq, &len)) != NULL) { | 140 | while ((rc = virtqueue_get_buf(chan->vq, &len)) != NULL) { |
| 141 | P9_DPRINTK(P9_DEBUG_TRANS, ": rc %p\n", rc); | 141 | P9_DPRINTK(P9_DEBUG_TRANS, ": rc %p\n", rc); |
| 142 | P9_DPRINTK(P9_DEBUG_TRANS, ": lookup tag %d\n", rc->tag); | 142 | P9_DPRINTK(P9_DEBUG_TRANS, ": lookup tag %d\n", rc->tag); |
| 143 | req = p9_tag_lookup(chan->client, rc->tag); | 143 | req = p9_tag_lookup(chan->client, rc->tag); |
| @@ -209,13 +209,13 @@ p9_virtio_request(struct p9_client *client, struct p9_req_t *req) | |||
| 209 | 209 | ||
| 210 | req->status = REQ_STATUS_SENT; | 210 | req->status = REQ_STATUS_SENT; |
| 211 | 211 | ||
| 212 | if (chan->vq->vq_ops->add_buf(chan->vq, chan->sg, out, in, req->tc) < 0) { | 212 | if (virtqueue_add_buf(chan->vq, chan->sg, out, in, req->tc) < 0) { |
| 213 | P9_DPRINTK(P9_DEBUG_TRANS, | 213 | P9_DPRINTK(P9_DEBUG_TRANS, |
| 214 | "9p debug: virtio rpc add_buf returned failure"); | 214 | "9p debug: virtio rpc add_buf returned failure"); |
| 215 | return -EIO; | 215 | return -EIO; |
| 216 | } | 216 | } |
| 217 | 217 | ||
| 218 | chan->vq->vq_ops->kick(chan->vq); | 218 | virtqueue_kick(chan->vq); |
| 219 | 219 | ||
| 220 | P9_DPRINTK(P9_DEBUG_TRANS, "9p debug: virtio request kicked\n"); | 220 | P9_DPRINTK(P9_DEBUG_TRANS, "9p debug: virtio request kicked\n"); |
| 221 | return 0; | 221 | return 0; |
diff --git a/net/bridge/br_sysfs_br.c b/net/bridge/br_sysfs_br.c index dd321e39e621..486b8f3861d2 100644 --- a/net/bridge/br_sysfs_br.c +++ b/net/bridge/br_sysfs_br.c | |||
| @@ -659,7 +659,7 @@ static struct attribute_group bridge_group = { | |||
| 659 | * | 659 | * |
| 660 | * Returns the number of bytes read. | 660 | * Returns the number of bytes read. |
| 661 | */ | 661 | */ |
| 662 | static ssize_t brforward_read(struct kobject *kobj, | 662 | static ssize_t brforward_read(struct file *filp, struct kobject *kobj, |
| 663 | struct bin_attribute *bin_attr, | 663 | struct bin_attribute *bin_attr, |
| 664 | char *buf, loff_t off, size_t count) | 664 | char *buf, loff_t off, size_t count) |
| 665 | { | 665 | { |
diff --git a/net/core/dev.c b/net/core/dev.c index 07a48e2bf7db..1845b08c624e 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -1006,15 +1006,10 @@ int dev_change_name(struct net_device *dev, const char *newname) | |||
| 1006 | return err; | 1006 | return err; |
| 1007 | 1007 | ||
| 1008 | rollback: | 1008 | rollback: |
| 1009 | /* For now only devices in the initial network namespace | 1009 | ret = device_rename(&dev->dev, dev->name); |
| 1010 | * are in sysfs. | 1010 | if (ret) { |
| 1011 | */ | 1011 | memcpy(dev->name, oldname, IFNAMSIZ); |
| 1012 | if (net_eq(net, &init_net)) { | 1012 | return ret; |
| 1013 | ret = device_rename(&dev->dev, dev->name); | ||
| 1014 | if (ret) { | ||
| 1015 | memcpy(dev->name, oldname, IFNAMSIZ); | ||
| 1016 | return ret; | ||
| 1017 | } | ||
| 1018 | } | 1013 | } |
| 1019 | 1014 | ||
| 1020 | write_lock_bh(&dev_base_lock); | 1015 | write_lock_bh(&dev_base_lock); |
| @@ -4998,8 +4993,6 @@ int register_netdevice(struct net_device *dev) | |||
| 4998 | if (dev->features & NETIF_F_SG) | 4993 | if (dev->features & NETIF_F_SG) |
| 4999 | dev->features |= NETIF_F_GSO; | 4994 | dev->features |= NETIF_F_GSO; |
| 5000 | 4995 | ||
| 5001 | netdev_initialize_kobject(dev); | ||
| 5002 | |||
| 5003 | ret = call_netdevice_notifiers(NETDEV_POST_INIT, dev); | 4996 | ret = call_netdevice_notifiers(NETDEV_POST_INIT, dev); |
| 5004 | ret = notifier_to_errno(ret); | 4997 | ret = notifier_to_errno(ret); |
| 5005 | if (ret) | 4998 | if (ret) |
| @@ -5551,15 +5544,6 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char | |||
| 5551 | if (dev->features & NETIF_F_NETNS_LOCAL) | 5544 | if (dev->features & NETIF_F_NETNS_LOCAL) |
| 5552 | goto out; | 5545 | goto out; |
| 5553 | 5546 | ||
| 5554 | #ifdef CONFIG_SYSFS | ||
| 5555 | /* Don't allow real devices to be moved when sysfs | ||
| 5556 | * is enabled. | ||
| 5557 | */ | ||
| 5558 | err = -EINVAL; | ||
| 5559 | if (dev->dev.parent) | ||
| 5560 | goto out; | ||
| 5561 | #endif | ||
| 5562 | |||
| 5563 | /* Ensure the device has been registrered */ | 5547 | /* Ensure the device has been registrered */ |
| 5564 | err = -EINVAL; | 5548 | err = -EINVAL; |
| 5565 | if (dev->reg_state != NETREG_REGISTERED) | 5549 | if (dev->reg_state != NETREG_REGISTERED) |
| @@ -5610,8 +5594,6 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char | |||
| 5610 | dev_uc_flush(dev); | 5594 | dev_uc_flush(dev); |
| 5611 | dev_mc_flush(dev); | 5595 | dev_mc_flush(dev); |
| 5612 | 5596 | ||
| 5613 | netdev_unregister_kobject(dev); | ||
| 5614 | |||
| 5615 | /* Actually switch the network namespace */ | 5597 | /* Actually switch the network namespace */ |
| 5616 | dev_net_set(dev, net); | 5598 | dev_net_set(dev, net); |
| 5617 | 5599 | ||
| @@ -5624,7 +5606,7 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char | |||
| 5624 | } | 5606 | } |
| 5625 | 5607 | ||
| 5626 | /* Fixup kobjects */ | 5608 | /* Fixup kobjects */ |
| 5627 | err = netdev_register_kobject(dev); | 5609 | err = device_rename(&dev->dev, dev->name); |
| 5628 | WARN_ON(err); | 5610 | WARN_ON(err); |
| 5629 | 5611 | ||
| 5630 | /* Add the device back in the hashes */ | 5612 | /* Add the device back in the hashes */ |
diff --git a/net/core/drop_monitor.c b/net/core/drop_monitor.c index cf208d8042b1..ad41529fb60f 100644 --- a/net/core/drop_monitor.c +++ b/net/core/drop_monitor.c | |||
| @@ -172,12 +172,12 @@ out: | |||
| 172 | return; | 172 | return; |
| 173 | } | 173 | } |
| 174 | 174 | ||
| 175 | static void trace_kfree_skb_hit(struct sk_buff *skb, void *location) | 175 | static void trace_kfree_skb_hit(void *ignore, struct sk_buff *skb, void *location) |
| 176 | { | 176 | { |
| 177 | trace_drop_common(skb, location); | 177 | trace_drop_common(skb, location); |
| 178 | } | 178 | } |
| 179 | 179 | ||
| 180 | static void trace_napi_poll_hit(struct napi_struct *napi) | 180 | static void trace_napi_poll_hit(void *ignore, struct napi_struct *napi) |
| 181 | { | 181 | { |
| 182 | struct dm_hw_stat_delta *new_stat; | 182 | struct dm_hw_stat_delta *new_stat; |
| 183 | 183 | ||
| @@ -225,12 +225,12 @@ static int set_all_monitor_traces(int state) | |||
| 225 | 225 | ||
| 226 | switch (state) { | 226 | switch (state) { |
| 227 | case TRACE_ON: | 227 | case TRACE_ON: |
| 228 | rc |= register_trace_kfree_skb(trace_kfree_skb_hit); | 228 | rc |= register_trace_kfree_skb(trace_kfree_skb_hit, NULL); |
| 229 | rc |= register_trace_napi_poll(trace_napi_poll_hit); | 229 | rc |= register_trace_napi_poll(trace_napi_poll_hit, NULL); |
| 230 | break; | 230 | break; |
| 231 | case TRACE_OFF: | 231 | case TRACE_OFF: |
| 232 | rc |= unregister_trace_kfree_skb(trace_kfree_skb_hit); | 232 | rc |= unregister_trace_kfree_skb(trace_kfree_skb_hit, NULL); |
| 233 | rc |= unregister_trace_napi_poll(trace_napi_poll_hit); | 233 | rc |= unregister_trace_napi_poll(trace_napi_poll_hit, NULL); |
| 234 | 234 | ||
| 235 | tracepoint_synchronize_unregister(); | 235 | tracepoint_synchronize_unregister(); |
| 236 | 236 | ||
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index c57c4b228bb5..99e7052d7323 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c | |||
| @@ -14,7 +14,9 @@ | |||
| 14 | #include <linux/netdevice.h> | 14 | #include <linux/netdevice.h> |
| 15 | #include <linux/if_arp.h> | 15 | #include <linux/if_arp.h> |
| 16 | #include <linux/slab.h> | 16 | #include <linux/slab.h> |
| 17 | #include <linux/nsproxy.h> | ||
| 17 | #include <net/sock.h> | 18 | #include <net/sock.h> |
| 19 | #include <net/net_namespace.h> | ||
| 18 | #include <linux/rtnetlink.h> | 20 | #include <linux/rtnetlink.h> |
| 19 | #include <linux/wireless.h> | 21 | #include <linux/wireless.h> |
| 20 | #include <linux/vmalloc.h> | 22 | #include <linux/vmalloc.h> |
| @@ -467,6 +469,7 @@ static struct attribute_group wireless_group = { | |||
| 467 | .attrs = wireless_attrs, | 469 | .attrs = wireless_attrs, |
| 468 | }; | 470 | }; |
| 469 | #endif | 471 | #endif |
| 472 | #endif /* CONFIG_SYSFS */ | ||
| 470 | 473 | ||
| 471 | #ifdef CONFIG_RPS | 474 | #ifdef CONFIG_RPS |
| 472 | /* | 475 | /* |
| @@ -766,7 +769,38 @@ static void rx_queue_remove_kobjects(struct net_device *net) | |||
| 766 | kset_unregister(net->queues_kset); | 769 | kset_unregister(net->queues_kset); |
| 767 | } | 770 | } |
| 768 | #endif /* CONFIG_RPS */ | 771 | #endif /* CONFIG_RPS */ |
| 769 | #endif /* CONFIG_SYSFS */ | 772 | |
| 773 | static const void *net_current_ns(void) | ||
| 774 | { | ||
| 775 | return current->nsproxy->net_ns; | ||
| 776 | } | ||
| 777 | |||
| 778 | static const void *net_initial_ns(void) | ||
| 779 | { | ||
| 780 | return &init_net; | ||
| 781 | } | ||
| 782 | |||
| 783 | static const void *net_netlink_ns(struct sock *sk) | ||
| 784 | { | ||
| 785 | return sock_net(sk); | ||
| 786 | } | ||
| 787 | |||
| 788 | static struct kobj_ns_type_operations net_ns_type_operations = { | ||
| 789 | .type = KOBJ_NS_TYPE_NET, | ||
| 790 | .current_ns = net_current_ns, | ||
| 791 | .netlink_ns = net_netlink_ns, | ||
| 792 | .initial_ns = net_initial_ns, | ||
| 793 | }; | ||
| 794 | |||
| 795 | static void net_kobj_ns_exit(struct net *net) | ||
| 796 | { | ||
| 797 | kobj_ns_exit(KOBJ_NS_TYPE_NET, net); | ||
| 798 | } | ||
| 799 | |||
| 800 | static struct pernet_operations kobj_net_ops = { | ||
| 801 | .exit = net_kobj_ns_exit, | ||
| 802 | }; | ||
| 803 | |||
| 770 | 804 | ||
| 771 | #ifdef CONFIG_HOTPLUG | 805 | #ifdef CONFIG_HOTPLUG |
| 772 | static int netdev_uevent(struct device *d, struct kobj_uevent_env *env) | 806 | static int netdev_uevent(struct device *d, struct kobj_uevent_env *env) |
| @@ -774,9 +808,6 @@ static int netdev_uevent(struct device *d, struct kobj_uevent_env *env) | |||
| 774 | struct net_device *dev = to_net_dev(d); | 808 | struct net_device *dev = to_net_dev(d); |
| 775 | int retval; | 809 | int retval; |
| 776 | 810 | ||
| 777 | if (!net_eq(dev_net(dev), &init_net)) | ||
| 778 | return 0; | ||
| 779 | |||
| 780 | /* pass interface to uevent. */ | 811 | /* pass interface to uevent. */ |
| 781 | retval = add_uevent_var(env, "INTERFACE=%s", dev->name); | 812 | retval = add_uevent_var(env, "INTERFACE=%s", dev->name); |
| 782 | if (retval) | 813 | if (retval) |
| @@ -806,6 +837,13 @@ static void netdev_release(struct device *d) | |||
| 806 | kfree((char *)dev - dev->padded); | 837 | kfree((char *)dev - dev->padded); |
| 807 | } | 838 | } |
| 808 | 839 | ||
| 840 | static const void *net_namespace(struct device *d) | ||
| 841 | { | ||
| 842 | struct net_device *dev; | ||
| 843 | dev = container_of(d, struct net_device, dev); | ||
| 844 | return dev_net(dev); | ||
| 845 | } | ||
| 846 | |||
| 809 | static struct class net_class = { | 847 | static struct class net_class = { |
| 810 | .name = "net", | 848 | .name = "net", |
| 811 | .dev_release = netdev_release, | 849 | .dev_release = netdev_release, |
| @@ -815,6 +853,8 @@ static struct class net_class = { | |||
| 815 | #ifdef CONFIG_HOTPLUG | 853 | #ifdef CONFIG_HOTPLUG |
| 816 | .dev_uevent = netdev_uevent, | 854 | .dev_uevent = netdev_uevent, |
| 817 | #endif | 855 | #endif |
| 856 | .ns_type = &net_ns_type_operations, | ||
| 857 | .namespace = net_namespace, | ||
| 818 | }; | 858 | }; |
| 819 | 859 | ||
| 820 | /* Delete sysfs entries but hold kobject reference until after all | 860 | /* Delete sysfs entries but hold kobject reference until after all |
| @@ -826,9 +866,6 @@ void netdev_unregister_kobject(struct net_device * net) | |||
| 826 | 866 | ||
| 827 | kobject_get(&dev->kobj); | 867 | kobject_get(&dev->kobj); |
| 828 | 868 | ||
| 829 | if (!net_eq(dev_net(net), &init_net)) | ||
| 830 | return; | ||
| 831 | |||
| 832 | #ifdef CONFIG_RPS | 869 | #ifdef CONFIG_RPS |
| 833 | rx_queue_remove_kobjects(net); | 870 | rx_queue_remove_kobjects(net); |
| 834 | #endif | 871 | #endif |
| @@ -843,6 +880,7 @@ int netdev_register_kobject(struct net_device *net) | |||
| 843 | const struct attribute_group **groups = net->sysfs_groups; | 880 | const struct attribute_group **groups = net->sysfs_groups; |
| 844 | int error = 0; | 881 | int error = 0; |
| 845 | 882 | ||
| 883 | device_initialize(dev); | ||
| 846 | dev->class = &net_class; | 884 | dev->class = &net_class; |
| 847 | dev->platform_data = net; | 885 | dev->platform_data = net; |
| 848 | dev->groups = groups; | 886 | dev->groups = groups; |
| @@ -865,9 +903,6 @@ int netdev_register_kobject(struct net_device *net) | |||
| 865 | #endif | 903 | #endif |
| 866 | #endif /* CONFIG_SYSFS */ | 904 | #endif /* CONFIG_SYSFS */ |
| 867 | 905 | ||
| 868 | if (!net_eq(dev_net(net), &init_net)) | ||
| 869 | return 0; | ||
| 870 | |||
| 871 | error = device_add(dev); | 906 | error = device_add(dev); |
| 872 | if (error) | 907 | if (error) |
| 873 | return error; | 908 | return error; |
| @@ -896,13 +931,9 @@ void netdev_class_remove_file(struct class_attribute *class_attr) | |||
| 896 | EXPORT_SYMBOL(netdev_class_create_file); | 931 | EXPORT_SYMBOL(netdev_class_create_file); |
| 897 | EXPORT_SYMBOL(netdev_class_remove_file); | 932 | EXPORT_SYMBOL(netdev_class_remove_file); |
| 898 | 933 | ||
| 899 | void netdev_initialize_kobject(struct net_device *net) | ||
| 900 | { | ||
| 901 | struct device *device = &(net->dev); | ||
| 902 | device_initialize(device); | ||
| 903 | } | ||
| 904 | |||
| 905 | int netdev_kobject_init(void) | 934 | int netdev_kobject_init(void) |
| 906 | { | 935 | { |
| 936 | kobj_ns_type_register(&net_ns_type_operations); | ||
| 937 | register_pernet_subsys(&kobj_net_ops); | ||
| 907 | return class_register(&net_class); | 938 | return class_register(&net_class); |
| 908 | } | 939 | } |
diff --git a/net/core/net-sysfs.h b/net/core/net-sysfs.h index 14e7524260b3..805555e8b187 100644 --- a/net/core/net-sysfs.h +++ b/net/core/net-sysfs.h | |||
| @@ -4,5 +4,4 @@ | |||
| 4 | int netdev_kobject_init(void); | 4 | int netdev_kobject_init(void); |
| 5 | int netdev_register_kobject(struct net_device *); | 5 | int netdev_register_kobject(struct net_device *); |
| 6 | void netdev_unregister_kobject(struct net_device *); | 6 | void netdev_unregister_kobject(struct net_device *); |
| 7 | void netdev_initialize_kobject(struct net_device *); | ||
| 8 | #endif | 7 | #endif |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index 4c11000a96aa..f8abf68e3988 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -1406,12 +1406,13 @@ new_page: | |||
| 1406 | /* | 1406 | /* |
| 1407 | * Fill page/offset/length into spd, if it can hold more pages. | 1407 | * Fill page/offset/length into spd, if it can hold more pages. |
| 1408 | */ | 1408 | */ |
| 1409 | static inline int spd_fill_page(struct splice_pipe_desc *spd, struct page *page, | 1409 | static inline int spd_fill_page(struct splice_pipe_desc *spd, |
| 1410 | struct pipe_inode_info *pipe, struct page *page, | ||
| 1410 | unsigned int *len, unsigned int offset, | 1411 | unsigned int *len, unsigned int offset, |
| 1411 | struct sk_buff *skb, int linear, | 1412 | struct sk_buff *skb, int linear, |
| 1412 | struct sock *sk) | 1413 | struct sock *sk) |
| 1413 | { | 1414 | { |
| 1414 | if (unlikely(spd->nr_pages == PIPE_BUFFERS)) | 1415 | if (unlikely(spd->nr_pages == pipe->buffers)) |
| 1415 | return 1; | 1416 | return 1; |
| 1416 | 1417 | ||
| 1417 | if (linear) { | 1418 | if (linear) { |
| @@ -1447,7 +1448,8 @@ static inline int __splice_segment(struct page *page, unsigned int poff, | |||
| 1447 | unsigned int plen, unsigned int *off, | 1448 | unsigned int plen, unsigned int *off, |
| 1448 | unsigned int *len, struct sk_buff *skb, | 1449 | unsigned int *len, struct sk_buff *skb, |
| 1449 | struct splice_pipe_desc *spd, int linear, | 1450 | struct splice_pipe_desc *spd, int linear, |
| 1450 | struct sock *sk) | 1451 | struct sock *sk, |
| 1452 | struct pipe_inode_info *pipe) | ||
| 1451 | { | 1453 | { |
| 1452 | if (!*len) | 1454 | if (!*len) |
| 1453 | return 1; | 1455 | return 1; |
| @@ -1470,7 +1472,7 @@ static inline int __splice_segment(struct page *page, unsigned int poff, | |||
| 1470 | /* the linear region may spread across several pages */ | 1472 | /* the linear region may spread across several pages */ |
| 1471 | flen = min_t(unsigned int, flen, PAGE_SIZE - poff); | 1473 | flen = min_t(unsigned int, flen, PAGE_SIZE - poff); |
| 1472 | 1474 | ||
| 1473 | if (spd_fill_page(spd, page, &flen, poff, skb, linear, sk)) | 1475 | if (spd_fill_page(spd, pipe, page, &flen, poff, skb, linear, sk)) |
| 1474 | return 1; | 1476 | return 1; |
| 1475 | 1477 | ||
| 1476 | __segment_seek(&page, &poff, &plen, flen); | 1478 | __segment_seek(&page, &poff, &plen, flen); |
| @@ -1485,9 +1487,9 @@ static inline int __splice_segment(struct page *page, unsigned int poff, | |||
| 1485 | * Map linear and fragment data from the skb to spd. It reports failure if the | 1487 | * Map linear and fragment data from the skb to spd. It reports failure if the |
| 1486 | * pipe is full or if we already spliced the requested length. | 1488 | * pipe is full or if we already spliced the requested length. |
| 1487 | */ | 1489 | */ |
| 1488 | static int __skb_splice_bits(struct sk_buff *skb, unsigned int *offset, | 1490 | static int __skb_splice_bits(struct sk_buff *skb, struct pipe_inode_info *pipe, |
| 1489 | unsigned int *len, struct splice_pipe_desc *spd, | 1491 | unsigned int *offset, unsigned int *len, |
| 1490 | struct sock *sk) | 1492 | struct splice_pipe_desc *spd, struct sock *sk) |
| 1491 | { | 1493 | { |
| 1492 | int seg; | 1494 | int seg; |
| 1493 | 1495 | ||
| @@ -1497,7 +1499,7 @@ static int __skb_splice_bits(struct sk_buff *skb, unsigned int *offset, | |||
| 1497 | if (__splice_segment(virt_to_page(skb->data), | 1499 | if (__splice_segment(virt_to_page(skb->data), |
| 1498 | (unsigned long) skb->data & (PAGE_SIZE - 1), | 1500 | (unsigned long) skb->data & (PAGE_SIZE - 1), |
| 1499 | skb_headlen(skb), | 1501 | skb_headlen(skb), |
| 1500 | offset, len, skb, spd, 1, sk)) | 1502 | offset, len, skb, spd, 1, sk, pipe)) |
| 1501 | return 1; | 1503 | return 1; |
| 1502 | 1504 | ||
| 1503 | /* | 1505 | /* |
| @@ -1507,7 +1509,7 @@ static int __skb_splice_bits(struct sk_buff *skb, unsigned int *offset, | |||
| 1507 | const skb_frag_t *f = &skb_shinfo(skb)->frags[seg]; | 1509 | const skb_frag_t *f = &skb_shinfo(skb)->frags[seg]; |
| 1508 | 1510 | ||
| 1509 | if (__splice_segment(f->page, f->page_offset, f->size, | 1511 | if (__splice_segment(f->page, f->page_offset, f->size, |
| 1510 | offset, len, skb, spd, 0, sk)) | 1512 | offset, len, skb, spd, 0, sk, pipe)) |
| 1511 | return 1; | 1513 | return 1; |
| 1512 | } | 1514 | } |
| 1513 | 1515 | ||
| @@ -1524,8 +1526,8 @@ int skb_splice_bits(struct sk_buff *skb, unsigned int offset, | |||
| 1524 | struct pipe_inode_info *pipe, unsigned int tlen, | 1526 | struct pipe_inode_info *pipe, unsigned int tlen, |
| 1525 | unsigned int flags) | 1527 | unsigned int flags) |
| 1526 | { | 1528 | { |
| 1527 | struct partial_page partial[PIPE_BUFFERS]; | 1529 | struct partial_page partial[PIPE_DEF_BUFFERS]; |
| 1528 | struct page *pages[PIPE_BUFFERS]; | 1530 | struct page *pages[PIPE_DEF_BUFFERS]; |
| 1529 | struct splice_pipe_desc spd = { | 1531 | struct splice_pipe_desc spd = { |
| 1530 | .pages = pages, | 1532 | .pages = pages, |
| 1531 | .partial = partial, | 1533 | .partial = partial, |
| @@ -1535,12 +1537,16 @@ int skb_splice_bits(struct sk_buff *skb, unsigned int offset, | |||
| 1535 | }; | 1537 | }; |
| 1536 | struct sk_buff *frag_iter; | 1538 | struct sk_buff *frag_iter; |
| 1537 | struct sock *sk = skb->sk; | 1539 | struct sock *sk = skb->sk; |
| 1540 | int ret = 0; | ||
| 1541 | |||
| 1542 | if (splice_grow_spd(pipe, &spd)) | ||
| 1543 | return -ENOMEM; | ||
| 1538 | 1544 | ||
| 1539 | /* | 1545 | /* |
| 1540 | * __skb_splice_bits() only fails if the output has no room left, | 1546 | * __skb_splice_bits() only fails if the output has no room left, |
| 1541 | * so no point in going over the frag_list for the error case. | 1547 | * so no point in going over the frag_list for the error case. |
| 1542 | */ | 1548 | */ |
| 1543 | if (__skb_splice_bits(skb, &offset, &tlen, &spd, sk)) | 1549 | if (__skb_splice_bits(skb, pipe, &offset, &tlen, &spd, sk)) |
| 1544 | goto done; | 1550 | goto done; |
| 1545 | else if (!tlen) | 1551 | else if (!tlen) |
| 1546 | goto done; | 1552 | goto done; |
| @@ -1551,14 +1557,12 @@ int skb_splice_bits(struct sk_buff *skb, unsigned int offset, | |||
| 1551 | skb_walk_frags(skb, frag_iter) { | 1557 | skb_walk_frags(skb, frag_iter) { |
| 1552 | if (!tlen) | 1558 | if (!tlen) |
| 1553 | break; | 1559 | break; |
| 1554 | if (__skb_splice_bits(frag_iter, &offset, &tlen, &spd, sk)) | 1560 | if (__skb_splice_bits(frag_iter, pipe, &offset, &tlen, &spd, sk)) |
| 1555 | break; | 1561 | break; |
| 1556 | } | 1562 | } |
| 1557 | 1563 | ||
| 1558 | done: | 1564 | done: |
| 1559 | if (spd.nr_pages) { | 1565 | if (spd.nr_pages) { |
| 1560 | int ret; | ||
| 1561 | |||
| 1562 | /* | 1566 | /* |
| 1563 | * Drop the socket lock, otherwise we have reverse | 1567 | * Drop the socket lock, otherwise we have reverse |
| 1564 | * locking dependencies between sk_lock and i_mutex | 1568 | * locking dependencies between sk_lock and i_mutex |
| @@ -1571,10 +1575,10 @@ done: | |||
| 1571 | release_sock(sk); | 1575 | release_sock(sk); |
| 1572 | ret = splice_to_pipe(pipe, &spd); | 1576 | ret = splice_to_pipe(pipe, &spd); |
| 1573 | lock_sock(sk); | 1577 | lock_sock(sk); |
| 1574 | return ret; | ||
| 1575 | } | 1578 | } |
| 1576 | 1579 | ||
| 1577 | return 0; | 1580 | splice_shrink_spd(pipe, &spd); |
| 1581 | return ret; | ||
| 1578 | } | 1582 | } |
| 1579 | 1583 | ||
| 1580 | /** | 1584 | /** |
diff --git a/net/dccp/options.c b/net/dccp/options.c index 1b08cae9c65b..07395f861d35 100644 --- a/net/dccp/options.c +++ b/net/dccp/options.c | |||
| @@ -296,7 +296,7 @@ static inline u8 dccp_ndp_len(const u64 ndp) | |||
| 296 | { | 296 | { |
| 297 | if (likely(ndp <= 0xFF)) | 297 | if (likely(ndp <= 0xFF)) |
| 298 | return 1; | 298 | return 1; |
| 299 | return likely(ndp <= USHORT_MAX) ? 2 : (ndp <= UINT_MAX ? 4 : 6); | 299 | return likely(ndp <= USHRT_MAX) ? 2 : (ndp <= UINT_MAX ? 4 : 6); |
| 300 | } | 300 | } |
| 301 | 301 | ||
| 302 | int dccp_insert_option(struct sock *sk, struct sk_buff *skb, | 302 | int dccp_insert_option(struct sock *sk, struct sk_buff *skb, |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index b9d0d409516f..58585748bdac 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
| @@ -1688,8 +1688,8 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname, | |||
| 1688 | return -ENOPROTOOPT; | 1688 | return -ENOPROTOOPT; |
| 1689 | if (val != 0 && val < 8) /* Illegal coverage: use default (8) */ | 1689 | if (val != 0 && val < 8) /* Illegal coverage: use default (8) */ |
| 1690 | val = 8; | 1690 | val = 8; |
| 1691 | else if (val > USHORT_MAX) | 1691 | else if (val > USHRT_MAX) |
| 1692 | val = USHORT_MAX; | 1692 | val = USHRT_MAX; |
| 1693 | up->pcslen = val; | 1693 | up->pcslen = val; |
| 1694 | up->pcflag |= UDPLITE_SEND_CC; | 1694 | up->pcflag |= UDPLITE_SEND_CC; |
| 1695 | break; | 1695 | break; |
| @@ -1702,8 +1702,8 @@ int udp_lib_setsockopt(struct sock *sk, int level, int optname, | |||
| 1702 | return -ENOPROTOOPT; | 1702 | return -ENOPROTOOPT; |
| 1703 | if (val != 0 && val < 8) /* Avoid silly minimal values. */ | 1703 | if (val != 0 && val < 8) /* Avoid silly minimal values. */ |
| 1704 | val = 8; | 1704 | val = 8; |
| 1705 | else if (val > USHORT_MAX) | 1705 | else if (val > USHRT_MAX) |
| 1706 | val = USHORT_MAX; | 1706 | val = USHRT_MAX; |
| 1707 | up->pcrlen = val; | 1707 | up->pcrlen = val; |
| 1708 | up->pcflag |= UDPLITE_RECV_CC; | 1708 | up->pcflag |= UDPLITE_RECV_CC; |
| 1709 | break; | 1709 | break; |
diff --git a/net/iucv/iucv.c b/net/iucv/iucv.c index fd8b28361a64..f28ad2cc8428 100644 --- a/net/iucv/iucv.c +++ b/net/iucv/iucv.c | |||
| @@ -632,13 +632,14 @@ static int __cpuinit iucv_cpu_notify(struct notifier_block *self, | |||
| 632 | iucv_irq_data[cpu] = kmalloc_node(sizeof(struct iucv_irq_data), | 632 | iucv_irq_data[cpu] = kmalloc_node(sizeof(struct iucv_irq_data), |
| 633 | GFP_KERNEL|GFP_DMA, cpu_to_node(cpu)); | 633 | GFP_KERNEL|GFP_DMA, cpu_to_node(cpu)); |
| 634 | if (!iucv_irq_data[cpu]) | 634 | if (!iucv_irq_data[cpu]) |
| 635 | return NOTIFY_BAD; | 635 | return notifier_from_errno(-ENOMEM); |
| 636 | |||
| 636 | iucv_param[cpu] = kmalloc_node(sizeof(union iucv_param), | 637 | iucv_param[cpu] = kmalloc_node(sizeof(union iucv_param), |
| 637 | GFP_KERNEL|GFP_DMA, cpu_to_node(cpu)); | 638 | GFP_KERNEL|GFP_DMA, cpu_to_node(cpu)); |
| 638 | if (!iucv_param[cpu]) { | 639 | if (!iucv_param[cpu]) { |
| 639 | kfree(iucv_irq_data[cpu]); | 640 | kfree(iucv_irq_data[cpu]); |
| 640 | iucv_irq_data[cpu] = NULL; | 641 | iucv_irq_data[cpu] = NULL; |
| 641 | return NOTIFY_BAD; | 642 | return notifier_from_errno(-ENOMEM); |
| 642 | } | 643 | } |
| 643 | iucv_param_irq[cpu] = kmalloc_node(sizeof(union iucv_param), | 644 | iucv_param_irq[cpu] = kmalloc_node(sizeof(union iucv_param), |
| 644 | GFP_KERNEL|GFP_DMA, cpu_to_node(cpu)); | 645 | GFP_KERNEL|GFP_DMA, cpu_to_node(cpu)); |
| @@ -647,7 +648,7 @@ static int __cpuinit iucv_cpu_notify(struct notifier_block *self, | |||
| 647 | iucv_param[cpu] = NULL; | 648 | iucv_param[cpu] = NULL; |
| 648 | kfree(iucv_irq_data[cpu]); | 649 | kfree(iucv_irq_data[cpu]); |
| 649 | iucv_irq_data[cpu] = NULL; | 650 | iucv_irq_data[cpu] = NULL; |
| 650 | return NOTIFY_BAD; | 651 | return notifier_from_errno(-ENOMEM); |
| 651 | } | 652 | } |
| 652 | break; | 653 | break; |
| 653 | case CPU_UP_CANCELED: | 654 | case CPU_UP_CANCELED: |
| @@ -677,7 +678,7 @@ static int __cpuinit iucv_cpu_notify(struct notifier_block *self, | |||
| 677 | cpu_clear(cpu, cpumask); | 678 | cpu_clear(cpu, cpumask); |
| 678 | if (cpus_empty(cpumask)) | 679 | if (cpus_empty(cpumask)) |
| 679 | /* Can't offline last IUCV enabled cpu. */ | 680 | /* Can't offline last IUCV enabled cpu. */ |
| 680 | return NOTIFY_BAD; | 681 | return notifier_from_errno(-EINVAL); |
| 681 | smp_call_function_single(cpu, iucv_retrieve_cpu, NULL, 1); | 682 | smp_call_function_single(cpu, iucv_retrieve_cpu, NULL, 1); |
| 682 | if (cpus_empty(iucv_irq_cpumask)) | 683 | if (cpus_empty(iucv_irq_cpumask)) |
| 683 | smp_call_function_single(first_cpu(iucv_buffer_cpumask), | 684 | smp_call_function_single(first_cpu(iucv_buffer_cpumask), |
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index 730197591ab5..ba9360a475b0 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c | |||
| @@ -259,7 +259,7 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata, | |||
| 259 | skb_queue_head_init(&sta->tx_filtered); | 259 | skb_queue_head_init(&sta->tx_filtered); |
| 260 | 260 | ||
| 261 | for (i = 0; i < NUM_RX_DATA_QUEUES; i++) | 261 | for (i = 0; i < NUM_RX_DATA_QUEUES; i++) |
| 262 | sta->last_seq_ctrl[i] = cpu_to_le16(USHORT_MAX); | 262 | sta->last_seq_ctrl[i] = cpu_to_le16(USHRT_MAX); |
| 263 | 263 | ||
| 264 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG | 264 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG |
| 265 | printk(KERN_DEBUG "%s: Allocated STA %pM\n", | 265 | printk(KERN_DEBUG "%s: Allocated STA %pM\n", |
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 6464a1972a69..a2eb965207d3 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c | |||
| @@ -978,6 +978,8 @@ struct netlink_broadcast_data { | |||
| 978 | int delivered; | 978 | int delivered; |
| 979 | gfp_t allocation; | 979 | gfp_t allocation; |
| 980 | struct sk_buff *skb, *skb2; | 980 | struct sk_buff *skb, *skb2; |
| 981 | int (*tx_filter)(struct sock *dsk, struct sk_buff *skb, void *data); | ||
| 982 | void *tx_data; | ||
| 981 | }; | 983 | }; |
| 982 | 984 | ||
| 983 | static inline int do_one_broadcast(struct sock *sk, | 985 | static inline int do_one_broadcast(struct sock *sk, |
| @@ -1020,6 +1022,9 @@ static inline int do_one_broadcast(struct sock *sk, | |||
| 1020 | p->failure = 1; | 1022 | p->failure = 1; |
| 1021 | if (nlk->flags & NETLINK_BROADCAST_SEND_ERROR) | 1023 | if (nlk->flags & NETLINK_BROADCAST_SEND_ERROR) |
| 1022 | p->delivery_failure = 1; | 1024 | p->delivery_failure = 1; |
| 1025 | } else if (p->tx_filter && p->tx_filter(sk, p->skb2, p->tx_data)) { | ||
| 1026 | kfree_skb(p->skb2); | ||
| 1027 | p->skb2 = NULL; | ||
| 1023 | } else if (sk_filter(sk, p->skb2)) { | 1028 | } else if (sk_filter(sk, p->skb2)) { |
| 1024 | kfree_skb(p->skb2); | 1029 | kfree_skb(p->skb2); |
| 1025 | p->skb2 = NULL; | 1030 | p->skb2 = NULL; |
| @@ -1038,8 +1043,10 @@ out: | |||
| 1038 | return 0; | 1043 | return 0; |
| 1039 | } | 1044 | } |
| 1040 | 1045 | ||
| 1041 | int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, u32 pid, | 1046 | int netlink_broadcast_filtered(struct sock *ssk, struct sk_buff *skb, u32 pid, |
| 1042 | u32 group, gfp_t allocation) | 1047 | u32 group, gfp_t allocation, |
| 1048 | int (*filter)(struct sock *dsk, struct sk_buff *skb, void *data), | ||
| 1049 | void *filter_data) | ||
| 1043 | { | 1050 | { |
| 1044 | struct net *net = sock_net(ssk); | 1051 | struct net *net = sock_net(ssk); |
| 1045 | struct netlink_broadcast_data info; | 1052 | struct netlink_broadcast_data info; |
| @@ -1059,6 +1066,8 @@ int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, u32 pid, | |||
| 1059 | info.allocation = allocation; | 1066 | info.allocation = allocation; |
| 1060 | info.skb = skb; | 1067 | info.skb = skb; |
| 1061 | info.skb2 = NULL; | 1068 | info.skb2 = NULL; |
| 1069 | info.tx_filter = filter; | ||
| 1070 | info.tx_data = filter_data; | ||
| 1062 | 1071 | ||
| 1063 | /* While we sleep in clone, do not allow to change socket list */ | 1072 | /* While we sleep in clone, do not allow to change socket list */ |
| 1064 | 1073 | ||
| @@ -1083,6 +1092,14 @@ int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, u32 pid, | |||
| 1083 | } | 1092 | } |
| 1084 | return -ESRCH; | 1093 | return -ESRCH; |
| 1085 | } | 1094 | } |
| 1095 | EXPORT_SYMBOL(netlink_broadcast_filtered); | ||
| 1096 | |||
| 1097 | int netlink_broadcast(struct sock *ssk, struct sk_buff *skb, u32 pid, | ||
| 1098 | u32 group, gfp_t allocation) | ||
| 1099 | { | ||
| 1100 | return netlink_broadcast_filtered(ssk, skb, pid, group, allocation, | ||
| 1101 | NULL, NULL); | ||
| 1102 | } | ||
| 1086 | EXPORT_SYMBOL(netlink_broadcast); | 1103 | EXPORT_SYMBOL(netlink_broadcast); |
| 1087 | 1104 | ||
| 1088 | struct netlink_set_err_data { | 1105 | struct netlink_set_err_data { |
diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c index c2173ebdb33c..58de76c8540c 100644 --- a/net/sunrpc/cache.c +++ b/net/sunrpc/cache.c | |||
| @@ -34,6 +34,7 @@ | |||
| 34 | #include <linux/sunrpc/cache.h> | 34 | #include <linux/sunrpc/cache.h> |
| 35 | #include <linux/sunrpc/stats.h> | 35 | #include <linux/sunrpc/stats.h> |
| 36 | #include <linux/sunrpc/rpc_pipe_fs.h> | 36 | #include <linux/sunrpc/rpc_pipe_fs.h> |
| 37 | #include <linux/smp_lock.h> | ||
| 37 | 38 | ||
| 38 | #define RPCDBG_FACILITY RPCDBG_CACHE | 39 | #define RPCDBG_FACILITY RPCDBG_CACHE |
| 39 | 40 | ||
| @@ -1545,12 +1546,18 @@ static unsigned int cache_poll_pipefs(struct file *filp, poll_table *wait) | |||
| 1545 | return cache_poll(filp, wait, cd); | 1546 | return cache_poll(filp, wait, cd); |
| 1546 | } | 1547 | } |
| 1547 | 1548 | ||
| 1548 | static int cache_ioctl_pipefs(struct inode *inode, struct file *filp, | 1549 | static long cache_ioctl_pipefs(struct file *filp, |
| 1549 | unsigned int cmd, unsigned long arg) | 1550 | unsigned int cmd, unsigned long arg) |
| 1550 | { | 1551 | { |
| 1552 | struct inode *inode = filp->f_dentry->d_inode; | ||
| 1551 | struct cache_detail *cd = RPC_I(inode)->private; | 1553 | struct cache_detail *cd = RPC_I(inode)->private; |
| 1554 | long ret; | ||
| 1552 | 1555 | ||
| 1553 | return cache_ioctl(inode, filp, cmd, arg, cd); | 1556 | lock_kernel(); |
| 1557 | ret = cache_ioctl(inode, filp, cmd, arg, cd); | ||
| 1558 | unlock_kernel(); | ||
| 1559 | |||
| 1560 | return ret; | ||
| 1554 | } | 1561 | } |
| 1555 | 1562 | ||
| 1556 | static int cache_open_pipefs(struct inode *inode, struct file *filp) | 1563 | static int cache_open_pipefs(struct inode *inode, struct file *filp) |
| @@ -1573,7 +1580,7 @@ const struct file_operations cache_file_operations_pipefs = { | |||
| 1573 | .read = cache_read_pipefs, | 1580 | .read = cache_read_pipefs, |
| 1574 | .write = cache_write_pipefs, | 1581 | .write = cache_write_pipefs, |
| 1575 | .poll = cache_poll_pipefs, | 1582 | .poll = cache_poll_pipefs, |
| 1576 | .ioctl = cache_ioctl_pipefs, /* for FIONREAD */ | 1583 | .unlocked_ioctl = cache_ioctl_pipefs, /* for FIONREAD */ |
| 1577 | .open = cache_open_pipefs, | 1584 | .open = cache_open_pipefs, |
| 1578 | .release = cache_release_pipefs, | 1585 | .release = cache_release_pipefs, |
| 1579 | }; | 1586 | }; |
diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c index 20e30c6f8355..95ccbcf45d3e 100644 --- a/net/sunrpc/rpc_pipe.c +++ b/net/sunrpc/rpc_pipe.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <linux/workqueue.h> | 27 | #include <linux/workqueue.h> |
| 28 | #include <linux/sunrpc/rpc_pipe_fs.h> | 28 | #include <linux/sunrpc/rpc_pipe_fs.h> |
| 29 | #include <linux/sunrpc/cache.h> | 29 | #include <linux/sunrpc/cache.h> |
| 30 | #include <linux/smp_lock.h> | ||
| 30 | 31 | ||
| 31 | static struct vfsmount *rpc_mount __read_mostly; | 32 | static struct vfsmount *rpc_mount __read_mostly; |
| 32 | static int rpc_mount_count; | 33 | static int rpc_mount_count; |
| @@ -309,8 +310,7 @@ rpc_pipe_poll(struct file *filp, struct poll_table_struct *wait) | |||
| 309 | } | 310 | } |
| 310 | 311 | ||
| 311 | static int | 312 | static int |
| 312 | rpc_pipe_ioctl(struct inode *ino, struct file *filp, | 313 | rpc_pipe_ioctl_unlocked(struct file *filp, unsigned int cmd, unsigned long arg) |
| 313 | unsigned int cmd, unsigned long arg) | ||
| 314 | { | 314 | { |
| 315 | struct rpc_inode *rpci = RPC_I(filp->f_path.dentry->d_inode); | 315 | struct rpc_inode *rpci = RPC_I(filp->f_path.dentry->d_inode); |
| 316 | int len; | 316 | int len; |
| @@ -331,13 +331,25 @@ rpc_pipe_ioctl(struct inode *ino, struct file *filp, | |||
| 331 | } | 331 | } |
| 332 | } | 332 | } |
| 333 | 333 | ||
| 334 | static long | ||
| 335 | rpc_pipe_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) | ||
| 336 | { | ||
| 337 | long ret; | ||
| 338 | |||
| 339 | lock_kernel(); | ||
| 340 | ret = rpc_pipe_ioctl_unlocked(filp, cmd, arg); | ||
| 341 | unlock_kernel(); | ||
| 342 | |||
| 343 | return ret; | ||
| 344 | } | ||
| 345 | |||
| 334 | static const struct file_operations rpc_pipe_fops = { | 346 | static const struct file_operations rpc_pipe_fops = { |
| 335 | .owner = THIS_MODULE, | 347 | .owner = THIS_MODULE, |
| 336 | .llseek = no_llseek, | 348 | .llseek = no_llseek, |
| 337 | .read = rpc_pipe_read, | 349 | .read = rpc_pipe_read, |
| 338 | .write = rpc_pipe_write, | 350 | .write = rpc_pipe_write, |
| 339 | .poll = rpc_pipe_poll, | 351 | .poll = rpc_pipe_poll, |
| 340 | .ioctl = rpc_pipe_ioctl, | 352 | .unlocked_ioctl = rpc_pipe_ioctl, |
| 341 | .open = rpc_pipe_open, | 353 | .open = rpc_pipe_open, |
| 342 | .release = rpc_pipe_release, | 354 | .release = rpc_pipe_release, |
| 343 | }; | 355 | }; |
diff --git a/net/sunrpc/rpcb_clnt.c b/net/sunrpc/rpcb_clnt.c index 121105355f60..dac219a56ae1 100644 --- a/net/sunrpc/rpcb_clnt.c +++ b/net/sunrpc/rpcb_clnt.c | |||
| @@ -783,7 +783,7 @@ static int rpcb_dec_getport(struct rpc_rqst *req, __be32 *p, | |||
| 783 | port = ntohl(*p); | 783 | port = ntohl(*p); |
| 784 | dprintk("RPC: %5u PMAP_%s result: %lu\n", task->tk_pid, | 784 | dprintk("RPC: %5u PMAP_%s result: %lu\n", task->tk_pid, |
| 785 | task->tk_msg.rpc_proc->p_name, port); | 785 | task->tk_msg.rpc_proc->p_name, port); |
| 786 | if (unlikely(port > USHORT_MAX)) | 786 | if (unlikely(port > USHRT_MAX)) |
| 787 | return -EIO; | 787 | return -EIO; |
| 788 | 788 | ||
| 789 | rpcb->r_port = port; | 789 | rpcb->r_port = port; |
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index 3fc325399ee4..dcd0132396ba 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c | |||
| @@ -166,7 +166,6 @@ EXPORT_SYMBOL_GPL(xprt_unregister_transport); | |||
| 166 | int xprt_load_transport(const char *transport_name) | 166 | int xprt_load_transport(const char *transport_name) |
| 167 | { | 167 | { |
| 168 | struct xprt_class *t; | 168 | struct xprt_class *t; |
| 169 | char module_name[sizeof t->name + 5]; | ||
| 170 | int result; | 169 | int result; |
| 171 | 170 | ||
| 172 | result = 0; | 171 | result = 0; |
| @@ -178,9 +177,7 @@ int xprt_load_transport(const char *transport_name) | |||
| 178 | } | 177 | } |
| 179 | } | 178 | } |
| 180 | spin_unlock(&xprt_list_lock); | 179 | spin_unlock(&xprt_list_lock); |
| 181 | strcpy(module_name, "xprt"); | 180 | result = request_module("xprt%s", transport_name); |
| 182 | strncat(module_name, transport_name, sizeof t->name); | ||
| 183 | result = request_module(module_name); | ||
| 184 | out: | 181 | out: |
| 185 | return result; | 182 | return result; |
| 186 | } | 183 | } |
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index b7cd8cccbe72..2a9675136c68 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
| @@ -2293,6 +2293,7 @@ static struct rpc_xprt *xs_setup_udp(struct xprt_create *args) | |||
| 2293 | struct sockaddr *addr = args->dstaddr; | 2293 | struct sockaddr *addr = args->dstaddr; |
| 2294 | struct rpc_xprt *xprt; | 2294 | struct rpc_xprt *xprt; |
| 2295 | struct sock_xprt *transport; | 2295 | struct sock_xprt *transport; |
| 2296 | struct rpc_xprt *ret; | ||
| 2296 | 2297 | ||
| 2297 | xprt = xs_setup_xprt(args, xprt_udp_slot_table_entries); | 2298 | xprt = xs_setup_xprt(args, xprt_udp_slot_table_entries); |
| 2298 | if (IS_ERR(xprt)) | 2299 | if (IS_ERR(xprt)) |
| @@ -2330,8 +2331,8 @@ static struct rpc_xprt *xs_setup_udp(struct xprt_create *args) | |||
| 2330 | xs_format_peer_addresses(xprt, "udp", RPCBIND_NETID_UDP6); | 2331 | xs_format_peer_addresses(xprt, "udp", RPCBIND_NETID_UDP6); |
| 2331 | break; | 2332 | break; |
| 2332 | default: | 2333 | default: |
| 2333 | kfree(xprt); | 2334 | ret = ERR_PTR(-EAFNOSUPPORT); |
| 2334 | return ERR_PTR(-EAFNOSUPPORT); | 2335 | goto out_err; |
| 2335 | } | 2336 | } |
| 2336 | 2337 | ||
| 2337 | if (xprt_bound(xprt)) | 2338 | if (xprt_bound(xprt)) |
| @@ -2346,10 +2347,11 @@ static struct rpc_xprt *xs_setup_udp(struct xprt_create *args) | |||
| 2346 | 2347 | ||
| 2347 | if (try_module_get(THIS_MODULE)) | 2348 | if (try_module_get(THIS_MODULE)) |
| 2348 | return xprt; | 2349 | return xprt; |
| 2349 | 2350 | ret = ERR_PTR(-EINVAL); | |
| 2351 | out_err: | ||
| 2350 | kfree(xprt->slot); | 2352 | kfree(xprt->slot); |
| 2351 | kfree(xprt); | 2353 | kfree(xprt); |
| 2352 | return ERR_PTR(-EINVAL); | 2354 | return ret; |
| 2353 | } | 2355 | } |
| 2354 | 2356 | ||
| 2355 | static const struct rpc_timeout xs_tcp_default_timeout = { | 2357 | static const struct rpc_timeout xs_tcp_default_timeout = { |
| @@ -2368,6 +2370,7 @@ static struct rpc_xprt *xs_setup_tcp(struct xprt_create *args) | |||
| 2368 | struct sockaddr *addr = args->dstaddr; | 2370 | struct sockaddr *addr = args->dstaddr; |
| 2369 | struct rpc_xprt *xprt; | 2371 | struct rpc_xprt *xprt; |
| 2370 | struct sock_xprt *transport; | 2372 | struct sock_xprt *transport; |
| 2373 | struct rpc_xprt *ret; | ||
| 2371 | 2374 | ||
| 2372 | xprt = xs_setup_xprt(args, xprt_tcp_slot_table_entries); | 2375 | xprt = xs_setup_xprt(args, xprt_tcp_slot_table_entries); |
| 2373 | if (IS_ERR(xprt)) | 2376 | if (IS_ERR(xprt)) |
| @@ -2403,8 +2406,8 @@ static struct rpc_xprt *xs_setup_tcp(struct xprt_create *args) | |||
| 2403 | xs_format_peer_addresses(xprt, "tcp", RPCBIND_NETID_TCP6); | 2406 | xs_format_peer_addresses(xprt, "tcp", RPCBIND_NETID_TCP6); |
| 2404 | break; | 2407 | break; |
| 2405 | default: | 2408 | default: |
| 2406 | kfree(xprt); | 2409 | ret = ERR_PTR(-EAFNOSUPPORT); |
| 2407 | return ERR_PTR(-EAFNOSUPPORT); | 2410 | goto out_err; |
| 2408 | } | 2411 | } |
| 2409 | 2412 | ||
| 2410 | if (xprt_bound(xprt)) | 2413 | if (xprt_bound(xprt)) |
| @@ -2420,10 +2423,11 @@ static struct rpc_xprt *xs_setup_tcp(struct xprt_create *args) | |||
| 2420 | 2423 | ||
| 2421 | if (try_module_get(THIS_MODULE)) | 2424 | if (try_module_get(THIS_MODULE)) |
| 2422 | return xprt; | 2425 | return xprt; |
| 2423 | 2426 | ret = ERR_PTR(-EINVAL); | |
| 2427 | out_err: | ||
| 2424 | kfree(xprt->slot); | 2428 | kfree(xprt->slot); |
| 2425 | kfree(xprt); | 2429 | kfree(xprt); |
| 2426 | return ERR_PTR(-EINVAL); | 2430 | return ret; |
| 2427 | } | 2431 | } |
| 2428 | 2432 | ||
| 2429 | /** | 2433 | /** |
| @@ -2437,6 +2441,7 @@ static struct rpc_xprt *xs_setup_bc_tcp(struct xprt_create *args) | |||
| 2437 | struct rpc_xprt *xprt; | 2441 | struct rpc_xprt *xprt; |
| 2438 | struct sock_xprt *transport; | 2442 | struct sock_xprt *transport; |
| 2439 | struct svc_sock *bc_sock; | 2443 | struct svc_sock *bc_sock; |
| 2444 | struct rpc_xprt *ret; | ||
| 2440 | 2445 | ||
| 2441 | xprt = xs_setup_xprt(args, xprt_tcp_slot_table_entries); | 2446 | xprt = xs_setup_xprt(args, xprt_tcp_slot_table_entries); |
| 2442 | if (IS_ERR(xprt)) | 2447 | if (IS_ERR(xprt)) |
| @@ -2476,8 +2481,8 @@ static struct rpc_xprt *xs_setup_bc_tcp(struct xprt_create *args) | |||
| 2476 | RPCBIND_NETID_TCP6); | 2481 | RPCBIND_NETID_TCP6); |
| 2477 | break; | 2482 | break; |
| 2478 | default: | 2483 | default: |
| 2479 | kfree(xprt); | 2484 | ret = ERR_PTR(-EAFNOSUPPORT); |
| 2480 | return ERR_PTR(-EAFNOSUPPORT); | 2485 | goto out_err; |
| 2481 | } | 2486 | } |
| 2482 | 2487 | ||
| 2483 | if (xprt_bound(xprt)) | 2488 | if (xprt_bound(xprt)) |
| @@ -2499,9 +2504,11 @@ static struct rpc_xprt *xs_setup_bc_tcp(struct xprt_create *args) | |||
| 2499 | 2504 | ||
| 2500 | if (try_module_get(THIS_MODULE)) | 2505 | if (try_module_get(THIS_MODULE)) |
| 2501 | return xprt; | 2506 | return xprt; |
| 2507 | ret = ERR_PTR(-EINVAL); | ||
| 2508 | out_err: | ||
| 2502 | kfree(xprt->slot); | 2509 | kfree(xprt->slot); |
| 2503 | kfree(xprt); | 2510 | kfree(xprt); |
| 2504 | return ERR_PTR(-EINVAL); | 2511 | return ret; |
| 2505 | } | 2512 | } |
| 2506 | 2513 | ||
| 2507 | static struct xprt_class xs_udp_transport = { | 2514 | static struct xprt_class xs_udp_transport = { |
