fs/ntfs/runlist.c
Source file repositories/reference/linux-study-clean/fs/ntfs/runlist.c
File Facts
- System
- Linux kernel
- Corpus path
fs/ntfs/runlist.c- Extension
.c- Size
- 64698 bytes
- Lines
- 2090
- Domain
- Core OS
- Bucket
- VFS And Filesystem Core
- Inferred role
- Core OS: implementation source
- Status
- source 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.
- 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/overflow.hntfs.hattrib.h
Detected Declarations
function Copyrightfunction ntfs_rl_mcfunction ntfs_are_rl_mergeablefunction __ntfs_rl_mergefunction numberfunction numberfunction ntfs_get_size_for_mapping_pairsfunction numberfunction numberfunction numberfunction ntfs_get_size_for_mapping_pairsfunction numberfunction numberfunction ntfs_rl_truncate_nolockfunction ntfs_rl_sparsefunction ntfs_rl_get_compressed_sizefunction ntfs_rle_lcn_contiguousfunction ntfs_rle_containfunction ntfs_rle_lcn_contiguous
Annotated Snippet
if (loc > 0) {
dst[loc].vcn = dst[loc - 1].vcn + dst[loc - 1].length;
dst[loc].length = dst[loc + 1].vcn - dst[loc].vcn;
} else {
dst[loc].vcn = 0;
dst[loc].length = dst[loc + 1].vcn;
}
dst[loc].lcn = LCN_RL_NOT_MAPPED;
}
return dst;
}
/*
* ntfs_rl_replace - overwrite a runlist element with another runlist
* @dst: destination runlist to replace in
* @dsize: number of elements in @dst
* @src: source runlist to replace with
* @ssize: number of elements in @src
* @loc: index in @dst to replace
* @new_size: on success, set to the new combined size
*
* Replace the runlist element @dst at @loc with @src. Merge the left and
* right ends of the inserted runlist, if necessary.
*
* It is up to the caller to serialize access to the runlists @dst and @src.
*
* On success, return a pointer to the new, combined, runlist. Note, both
* runlists @dst and @src are deallocated before returning so you cannot use
* the pointers for anything any more. (Strictly speaking the returned runlist
* may be the same as @dst but this is irrelevant.)
*
* On error, return -errno. Both runlists are left unmodified.
*/
static inline struct runlist_element *ntfs_rl_replace(struct runlist_element *dst,
int dsize, struct runlist_element *src, int ssize, int loc,
size_t *new_size)
{
int delta;
bool left = false; /* Left end of @src needs merging. */
bool right = false; /* Right end of @src needs merging. */
int tail; /* Start of tail of @dst. */
int marker; /* End of the inserted runs. */
/* First, see if the left and right ends need merging. */
if ((loc + 1) < dsize)
right = ntfs_are_rl_mergeable(src + ssize - 1, dst + loc + 1);
if (loc > 0)
left = ntfs_are_rl_mergeable(dst + loc - 1, src);
/*
* Allocate some space. We will need less if the left, right, or both
* ends get merged. The -1 accounts for the run being replaced.
*/
delta = ssize - 1 - left - right;
if (delta > 0) {
dst = ntfs_rl_realloc(dst, dsize, dsize + delta);
if (IS_ERR(dst))
return dst;
}
*new_size = dsize + delta;
/*
* We are guaranteed to succeed from here so can start modifying the
* original runlists.
*/
/* First, merge the left and right ends, if necessary. */
if (right)
__ntfs_rl_merge(src + ssize - 1, dst + loc + 1);
if (left)
__ntfs_rl_merge(dst + loc - 1, src);
/*
* Offset of the tail of @dst. This needs to be moved out of the way
* to make space for the runs to be copied from @src, i.e. the first
* run of the tail of @dst.
* Nominally, @tail equals @loc + 1, i.e. location, skipping the
* replaced run. However, if @right, then one of @dst's runs is
* already merged into @src.
*/
tail = loc + right + 1;
/*
* First run after the @src runs that have been inserted, i.e. where
* the tail of @dst needs to be moved to.
* Nominally, @marker equals @loc + @ssize, i.e. location + number of
* runs in @src. However, if @left, then the first run in @src has
* been merged with one in @dst.
*/
marker = loc + ssize - left;
/* Move the tail of @dst out of the way, then copy in @src. */
ntfs_rl_mm(dst, marker, tail, dsize - tail);
Annotation
- Immediate include surface: `linux/overflow.h`, `ntfs.h`, `attrib.h`.
- Detected declarations: `function Copyright`, `function ntfs_rl_mc`, `function ntfs_are_rl_mergeable`, `function __ntfs_rl_merge`, `function number`, `function number`, `function ntfs_get_size_for_mapping_pairs`, `function number`, `function number`, `function number`.
- Atlas domain: Core OS / VFS And Filesystem Core.
- Implementation status: source implementation candidate.
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.