文章目录
- bdev
- block/bdev.c
-
- [BDEV_I 将通用的 inode 转换为块设备特定的 bdev_inode 结构体](#BDEV_I 将通用的 inode 转换为块设备特定的 bdev_inode 结构体)
- [I_BDEV 于从 inode 中提取与块设备(block_device)相关的信](#I_BDEV 于从 inode 中提取与块设备(block_device)相关的信)
- [bdev_cache_init 用于初始化块设备的缓存](#bdev_cache_init 用于初始化块设备的缓存)
- block/blk-ioc.c

bdev
block/bdev.c
BDEV_I 将通用的 inode 转换为块设备特定的 bdev_inode 结构体
c
struct bdev_inode {
struct block_device bdev;
struct inode vfs_inode;
};
static inline struct bdev_inode *BDEV_I(struct inode *inode)
{
return container_of(inode, struct bdev_inode, vfs_inode);
}
I_BDEV 于从 inode 中提取与块设备(block_device)相关的信
c
struct block_device *I_BDEV(struct inode *inode)
{
return &BDEV_I(inode)->bdev;
}
EXPORT_SYMBOL(I_BDEV);
bdev_cache_init 用于初始化块设备的缓存
c
static struct file_system_type bd_type = {
.name = "bdev",
.init_fs_context = bd_init_fs_context,
.kill_sb = kill_anon_super,
};
void __init bdev_cache_init(void)
{
int err;
/* SLAB_HWCACHE_ALIGN:确保缓存对象与硬件缓存对齐,提高访问效率。
SLAB_RECLAIM_ACCOUNT 和 SLAB_ACCOUNT:用于内存回收和内存使用统计。
SLAB_PANIC:如果缓存创建失败,触发内核 panic */
bdev_cachep = kmem_cache_create("bdev_cache", sizeof(struct bdev_inode),
0, (SLAB_HWCACHE_ALIGN|SLAB_RECLAIM_ACCOUNT|
SLAB_ACCOUNT|SLAB_PANIC),
init_once);
err = register_filesystem(&bd_type);
if (err)
panic("Cannot register bdev pseudo-fs");
blockdev_mnt = kern_mount(&bd_type);
if (IS_ERR(blockdev_mnt))
panic("Cannot create bdev pseudo-fs");
blockdev_superblock = blockdev_mnt->mnt_sb; /* For writeback */
}
block/blk-ioc.c
copy_io
c
int __copy_io(unsigned long clone_flags, struct task_struct *tsk)
{
struct io_context *ioc = current->io_context;
/*
* Share io context with parent, if CLONE_IO is set
*/
if (clone_flags & CLONE_IO) {
atomic_inc(&ioc->active_ref);
tsk->io_context = ioc;
} else if (ioprio_valid(ioc->ioprio)) {
tsk->io_context = alloc_io_context(GFP_KERNEL, NUMA_NO_NODE);
if (!tsk->io_context)
return -ENOMEM;
tsk->io_context->ioprio = ioc->ioprio;
}
return 0;
}
static inline int copy_io(unsigned long clone_flags, struct task_struct *tsk)
{
if (!current->io_context)
return 0;
return __copy_io(clone_flags, tsk);
}