diff options
author | Mi Jinlong <mijinlong@cn.fujitsu.com> | 2011-08-30 05:18:41 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2011-09-14 08:21:48 -0400 |
commit | 849a1cf13d4394d398d91752166e92e9ecd64f8d (patch) | |
tree | 475c08721cb327b924035144f771dd2d85eda0cd /fs/nfsd | |
parent | 11fcee0293a6d9f0973e04f8b3fb6cd15a55bcce (diff) |
SUNRPC: Replace svc_addr_u by sockaddr_storage
For IPv6 local address, lockd can not callback to client for
missing scope id when binding address at inet6_bind:
324 if (addr_type & IPV6_ADDR_LINKLOCAL) {
325 if (addr_len >= sizeof(struct sockaddr_in6) &&
326 addr->sin6_scope_id) {
327 /* Override any existing binding, if another one
328 * is supplied by user.
329 */
330 sk->sk_bound_dev_if = addr->sin6_scope_id;
331 }
332
333 /* Binding to link-local address requires an interface */
334 if (!sk->sk_bound_dev_if) {
335 err = -EINVAL;
336 goto out_unlock;
337 }
Replacing svc_addr_u by sockaddr_storage, let rqstp->rq_daddr contains more info
besides address.
Reviewed-by: Jeff Layton <jlayton@redhat.com>
Reviewed-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Mi Jinlong <mijinlong@cn.fujitsu.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'fs/nfsd')
-rw-r--r-- | fs/nfsd/nfs4state.c | 16 |
1 files changed, 1 insertions, 15 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 0cd346477f29..e7f83bd9b4a8 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c | |||
@@ -1257,20 +1257,6 @@ find_unconfirmed_client_by_str(const char *dname, unsigned int hashval) | |||
1257 | return NULL; | 1257 | return NULL; |
1258 | } | 1258 | } |
1259 | 1259 | ||
1260 | static void rpc_svcaddr2sockaddr(struct sockaddr *sa, unsigned short family, union svc_addr_u *svcaddr) | ||
1261 | { | ||
1262 | switch (family) { | ||
1263 | case AF_INET: | ||
1264 | ((struct sockaddr_in *)sa)->sin_family = AF_INET; | ||
1265 | ((struct sockaddr_in *)sa)->sin_addr = svcaddr->addr; | ||
1266 | return; | ||
1267 | case AF_INET6: | ||
1268 | ((struct sockaddr_in6 *)sa)->sin6_family = AF_INET6; | ||
1269 | ((struct sockaddr_in6 *)sa)->sin6_addr = svcaddr->addr6; | ||
1270 | return; | ||
1271 | } | ||
1272 | } | ||
1273 | |||
1274 | static void | 1260 | static void |
1275 | gen_callback(struct nfs4_client *clp, struct nfsd4_setclientid *se, struct svc_rqst *rqstp) | 1261 | gen_callback(struct nfs4_client *clp, struct nfsd4_setclientid *se, struct svc_rqst *rqstp) |
1276 | { | 1262 | { |
@@ -1302,7 +1288,7 @@ gen_callback(struct nfs4_client *clp, struct nfsd4_setclientid *se, struct svc_r | |||
1302 | 1288 | ||
1303 | conn->cb_prog = se->se_callback_prog; | 1289 | conn->cb_prog = se->se_callback_prog; |
1304 | conn->cb_ident = se->se_callback_ident; | 1290 | conn->cb_ident = se->se_callback_ident; |
1305 | rpc_svcaddr2sockaddr((struct sockaddr *)&conn->cb_saddr, expected_family, &rqstp->rq_daddr); | 1291 | memcpy(&conn->cb_saddr, &rqstp->rq_daddr, rqstp->rq_daddrlen); |
1306 | return; | 1292 | return; |
1307 | out_err: | 1293 | out_err: |
1308 | conn->cb_addr.ss_family = AF_UNSPEC; | 1294 | conn->cb_addr.ss_family = AF_UNSPEC; |