lkml.org 
[lkml]   [2022]   [Feb]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.16 10/52] NFSv4 handle port presence in fs_location server string
    Date
    From: Olga Kornievskaia <kolga@netapp.com>

    [ Upstream commit a8d54baba7c65db2d3278873def61f8d3753d766 ]

    An fs_location attribute returns a string that can be ipv4, ipv6,
    or DNS name. An ip location can have a port appended to it and if
    no port is present a default port needs to be set. If rpc_pton()
    fails to parse, try calling rpc_uaddr2socaddr() that can convert
    an universal address.

    Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
    Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/nfs/nfs4_fs.h | 2 +-
    fs/nfs/nfs4namespace.c | 17 +++++++++++------
    2 files changed, 12 insertions(+), 7 deletions(-)

    diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h
    index 734ac09becf73..85c5d08dfa9cc 100644
    --- a/fs/nfs/nfs4_fs.h
    +++ b/fs/nfs/nfs4_fs.h
    @@ -281,7 +281,7 @@ int nfs4_submount(struct fs_context *, struct nfs_server *);
    int nfs4_replace_transport(struct nfs_server *server,
    const struct nfs4_fs_locations *locations);
    size_t nfs_parse_server_name(char *string, size_t len, struct sockaddr *sa,
    - size_t salen, struct net *net);
    + size_t salen, struct net *net, int port);
    /* nfs4proc.c */
    extern int nfs4_handle_exception(struct nfs_server *, int, struct nfs4_exception *);
    extern int nfs4_async_handle_error(struct rpc_task *task,
    diff --git a/fs/nfs/nfs4namespace.c b/fs/nfs/nfs4namespace.c
    index f1ed4f60a7f33..3680c8da510c9 100644
    --- a/fs/nfs/nfs4namespace.c
    +++ b/fs/nfs/nfs4namespace.c
    @@ -165,15 +165,20 @@ static int nfs4_validate_fspath(struct dentry *dentry,
    }

    size_t nfs_parse_server_name(char *string, size_t len, struct sockaddr *sa,
    - size_t salen, struct net *net)
    + size_t salen, struct net *net, int port)
    {
    ssize_t ret;

    ret = rpc_pton(net, string, len, sa, salen);
    if (ret == 0) {
    - ret = nfs_dns_resolve_name(net, string, len, sa, salen);
    - if (ret < 0)
    - ret = 0;
    + ret = rpc_uaddr2sockaddr(net, string, len, sa, salen);
    + if (ret == 0) {
    + ret = nfs_dns_resolve_name(net, string, len, sa, salen);
    + if (ret < 0)
    + ret = 0;
    + }
    + } else if (port) {
    + rpc_set_port(sa, port);
    }
    return ret;
    }
    @@ -328,7 +333,7 @@ static int try_location(struct fs_context *fc,
    nfs_parse_server_name(buf->data, buf->len,
    &ctx->nfs_server.address,
    sizeof(ctx->nfs_server._address),
    - fc->net_ns);
    + fc->net_ns, 0);
    if (ctx->nfs_server.addrlen == 0)
    continue;

    @@ -496,7 +501,7 @@ static int nfs4_try_replacing_one_location(struct nfs_server *server,
    continue;

    salen = nfs_parse_server_name(buf->data, buf->len,
    - sap, addr_bufsize, net);
    + sap, addr_bufsize, net, 0);
    if (salen == 0)
    continue;
    rpc_set_port(sap, NFS_PORT);
    --
    2.34.1
    \
     
     \ /
      Last update: 2022-02-03 21:30    [W:2.235 / U:2.152 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site