fs/nfs/localio.c
Source file repositories/reference/linux-study-clean/fs/nfs/localio.c
File Facts
- System
- Linux kernel
- Corpus path
fs/nfs/localio.c- Extension
.c- Size
- 29578 bytes
- Lines
- 1121
- 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/errno.hlinux/vfs.hlinux/file.hlinux/inet.hlinux/sunrpc/addr.hlinux/inetdevice.hnet/addrconf.hlinux/nfs_common.hlinux/nfslocalio.hlinux/bvec.hlinux/nfs.hlinux/nfs_fs.hlinux/nfs_xdr.hinternal.hpnfs.hnfstrace.h
Detected Declarations
struct nfs_local_kiocbstruct nfs_local_fsync_ctxfunction nfs_client_is_localfunction nfs_server_is_localfunction localio_xdr_enc_uuidargsfunction localio_xdr_dec_uuidresfunction nfs_server_uuid_is_localfunction nfs_local_probefunction nfs_local_probe_async_workfunction nfs_local_probe_asyncfunction nfs_local_file_putfunction nfs_to_nfsd_file_put_localfunction nfs_local_open_fhfunction nfs_local_mapping_set_gfp_nofs_contextfunction nfs_local_iocb_freefunction nfs_local_iocb_allocfunction nfs_is_local_dio_possiblefunction nfs_iov_iter_aligned_bvecfunction nfs_local_iter_setupfunction nfs_local_iters_setup_diofunction nfs_local_iters_initfunction nfs_local_hdr_releasefunction nfs_local_pgio_initfunction nfs_local_pgio_donefunction nfs_local_iocb_releasefunction nfs_local_pgio_restartfunction nfs_local_pgio_releasefunction rpc_call_donefunction nfs_local_read_donefunction nfs_local_read_iocb_donefunction nfs_local_read_aio_complete_workfunction nfs_local_read_aio_completefunction nfs_local_call_readfunction nfs_local_do_readfunction nfs_copy_boot_verifierfunction nfs_reset_boot_verifierfunction nfs_set_local_verifierfunction __vfs_getattrfunction __nfsd4_change_attributefunction nfs_local_vfs_getattrfunction nfs_local_write_donefunction nfs_local_write_iocb_donefunction nfs_local_write_aio_complete_workfunction nfs_local_write_aio_completefunction nfs_local_call_writefunction nfs_local_do_writefunction nfs_local_iocb_initfunction nfs_local_doio
Annotated Snippet
dprintk("%s: vfs_read count=%u pos=%llu\n",
__func__, hdr->args.count, hdr->args.offset);
nfs_local_pgio_init(hdr, call_ops);
hdr->res.eof = false;
INIT_WORK(&iocb->work, nfs_local_call_read);
queue_work(nfslocaliod_workqueue, &iocb->work);
}
static void
nfs_copy_boot_verifier(struct nfs_write_verifier *verifier, struct inode *inode)
{
struct nfs_client *clp = NFS_SERVER(inode)->nfs_client;
u32 *verf = (u32 *)verifier->data;
unsigned int seq;
do {
seq = read_seqbegin(&clp->cl_boot_lock);
verf[0] = (u32)clp->cl_nfssvc_boot.tv_sec;
verf[1] = (u32)clp->cl_nfssvc_boot.tv_nsec;
} while (read_seqretry(&clp->cl_boot_lock, seq));
}
static void
nfs_reset_boot_verifier(struct inode *inode)
{
struct nfs_client *clp = NFS_SERVER(inode)->nfs_client;
write_seqlock(&clp->cl_boot_lock);
ktime_get_real_ts64(&clp->cl_nfssvc_boot);
write_sequnlock(&clp->cl_boot_lock);
}
static void
nfs_set_local_verifier(struct inode *inode,
struct nfs_writeverf *verf,
enum nfs3_stable_how how)
{
nfs_copy_boot_verifier(&verf->verifier, inode);
verf->committed = how;
}
/* Factored out from fs/nfsd/vfs.h:fh_getattr() */
static int __vfs_getattr(const struct path *p, struct kstat *stat, int version)
{
u32 request_mask = STATX_BASIC_STATS;
if (version == 4)
request_mask |= (STATX_BTIME | STATX_CHANGE_COOKIE);
return vfs_getattr(p, stat, request_mask, AT_STATX_SYNC_AS_STAT);
}
/* Copied from fs/nfsd/nfsfh.c:nfsd4_change_attribute() */
static u64 __nfsd4_change_attribute(const struct kstat *stat,
const struct inode *inode)
{
u64 chattr;
if (stat->result_mask & STATX_CHANGE_COOKIE) {
chattr = stat->change_cookie;
if (S_ISREG(inode->i_mode) &&
!(stat->attributes & STATX_ATTR_CHANGE_MONOTONIC)) {
chattr += (u64)stat->ctime.tv_sec << 30;
chattr += stat->ctime.tv_nsec;
}
} else {
chattr = time_to_chattr(&stat->ctime);
}
return chattr;
}
static void nfs_local_vfs_getattr(struct nfs_local_kiocb *iocb)
{
struct kstat stat;
struct file *filp = iocb->kiocb.ki_filp;
struct nfs_pgio_header *hdr = iocb->hdr;
struct nfs_fattr *fattr = hdr->res.fattr;
int version = NFS_PROTO(hdr->inode)->version;
if (unlikely(!fattr) || __vfs_getattr(&filp->f_path, &stat, version))
return;
fattr->valid = (NFS_ATTR_FATTR_FILEID |
NFS_ATTR_FATTR_CHANGE |
NFS_ATTR_FATTR_SIZE |
NFS_ATTR_FATTR_ATIME |
NFS_ATTR_FATTR_MTIME |
NFS_ATTR_FATTR_CTIME |
NFS_ATTR_FATTR_SPACE_USED);
Annotation
- Immediate include surface: `linux/module.h`, `linux/errno.h`, `linux/vfs.h`, `linux/file.h`, `linux/inet.h`, `linux/sunrpc/addr.h`, `linux/inetdevice.h`, `net/addrconf.h`.
- Detected declarations: `struct nfs_local_kiocb`, `struct nfs_local_fsync_ctx`, `function nfs_client_is_local`, `function nfs_server_is_local`, `function localio_xdr_enc_uuidargs`, `function localio_xdr_dec_uuidres`, `function nfs_server_uuid_is_local`, `function nfs_local_probe`, `function nfs_local_probe_async_work`, `function nfs_local_probe_async`.
- 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.