diff options
| author | Dave Airlie <airlied@redhat.com> | 2013-08-18 23:49:20 -0400 |
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2013-08-18 23:49:20 -0400 |
| commit | 3387ed83943daf6cb1bb4195ae369067b9cd80ce (patch) | |
| tree | e9fc247ed3a26f5369a7ec1b1bd0ef66bda7b4dd /net | |
| parent | eb91626ac4b9af3d5602a7db888b8bc4cb23eb3b (diff) | |
| parent | 63b66e5ba54b15a6592be00555d762db6db739ce (diff) | |
Merge tag 'drm-intel-fixes-2013-08-15' of git://people.freedesktop.org/~danvet/drm-intel
* tag 'drm-intel-fixes-2013-08-15' of git://people.freedesktop.org/~danvet/drm-intel: (153 commits)
drm/i915: Don't deref pipe->cpu_transcoder in the hangcheck code
Diffstat (limited to 'net')
| -rw-r--r-- | net/sunrpc/clnt.c | 4 | ||||
| -rw-r--r-- | net/sunrpc/netns.h | 1 | ||||
| -rw-r--r-- | net/sunrpc/rpcb_clnt.c | 48 |
3 files changed, 40 insertions, 13 deletions
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 74f6a704e374..ecbc4e3d83ad 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
| @@ -1660,6 +1660,10 @@ call_connect(struct rpc_task *task) | |||
| 1660 | task->tk_action = call_connect_status; | 1660 | task->tk_action = call_connect_status; |
| 1661 | if (task->tk_status < 0) | 1661 | if (task->tk_status < 0) |
| 1662 | return; | 1662 | return; |
| 1663 | if (task->tk_flags & RPC_TASK_NOCONNECT) { | ||
| 1664 | rpc_exit(task, -ENOTCONN); | ||
| 1665 | return; | ||
| 1666 | } | ||
| 1663 | xprt_connect(task); | 1667 | xprt_connect(task); |
| 1664 | } | 1668 | } |
| 1665 | } | 1669 | } |
diff --git a/net/sunrpc/netns.h b/net/sunrpc/netns.h index 74d948f5d5a1..779742cfc1ff 100644 --- a/net/sunrpc/netns.h +++ b/net/sunrpc/netns.h | |||
| @@ -23,6 +23,7 @@ struct sunrpc_net { | |||
| 23 | struct rpc_clnt *rpcb_local_clnt4; | 23 | struct rpc_clnt *rpcb_local_clnt4; |
| 24 | spinlock_t rpcb_clnt_lock; | 24 | spinlock_t rpcb_clnt_lock; |
| 25 | unsigned int rpcb_users; | 25 | unsigned int rpcb_users; |
| 26 | unsigned int rpcb_is_af_local : 1; | ||
| 26 | 27 | ||
| 27 | struct mutex gssp_lock; | 28 | struct mutex gssp_lock; |
| 28 | wait_queue_head_t gssp_wq; | 29 | wait_queue_head_t gssp_wq; |
diff --git a/net/sunrpc/rpcb_clnt.c b/net/sunrpc/rpcb_clnt.c index 3df764dc330c..1891a1022c17 100644 --- a/net/sunrpc/rpcb_clnt.c +++ b/net/sunrpc/rpcb_clnt.c | |||
| @@ -204,13 +204,15 @@ void rpcb_put_local(struct net *net) | |||
| 204 | } | 204 | } |
| 205 | 205 | ||
| 206 | static void rpcb_set_local(struct net *net, struct rpc_clnt *clnt, | 206 | static void rpcb_set_local(struct net *net, struct rpc_clnt *clnt, |
| 207 | struct rpc_clnt *clnt4) | 207 | struct rpc_clnt *clnt4, |
| 208 | bool is_af_local) | ||
| 208 | { | 209 | { |
| 209 | struct sunrpc_net *sn = net_generic(net, sunrpc_net_id); | 210 | struct sunrpc_net *sn = net_generic(net, sunrpc_net_id); |
| 210 | 211 | ||
| 211 | /* Protected by rpcb_create_local_mutex */ | 212 | /* Protected by rpcb_create_local_mutex */ |
| 212 | sn->rpcb_local_clnt = clnt; | 213 | sn->rpcb_local_clnt = clnt; |
| 213 | sn->rpcb_local_clnt4 = clnt4; | 214 | sn->rpcb_local_clnt4 = clnt4; |
| 215 | sn->rpcb_is_af_local = is_af_local ? 1 : 0; | ||
| 214 | smp_wmb(); | 216 | smp_wmb(); |
| 215 | sn->rpcb_users = 1; | 217 | sn->rpcb_users = 1; |
| 216 | dprintk("RPC: created new rpcb local clients (rpcb_local_clnt: " | 218 | dprintk("RPC: created new rpcb local clients (rpcb_local_clnt: " |
| @@ -238,6 +240,14 @@ static int rpcb_create_local_unix(struct net *net) | |||
| 238 | .program = &rpcb_program, | 240 | .program = &rpcb_program, |
| 239 | .version = RPCBVERS_2, | 241 | .version = RPCBVERS_2, |
| 240 | .authflavor = RPC_AUTH_NULL, | 242 | .authflavor = RPC_AUTH_NULL, |
| 243 | /* | ||
| 244 | * We turn off the idle timeout to prevent the kernel | ||
| 245 | * from automatically disconnecting the socket. | ||
| 246 | * Otherwise, we'd have to cache the mount namespace | ||
| 247 | * of the caller and somehow pass that to the socket | ||
| 248 | * reconnect code. | ||
| 249 | */ | ||
| 250 | .flags = RPC_CLNT_CREATE_NO_IDLE_TIMEOUT, | ||
| 241 | }; | 251 | }; |
| 242 | struct rpc_clnt *clnt, *clnt4; | 252 | struct rpc_clnt *clnt, *clnt4; |
| 243 | int result = 0; | 253 | int result = 0; |
| @@ -263,7 +273,7 @@ static int rpcb_create_local_unix(struct net *net) | |||
| 263 | clnt4 = NULL; | 273 | clnt4 = NULL; |
| 264 | } | 274 | } |
| 265 | 275 | ||
| 266 | rpcb_set_local(net, clnt, clnt4); | 276 | rpcb_set_local(net, clnt, clnt4, true); |
| 267 | 277 | ||
| 268 | out: | 278 | out: |
| 269 | return result; | 279 | return result; |
| @@ -315,7 +325,7 @@ static int rpcb_create_local_net(struct net *net) | |||
| 315 | clnt4 = NULL; | 325 | clnt4 = NULL; |
| 316 | } | 326 | } |
| 317 | 327 | ||
| 318 | rpcb_set_local(net, clnt, clnt4); | 328 | rpcb_set_local(net, clnt, clnt4, false); |
| 319 | 329 | ||
| 320 | out: | 330 | out: |
| 321 | return result; | 331 | return result; |
| @@ -376,13 +386,16 @@ static struct rpc_clnt *rpcb_create(struct net *net, const char *hostname, | |||
| 376 | return rpc_create(&args); | 386 | return rpc_create(&args); |
| 377 | } | 387 | } |
| 378 | 388 | ||
| 379 | static int rpcb_register_call(struct rpc_clnt *clnt, struct rpc_message *msg) | 389 | static int rpcb_register_call(struct sunrpc_net *sn, struct rpc_clnt *clnt, struct rpc_message *msg, bool is_set) |
| 380 | { | 390 | { |
| 381 | int result, error = 0; | 391 | int flags = RPC_TASK_NOCONNECT; |
| 392 | int error, result = 0; | ||
| 382 | 393 | ||
| 394 | if (is_set || !sn->rpcb_is_af_local) | ||
| 395 | flags = RPC_TASK_SOFTCONN; | ||
| 383 | msg->rpc_resp = &result; | 396 | msg->rpc_resp = &result; |
| 384 | 397 | ||
| 385 | error = rpc_call_sync(clnt, msg, RPC_TASK_SOFTCONN); | 398 | error = rpc_call_sync(clnt, msg, flags); |
| 386 | if (error < 0) { | 399 | if (error < 0) { |
| 387 | dprintk("RPC: failed to contact local rpcbind " | 400 | dprintk("RPC: failed to contact local rpcbind " |
| 388 | "server (errno %d).\n", -error); | 401 | "server (errno %d).\n", -error); |
| @@ -439,16 +452,19 @@ int rpcb_register(struct net *net, u32 prog, u32 vers, int prot, unsigned short | |||
| 439 | .rpc_argp = &map, | 452 | .rpc_argp = &map, |
| 440 | }; | 453 | }; |
| 441 | struct sunrpc_net *sn = net_generic(net, sunrpc_net_id); | 454 | struct sunrpc_net *sn = net_generic(net, sunrpc_net_id); |
| 455 | bool is_set = false; | ||
| 442 | 456 | ||
| 443 | dprintk("RPC: %sregistering (%u, %u, %d, %u) with local " | 457 | dprintk("RPC: %sregistering (%u, %u, %d, %u) with local " |
| 444 | "rpcbind\n", (port ? "" : "un"), | 458 | "rpcbind\n", (port ? "" : "un"), |
| 445 | prog, vers, prot, port); | 459 | prog, vers, prot, port); |
| 446 | 460 | ||
| 447 | msg.rpc_proc = &rpcb_procedures2[RPCBPROC_UNSET]; | 461 | msg.rpc_proc = &rpcb_procedures2[RPCBPROC_UNSET]; |
| 448 | if (port) | 462 | if (port != 0) { |
| 449 | msg.rpc_proc = &rpcb_procedures2[RPCBPROC_SET]; | 463 | msg.rpc_proc = &rpcb_procedures2[RPCBPROC_SET]; |
| 464 | is_set = true; | ||
| 465 | } | ||
| 450 | 466 | ||
| 451 | return rpcb_register_call(sn->rpcb_local_clnt, &msg); | 467 | return rpcb_register_call(sn, sn->rpcb_local_clnt, &msg, is_set); |
| 452 | } | 468 | } |
| 453 | 469 | ||
| 454 | /* | 470 | /* |
| @@ -461,6 +477,7 @@ static int rpcb_register_inet4(struct sunrpc_net *sn, | |||
| 461 | const struct sockaddr_in *sin = (const struct sockaddr_in *)sap; | 477 | const struct sockaddr_in *sin = (const struct sockaddr_in *)sap; |
| 462 | struct rpcbind_args *map = msg->rpc_argp; | 478 | struct rpcbind_args *map = msg->rpc_argp; |
| 463 | unsigned short port = ntohs(sin->sin_port); | 479 | unsigned short port = ntohs(sin->sin_port); |
| 480 | bool is_set = false; | ||
| 464 | int result; | 481 | int result; |
| 465 | 482 | ||
| 466 | map->r_addr = rpc_sockaddr2uaddr(sap, GFP_KERNEL); | 483 | map->r_addr = rpc_sockaddr2uaddr(sap, GFP_KERNEL); |
| @@ -471,10 +488,12 @@ static int rpcb_register_inet4(struct sunrpc_net *sn, | |||
| 471 | map->r_addr, map->r_netid); | 488 | map->r_addr, map->r_netid); |
| 472 | 489 | ||
| 473 | msg->rpc_proc = &rpcb_procedures4[RPCBPROC_UNSET]; | 490 | msg->rpc_proc = &rpcb_procedures4[RPCBPROC_UNSET]; |
| 474 | if (port) | 491 | if (port != 0) { |
| 475 | msg->rpc_proc = &rpcb_procedures4[RPCBPROC_SET]; | 492 | msg->rpc_proc = &rpcb_procedures4[RPCBPROC_SET]; |
| 493 | is_set = true; | ||
| 494 | } | ||
| 476 | 495 | ||
| 477 | result = rpcb_register_call(sn->rpcb_local_clnt4, msg); | 496 | result = rpcb_register_call(sn, sn->rpcb_local_clnt4, msg, is_set); |
| 478 | kfree(map->r_addr); | 497 | kfree(map->r_addr); |
| 479 | return result; | 498 | return result; |
| 480 | } | 499 | } |
| @@ -489,6 +508,7 @@ static int rpcb_register_inet6(struct sunrpc_net *sn, | |||
| 489 | const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)sap; | 508 | const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)sap; |
| 490 | struct rpcbind_args *map = msg->rpc_argp; | 509 | struct rpcbind_args *map = msg->rpc_argp; |
| 491 | unsigned short port = ntohs(sin6->sin6_port); | 510 | unsigned short port = ntohs(sin6->sin6_port); |
| 511 | bool is_set = false; | ||
| 492 | int result; | 512 | int result; |
| 493 | 513 | ||
| 494 | map->r_addr = rpc_sockaddr2uaddr(sap, GFP_KERNEL); | 514 | map->r_addr = rpc_sockaddr2uaddr(sap, GFP_KERNEL); |
| @@ -499,10 +519,12 @@ static int rpcb_register_inet6(struct sunrpc_net *sn, | |||
| 499 | map->r_addr, map->r_netid); | 519 | map->r_addr, map->r_netid); |
| 500 | 520 | ||
| 501 | msg->rpc_proc = &rpcb_procedures4[RPCBPROC_UNSET]; | 521 | msg->rpc_proc = &rpcb_procedures4[RPCBPROC_UNSET]; |
| 502 | if (port) | 522 | if (port != 0) { |
| 503 | msg->rpc_proc = &rpcb_procedures4[RPCBPROC_SET]; | 523 | msg->rpc_proc = &rpcb_procedures4[RPCBPROC_SET]; |
| 524 | is_set = true; | ||
| 525 | } | ||
| 504 | 526 | ||
| 505 | result = rpcb_register_call(sn->rpcb_local_clnt4, msg); | 527 | result = rpcb_register_call(sn, sn->rpcb_local_clnt4, msg, is_set); |
| 506 | kfree(map->r_addr); | 528 | kfree(map->r_addr); |
| 507 | return result; | 529 | return result; |
| 508 | } | 530 | } |
| @@ -519,7 +541,7 @@ static int rpcb_unregister_all_protofamilies(struct sunrpc_net *sn, | |||
| 519 | map->r_addr = ""; | 541 | map->r_addr = ""; |
| 520 | msg->rpc_proc = &rpcb_procedures4[RPCBPROC_UNSET]; | 542 | msg->rpc_proc = &rpcb_procedures4[RPCBPROC_UNSET]; |
| 521 | 543 | ||
| 522 | return rpcb_register_call(sn->rpcb_local_clnt4, msg); | 544 | return rpcb_register_call(sn, sn->rpcb_local_clnt4, msg, false); |
| 523 | } | 545 | } |
| 524 | 546 | ||
| 525 | /** | 547 | /** |
