|
19 | 19 | #include <linux/sunrpc/svc.h> |
20 | 20 | #include <linux/sunrpc/svc_xprt.h> |
21 | 21 | #include <linux/sunrpc/msg_prot.h> |
| 22 | +#include <linux/sunrpc/addr.h> |
22 | 23 |
|
23 | 24 | #include <uapi/linux/nfsd/debug.h> |
24 | 25 |
|
@@ -387,6 +388,37 @@ void nfsd_lockd_shutdown(void); |
387 | 388 |
|
388 | 389 | extern const u32 nfsd_suppattrs[3][3]; |
389 | 390 |
|
| 391 | +static inline u32 nfsd4_set_netaddr(struct sockaddr *addr, |
| 392 | + struct nfs42_netaddr *netaddr) |
| 393 | +{ |
| 394 | + struct sockaddr_in *sin = (struct sockaddr_in *)addr; |
| 395 | + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)addr; |
| 396 | + unsigned int port; |
| 397 | + size_t ret_addr, ret_port; |
| 398 | + |
| 399 | + switch (addr->sa_family) { |
| 400 | + case AF_INET: |
| 401 | + port = ntohs(sin->sin_port); |
| 402 | + sprintf(netaddr->netid, "tcp"); |
| 403 | + netaddr->netid_len = 3; |
| 404 | + break; |
| 405 | + case AF_INET6: |
| 406 | + port = ntohs(sin6->sin6_port); |
| 407 | + sprintf(netaddr->netid, "tcp6"); |
| 408 | + netaddr->netid_len = 4; |
| 409 | + break; |
| 410 | + default: |
| 411 | + return nfserr_inval; |
| 412 | + } |
| 413 | + ret_addr = rpc_ntop(addr, netaddr->addr, sizeof(netaddr->addr)); |
| 414 | + ret_port = snprintf(netaddr->addr + ret_addr, |
| 415 | + RPCBIND_MAXUADDRLEN + 1 - ret_addr, |
| 416 | + ".%u.%u", port >> 8, port & 0xff); |
| 417 | + WARN_ON(ret_port >= RPCBIND_MAXUADDRLEN + 1 - ret_addr); |
| 418 | + netaddr->addr_len = ret_addr + ret_port; |
| 419 | + return 0; |
| 420 | +} |
| 421 | + |
390 | 422 | static inline bool bmval_is_subset(const u32 *bm1, const u32 *bm2) |
391 | 423 | { |
392 | 424 | return !((bm1[0] & ~bm2[0]) || |
|
0 commit comments