}
 EXPORT_SYMBOL(folio_zero_new_buffers);
 
-static void
+static int
 iomap_to_bh(struct inode *inode, sector_t block, struct buffer_head *bh,
                const struct iomap *iomap)
 {
         * current block, then do not map the buffer and let the caller
         * handle it.
         */
-       BUG_ON(offset >= iomap->offset + iomap->length);
+       if (offset >= iomap->offset + iomap->length)
+               return -EIO;
 
        switch (iomap->type) {
        case IOMAP_HOLE:
                if (!buffer_uptodate(bh) ||
                    (offset >= i_size_read(inode)))
                        set_buffer_new(bh);
-               break;
+               return 0;
        case IOMAP_DELALLOC:
                if (!buffer_uptodate(bh) ||
                    (offset >= i_size_read(inode)))
                set_buffer_uptodate(bh);
                set_buffer_mapped(bh);
                set_buffer_delay(bh);
-               break;
+               return 0;
        case IOMAP_UNWRITTEN:
                /*
                 * For unwritten regions, we always need to ensure that regions
                bh->b_blocknr = (iomap->addr + offset - iomap->offset) >>
                                inode->i_blkbits;
                set_buffer_mapped(bh);
-               break;
+               return 0;
+       default:
+               WARN_ON_ONCE(1);
+               return -EIO;
        }
 }
 
                        clear_buffer_new(bh);
                if (!buffer_mapped(bh)) {
                        WARN_ON(bh->b_size != blocksize);
-                       if (get_block) {
+                       if (get_block)
                                err = get_block(inode, block, bh, 1);
-                               if (err)
-                                       break;
-                       } else {
-                               iomap_to_bh(inode, block, bh, iomap);
-                       }
+                       else
+                               err = iomap_to_bh(inode, block, bh, iomap);
+                       if (err)
+                               break;
 
                        if (buffer_new(bh)) {
                                clean_bdev_bh_alias(bh);