Linux md驱动程序如何将数据写入SATA磁盘?

时间:2016-01-04 03:12:10

标签: linux-kernel drivers raid

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

2 个答案:

答案 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,这意味着他们没有特别实施。这对过滤器驱动程序来说是正常的;它们只取代了一些操作。