Merge tag 'iomap-5.14-fixes-1' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux

Pull iomap fixes from Darrick Wong:
"A handful of bugfixes for the iomap code.

There's nothing especially exciting here, just fixes for UBSAN (not
KASAN as I erroneously wrote in the tag message) warnings about
undefined behavior in the SEEK_DATA/SEEK_HOLE code, and some
reshuffling of per-page block state info to fix some problems with
gfs2.

- Fix KASAN warnings due to integer overflow in SEEK_DATA/SEEK_HOLE

- Fix assertion errors when using inlinedata files on gfs2"

* tag 'iomap-5.14-fixes-1' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux:
iomap: Don't create iomap_page objects in iomap_page_mkwrite_actor
iomap: Don't create iomap_page objects for inline files
iomap: Permit pages without an iop to enter writeback
iomap: remove the length variable in iomap_seek_hole
iomap: remove the length variable in iomap_seek_data

Changed files
+13 -20
fs
+4 -4
fs/iomap/buffered-io.c
··· 215 if (PageUptodate(page)) 216 return; 217 218 BUG_ON(page->index); 219 BUG_ON(size > PAGE_SIZE - offset_in_page(iomap->inline_data)); 220 ··· 240 { 241 struct iomap_readpage_ctx *ctx = data; 242 struct page *page = ctx->cur_page; 243 - struct iomap_page *iop = iomap_page_create(inode, page); 244 bool same_page = false, is_contig = false; 245 loff_t orig_pos = pos; 246 unsigned poff, plen; ··· 253 } 254 255 /* zero post-eof blocks as the page may be mapped */ 256 iomap_adjust_read_range(inode, iop, &pos, length, &poff, &plen); 257 if (plen == 0) 258 goto done; ··· 969 block_commit_write(page, 0, length); 970 } else { 971 WARN_ON_ONCE(!PageUptodate(page)); 972 - iomap_page_create(inode, page); 973 set_page_dirty(page); 974 } 975 ··· 1305 struct writeback_control *wbc, struct inode *inode, 1306 struct page *page, u64 end_offset) 1307 { 1308 - struct iomap_page *iop = to_iomap_page(page); 1309 struct iomap_ioend *ioend, *next; 1310 unsigned len = i_blocksize(inode); 1311 u64 file_offset; /* file offset of page */ 1312 int error = 0, count = 0, i; 1313 LIST_HEAD(submit_list); 1314 1315 - WARN_ON_ONCE(i_blocks_per_page(inode, page) > 1 && !iop); 1316 WARN_ON_ONCE(iop && atomic_read(&iop->write_bytes_pending) != 0); 1317 1318 /*
··· 215 if (PageUptodate(page)) 216 return; 217 218 + BUG_ON(page_has_private(page)); 219 BUG_ON(page->index); 220 BUG_ON(size > PAGE_SIZE - offset_in_page(iomap->inline_data)); 221 ··· 239 { 240 struct iomap_readpage_ctx *ctx = data; 241 struct page *page = ctx->cur_page; 242 + struct iomap_page *iop; 243 bool same_page = false, is_contig = false; 244 loff_t orig_pos = pos; 245 unsigned poff, plen; ··· 252 } 253 254 /* zero post-eof blocks as the page may be mapped */ 255 + iop = iomap_page_create(inode, page); 256 iomap_adjust_read_range(inode, iop, &pos, length, &poff, &plen); 257 if (plen == 0) 258 goto done; ··· 967 block_commit_write(page, 0, length); 968 } else { 969 WARN_ON_ONCE(!PageUptodate(page)); 970 set_page_dirty(page); 971 } 972 ··· 1304 struct writeback_control *wbc, struct inode *inode, 1305 struct page *page, u64 end_offset) 1306 { 1307 + struct iomap_page *iop = iomap_page_create(inode, page); 1308 struct iomap_ioend *ioend, *next; 1309 unsigned len = i_blocksize(inode); 1310 u64 file_offset; /* file offset of page */ 1311 int error = 0, count = 0, i; 1312 LIST_HEAD(submit_list); 1313 1314 WARN_ON_ONCE(iop && atomic_read(&iop->write_bytes_pending) != 0); 1315 1316 /*
+9 -16
fs/iomap/seek.c
··· 35 iomap_seek_hole(struct inode *inode, loff_t offset, const struct iomap_ops *ops) 36 { 37 loff_t size = i_size_read(inode); 38 - loff_t length = size - offset; 39 loff_t ret; 40 41 /* Nothing to be found before or beyond the end of the file. */ 42 if (offset < 0 || offset >= size) 43 return -ENXIO; 44 45 - while (length > 0) { 46 - ret = iomap_apply(inode, offset, length, IOMAP_REPORT, ops, 47 - &offset, iomap_seek_hole_actor); 48 if (ret < 0) 49 return ret; 50 if (ret == 0) 51 break; 52 - 53 offset += ret; 54 - length -= ret; 55 } 56 57 return offset; ··· 80 iomap_seek_data(struct inode *inode, loff_t offset, const struct iomap_ops *ops) 81 { 82 loff_t size = i_size_read(inode); 83 - loff_t length = size - offset; 84 loff_t ret; 85 86 /* Nothing to be found before or beyond the end of the file. */ 87 if (offset < 0 || offset >= size) 88 return -ENXIO; 89 90 - while (length > 0) { 91 - ret = iomap_apply(inode, offset, length, IOMAP_REPORT, ops, 92 - &offset, iomap_seek_data_actor); 93 if (ret < 0) 94 return ret; 95 if (ret == 0) 96 - break; 97 - 98 offset += ret; 99 - length -= ret; 100 } 101 102 - if (length <= 0) 103 - return -ENXIO; 104 - return offset; 105 } 106 EXPORT_SYMBOL_GPL(iomap_seek_data);
··· 35 iomap_seek_hole(struct inode *inode, loff_t offset, const struct iomap_ops *ops) 36 { 37 loff_t size = i_size_read(inode); 38 loff_t ret; 39 40 /* Nothing to be found before or beyond the end of the file. */ 41 if (offset < 0 || offset >= size) 42 return -ENXIO; 43 44 + while (offset < size) { 45 + ret = iomap_apply(inode, offset, size - offset, IOMAP_REPORT, 46 + ops, &offset, iomap_seek_hole_actor); 47 if (ret < 0) 48 return ret; 49 if (ret == 0) 50 break; 51 offset += ret; 52 } 53 54 return offset; ··· 83 iomap_seek_data(struct inode *inode, loff_t offset, const struct iomap_ops *ops) 84 { 85 loff_t size = i_size_read(inode); 86 loff_t ret; 87 88 /* Nothing to be found before or beyond the end of the file. */ 89 if (offset < 0 || offset >= size) 90 return -ENXIO; 91 92 + while (offset < size) { 93 + ret = iomap_apply(inode, offset, size - offset, IOMAP_REPORT, 94 + ops, &offset, iomap_seek_data_actor); 95 if (ret < 0) 96 return ret; 97 if (ret == 0) 98 + return offset; 99 offset += ret; 100 } 101 102 + /* We've reached the end of the file without finding data */ 103 + return -ENXIO; 104 } 105 EXPORT_SYMBOL_GPL(iomap_seek_data);