fs/nfs/write.c
Source file repositories/reference/linux-study-clean/fs/nfs/write.c
File Facts
- System
- Linux kernel
- Corpus path
fs/nfs/write.c- Extension
.c- Size
- 59997 bytes
- Lines
- 2211
- 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/types.hlinux/slab.hlinux/mm.hlinux/pagemap.hlinux/file.hlinux/writeback.hlinux/swap.hlinux/migrate.hlinux/sunrpc/clnt.hlinux/nfs_fs.hlinux/nfs_mount.hlinux/nfs_page.hlinux/backing-dev.hlinux/export.hlinux/freezer.hlinux/wait.hlinux/iversion.hlinux/filelock.hlinux/uaccess.hlinux/sched/mm.hdelegation.hinternal.hiostat.hnfs4_fs.hfscache.hpnfs.hnfstrace.h
Detected Declarations
struct nfs_io_completionfunction nfs_commit_freefunction nfs_writehdr_freefunction nfs_io_completion_initfunction nfs_io_completion_releasefunction nfs_io_completion_getfunction nfs_io_completion_putfunction nfs_page_set_inode_reffunction nfs_cancel_remove_inodefunction nfs_grow_filefunction nfs_set_pageerrorfunction nfs_mapping_set_errorfunction nfs_page_group_covers_pagefunction nfs_mark_uptodatefunction wb_priorityfunction nfs_folio_set_writebackfunction nfs_folio_end_writebackfunction nfs_page_end_writebackfunction nfs_destroy_unlinked_subrequestsfunction thefunction nfs_wait_on_requestfunction nfs_unroll_locksfunction nfs_page_group_lock_subreqfunction thefunction nfs_write_errorfunction nfs_wait_on_requestfunction nfs_writepage_lockedfunction nfs_io_completion_commitfunction nfs_writepagesfunction nfs_inode_add_requestfunction nfs_inode_remove_requestfunction nfs_mark_request_dirtyfunction NFS_Ifunction nfs_request_add_commit_listfunction nfs_request_remove_commit_listfunction nfs_init_cinfo_from_inodefunction nfs_init_cinfofunction nfs_mark_request_commitfunction nfs_folio_clear_commitfunction nfs_clear_request_commitfunction nfs_write_need_commitfunction nfs_async_write_initfunction nfs_write_completionfunction nfs_reqs_to_commitfunction nfs_scan_commit_listfunction list_for_each_entry_safefunction nfs_scan_commitfunction nfs_flush_incompatible
Annotated Snippet
struct nfs_io_completion {
void (*complete)(void *data);
void *data;
struct kref refcount;
};
/*
* Local function declarations
*/
static void nfs_redirty_request(struct nfs_page *req);
static const struct rpc_call_ops nfs_commit_ops;
static const struct nfs_pgio_completion_ops nfs_async_write_completion_ops;
static const struct nfs_commit_completion_ops nfs_commit_completion_ops;
static const struct nfs_rw_ops nfs_rw_write_ops;
static void nfs_inode_remove_request(struct nfs_page *req);
static void nfs_clear_request_commit(struct nfs_commit_info *cinfo,
struct nfs_page *req);
static void nfs_init_cinfo_from_inode(struct nfs_commit_info *cinfo,
struct inode *inode);
static struct kmem_cache *nfs_wdata_cachep;
static mempool_t *nfs_wdata_mempool;
static struct kmem_cache *nfs_cdata_cachep;
static mempool_t *nfs_commit_mempool;
struct nfs_commit_data *nfs_commitdata_alloc(void)
{
struct nfs_commit_data *p;
p = kmem_cache_zalloc(nfs_cdata_cachep, nfs_io_gfp_mask());
if (!p) {
p = mempool_alloc(nfs_commit_mempool, GFP_NOWAIT);
if (!p)
return NULL;
memset(p, 0, sizeof(*p));
}
INIT_LIST_HEAD(&p->pages);
return p;
}
EXPORT_SYMBOL_GPL(nfs_commitdata_alloc);
void nfs_commit_free(struct nfs_commit_data *p)
{
mempool_free(p, nfs_commit_mempool);
}
EXPORT_SYMBOL_GPL(nfs_commit_free);
static struct nfs_pgio_header *nfs_writehdr_alloc(void)
{
struct nfs_pgio_header *p;
p = kmem_cache_zalloc(nfs_wdata_cachep, nfs_io_gfp_mask());
if (!p) {
p = mempool_alloc(nfs_wdata_mempool, GFP_NOWAIT);
if (!p)
return NULL;
memset(p, 0, sizeof(*p));
}
p->rw_mode = FMODE_WRITE;
return p;
}
static void nfs_writehdr_free(struct nfs_pgio_header *hdr)
{
mempool_free(hdr, nfs_wdata_mempool);
}
static struct nfs_io_completion *nfs_io_completion_alloc(gfp_t gfp_flags)
{
return kmalloc_obj(struct nfs_io_completion, gfp_flags);
}
static void nfs_io_completion_init(struct nfs_io_completion *ioc,
void (*complete)(void *), void *data)
{
ioc->complete = complete;
ioc->data = data;
kref_init(&ioc->refcount);
}
static void nfs_io_completion_release(struct kref *kref)
{
struct nfs_io_completion *ioc = container_of(kref,
struct nfs_io_completion, refcount);
ioc->complete(ioc->data);
kfree(ioc);
}
static void nfs_io_completion_get(struct nfs_io_completion *ioc)
{
Annotation
- Immediate include surface: `linux/types.h`, `linux/slab.h`, `linux/mm.h`, `linux/pagemap.h`, `linux/file.h`, `linux/writeback.h`, `linux/swap.h`, `linux/migrate.h`.
- Detected declarations: `struct nfs_io_completion`, `function nfs_commit_free`, `function nfs_writehdr_free`, `function nfs_io_completion_init`, `function nfs_io_completion_release`, `function nfs_io_completion_get`, `function nfs_io_completion_put`, `function nfs_page_set_inode_ref`, `function nfs_cancel_remove_inode`, `function nfs_grow_file`.
- 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.