![](/img/trans.png)
[英]Unknown symbol vfs_write (err -2) in kernel module in kernel 4.20
[英]Linux Kernel vfs_write function confusion
我正在查看舊的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()
顯然可以繼續調用異步IO函數時,為什么將其命名為“ sync”?
也許我可能錯過了一些東西,或者那時候在這里犯了一個大錯?
功能定義供參考,
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;
}
為什么函數
do_sync_write()
名為“ sync”,當它顯然可以繼續調用異步IO函數時呢?
它調用異步函數,然后等待其完成
ret = wait_on_sync_kiocb(&kiocb);
因此,從do_sync_write
函數的調用者的do_sync_write
,整個函數的行為都是同步的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.