I suspect this might be where your problems lies: blockdev_direct_IO calls __blockdev_direct_IO with DIO_SKIP_HOLES set. DIO_SKIP_HOLES causes get_more_blocks to never set the create bit to get_block except for writes beyond i_size. If we want to replicate that behavior with iomap, ->iomap_begin needs to return -ENOTBLK when it encounters a hole for writing. To properly supporting writing to holes we'd need unwritten extents, which jfs does not support. gfs2 might be a place to look for how to implement this.