@@ -7241,18 +7241,13 @@ static int btrfs_dio_iomap_begin(struct inode *inode, loff_t start,
unlock_extents = true;
/* Recalc len in case the new em is smaller than requested */
len = min(len, em->len - (start - em->start));
- } else if (em->block_start == EXTENT_MAP_HOLE ||
- test_bit(EXTENT_FLAG_PREALLOC, &em->flags)) {
- /* Unlock in case of direct reading from a hole */
- unlock_extents = true;
- } else {
+ } else if (start + len < lockend) {
/*
* We need to unlock only the end area that we aren't using.
* The rest is going to be unlocked by the endio routine.
*/
lockstart = start + len;
- if (lockstart < lockend)
- unlock_extents = true;
+ unlock_extents = true;
}
if (unlock_extents)
@@ -7299,8 +7294,10 @@ static int btrfs_dio_iomap_end(struct inode *inode, loff_t pos, loff_t length,
struct btrfs_iomap *btrfs_iomap = iomap->private;
int ret = 0;
- if (!(flags & IOMAP_WRITE))
+ if (!(flags & IOMAP_WRITE)) {
+ unlock_extent(&BTRFS_I(inode)->io_tree, pos, pos + length - 1);
return 0;
+ }
if (btrfs_iomap->submitted_bytes < length) {
__endio_write_update_ordered(inode,
@@ -7661,10 +7658,7 @@ static void btrfs_endio_direct_read(struct bio *bio)
if (dip->flags & BTRFS_DIO_ORIG_BIO_SUBMITTED)
err = btrfs_subio_endio_read(inode, io_bio, err);
- unlock_extent(&BTRFS_I(inode)->io_tree, dip->logical_offset,
- dip->logical_offset + dip->bytes - 1);
dio_bio = dip->dio_bio;
-
kfree(dip);
btrfs_io_bio_free_csum(io_bio);