在an Intel white paper中,它说:
Linux中的MD RAID是一个在Linux之间过滤数据的块驱动程序 文件系统驱动程序,如ext2文件系统,以及低级硬盘 磁盘驱动程序,例如AHCI驱动程序和SAS驱动程序。
在内核代码drivers/md/md.c
中,我只找到此file_operations
:
static const struct file_operations md_seq_fops = {
.owner = THIS_MODULE,
.open = md_seq_open,
.read = seq_read,
.llseek = seq_lseek,
.release = seq_release_private,
.poll = mdstat_poll,
};
md_fops既没有读也没有写:
static const struct block_device_operations md_fops =
{
.owner = THIS_MODULE,
.open = md_open,
.release = md_release,
.ioctl = md_ioctl,
#ifdef CONFIG_COMPAT
.compat_ioctl = md_compat_ioctl,
#endif
.getgeo = md_getgeo,
.media_changed = md_media_changed,
.revalidate_disk= md_revalidate,
};
这是MD驱动程序执行的file_operations打开,读取......? MD驱动程序如何写入数据?使用AHCI驱动程序?
当调用write syscall时,写入数据的步骤是什么?
sys_write - > vfs_write - > file-> f_op-> write或do_sync_write? md_seq_fops既没有写也没有aio_write
答案 0 :(得分:1)
函数调用的确切顺序将取决于各种情况,例如I / O是否是直接的,I / O是同步还是异步等。根据这些情况,最后MD层的make_request()方法是调用此方法,并在创建RAID设备时通过blk_queue_make_request()调用由MD层本身注册,如下所示在md.c文件中:
blk_queue_make_request(mddev->queue, md_make_request);
这个md_make_request()函数将在内部调用特定于该RAID设备个性的make_request()方法,如下所示:
mddev->pers->make_request(mddev, bio);
您可以在源代码中的各个RAID文件中给出的RAID个性化方法列表中找到特定的make_request()方法,即对于raid0个性,这里是raid0.c中使用raid0_make_request()初始化make_request的方法列表。文件。
static struct md_personality raid0_personality=
{
.name = "raid0",
.level = 0,
.owner = THIS_MODULE,
.make_request = raid0_make_request,
.run = raid0_run,
.free = raid0_free,
.status = raid0_status,
.size = raid0_size,
.takeover = raid0_takeover,
.quiesce = raid0_quiesce,
.congested = raid0_congested,
};
此raid0_make_request()函数将在raid0设备上执行读取或写入。
答案 1 :(得分:0)
struct file_operations
还有更多成员。根据C99,未列出的成员被初始化为NULL
,这意味着他们没有特别实施。这对过滤器驱动程序来说是正常的;它们只取代了一些操作。