fs/adfs/inode.c
Source file repositories/reference/linux-study-clean/fs/adfs/inode.c
File Facts
- System
- Linux kernel
- Corpus path
fs/adfs/inode.c- Extension
.c- Size
- 9909 bytes
- Lines
- 374
- 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.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/buffer_head.hlinux/mpage.hlinux/writeback.hadfs.h
Detected Declarations
function Copyrightfunction adfs_writepagesfunction adfs_read_foliofunction adfs_write_failedfunction adfs_write_beginfunction _adfs_bmapfunction adfs_atts2modefunction adfs_mode2attsfunction adfs_adfs2unix_timefunction adfs_unix2adfs_timefunction adfs_igetfunction adfs_setattrfunction adfs_write_inode
Annotated Snippet
// SPDX-License-Identifier: GPL-2.0-only
/*
* linux/fs/adfs/inode.c
*
* Copyright (C) 1997-1999 Russell King
*/
#include <linux/buffer_head.h>
#include <linux/mpage.h>
#include <linux/writeback.h>
#include "adfs.h"
/*
* Lookup/Create a block at offset 'block' into 'inode'. We currently do
* not support creation of new blocks, so we return -EIO for this case.
*/
static int
adfs_get_block(struct inode *inode, sector_t block, struct buffer_head *bh,
int create)
{
if (!create) {
if (block >= inode->i_blocks)
goto abort_toobig;
block = __adfs_block_map(inode->i_sb, ADFS_I(inode)->indaddr,
block);
if (block)
map_bh(bh, inode->i_sb, block);
return 0;
}
/* don't support allocation of blocks yet */
return -EIO;
abort_toobig:
return 0;
}
static int adfs_writepages(struct address_space *mapping,
struct writeback_control *wbc)
{
return mpage_writepages(mapping, wbc, adfs_get_block);
}
static int adfs_read_folio(struct file *file, struct folio *folio)
{
return block_read_full_folio(folio, adfs_get_block);
}
static void adfs_write_failed(struct address_space *mapping, loff_t to)
{
struct inode *inode = mapping->host;
if (to > inode->i_size)
truncate_pagecache(inode, inode->i_size);
}
static int adfs_write_begin(const struct kiocb *iocb,
struct address_space *mapping,
loff_t pos, unsigned len,
struct folio **foliop, void **fsdata)
{
int ret;
ret = cont_write_begin(iocb, mapping, pos, len, foliop, fsdata,
adfs_get_block,
&ADFS_I(mapping->host)->mmu_private);
if (unlikely(ret))
adfs_write_failed(mapping, pos + len);
return ret;
}
static sector_t _adfs_bmap(struct address_space *mapping, sector_t block)
{
return generic_block_bmap(mapping, block, adfs_get_block);
}
static const struct address_space_operations adfs_aops = {
.dirty_folio = block_dirty_folio,
.invalidate_folio = block_invalidate_folio,
.read_folio = adfs_read_folio,
.writepages = adfs_writepages,
.write_begin = adfs_write_begin,
.write_end = generic_write_end,
.migrate_folio = buffer_migrate_folio,
.bmap = _adfs_bmap,
};
/*
* Convert ADFS attributes and filetype to Linux permission.
*/
Annotation
- Immediate include surface: `linux/buffer_head.h`, `linux/mpage.h`, `linux/writeback.h`, `adfs.h`.
- Detected declarations: `function Copyright`, `function adfs_writepages`, `function adfs_read_folio`, `function adfs_write_failed`, `function adfs_write_begin`, `function _adfs_bmap`, `function adfs_atts2mode`, `function adfs_mode2atts`, `function adfs_adfs2unix_time`, `function adfs_unix2adfs_time`.
- 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.