[Linux]学习笔记系列 -- [block][\bdev]

文章目录

  • 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

https://github.com/wdfk-prog/linux-study

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);
}