Loading fs/iomap/buffered-io.c +17 −22 Original line number Diff line number Diff line Loading @@ -961,15 +961,15 @@ iomap_truncate_page(struct inode *inode, loff_t pos, bool *did_zero, } EXPORT_SYMBOL_GPL(iomap_truncate_page); static loff_t iomap_page_mkwrite_actor(struct inode *inode, loff_t pos, loff_t length, void *data, struct iomap *iomap, struct iomap *srcmap) static loff_t iomap_page_mkwrite_iter(struct iomap_iter *iter, struct page *page) { struct page *page = data; loff_t length = iomap_length(iter); int ret; if (iomap->flags & IOMAP_F_BUFFER_HEAD) { ret = __block_write_begin_int(page, pos, length, NULL, iomap); if (iter->iomap.flags & IOMAP_F_BUFFER_HEAD) { ret = __block_write_begin_int(page, iter->pos, length, NULL, &iter->iomap); if (ret) return ret; block_commit_write(page, 0, length); Loading @@ -983,29 +983,24 @@ iomap_page_mkwrite_actor(struct inode *inode, loff_t pos, loff_t length, vm_fault_t iomap_page_mkwrite(struct vm_fault *vmf, const struct iomap_ops *ops) { struct iomap_iter iter = { .inode = file_inode(vmf->vma->vm_file), .flags = IOMAP_WRITE | IOMAP_FAULT, }; struct page *page = vmf->page; struct inode *inode = file_inode(vmf->vma->vm_file); unsigned long length; loff_t offset; ssize_t ret; lock_page(page); ret = page_mkwrite_check_truncate(page, inode); ret = page_mkwrite_check_truncate(page, iter.inode); if (ret < 0) goto out_unlock; length = ret; offset = page_offset(page); while (length > 0) { ret = iomap_apply(inode, offset, length, IOMAP_WRITE | IOMAP_FAULT, ops, page, iomap_page_mkwrite_actor); if (unlikely(ret <= 0)) goto out_unlock; offset += ret; length -= ret; } iter.pos = page_offset(page); iter.len = ret; while ((ret = iomap_iter(&iter, ops)) > 0) iter.processed = iomap_page_mkwrite_iter(&iter, page); if (ret < 0) goto out_unlock; wait_for_stable_page(page); return VM_FAULT_LOCKED; out_unlock: Loading Loading
fs/iomap/buffered-io.c +17 −22 Original line number Diff line number Diff line Loading @@ -961,15 +961,15 @@ iomap_truncate_page(struct inode *inode, loff_t pos, bool *did_zero, } EXPORT_SYMBOL_GPL(iomap_truncate_page); static loff_t iomap_page_mkwrite_actor(struct inode *inode, loff_t pos, loff_t length, void *data, struct iomap *iomap, struct iomap *srcmap) static loff_t iomap_page_mkwrite_iter(struct iomap_iter *iter, struct page *page) { struct page *page = data; loff_t length = iomap_length(iter); int ret; if (iomap->flags & IOMAP_F_BUFFER_HEAD) { ret = __block_write_begin_int(page, pos, length, NULL, iomap); if (iter->iomap.flags & IOMAP_F_BUFFER_HEAD) { ret = __block_write_begin_int(page, iter->pos, length, NULL, &iter->iomap); if (ret) return ret; block_commit_write(page, 0, length); Loading @@ -983,29 +983,24 @@ iomap_page_mkwrite_actor(struct inode *inode, loff_t pos, loff_t length, vm_fault_t iomap_page_mkwrite(struct vm_fault *vmf, const struct iomap_ops *ops) { struct iomap_iter iter = { .inode = file_inode(vmf->vma->vm_file), .flags = IOMAP_WRITE | IOMAP_FAULT, }; struct page *page = vmf->page; struct inode *inode = file_inode(vmf->vma->vm_file); unsigned long length; loff_t offset; ssize_t ret; lock_page(page); ret = page_mkwrite_check_truncate(page, inode); ret = page_mkwrite_check_truncate(page, iter.inode); if (ret < 0) goto out_unlock; length = ret; offset = page_offset(page); while (length > 0) { ret = iomap_apply(inode, offset, length, IOMAP_WRITE | IOMAP_FAULT, ops, page, iomap_page_mkwrite_actor); if (unlikely(ret <= 0)) goto out_unlock; offset += ret; length -= ret; } iter.pos = page_offset(page); iter.len = ret; while ((ret = iomap_iter(&iter, ops)) > 0) iter.processed = iomap_page_mkwrite_iter(&iter, page); if (ret < 0) goto out_unlock; wait_for_stable_page(page); return VM_FAULT_LOCKED; out_unlock: Loading