gpt4 book ai didi

c - Linux Kernel vfs_write 函数混淆

转载 作者:太空宇宙 更新时间:2023-11-04 11:47:04 28 4
gpt4 key购买 nike

我正在查看旧的 Linux 内核代码 (3.10.1),尤其是 IO 路径。

所以当IO进入VFS层时,函数vfs_write()被调用。

在这里我可以看到对 file->f_op->write() 的调用,这是一个阻塞调用,作为系统调用 write() 的手册页说。

代码中的另一个选项是当 file->f_op->write 指针未定义时,在这种情况下 vfs_write() 调用 do_sync_write()

do_sync_write() 继续调用 filp->f_op->aio_write(),这是 aio_write() 手册页中的异步调用 解释。

现在,我的问题是,为什么函数 do_sync_write() 命名为“sync”,而它显然继续调用异步 IO 函数?

我可能遗漏了什么,或者当时这里犯了一个错误?

供引用的函数定义,

ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)
{
ssize_t ret;

if (!(file->f_mode & FMODE_WRITE))
return -EBADF;
if (!file->f_op || (!file->f_op->write && !file->f_op->aio_write))
return -EINVAL;
if (unlikely(!access_ok(VERIFY_READ, buf, count)))
return -EFAULT;

ret = rw_verify_area(WRITE, file, pos, count);
if (ret >= 0) {
count = ret;
file_start_write(file);
if (file->f_op->write)
ret = file->f_op->write(file, buf, count, pos);
else
ret = do_sync_write(file, buf, count, pos);
if (ret > 0) {
fsnotify_modify(file);
add_wchar(current, ret);
}
inc_syscw(current);
file_end_write(file);
}

return ret;
}



ssize_t do_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos)
{
struct iovec iov = { .iov_base = (void __user *)buf, .iov_len = len };
struct kiocb kiocb;
ssize_t ret;

init_sync_kiocb(&kiocb, filp);
kiocb.ki_pos = *ppos;
kiocb.ki_left = len;
kiocb.ki_nbytes = len;

ret = filp->f_op->aio_write(&kiocb, &iov, 1, kiocb.ki_pos);
if (-EIOCBQUEUED == ret)
ret = wait_on_sync_kiocb(&kiocb);
*ppos = kiocb.ki_pos;
return ret;
}

最佳答案

why was the function do_sync_write() named "sync", when it clearly goes on to call an async IO function?

它调用异步函数,然后等待其完成

ret = wait_on_sync_kiocb(&kiocb);

所以从do_sync_write函数调用者的角度来看,整个函数行为是同步的。

关于c - Linux Kernel vfs_write 函数混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57313020/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com