簡體   English   中英

Linux內核vfs_write函數混亂

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM