2

英特尔白皮书中,它说:

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 open, read...?MD驱动如何写入数据?使用AHCI驱动程序?

当调用 write 系统调用时,写入数据的步骤是什么?

sys_write -> vfs_write -> 文件->f_op->write 还是 do_sync_write?md_seq_fops 既没有 write 也没有 aio_write

4

2 回答 2

1

函数调用的确切顺序将取决于各种情况,例如 I/O 是否直接,I/O 是同步还是异步等。根据这些情况,最后会调用 MD 层的 make_request() 方法,这方法由 MD 层在通过 blk_queue_make_request() 调用创建 RAID 设备时自行注册,如下 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 设备上执行读取或写入。

于 2016-01-04T12:57:21.860 回答
0

struct file_operations有更多的成员。根据 C99,未列出的成员被初始化为NULL这意味着它们没有特别实现。这对于过滤器驱动程序来说是正常的;它们只替换了一些操作。

于 2016-01-04T11:58:57.313 回答