From: Greg Kroah-Hartman Date: Thu, 21 Sep 2017 10:57:23 +0000 (+0200) Subject: 4.9-stable patches X-Git-Tag: v3.18.72~36 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=42e64738e60ee7d9eee1802dd69862c71ef56d83;p=thirdparty%2Fkernel%2Fstable-queue.git 4.9-stable patches added patches: ib-addr-fix-setting-source-address-in-addr6_resolve.patch --- diff --git a/queue-4.9/ib-addr-fix-setting-source-address-in-addr6_resolve.patch b/queue-4.9/ib-addr-fix-setting-source-address-in-addr6_resolve.patch new file mode 100644 index 00000000000..c0888160ed1 --- /dev/null +++ b/queue-4.9/ib-addr-fix-setting-source-address-in-addr6_resolve.patch @@ -0,0 +1,66 @@ +From 79e25959403e6a79552db28a87abed34de32a1df Mon Sep 17 00:00:00 2001 +From: Roland Dreier +Date: Tue, 6 Jun 2017 09:22:00 -0700 +Subject: IB/addr: Fix setting source address in addr6_resolve() + +From: Roland Dreier + +commit 79e25959403e6a79552db28a87abed34de32a1df upstream. + +Commit eea40b8f624f ("infiniband: call ipv6 route lookup via the stub +interface") introduced a regression in address resolution when connecting +to IPv6 destination addresses. The old code called ip6_route_output(), +while the new code calls ipv6_stub->ipv6_dst_lookup(). The two are almost +the same, except that ipv6_dst_lookup() also calls ip6_route_get_saddr() +if the source address is in6addr_any. + +This means that the test of ipv6_addr_any(&fl6.saddr) now never succeeds, +and so we never copy the source address out. This ends up causing +rdma_resolve_addr() to fail, because without a resolved source address, +cma_acquire_dev() will fail to find an RDMA device to use. For me, this +causes connecting to an NVMe over Fabrics target via RoCE / IPv6 to fail. + +Fix this by copying out fl6.saddr if ipv6_addr_any() is true for the original +source address passed into addr6_resolve(). We can drop our call to +ipv6_dev_get_saddr() because ipv6_dst_lookup() already does that work. + +Fixes: eea40b8f624 ("infiniband: call ipv6 route lookup via the stub interface") +Signed-off-by: Roland Dreier +Acked-by: Paolo Abeni +Signed-off-by: Doug Ledford +Signed-off-by: Raju Rangoju +Signed-off-by: Greg Kroah-Hartman +--- + drivers/infiniband/core/addr.c | 12 ++---------- + 1 file changed, 2 insertions(+), 10 deletions(-) + +--- a/drivers/infiniband/core/addr.c ++++ b/drivers/infiniband/core/addr.c +@@ -446,15 +446,10 @@ static int addr6_resolve(struct sockaddr + + ret = ipv6_stub->ipv6_dst_lookup(addr->net, NULL, &dst, &fl6); + if (ret < 0) +- goto put; ++ return ret; + + rt = (struct rt6_info *)dst; +- if (ipv6_addr_any(&fl6.saddr)) { +- ret = ipv6_dev_get_saddr(addr->net, ip6_dst_idev(dst)->dev, +- &fl6.daddr, 0, &fl6.saddr); +- if (ret) +- goto put; +- ++ if (ipv6_addr_any(&src_in->sin6_addr)) { + src_in->sin6_family = AF_INET6; + src_in->sin6_addr = fl6.saddr; + } +@@ -471,9 +466,6 @@ static int addr6_resolve(struct sockaddr + + *pdst = dst; + return 0; +-put: +- dst_release(dst); +- return ret; + } + #else + static int addr6_resolve(struct sockaddr_in6 *src_in, diff --git a/queue-4.9/series b/queue-4.9/series index 9096d2ef01b..204850979ab 100644 --- a/queue-4.9/series +++ b/queue-4.9/series @@ -4,3 +4,4 @@ mm-prevent-double-decrease-of-nr_reserved_highatomic.patch orangefs-don-t-clear-sgid-when-inheriting-acls.patch ib-qib-hfi1-avoid-flow-control-testing-for-rdma-write-operation.patch drm-sun4i-implement-drm_driver-lastclose-to-restore-fbdev-console.patch +ib-addr-fix-setting-source-address-in-addr6_resolve.patch