fs/squashfs/xz_wrapper.c
Source file repositories/reference/linux-study-clean/fs/squashfs/xz_wrapper.c
File Facts
- System
- Linux kernel
- Corpus path
fs/squashfs/xz_wrapper.c- Extension
.c- Size
- 4019 bytes
- Lines
- 197
- 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/mutex.hlinux/bio.hlinux/slab.hlinux/xz.hlinux/bitops.hsquashfs_fs.hsquashfs_fs_sb.hsquashfs.hdecompressor.hpage_actor.h
Detected Declarations
struct squashfs_xzstruct disk_comp_optsstruct comp_optsfunction squashfs_xz_freefunction squashfs_xz_uncompress
Annotated Snippet
struct squashfs_xz {
struct xz_dec *state;
struct xz_buf buf;
};
struct disk_comp_opts {
__le32 dictionary_size;
__le32 flags;
};
struct comp_opts {
int dict_size;
};
static void *squashfs_xz_comp_opts(struct squashfs_sb_info *msblk,
void *buff, int len)
{
struct disk_comp_opts *comp_opts = buff;
struct comp_opts *opts;
int err = 0, n;
opts = kmalloc_obj(*opts);
if (opts == NULL) {
err = -ENOMEM;
goto out2;
}
if (comp_opts) {
/* check compressor options are the expected length */
if (len < sizeof(*comp_opts)) {
err = -EIO;
goto out;
}
opts->dict_size = le32_to_cpu(comp_opts->dictionary_size);
/* the dictionary size should be 2^n or 2^n+2^(n+1) */
n = ffs(opts->dict_size) - 1;
if (opts->dict_size != (1 << n) && opts->dict_size != (1 << n) +
(1 << (n + 1))) {
err = -EIO;
goto out;
}
} else
/* use defaults */
opts->dict_size = max_t(int, msblk->block_size,
SQUASHFS_METADATA_SIZE);
return opts;
out:
kfree(opts);
out2:
return ERR_PTR(err);
}
static void *squashfs_xz_init(struct squashfs_sb_info *msblk, void *buff)
{
struct comp_opts *comp_opts = buff;
struct squashfs_xz *stream;
int err;
stream = kmalloc_obj(*stream);
if (stream == NULL) {
err = -ENOMEM;
goto failed;
}
stream->state = xz_dec_init(XZ_PREALLOC, comp_opts->dict_size);
if (stream->state == NULL) {
kfree(stream);
err = -ENOMEM;
goto failed;
}
return stream;
failed:
ERROR("Failed to initialise xz decompressor\n");
return ERR_PTR(err);
}
static void squashfs_xz_free(void *strm)
{
struct squashfs_xz *stream = strm;
if (stream) {
xz_dec_end(stream->state);
Annotation
- Immediate include surface: `linux/mutex.h`, `linux/bio.h`, `linux/slab.h`, `linux/xz.h`, `linux/bitops.h`, `squashfs_fs.h`, `squashfs_fs_sb.h`, `squashfs.h`.
- Detected declarations: `struct squashfs_xz`, `struct disk_comp_opts`, `struct comp_opts`, `function squashfs_xz_free`, `function squashfs_xz_uncompress`.
- 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.