fs/nfs/client.c
Source file repositories/reference/linux-study-clean/fs/nfs/client.c
File Facts
- System
- Linux kernel
- Corpus path
fs/nfs/client.c- Extension
.c- Size
- 40532 bytes
- Lines
- 1541
- Domain
- Core OS
- Bucket
- VFS And Filesystem Core
- Inferred role
- Core OS: exported/initcall integration point
- Status
- integration implementation candidate
Why This File Exists
Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Core operating-system implementation surface: boot, tasks, memory, VFS, syscall-facing interfaces, synchronization, credentials, and isolation.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/module.hlinux/init.hlinux/sched.hlinux/time.hlinux/kernel.hlinux/mm.hlinux/string.hlinux/stat.hlinux/errno.hlinux/unistd.hlinux/sunrpc/addr.hlinux/sunrpc/clnt.hlinux/sunrpc/stats.hlinux/sunrpc/metrics.hlinux/sunrpc/xprtsock.hlinux/sunrpc/xprtrdma.hlinux/nfs_fs.hlinux/nfs_mount.hlinux/nfs4_mount.hlinux/lockd/bind.hlinux/seq_file.hlinux/mount.hlinux/vfs.hlinux/inet.hlinux/in6.hlinux/slab.hlinux/idr.hnet/ipv6.hlinux/nfs_xdr.hlinux/sunrpc/bc_xprt.hlinux/nsproxy.hlinux/pid_namespace.h
Detected Declarations
function get_nfs_versionfunction put_nfs_versionfunction register_nfs_versionfunction unregister_nfs_versionfunction nfs_cleanup_cb_ident_idrfunction nfs_cb_idr_remove_lockedfunction pnfs_init_serverfunction nfs_cleanup_cb_ident_idrfunction nfs_put_clientfunction nfs_client_init_is_completefunction nfs_client_init_is_completefunction nfs_wait_client_init_completefunction nfs_found_clientfunction nfs_mark_client_readyfunction nfs_init_timeout_valuesfunction nfs_create_rpc_clientfunction nfs_destroy_serverfunction nfs_start_lockdfunction nfs_init_server_rpcclientfunction nfs4_server_set_init_capsfunction nfs_server_set_init_capsfunction nfs_init_serverfunction nfs_server_set_fsinfofunction nfs_probe_fsinfofunction nfs_probe_serverfunction nfs_server_copy_userdatafunction nfs_server_insert_listsfunction nfs_server_remove_listsfunction delayed_freefunction nfs_free_serverfunction nfs_clients_initfunction nfs_clients_exitfunction __acquiresfunction nfs_server_list_stopfunction nfs_server_list_showfunction __acquiresfunction nfs_volume_list_stopfunction nfs_volume_list_showfunction nfs_fs_proc_net_initfunction nfs_fs_proc_net_exitfunction nfs_fs_proc_initfunction nfs_fs_proc_exitexport get_nfs_versionexport register_nfs_versionexport unregister_nfs_versionexport nfs_alloc_clientexport nfs_free_clientexport nfs_put_client
Annotated Snippet
if (clp->cl_cons_state > NFS_CS_READY) {
refcount_inc(&clp->cl_count);
spin_unlock(&nn->nfs_client_lock);
error = nfs_wait_client_init_complete(clp);
nfs_put_client(clp);
spin_lock(&nn->nfs_client_lock);
if (error < 0)
return ERR_PTR(error);
goto again;
}
/* Different NFS versions cannot share the same nfs_client */
if (clp->rpc_ops != data->nfs_mod->rpc_ops)
continue;
if (clp->cl_proto != data->proto)
continue;
/* Match nfsv4 minorversion */
if (clp->cl_minorversion != data->minorversion)
continue;
/* Match request for a dedicated DS */
if (test_bit(NFS_CS_DS, &data->init_flags) !=
test_bit(NFS_CS_DS, &clp->cl_flags))
continue;
/* Match the full socket address */
if (!rpc_cmp_addr_port(sap, clap))
/* Match all xprt_switch full socket addresses */
if (IS_ERR(clp->cl_rpcclient) ||
!rpc_clnt_xprt_switch_has_addr(clp->cl_rpcclient,
sap))
continue;
/* Match the xprt security policy */
if (clp->cl_xprtsec.policy != data->xprtsec.policy)
continue;
if (clp->cl_xprtsec.policy == RPC_XPRTSEC_TLS_X509) {
if (clp->cl_xprtsec.cert_serial !=
data->xprtsec.cert_serial)
continue;
if (clp->cl_xprtsec.privkey_serial !=
data->xprtsec.privkey_serial)
continue;
}
refcount_inc(&clp->cl_count);
return clp;
}
return NULL;
}
/*
* Return true if @clp is done initializing, false if still working on it.
*
* Use nfs_client_init_status to check if it was successful.
*/
bool nfs_client_init_is_complete(const struct nfs_client *clp)
{
return clp->cl_cons_state <= NFS_CS_READY;
}
EXPORT_SYMBOL_GPL(nfs_client_init_is_complete);
/*
* Return 0 if @clp was successfully initialized, -errno otherwise.
*
* This must be called *after* nfs_client_init_is_complete() returns true,
* otherwise it will pop WARN_ON_ONCE and return -EINVAL
*/
int nfs_client_init_status(const struct nfs_client *clp)
{
/* called without checking nfs_client_init_is_complete */
if (clp->cl_cons_state > NFS_CS_READY) {
WARN_ON_ONCE(1);
return -EINVAL;
}
return clp->cl_cons_state;
}
EXPORT_SYMBOL_GPL(nfs_client_init_status);
int nfs_wait_client_init_complete(const struct nfs_client *clp)
{
return wait_event_killable(nfs_client_active_wq,
nfs_client_init_is_complete(clp));
}
EXPORT_SYMBOL_GPL(nfs_wait_client_init_complete);
/*
* Found an existing client. Make sure it's ready before returning.
*/
Annotation
- Immediate include surface: `linux/module.h`, `linux/init.h`, `linux/sched.h`, `linux/time.h`, `linux/kernel.h`, `linux/mm.h`, `linux/string.h`, `linux/stat.h`.
- Detected declarations: `function get_nfs_version`, `function put_nfs_version`, `function register_nfs_version`, `function unregister_nfs_version`, `function nfs_cleanup_cb_ident_idr`, `function nfs_cb_idr_remove_locked`, `function pnfs_init_server`, `function nfs_cleanup_cb_ident_idr`, `function nfs_put_client`, `function nfs_client_init_is_complete`.
- Atlas domain: Core OS / VFS And Filesystem Core.
- Implementation status: integration implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.