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