diff options
author | David S. Miller <davem@davemloft.net> | 2011-03-10 17:26:00 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-03-10 17:26:00 -0500 |
commit | 33175d84ee3fa29991adb80513683e010769e807 (patch) | |
tree | 3731f61cf82451b6892cf1368701e57e35d92908 /net | |
parent | c5908939b2738bafe1b309bc2465cb9f2e6184c5 (diff) | |
parent | 6dfbd87a20a737641ef228230c77f4262434fa24 (diff) |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts:
drivers/net/bnx2x/bnx2x_cmn.c
Diffstat (limited to 'net')
-rw-r--r-- | net/Makefile | 4 | ||||
-rw-r--r-- | net/bridge/Kconfig | 1 | ||||
-rw-r--r-- | net/ceph/messenger.c | 71 | ||||
-rw-r--r-- | net/ceph/pagevec.c | 18 | ||||
-rw-r--r-- | net/core/dev.c | 12 | ||||
-rw-r--r-- | net/core/pktgen.c | 2 | ||||
-rw-r--r-- | net/ipv4/devinet.c | 6 | ||||
-rw-r--r-- | net/ipv4/ip_gre.c | 2 | ||||
-rw-r--r-- | net/ipv4/ipip.c | 2 | ||||
-rw-r--r-- | net/ipv6/ip6_tunnel.c | 1 | ||||
-rw-r--r-- | net/ipv6/route.c | 4 | ||||
-rw-r--r-- | net/ipv6/sit.c | 2 | ||||
-rw-r--r-- | net/rds/ib_send.c | 5 | ||||
-rw-r--r-- | net/rds/loop.c | 11 | ||||
-rw-r--r-- | net/unix/af_unix.c | 17 |
15 files changed, 115 insertions, 43 deletions
diff --git a/net/Makefile b/net/Makefile index a3330ebe2c53..a51d9465e628 100644 --- a/net/Makefile +++ b/net/Makefile | |||
@@ -19,9 +19,7 @@ obj-$(CONFIG_NETFILTER) += netfilter/ | |||
19 | obj-$(CONFIG_INET) += ipv4/ | 19 | obj-$(CONFIG_INET) += ipv4/ |
20 | obj-$(CONFIG_XFRM) += xfrm/ | 20 | obj-$(CONFIG_XFRM) += xfrm/ |
21 | obj-$(CONFIG_UNIX) += unix/ | 21 | obj-$(CONFIG_UNIX) += unix/ |
22 | ifneq ($(CONFIG_IPV6),) | 22 | obj-$(CONFIG_NET) += ipv6/ |
23 | obj-y += ipv6/ | ||
24 | endif | ||
25 | obj-$(CONFIG_PACKET) += packet/ | 23 | obj-$(CONFIG_PACKET) += packet/ |
26 | obj-$(CONFIG_NET_KEY) += key/ | 24 | obj-$(CONFIG_NET_KEY) += key/ |
27 | obj-$(CONFIG_BRIDGE) += bridge/ | 25 | obj-$(CONFIG_BRIDGE) += bridge/ |
diff --git a/net/bridge/Kconfig b/net/bridge/Kconfig index 9190ae462cb4..6dee7bf648a9 100644 --- a/net/bridge/Kconfig +++ b/net/bridge/Kconfig | |||
@@ -6,6 +6,7 @@ config BRIDGE | |||
6 | tristate "802.1d Ethernet Bridging" | 6 | tristate "802.1d Ethernet Bridging" |
7 | select LLC | 7 | select LLC |
8 | select STP | 8 | select STP |
9 | depends on IPV6 || IPV6=n | ||
9 | ---help--- | 10 | ---help--- |
10 | If you say Y here, then your Linux box will be able to act as an | 11 | If you say Y here, then your Linux box will be able to act as an |
11 | Ethernet bridge, which means that the different Ethernet segments it | 12 | Ethernet bridge, which means that the different Ethernet segments it |
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c index 35b36b86d762..05f357828a2f 100644 --- a/net/ceph/messenger.c +++ b/net/ceph/messenger.c | |||
@@ -336,7 +336,6 @@ static void reset_connection(struct ceph_connection *con) | |||
336 | ceph_msg_put(con->out_msg); | 336 | ceph_msg_put(con->out_msg); |
337 | con->out_msg = NULL; | 337 | con->out_msg = NULL; |
338 | } | 338 | } |
339 | con->out_keepalive_pending = false; | ||
340 | con->in_seq = 0; | 339 | con->in_seq = 0; |
341 | con->in_seq_acked = 0; | 340 | con->in_seq_acked = 0; |
342 | } | 341 | } |
@@ -1248,8 +1247,6 @@ static int process_connect(struct ceph_connection *con) | |||
1248 | con->auth_retry); | 1247 | con->auth_retry); |
1249 | if (con->auth_retry == 2) { | 1248 | if (con->auth_retry == 2) { |
1250 | con->error_msg = "connect authorization failure"; | 1249 | con->error_msg = "connect authorization failure"; |
1251 | reset_connection(con); | ||
1252 | set_bit(CLOSED, &con->state); | ||
1253 | return -1; | 1250 | return -1; |
1254 | } | 1251 | } |
1255 | con->auth_retry = 1; | 1252 | con->auth_retry = 1; |
@@ -1715,14 +1712,6 @@ more: | |||
1715 | 1712 | ||
1716 | /* open the socket first? */ | 1713 | /* open the socket first? */ |
1717 | if (con->sock == NULL) { | 1714 | if (con->sock == NULL) { |
1718 | /* | ||
1719 | * if we were STANDBY and are reconnecting _this_ | ||
1720 | * connection, bump connect_seq now. Always bump | ||
1721 | * global_seq. | ||
1722 | */ | ||
1723 | if (test_and_clear_bit(STANDBY, &con->state)) | ||
1724 | con->connect_seq++; | ||
1725 | |||
1726 | prepare_write_banner(msgr, con); | 1715 | prepare_write_banner(msgr, con); |
1727 | prepare_write_connect(msgr, con, 1); | 1716 | prepare_write_connect(msgr, con, 1); |
1728 | prepare_read_banner(con); | 1717 | prepare_read_banner(con); |
@@ -1951,7 +1940,24 @@ static void con_work(struct work_struct *work) | |||
1951 | work.work); | 1940 | work.work); |
1952 | 1941 | ||
1953 | mutex_lock(&con->mutex); | 1942 | mutex_lock(&con->mutex); |
1943 | if (test_and_clear_bit(BACKOFF, &con->state)) { | ||
1944 | dout("con_work %p backing off\n", con); | ||
1945 | if (queue_delayed_work(ceph_msgr_wq, &con->work, | ||
1946 | round_jiffies_relative(con->delay))) { | ||
1947 | dout("con_work %p backoff %lu\n", con, con->delay); | ||
1948 | mutex_unlock(&con->mutex); | ||
1949 | return; | ||
1950 | } else { | ||
1951 | con->ops->put(con); | ||
1952 | dout("con_work %p FAILED to back off %lu\n", con, | ||
1953 | con->delay); | ||
1954 | } | ||
1955 | } | ||
1954 | 1956 | ||
1957 | if (test_bit(STANDBY, &con->state)) { | ||
1958 | dout("con_work %p STANDBY\n", con); | ||
1959 | goto done; | ||
1960 | } | ||
1955 | if (test_bit(CLOSED, &con->state)) { /* e.g. if we are replaced */ | 1961 | if (test_bit(CLOSED, &con->state)) { /* e.g. if we are replaced */ |
1956 | dout("con_work CLOSED\n"); | 1962 | dout("con_work CLOSED\n"); |
1957 | con_close_socket(con); | 1963 | con_close_socket(con); |
@@ -2008,10 +2014,12 @@ static void ceph_fault(struct ceph_connection *con) | |||
2008 | /* Requeue anything that hasn't been acked */ | 2014 | /* Requeue anything that hasn't been acked */ |
2009 | list_splice_init(&con->out_sent, &con->out_queue); | 2015 | list_splice_init(&con->out_sent, &con->out_queue); |
2010 | 2016 | ||
2011 | /* If there are no messages in the queue, place the connection | 2017 | /* If there are no messages queued or keepalive pending, place |
2012 | * in a STANDBY state (i.e., don't try to reconnect just yet). */ | 2018 | * the connection in a STANDBY state */ |
2013 | if (list_empty(&con->out_queue) && !con->out_keepalive_pending) { | 2019 | if (list_empty(&con->out_queue) && |
2014 | dout("fault setting STANDBY\n"); | 2020 | !test_bit(KEEPALIVE_PENDING, &con->state)) { |
2021 | dout("fault %p setting STANDBY clearing WRITE_PENDING\n", con); | ||
2022 | clear_bit(WRITE_PENDING, &con->state); | ||
2015 | set_bit(STANDBY, &con->state); | 2023 | set_bit(STANDBY, &con->state); |
2016 | } else { | 2024 | } else { |
2017 | /* retry after a delay. */ | 2025 | /* retry after a delay. */ |
@@ -2019,11 +2027,24 @@ static void ceph_fault(struct ceph_connection *con) | |||
2019 | con->delay = BASE_DELAY_INTERVAL; | 2027 | con->delay = BASE_DELAY_INTERVAL; |
2020 | else if (con->delay < MAX_DELAY_INTERVAL) | 2028 | else if (con->delay < MAX_DELAY_INTERVAL) |
2021 | con->delay *= 2; | 2029 | con->delay *= 2; |
2022 | dout("fault queueing %p delay %lu\n", con, con->delay); | ||
2023 | con->ops->get(con); | 2030 | con->ops->get(con); |
2024 | if (queue_delayed_work(ceph_msgr_wq, &con->work, | 2031 | if (queue_delayed_work(ceph_msgr_wq, &con->work, |
2025 | round_jiffies_relative(con->delay)) == 0) | 2032 | round_jiffies_relative(con->delay))) { |
2033 | dout("fault queued %p delay %lu\n", con, con->delay); | ||
2034 | } else { | ||
2026 | con->ops->put(con); | 2035 | con->ops->put(con); |
2036 | dout("fault failed to queue %p delay %lu, backoff\n", | ||
2037 | con, con->delay); | ||
2038 | /* | ||
2039 | * In many cases we see a socket state change | ||
2040 | * while con_work is running and end up | ||
2041 | * queuing (non-delayed) work, such that we | ||
2042 | * can't backoff with a delay. Set a flag so | ||
2043 | * that when con_work restarts we schedule the | ||
2044 | * delay then. | ||
2045 | */ | ||
2046 | set_bit(BACKOFF, &con->state); | ||
2047 | } | ||
2027 | } | 2048 | } |
2028 | 2049 | ||
2029 | out_unlock: | 2050 | out_unlock: |
@@ -2094,6 +2115,19 @@ void ceph_messenger_destroy(struct ceph_messenger *msgr) | |||
2094 | } | 2115 | } |
2095 | EXPORT_SYMBOL(ceph_messenger_destroy); | 2116 | EXPORT_SYMBOL(ceph_messenger_destroy); |
2096 | 2117 | ||
2118 | static void clear_standby(struct ceph_connection *con) | ||
2119 | { | ||
2120 | /* come back from STANDBY? */ | ||
2121 | if (test_and_clear_bit(STANDBY, &con->state)) { | ||
2122 | mutex_lock(&con->mutex); | ||
2123 | dout("clear_standby %p and ++connect_seq\n", con); | ||
2124 | con->connect_seq++; | ||
2125 | WARN_ON(test_bit(WRITE_PENDING, &con->state)); | ||
2126 | WARN_ON(test_bit(KEEPALIVE_PENDING, &con->state)); | ||
2127 | mutex_unlock(&con->mutex); | ||
2128 | } | ||
2129 | } | ||
2130 | |||
2097 | /* | 2131 | /* |
2098 | * Queue up an outgoing message on the given connection. | 2132 | * Queue up an outgoing message on the given connection. |
2099 | */ | 2133 | */ |
@@ -2126,6 +2160,7 @@ void ceph_con_send(struct ceph_connection *con, struct ceph_msg *msg) | |||
2126 | 2160 | ||
2127 | /* if there wasn't anything waiting to send before, queue | 2161 | /* if there wasn't anything waiting to send before, queue |
2128 | * new work */ | 2162 | * new work */ |
2163 | clear_standby(con); | ||
2129 | if (test_and_set_bit(WRITE_PENDING, &con->state) == 0) | 2164 | if (test_and_set_bit(WRITE_PENDING, &con->state) == 0) |
2130 | queue_con(con); | 2165 | queue_con(con); |
2131 | } | 2166 | } |
@@ -2191,6 +2226,8 @@ void ceph_con_revoke_message(struct ceph_connection *con, struct ceph_msg *msg) | |||
2191 | */ | 2226 | */ |
2192 | void ceph_con_keepalive(struct ceph_connection *con) | 2227 | void ceph_con_keepalive(struct ceph_connection *con) |
2193 | { | 2228 | { |
2229 | dout("con_keepalive %p\n", con); | ||
2230 | clear_standby(con); | ||
2194 | if (test_and_set_bit(KEEPALIVE_PENDING, &con->state) == 0 && | 2231 | if (test_and_set_bit(KEEPALIVE_PENDING, &con->state) == 0 && |
2195 | test_and_set_bit(WRITE_PENDING, &con->state) == 0) | 2232 | test_and_set_bit(WRITE_PENDING, &con->state) == 0) |
2196 | queue_con(con); | 2233 | queue_con(con); |
diff --git a/net/ceph/pagevec.c b/net/ceph/pagevec.c index 1a040e64c69f..cd9c21df87d1 100644 --- a/net/ceph/pagevec.c +++ b/net/ceph/pagevec.c | |||
@@ -16,22 +16,30 @@ struct page **ceph_get_direct_page_vector(const char __user *data, | |||
16 | int num_pages, bool write_page) | 16 | int num_pages, bool write_page) |
17 | { | 17 | { |
18 | struct page **pages; | 18 | struct page **pages; |
19 | int rc; | 19 | int got = 0; |
20 | int rc = 0; | ||
20 | 21 | ||
21 | pages = kmalloc(sizeof(*pages) * num_pages, GFP_NOFS); | 22 | pages = kmalloc(sizeof(*pages) * num_pages, GFP_NOFS); |
22 | if (!pages) | 23 | if (!pages) |
23 | return ERR_PTR(-ENOMEM); | 24 | return ERR_PTR(-ENOMEM); |
24 | 25 | ||
25 | down_read(¤t->mm->mmap_sem); | 26 | down_read(¤t->mm->mmap_sem); |
26 | rc = get_user_pages(current, current->mm, (unsigned long)data, | 27 | while (got < num_pages) { |
27 | num_pages, write_page, 0, pages, NULL); | 28 | rc = get_user_pages(current, current->mm, |
29 | (unsigned long)data + ((unsigned long)got * PAGE_SIZE), | ||
30 | num_pages - got, write_page, 0, pages + got, NULL); | ||
31 | if (rc < 0) | ||
32 | break; | ||
33 | BUG_ON(rc == 0); | ||
34 | got += rc; | ||
35 | } | ||
28 | up_read(¤t->mm->mmap_sem); | 36 | up_read(¤t->mm->mmap_sem); |
29 | if (rc < num_pages) | 37 | if (rc < 0) |
30 | goto fail; | 38 | goto fail; |
31 | return pages; | 39 | return pages; |
32 | 40 | ||
33 | fail: | 41 | fail: |
34 | ceph_put_page_vector(pages, rc > 0 ? rc : 0, false); | 42 | ceph_put_page_vector(pages, got, false); |
35 | return ERR_PTR(rc); | 43 | return ERR_PTR(rc); |
36 | } | 44 | } |
37 | EXPORT_SYMBOL(ceph_get_direct_page_vector); | 45 | EXPORT_SYMBOL(ceph_get_direct_page_vector); |
diff --git a/net/core/dev.c b/net/core/dev.c index 9f66de9c0572..0d39032e9621 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -1115,13 +1115,21 @@ EXPORT_SYMBOL(netdev_bonding_change); | |||
1115 | void dev_load(struct net *net, const char *name) | 1115 | void dev_load(struct net *net, const char *name) |
1116 | { | 1116 | { |
1117 | struct net_device *dev; | 1117 | struct net_device *dev; |
1118 | int no_module; | ||
1118 | 1119 | ||
1119 | rcu_read_lock(); | 1120 | rcu_read_lock(); |
1120 | dev = dev_get_by_name_rcu(net, name); | 1121 | dev = dev_get_by_name_rcu(net, name); |
1121 | rcu_read_unlock(); | 1122 | rcu_read_unlock(); |
1122 | 1123 | ||
1123 | if (!dev && capable(CAP_NET_ADMIN)) | 1124 | no_module = !dev; |
1124 | request_module("%s", name); | 1125 | if (no_module && capable(CAP_NET_ADMIN)) |
1126 | no_module = request_module("netdev-%s", name); | ||
1127 | if (no_module && capable(CAP_SYS_MODULE)) { | ||
1128 | if (!request_module("%s", name)) | ||
1129 | pr_err("Loading kernel module for a network device " | ||
1130 | "with CAP_SYS_MODULE (deprecated). Use CAP_NET_ADMIN and alias netdev-%s " | ||
1131 | "instead\n", name); | ||
1132 | } | ||
1125 | } | 1133 | } |
1126 | EXPORT_SYMBOL(dev_load); | 1134 | EXPORT_SYMBOL(dev_load); |
1127 | 1135 | ||
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index d73b77adb676..f0aec6c39ecd 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
@@ -3271,7 +3271,7 @@ static void show_results(struct pktgen_dev *pkt_dev, int nr_frags) | |||
3271 | pkt_dev->started_at); | 3271 | pkt_dev->started_at); |
3272 | ktime_t idle = ns_to_ktime(pkt_dev->idle_acc); | 3272 | ktime_t idle = ns_to_ktime(pkt_dev->idle_acc); |
3273 | 3273 | ||
3274 | p += sprintf(p, "OK: %llu(c%llu+d%llu) nsec, %llu (%dbyte,%dfrags)\n", | 3274 | p += sprintf(p, "OK: %llu(c%llu+d%llu) usec, %llu (%dbyte,%dfrags)\n", |
3275 | (unsigned long long)ktime_to_us(elapsed), | 3275 | (unsigned long long)ktime_to_us(elapsed), |
3276 | (unsigned long long)ktime_to_us(ktime_sub(elapsed, idle)), | 3276 | (unsigned long long)ktime_to_us(ktime_sub(elapsed, idle)), |
3277 | (unsigned long long)ktime_to_us(idle), | 3277 | (unsigned long long)ktime_to_us(idle), |
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index ff53860d1e56..6d85800daeb7 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c | |||
@@ -741,7 +741,7 @@ int devinet_ioctl(struct net *net, unsigned int cmd, void __user *arg) | |||
741 | ifap = &ifa->ifa_next) { | 741 | ifap = &ifa->ifa_next) { |
742 | if (!strcmp(ifr.ifr_name, ifa->ifa_label) && | 742 | if (!strcmp(ifr.ifr_name, ifa->ifa_label) && |
743 | sin_orig.sin_addr.s_addr == | 743 | sin_orig.sin_addr.s_addr == |
744 | ifa->ifa_address) { | 744 | ifa->ifa_local) { |
745 | break; /* found */ | 745 | break; /* found */ |
746 | } | 746 | } |
747 | } | 747 | } |
@@ -1112,8 +1112,8 @@ static void inetdev_send_gratuitous_arp(struct net_device *dev, | |||
1112 | return; | 1112 | return; |
1113 | 1113 | ||
1114 | arp_send(ARPOP_REQUEST, ETH_P_ARP, | 1114 | arp_send(ARPOP_REQUEST, ETH_P_ARP, |
1115 | ifa->ifa_address, dev, | 1115 | ifa->ifa_local, dev, |
1116 | ifa->ifa_address, NULL, | 1116 | ifa->ifa_local, NULL, |
1117 | dev->dev_addr, NULL); | 1117 | dev->dev_addr, NULL); |
1118 | } | 1118 | } |
1119 | 1119 | ||
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index f9af98dd7561..71465955520b 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c | |||
@@ -1766,4 +1766,4 @@ module_exit(ipgre_fini); | |||
1766 | MODULE_LICENSE("GPL"); | 1766 | MODULE_LICENSE("GPL"); |
1767 | MODULE_ALIAS_RTNL_LINK("gre"); | 1767 | MODULE_ALIAS_RTNL_LINK("gre"); |
1768 | MODULE_ALIAS_RTNL_LINK("gretap"); | 1768 | MODULE_ALIAS_RTNL_LINK("gretap"); |
1769 | MODULE_ALIAS("gre0"); | 1769 | MODULE_ALIAS_NETDEV("gre0"); |
diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c index e1e17576baa6..65008f45addc 100644 --- a/net/ipv4/ipip.c +++ b/net/ipv4/ipip.c | |||
@@ -914,4 +914,4 @@ static void __exit ipip_fini(void) | |||
914 | module_init(ipip_init); | 914 | module_init(ipip_init); |
915 | module_exit(ipip_fini); | 915 | module_exit(ipip_fini); |
916 | MODULE_LICENSE("GPL"); | 916 | MODULE_LICENSE("GPL"); |
917 | MODULE_ALIAS("tunl0"); | 917 | MODULE_ALIAS_NETDEV("tunl0"); |
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c index 02730ef26b0f..ea8d5e8128a9 100644 --- a/net/ipv6/ip6_tunnel.c +++ b/net/ipv6/ip6_tunnel.c | |||
@@ -57,6 +57,7 @@ | |||
57 | MODULE_AUTHOR("Ville Nuorvala"); | 57 | MODULE_AUTHOR("Ville Nuorvala"); |
58 | MODULE_DESCRIPTION("IPv6 tunneling device"); | 58 | MODULE_DESCRIPTION("IPv6 tunneling device"); |
59 | MODULE_LICENSE("GPL"); | 59 | MODULE_LICENSE("GPL"); |
60 | MODULE_ALIAS_NETDEV("ip6tnl0"); | ||
60 | 61 | ||
61 | #ifdef IP6_TNL_DEBUG | 62 | #ifdef IP6_TNL_DEBUG |
62 | #define IP6_TNL_TRACE(x...) printk(KERN_DEBUG "%s:" x "\n", __func__) | 63 | #define IP6_TNL_TRACE(x...) printk(KERN_DEBUG "%s:" x "\n", __func__) |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index d55d00c2a824..001276055a6b 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -783,8 +783,10 @@ restart: | |||
783 | 783 | ||
784 | if (!rt->rt6i_nexthop && !(rt->rt6i_flags & RTF_NONEXTHOP)) | 784 | if (!rt->rt6i_nexthop && !(rt->rt6i_flags & RTF_NONEXTHOP)) |
785 | nrt = rt6_alloc_cow(rt, &fl->fl6_dst, &fl->fl6_src); | 785 | nrt = rt6_alloc_cow(rt, &fl->fl6_dst, &fl->fl6_src); |
786 | else | 786 | else if (!(rt->dst.flags & DST_HOST)) |
787 | nrt = rt6_alloc_clone(rt, &fl->fl6_dst); | 787 | nrt = rt6_alloc_clone(rt, &fl->fl6_dst); |
788 | else | ||
789 | goto out2; | ||
788 | 790 | ||
789 | dst_release(&rt->dst); | 791 | dst_release(&rt->dst); |
790 | rt = nrt ? : net->ipv6.ip6_null_entry; | 792 | rt = nrt ? : net->ipv6.ip6_null_entry; |
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index b8c8adbd7cf6..3534ceaa4fba 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
@@ -1295,4 +1295,4 @@ static int __init sit_init(void) | |||
1295 | module_init(sit_init); | 1295 | module_init(sit_init); |
1296 | module_exit(sit_cleanup); | 1296 | module_exit(sit_cleanup); |
1297 | MODULE_LICENSE("GPL"); | 1297 | MODULE_LICENSE("GPL"); |
1298 | MODULE_ALIAS("sit0"); | 1298 | MODULE_ALIAS_NETDEV("sit0"); |
diff --git a/net/rds/ib_send.c b/net/rds/ib_send.c index 71f373c421bc..c47a511f203d 100644 --- a/net/rds/ib_send.c +++ b/net/rds/ib_send.c | |||
@@ -551,7 +551,10 @@ int rds_ib_xmit(struct rds_connection *conn, struct rds_message *rm, | |||
551 | if (conn->c_loopback | 551 | if (conn->c_loopback |
552 | && rm->m_inc.i_hdr.h_flags & RDS_FLAG_CONG_BITMAP) { | 552 | && rm->m_inc.i_hdr.h_flags & RDS_FLAG_CONG_BITMAP) { |
553 | rds_cong_map_updated(conn->c_fcong, ~(u64) 0); | 553 | rds_cong_map_updated(conn->c_fcong, ~(u64) 0); |
554 | return sizeof(struct rds_header) + RDS_CONG_MAP_BYTES; | 554 | scat = &rm->data.op_sg[sg]; |
555 | ret = sizeof(struct rds_header) + RDS_CONG_MAP_BYTES; | ||
556 | ret = min_t(int, ret, scat->length - conn->c_xmit_data_off); | ||
557 | return ret; | ||
555 | } | 558 | } |
556 | 559 | ||
557 | /* FIXME we may overallocate here */ | 560 | /* FIXME we may overallocate here */ |
diff --git a/net/rds/loop.c b/net/rds/loop.c index aeec1d483b17..bca6761a3ca2 100644 --- a/net/rds/loop.c +++ b/net/rds/loop.c | |||
@@ -61,10 +61,15 @@ static int rds_loop_xmit(struct rds_connection *conn, struct rds_message *rm, | |||
61 | unsigned int hdr_off, unsigned int sg, | 61 | unsigned int hdr_off, unsigned int sg, |
62 | unsigned int off) | 62 | unsigned int off) |
63 | { | 63 | { |
64 | struct scatterlist *sgp = &rm->data.op_sg[sg]; | ||
65 | int ret = sizeof(struct rds_header) + | ||
66 | be32_to_cpu(rm->m_inc.i_hdr.h_len); | ||
67 | |||
64 | /* Do not send cong updates to loopback */ | 68 | /* Do not send cong updates to loopback */ |
65 | if (rm->m_inc.i_hdr.h_flags & RDS_FLAG_CONG_BITMAP) { | 69 | if (rm->m_inc.i_hdr.h_flags & RDS_FLAG_CONG_BITMAP) { |
66 | rds_cong_map_updated(conn->c_fcong, ~(u64) 0); | 70 | rds_cong_map_updated(conn->c_fcong, ~(u64) 0); |
67 | return sizeof(struct rds_header) + RDS_CONG_MAP_BYTES; | 71 | ret = min_t(int, ret, sgp->length - conn->c_xmit_data_off); |
72 | goto out; | ||
68 | } | 73 | } |
69 | 74 | ||
70 | BUG_ON(hdr_off || sg || off); | 75 | BUG_ON(hdr_off || sg || off); |
@@ -80,8 +85,8 @@ static int rds_loop_xmit(struct rds_connection *conn, struct rds_message *rm, | |||
80 | NULL); | 85 | NULL); |
81 | 86 | ||
82 | rds_inc_put(&rm->m_inc); | 87 | rds_inc_put(&rm->m_inc); |
83 | 88 | out: | |
84 | return sizeof(struct rds_header) + be32_to_cpu(rm->m_inc.i_hdr.h_len); | 89 | return ret; |
85 | } | 90 | } |
86 | 91 | ||
87 | /* | 92 | /* |
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index df5997d25826..de870184e457 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
@@ -1728,7 +1728,11 @@ static int unix_dgram_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1728 | 1728 | ||
1729 | msg->msg_namelen = 0; | 1729 | msg->msg_namelen = 0; |
1730 | 1730 | ||
1731 | mutex_lock(&u->readlock); | 1731 | err = mutex_lock_interruptible(&u->readlock); |
1732 | if (err) { | ||
1733 | err = sock_intr_errno(sock_rcvtimeo(sk, noblock)); | ||
1734 | goto out; | ||
1735 | } | ||
1732 | 1736 | ||
1733 | skb = skb_recv_datagram(sk, flags, noblock, &err); | 1737 | skb = skb_recv_datagram(sk, flags, noblock, &err); |
1734 | if (!skb) { | 1738 | if (!skb) { |
@@ -1868,7 +1872,11 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1868 | memset(&tmp_scm, 0, sizeof(tmp_scm)); | 1872 | memset(&tmp_scm, 0, sizeof(tmp_scm)); |
1869 | } | 1873 | } |
1870 | 1874 | ||
1871 | mutex_lock(&u->readlock); | 1875 | err = mutex_lock_interruptible(&u->readlock); |
1876 | if (err) { | ||
1877 | err = sock_intr_errno(timeo); | ||
1878 | goto out; | ||
1879 | } | ||
1872 | 1880 | ||
1873 | do { | 1881 | do { |
1874 | int chunk; | 1882 | int chunk; |
@@ -1899,11 +1907,12 @@ static int unix_stream_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
1899 | 1907 | ||
1900 | timeo = unix_stream_data_wait(sk, timeo); | 1908 | timeo = unix_stream_data_wait(sk, timeo); |
1901 | 1909 | ||
1902 | if (signal_pending(current)) { | 1910 | if (signal_pending(current) |
1911 | || mutex_lock_interruptible(&u->readlock)) { | ||
1903 | err = sock_intr_errno(timeo); | 1912 | err = sock_intr_errno(timeo); |
1904 | goto out; | 1913 | goto out; |
1905 | } | 1914 | } |
1906 | mutex_lock(&u->readlock); | 1915 | |
1907 | continue; | 1916 | continue; |
1908 | unlock: | 1917 | unlock: |
1909 | unix_state_unlock(sk); | 1918 | unix_state_unlock(sk); |