|
|
@@ -2700,10 +2700,15 @@ static inline void lock_extent_range(struct inode *inode, u64 off, u64 len)
|
|
|
lock_extent(&BTRFS_I(inode)->io_tree, off, off + len - 1);
|
|
|
ordered = btrfs_lookup_first_ordered_extent(inode,
|
|
|
off + len - 1);
|
|
|
- if (!ordered &&
|
|
|
+ if ((!ordered ||
|
|
|
+ ordered->file_offset + ordered->len <= off ||
|
|
|
+ ordered->file_offset >= off + len) &&
|
|
|
!test_range_bit(&BTRFS_I(inode)->io_tree, off,
|
|
|
- off + len - 1, EXTENT_DELALLOC, 0, NULL))
|
|
|
+ off + len - 1, EXTENT_DELALLOC, 0, NULL)) {
|
|
|
+ if (ordered)
|
|
|
+ btrfs_put_ordered_extent(ordered);
|
|
|
break;
|
|
|
+ }
|
|
|
unlock_extent(&BTRFS_I(inode)->io_tree, off, off + len - 1);
|
|
|
if (ordered)
|
|
|
btrfs_put_ordered_extent(ordered);
|