On Fri, Oct 20, 2023 at 08:37:26PM +0100, Matthew Wilcox wrote: > On Mon, Sep 18, 2023 at 01:04:56PM +0200, Hannes Reinecke wrote: > > Use accessor functions block_index_to_sector() and block_sector_to_index() > > to translate the page index into the block sector and vice versa. > > You missed two in grow_dev_page() (which I just happened upon): I have fixes here. The key part of the first patch is: static sector_t folio_init_buffers(struct folio *folio, - struct block_device *bdev, sector_t block, int size) + struct block_device *bdev, int size) { struct buffer_head *head = folio_buffers(folio); struct buffer_head *bh = head; bool uptodate = folio_test_uptodate(folio); + sector_t block = folio_pos(folio) / size; sector_t end_block = blkdev_max_block(bdev, size); (and then there's the cruft of removing the arguments from folio_init_buffers) The second patch is: static bool grow_buffers(struct block_device *bdev, sector_t block, unsigned size, gfp_t gfp) { - pgoff_t index; - int sizebits; - - sizebits = PAGE_SHIFT - __ffs(size); - index = block >> sizebits; + loff_t pos; [...] - if (unlikely(index != block >> sizebits)) { + if (check_mul_overflow(block, size, &pos) || pos > MAX_LFS_FILESIZE) { I'll send a proper patch series tomorrow once the fstests are done running.