簡單處理後,把重擔交給了generic_perform_write()
code
mm/filemap.c:orm
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 }