lkml.org 
[lkml]   [2018]   [Mar]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 4.9 168/281] SUNRPC: ensure correct error is reported by xs_tcp_setup_socket()
    Date
    From: NeilBrown <neilb@suse.com>

    [ Upstream commit 6ea44adce91526700535b3150f77f8639ae8c82d ]

    If you attempt a TCP mount from an host that is unreachable in a way
    that triggers an immediate error from kernel_connect(), that error
    does not propagate up, instead EAGAIN is reported.

    This results in call_connect_status receiving the wrong error.

    A case that it easy to demonstrate is to attempt to mount from an
    address that results in ENETUNREACH, but first deleting any default
    route.
    Without this patch, the mount.nfs process is persistently runnable
    and is hard to kill. With this patch it exits as it should.

    The problem is caused by the fact that xs_tcp_force_close() eventually
    calls
    xprt_wake_pending_tasks(xprt, -EAGAIN);
    which causes an error return of -EAGAIN. so when xs_tcp_setup_sock()
    calls
    xprt_wake_pending_tasks(xprt, status);
    the status is ignored.

    Fixes: 4efdd92c9211 ("SUNRPC: Remove TCP client connection reset hack")
    Signed-off-by: NeilBrown <neilb@suse.com>
    Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    ---
    net/sunrpc/xprtsock.c | 7 ++++++-
    1 file changed, 6 insertions(+), 1 deletion(-)

    diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
    index d24d14ea8ba4..1bf9153004cd 100644
    --- a/net/sunrpc/xprtsock.c
    +++ b/net/sunrpc/xprtsock.c
    @@ -2384,7 +2384,12 @@ static void xs_tcp_setup_socket(struct work_struct *work)
    case -EHOSTUNREACH:
    case -EADDRINUSE:
    case -ENOBUFS:
    - /* retry with existing socket, after a delay */
    + /*
    + * xs_tcp_force_close() wakes tasks with -EIO.
    + * We need to wake them first to ensure the
    + * correct error code.
    + */
    + xprt_wake_pending_tasks(xprt, status);
    xs_tcp_force_close(xprt);
    goto out;
    }
    --
    2.14.1
    \
     
     \ /
      Last update: 2018-03-19 19:07    [W:4.137 / U:0.884 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site