Hugh Dickins <hu...@google.com> writes: > [PATCH] block: replace __getblk_slow misfix by grow_dev_page fix > > Commit 91f68c89d8f3 ("block: fix infinite loop in __getblk_slow") > is not good: a successful call to grow_buffers() cannot guarantee > that the page won't be reclaimed before the immediate next call to > __find_get_block(), which is why there was always a loop there. [snip] > Revert 91f68c89d8f3, restoring __getblk_slow() to how it was (plus > a checkpatch nitfix). Simplify the interface between grow_buffers() > and grow_dev_page(), and avoid the infinite loop beyond end of device > by instead checking init_page_buffers()'s end_block there (I presume > that's more efficient than a repeated call to blkdev_max_block()), > returning -ENXIO to __getblk_slow() in that case. > > And remove akpm's ten-year-old "__getblk() cannot fail ... weird" > comment, but that is worrying: are all users of __getblk() really > now prepared for a NULL bh beyond end of device, or will some oops??
Hi, Hugh, Thanks for digging into this. I had wondered whether that loop was required for other purposes, and you've verified that it was. I mostly like your fix. Returning end_block from init_page_buffers is a little strange, but I understand not wanting to redo the call to blkdev_max_block. I went ahead to re-tested with the reproducer that I had, and your patch works fine. Thanks again for tracking this down, and sorry I wasn't more diligent to begin with. Reviewed-and-Tested-by: Jeff Moyer <jmo...@redhat.com> -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/