简单处理后,把重担交给了generic_perform_write()
mm/filemap.c:
2667 generic_file_buffered_write(struct kiocb *iocb, const struct iovec *iov,
2668 unsigned long nr_segs, loff_t pos, loff_t *ppos,
2669 size_t count, ssize_t written)
2670 {
//@nr_segs:最早从do_sync_write()传下来时等于1,在ocfs2_file_aio_write()中调用
//generic_segment_checks(&nr_segs),即对struct iovec向量进行检查,看是否每个分量
//都是access_ok()?
//@count: number of bytes to write
//@written: 从ocfs2_file_aio_write()传下来等于0
2671 struct file *file = iocb->ki_filp;
2672 ssize_t status;
2673 struct iov_iter i;
2674
//初始化iovec迭代器,逻辑很简单
2675 iov_iter_init(&i, iov, nr_segs, count, written);
//here we go!
2676 status = generic_perform_write(file, &i, pos);
2677
2678 if (likely(status >= 0)) {
2679 written += status;
2680 *ppos = pos + status;
2681 }
2682
2683 return written ? written : status;
2684 }