Loading fs/iomap/buffered-io.c +25 −24 Original line number Diff line number Diff line Loading @@ -726,13 +726,14 @@ static size_t iomap_write_end(struct inode *inode, loff_t pos, size_t len, return ret; } static loff_t iomap_write_actor(struct inode *inode, loff_t pos, loff_t length, void *data, struct iomap *iomap, struct iomap *srcmap) static loff_t iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i) { struct iov_iter *i = data; long status = 0; struct iomap *srcmap = iomap_iter_srcmap(iter); struct iomap *iomap = &iter->iomap; loff_t length = iomap_length(iter); loff_t pos = iter->pos; ssize_t written = 0; long status = 0; do { struct page *page; Loading @@ -758,18 +759,18 @@ iomap_write_actor(struct inode *inode, loff_t pos, loff_t length, void *data, break; } status = iomap_write_begin(inode, pos, bytes, 0, &page, iomap, srcmap); status = iomap_write_begin(iter->inode, pos, bytes, 0, &page, iomap, srcmap); if (unlikely(status)) break; if (mapping_writably_mapped(inode->i_mapping)) if (mapping_writably_mapped(iter->inode->i_mapping)) flush_dcache_page(page); copied = copy_page_from_iter_atomic(page, offset, bytes, i); status = iomap_write_end(inode, pos, bytes, copied, page, iomap, srcmap); status = iomap_write_end(iter->inode, pos, bytes, copied, page, iomap, srcmap); if (unlikely(copied != status)) iov_iter_revert(i, copied - status); Loading @@ -790,29 +791,29 @@ iomap_write_actor(struct inode *inode, loff_t pos, loff_t length, void *data, written += status; length -= status; balance_dirty_pages_ratelimited(inode->i_mapping); balance_dirty_pages_ratelimited(iter->inode->i_mapping); } while (iov_iter_count(i) && length); return written ? written : status; } ssize_t iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *iter, iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *i, const struct iomap_ops *ops) { struct inode *inode = iocb->ki_filp->f_mapping->host; loff_t pos = iocb->ki_pos, ret = 0, written = 0; while (iov_iter_count(iter)) { ret = iomap_apply(inode, pos, iov_iter_count(iter), IOMAP_WRITE, ops, iter, iomap_write_actor); if (ret <= 0) break; pos += ret; written += ret; } struct iomap_iter iter = { .inode = iocb->ki_filp->f_mapping->host, .pos = iocb->ki_pos, .len = iov_iter_count(i), .flags = IOMAP_WRITE, }; int ret; return written ? written : ret; while ((ret = iomap_iter(&iter, ops)) > 0) iter.processed = iomap_write_iter(&iter, i); if (iter.pos == iocb->ki_pos) return ret; return iter.pos - iocb->ki_pos; } EXPORT_SYMBOL_GPL(iomap_file_buffered_write); Loading Loading
fs/iomap/buffered-io.c +25 −24 Original line number Diff line number Diff line Loading @@ -726,13 +726,14 @@ static size_t iomap_write_end(struct inode *inode, loff_t pos, size_t len, return ret; } static loff_t iomap_write_actor(struct inode *inode, loff_t pos, loff_t length, void *data, struct iomap *iomap, struct iomap *srcmap) static loff_t iomap_write_iter(struct iomap_iter *iter, struct iov_iter *i) { struct iov_iter *i = data; long status = 0; struct iomap *srcmap = iomap_iter_srcmap(iter); struct iomap *iomap = &iter->iomap; loff_t length = iomap_length(iter); loff_t pos = iter->pos; ssize_t written = 0; long status = 0; do { struct page *page; Loading @@ -758,18 +759,18 @@ iomap_write_actor(struct inode *inode, loff_t pos, loff_t length, void *data, break; } status = iomap_write_begin(inode, pos, bytes, 0, &page, iomap, srcmap); status = iomap_write_begin(iter->inode, pos, bytes, 0, &page, iomap, srcmap); if (unlikely(status)) break; if (mapping_writably_mapped(inode->i_mapping)) if (mapping_writably_mapped(iter->inode->i_mapping)) flush_dcache_page(page); copied = copy_page_from_iter_atomic(page, offset, bytes, i); status = iomap_write_end(inode, pos, bytes, copied, page, iomap, srcmap); status = iomap_write_end(iter->inode, pos, bytes, copied, page, iomap, srcmap); if (unlikely(copied != status)) iov_iter_revert(i, copied - status); Loading @@ -790,29 +791,29 @@ iomap_write_actor(struct inode *inode, loff_t pos, loff_t length, void *data, written += status; length -= status; balance_dirty_pages_ratelimited(inode->i_mapping); balance_dirty_pages_ratelimited(iter->inode->i_mapping); } while (iov_iter_count(i) && length); return written ? written : status; } ssize_t iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *iter, iomap_file_buffered_write(struct kiocb *iocb, struct iov_iter *i, const struct iomap_ops *ops) { struct inode *inode = iocb->ki_filp->f_mapping->host; loff_t pos = iocb->ki_pos, ret = 0, written = 0; while (iov_iter_count(iter)) { ret = iomap_apply(inode, pos, iov_iter_count(iter), IOMAP_WRITE, ops, iter, iomap_write_actor); if (ret <= 0) break; pos += ret; written += ret; } struct iomap_iter iter = { .inode = iocb->ki_filp->f_mapping->host, .pos = iocb->ki_pos, .len = iov_iter_count(i), .flags = IOMAP_WRITE, }; int ret; return written ? written : ret; while ((ret = iomap_iter(&iter, ops)) > 0) iter.processed = iomap_write_iter(&iter, i); if (iter.pos == iocb->ki_pos) return ret; return iter.pos - iocb->ki_pos; } EXPORT_SYMBOL_GPL(iomap_file_buffered_write); Loading