Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

RDMA/addr: Fix build breakage when IPv6 is disabled

Commit 38617c64 ("RDMA/addr: Add support for translating IPv6
addresses") broke the build when CONFIG_IPV6=n, because the ib_addr
module unconditionally attempted to call ipv6_chk_addr() and other
IPv6 functions that are not defined when IPv6 is disabled. Fix this
by only building IPv6 support if CONFIG_IPV6 is turned on, and
add a Kconfig dependency to prevent the ib_addr code from being built
in when IPv6 is built modular.

Signed-off-by: Roland Dreier <rolandd@cisco.com>

+41 -7
+1
drivers/infiniband/Kconfig
··· 37 37 config INFINIBAND_ADDR_TRANS 38 38 bool 39 39 depends on INET 40 + depends on !(INFINIBAND = y && IPV6 = m) 40 41 default y 41 42 42 43 source "drivers/infiniband/hw/mthca/Kconfig"
+40 -7
drivers/infiniband/core/addr.c
··· 128 128 ret = rdma_copy_addr(dev_addr, dev, NULL); 129 129 dev_put(dev); 130 130 break; 131 + 132 + #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) 131 133 case AF_INET6: 132 134 for_each_netdev(&init_net, dev) { 133 135 if (ipv6_chk_addr(&init_net, ··· 140 138 } 141 139 } 142 140 break; 143 - default: 144 - break; 141 + #endif 145 142 } 146 143 return ret; 147 144 } ··· 180 179 { 181 180 struct rtable *rt; 182 181 struct flowi fl; 183 - struct dst_entry *dst; 184 182 185 183 memset(&fl, 0, sizeof fl); 186 - if (dst_in->sa_family == AF_INET) { 184 + 185 + switch (dst_in->sa_family) { 186 + case AF_INET: 187 187 fl.nl_u.ip4_u.daddr = 188 188 ((struct sockaddr_in *) dst_in)->sin_addr.s_addr; 189 189 ··· 193 191 194 192 neigh_event_send(rt->u.dst.neighbour, NULL); 195 193 ip_rt_put(rt); 194 + break; 196 195 197 - } else { 196 + #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) 197 + case AF_INET6: 198 + { 199 + struct dst_entry *dst; 200 + 198 201 fl.nl_u.ip6_u.daddr = 199 202 ((struct sockaddr_in6 *) dst_in)->sin6_addr; 200 203 ··· 209 202 210 203 neigh_event_send(dst->neighbour, NULL); 211 204 dst_release(dst); 205 + break; 206 + } 207 + #endif 212 208 } 213 209 } 214 210 ··· 264 254 return ret; 265 255 } 266 256 257 + #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) 267 258 static int addr6_resolve_remote(struct sockaddr_in6 *src_in, 268 259 struct sockaddr_in6 *dst_in, 269 260 struct rdma_dev_addr *addr) ··· 293 282 dst_release(dst); 294 283 return ret; 295 284 } 285 + #else 286 + static int addr6_resolve_remote(struct sockaddr_in6 *src_in, 287 + struct sockaddr_in6 *dst_in, 288 + struct rdma_dev_addr *addr) 289 + { 290 + return -EADDRNOTAVAIL; 291 + } 292 + #endif 296 293 297 294 static int addr_resolve_remote(struct sockaddr *src_in, 298 295 struct sockaddr *dst_in, ··· 359 340 struct net_device *dev; 360 341 int ret; 361 342 362 - if (dst_in->sa_family == AF_INET) { 343 + switch (dst_in->sa_family) { 344 + case AF_INET: 345 + { 363 346 __be32 src_ip = ((struct sockaddr_in *) src_in)->sin_addr.s_addr; 364 347 __be32 dst_ip = ((struct sockaddr_in *) dst_in)->sin_addr.s_addr; 365 348 ··· 383 362 memcpy(addr->dst_dev_addr, dev->dev_addr, MAX_ADDR_LEN); 384 363 } 385 364 dev_put(dev); 386 - } else { 365 + break; 366 + } 367 + 368 + #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) 369 + case AF_INET6: 370 + { 387 371 struct in6_addr *a; 388 372 389 373 for_each_netdev(&init_net, dev) ··· 416 390 if (!ret) 417 391 memcpy(addr->dst_dev_addr, dev->dev_addr, MAX_ADDR_LEN); 418 392 } 393 + break; 394 + } 395 + #endif 396 + 397 + default: 398 + ret = -EADDRNOTAVAIL; 399 + break; 419 400 } 420 401 421 402 return ret;