Loading fs/nfs/nfs4_fs.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -278,6 +278,8 @@ extern int nfs4_proc_get_lease_time(struct nfs_client *clp, struct nfs_fsinfo *fsinfo); struct nfs_fsinfo *fsinfo); extern int nfs4_proc_layoutcommit(struct nfs4_layoutcommit_data *data, extern int nfs4_proc_layoutcommit(struct nfs4_layoutcommit_data *data, bool sync); bool sync); extern int nfs4_detect_session_trunking(struct nfs_client *clp, struct nfs41_exchange_id_res *res, struct rpc_xprt *xprt); static inline bool static inline bool is_ds_only_client(struct nfs_client *clp) is_ds_only_client(struct nfs_client *clp) Loading fs/nfs/nfs4client.c +90 −0 Original line number Original line Diff line number Diff line Loading @@ -595,6 +595,96 @@ nfs4_check_serverowner_major_id(struct nfs41_server_owner *o1, return false; return false; } } /* * Returns true if server minor ids match */ static bool nfs4_check_serverowner_minor_id(struct nfs41_server_owner *o1, struct nfs41_server_owner *o2) { /* Check eir_server_owner so_minor_id */ if (o1->minor_id != o2->minor_id) goto out_minor_mismatch; dprintk("NFS: --> %s server owner minor IDs match\n", __func__); return true; out_minor_mismatch: dprintk("NFS: --> %s server owner minor IDs do not match\n", __func__); return false; } /* * Returns true if the server scopes match */ static bool nfs4_check_server_scope(struct nfs41_server_scope *s1, struct nfs41_server_scope *s2) { if (s1->server_scope_sz != s2->server_scope_sz) goto out_scope_mismatch; if (memcmp(s1->server_scope, s2->server_scope, s1->server_scope_sz) != 0) goto out_scope_mismatch; dprintk("NFS: --> %s server scopes match\n", __func__); return true; out_scope_mismatch: dprintk("NFS: --> %s server scopes do not match\n", __func__); return false; } /** * nfs4_detect_session_trunking - Checks for session trunking called * after a successful EXCHANGE_ID testing a multi-addr connection to be * potentially added as a session trunk * * @clp: original mount nfs_client * @res: result structure from an exchange_id using the original mount * nfs_client with a new multi_addr transport * * Returns zero on success, otherwise -EINVAL * * Note: since the exchange_id for the new multi_addr transport uses the * same nfs_client from the original mount, the cl_owner_id is reused, * so eir_clientowner is the same. */ int nfs4_detect_session_trunking(struct nfs_client *clp, struct nfs41_exchange_id_res *res, struct rpc_xprt *xprt) { /* Check eir_clientid */ if (!nfs4_match_clientids(clp->cl_clientid, res->clientid)) goto out_err; /* Check eir_server_owner so_major_id */ if (!nfs4_check_serverowner_major_id(clp->cl_serverowner, res->server_owner)) goto out_err; /* Check eir_server_owner so_minor_id */ if (!nfs4_check_serverowner_minor_id(clp->cl_serverowner, res->server_owner)) goto out_err; /* Check eir_server_scope */ if (!nfs4_check_server_scope(clp->cl_serverscope, res->server_scope)) goto out_err; pr_info("NFS: %s: Session trunking succeeded for %s\n", clp->cl_hostname, xprt->address_strings[RPC_DISPLAY_ADDR]); return 0; out_err: pr_info("NFS: %s: Session trunking failed for %s\n", clp->cl_hostname, xprt->address_strings[RPC_DISPLAY_ADDR]); return -EINVAL; } /** /** * nfs41_walk_client_list - Find nfs_client that matches a client/server owner * nfs41_walk_client_list - Find nfs_client that matches a client/server owner * * Loading Loading
fs/nfs/nfs4_fs.h +2 −0 Original line number Original line Diff line number Diff line Loading @@ -278,6 +278,8 @@ extern int nfs4_proc_get_lease_time(struct nfs_client *clp, struct nfs_fsinfo *fsinfo); struct nfs_fsinfo *fsinfo); extern int nfs4_proc_layoutcommit(struct nfs4_layoutcommit_data *data, extern int nfs4_proc_layoutcommit(struct nfs4_layoutcommit_data *data, bool sync); bool sync); extern int nfs4_detect_session_trunking(struct nfs_client *clp, struct nfs41_exchange_id_res *res, struct rpc_xprt *xprt); static inline bool static inline bool is_ds_only_client(struct nfs_client *clp) is_ds_only_client(struct nfs_client *clp) Loading
fs/nfs/nfs4client.c +90 −0 Original line number Original line Diff line number Diff line Loading @@ -595,6 +595,96 @@ nfs4_check_serverowner_major_id(struct nfs41_server_owner *o1, return false; return false; } } /* * Returns true if server minor ids match */ static bool nfs4_check_serverowner_minor_id(struct nfs41_server_owner *o1, struct nfs41_server_owner *o2) { /* Check eir_server_owner so_minor_id */ if (o1->minor_id != o2->minor_id) goto out_minor_mismatch; dprintk("NFS: --> %s server owner minor IDs match\n", __func__); return true; out_minor_mismatch: dprintk("NFS: --> %s server owner minor IDs do not match\n", __func__); return false; } /* * Returns true if the server scopes match */ static bool nfs4_check_server_scope(struct nfs41_server_scope *s1, struct nfs41_server_scope *s2) { if (s1->server_scope_sz != s2->server_scope_sz) goto out_scope_mismatch; if (memcmp(s1->server_scope, s2->server_scope, s1->server_scope_sz) != 0) goto out_scope_mismatch; dprintk("NFS: --> %s server scopes match\n", __func__); return true; out_scope_mismatch: dprintk("NFS: --> %s server scopes do not match\n", __func__); return false; } /** * nfs4_detect_session_trunking - Checks for session trunking called * after a successful EXCHANGE_ID testing a multi-addr connection to be * potentially added as a session trunk * * @clp: original mount nfs_client * @res: result structure from an exchange_id using the original mount * nfs_client with a new multi_addr transport * * Returns zero on success, otherwise -EINVAL * * Note: since the exchange_id for the new multi_addr transport uses the * same nfs_client from the original mount, the cl_owner_id is reused, * so eir_clientowner is the same. */ int nfs4_detect_session_trunking(struct nfs_client *clp, struct nfs41_exchange_id_res *res, struct rpc_xprt *xprt) { /* Check eir_clientid */ if (!nfs4_match_clientids(clp->cl_clientid, res->clientid)) goto out_err; /* Check eir_server_owner so_major_id */ if (!nfs4_check_serverowner_major_id(clp->cl_serverowner, res->server_owner)) goto out_err; /* Check eir_server_owner so_minor_id */ if (!nfs4_check_serverowner_minor_id(clp->cl_serverowner, res->server_owner)) goto out_err; /* Check eir_server_scope */ if (!nfs4_check_server_scope(clp->cl_serverscope, res->server_scope)) goto out_err; pr_info("NFS: %s: Session trunking succeeded for %s\n", clp->cl_hostname, xprt->address_strings[RPC_DISPLAY_ADDR]); return 0; out_err: pr_info("NFS: %s: Session trunking failed for %s\n", clp->cl_hostname, xprt->address_strings[RPC_DISPLAY_ADDR]); return -EINVAL; } /** /** * nfs41_walk_client_list - Find nfs_client that matches a client/server owner * nfs41_walk_client_list - Find nfs_client that matches a client/server owner * * Loading