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

merge nfsd 4.13 bugfixes into nfsd for-4.14 branch

+22 -6
+2 -4
fs/nfsd/nfs4xdr.c
··· 144 144 argp->p = page_address(argp->pagelist[0]); 145 145 argp->pagelist++; 146 146 if (argp->pagelen < PAGE_SIZE) { 147 - argp->end = argp->p + (argp->pagelen>>2); 147 + argp->end = argp->p + XDR_QUADLEN(argp->pagelen); 148 148 argp->pagelen = 0; 149 149 } else { 150 150 argp->end = argp->p + (PAGE_SIZE>>2); ··· 1279 1279 argp->pagelen -= pages * PAGE_SIZE; 1280 1280 len -= pages * PAGE_SIZE; 1281 1281 1282 - argp->p = (__be32 *)page_address(argp->pagelist[0]); 1283 - argp->pagelist++; 1284 - argp->end = argp->p + XDR_QUADLEN(PAGE_SIZE); 1282 + next_decode_page(argp); 1285 1283 } 1286 1284 argp->p += XDR_QUADLEN(len); 1287 1285
+20 -2
net/sunrpc/svcsock.c
··· 421 421 dprintk("svc: socket %p(inet %p), busy=%d\n", 422 422 svsk, sk, 423 423 test_bit(XPT_BUSY, &svsk->sk_xprt.xpt_flags)); 424 + 425 + /* Refer to svc_setup_socket() for details. */ 426 + rmb(); 424 427 svsk->sk_odata(sk); 425 428 if (!test_and_set_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags)) 426 429 svc_xprt_enqueue(&svsk->sk_xprt); ··· 440 437 if (svsk) { 441 438 dprintk("svc: socket %p(inet %p), write_space busy=%d\n", 442 439 svsk, sk, test_bit(XPT_BUSY, &svsk->sk_xprt.xpt_flags)); 440 + 441 + /* Refer to svc_setup_socket() for details. */ 442 + rmb(); 443 443 svsk->sk_owspace(sk); 444 444 svc_xprt_enqueue(&svsk->sk_xprt); 445 445 } ··· 766 760 dprintk("svc: socket %p TCP (listen) state change %d\n", 767 761 sk, sk->sk_state); 768 762 769 - if (svsk) 763 + if (svsk) { 764 + /* Refer to svc_setup_socket() for details. */ 765 + rmb(); 770 766 svsk->sk_odata(sk); 767 + } 768 + 771 769 /* 772 770 * This callback may called twice when a new connection 773 771 * is established as a child socket inherits everything ··· 804 794 if (!svsk) 805 795 printk("svc: socket %p: no user data\n", sk); 806 796 else { 797 + /* Refer to svc_setup_socket() for details. */ 798 + rmb(); 807 799 svsk->sk_ostate(sk); 808 800 if (sk->sk_state != TCP_ESTABLISHED) { 809 801 set_bit(XPT_CLOSE, &svsk->sk_xprt.xpt_flags); ··· 1393 1381 return ERR_PTR(err); 1394 1382 } 1395 1383 1396 - inet->sk_user_data = svsk; 1397 1384 svsk->sk_sock = sock; 1398 1385 svsk->sk_sk = inet; 1399 1386 svsk->sk_ostate = inet->sk_state_change; 1400 1387 svsk->sk_odata = inet->sk_data_ready; 1401 1388 svsk->sk_owspace = inet->sk_write_space; 1389 + /* 1390 + * This barrier is necessary in order to prevent race condition 1391 + * with svc_data_ready(), svc_listen_data_ready() and others 1392 + * when calling callbacks above. 1393 + */ 1394 + wmb(); 1395 + inet->sk_user_data = svsk; 1402 1396 1403 1397 /* Initialize the socket */ 1404 1398 if (sock->type == SOCK_DGRAM)