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

SUNRPC: Use proper INADDR_ANY when setting up RPC services on IPv6

Teach svc_create_xprt() to use the correct ANY address for AF_INET6 based
RPC services.

No caller uses AF_INET6 yet.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>

authored by

Chuck Lever and committed by
J. Bruce Fields
5dd248f6 e851db5b

+33 -6
+33 -6
net/sunrpc/svc_xprt.c
··· 159 159 } 160 160 EXPORT_SYMBOL_GPL(svc_xprt_init); 161 161 162 - int svc_create_xprt(struct svc_serv *serv, char *xprt_name, unsigned short port, 163 - int flags) 162 + static struct svc_xprt *__svc_xpo_create(struct svc_xprt_class *xcl, 163 + struct svc_serv *serv, 164 + unsigned short port, int flags) 164 165 { 165 - struct svc_xprt_class *xcl; 166 166 struct sockaddr_in sin = { 167 167 .sin_family = AF_INET, 168 168 .sin_addr.s_addr = htonl(INADDR_ANY), 169 169 .sin_port = htons(port), 170 170 }; 171 + struct sockaddr_in6 sin6 = { 172 + .sin6_family = AF_INET6, 173 + .sin6_addr = IN6ADDR_ANY_INIT, 174 + .sin6_port = htons(port), 175 + }; 176 + struct sockaddr *sap; 177 + size_t len; 178 + 179 + switch (serv->sv_family) { 180 + case AF_INET: 181 + sap = (struct sockaddr *)&sin; 182 + len = sizeof(sin); 183 + break; 184 + case AF_INET6: 185 + sap = (struct sockaddr *)&sin6; 186 + len = sizeof(sin6); 187 + break; 188 + default: 189 + return ERR_PTR(-EAFNOSUPPORT); 190 + } 191 + 192 + return xcl->xcl_ops->xpo_create(serv, sap, len, flags); 193 + } 194 + 195 + int svc_create_xprt(struct svc_serv *serv, char *xprt_name, unsigned short port, 196 + int flags) 197 + { 198 + struct svc_xprt_class *xcl; 199 + 171 200 dprintk("svc: creating transport %s[%d]\n", xprt_name, port); 172 201 spin_lock(&svc_xprt_class_lock); 173 202 list_for_each_entry(xcl, &svc_xprt_class_list, xcl_list) { ··· 209 180 goto err; 210 181 211 182 spin_unlock(&svc_xprt_class_lock); 212 - newxprt = xcl->xcl_ops-> 213 - xpo_create(serv, (struct sockaddr *)&sin, sizeof(sin), 214 - flags); 183 + newxprt = __svc_xpo_create(xcl, serv, port, flags); 215 184 if (IS_ERR(newxprt)) { 216 185 module_put(xcl->xcl_owner); 217 186 return PTR_ERR(newxprt);