diff options
Diffstat (limited to 'fs/btrfs/ioctl.c')
-rw-r--r-- | fs/btrfs/ioctl.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index f0b4237cedfc..04ece8fab921 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
@@ -2700,10 +2700,15 @@ static inline void lock_extent_range(struct inode *inode, u64 off, u64 len) | |||
2700 | lock_extent(&BTRFS_I(inode)->io_tree, off, off + len - 1); | 2700 | lock_extent(&BTRFS_I(inode)->io_tree, off, off + len - 1); |
2701 | ordered = btrfs_lookup_first_ordered_extent(inode, | 2701 | ordered = btrfs_lookup_first_ordered_extent(inode, |
2702 | off + len - 1); | 2702 | off + len - 1); |
2703 | if (!ordered && | 2703 | if ((!ordered || |
2704 | ordered->file_offset + ordered->len <= off || | ||
2705 | ordered->file_offset >= off + len) && | ||
2704 | !test_range_bit(&BTRFS_I(inode)->io_tree, off, | 2706 | !test_range_bit(&BTRFS_I(inode)->io_tree, off, |
2705 | off + len - 1, EXTENT_DELALLOC, 0, NULL)) | 2707 | off + len - 1, EXTENT_DELALLOC, 0, NULL)) { |
2708 | if (ordered) | ||
2709 | btrfs_put_ordered_extent(ordered); | ||
2706 | break; | 2710 | break; |
2711 | } | ||
2707 | unlock_extent(&BTRFS_I(inode)->io_tree, off, off + len - 1); | 2712 | unlock_extent(&BTRFS_I(inode)->io_tree, off, off + len - 1); |
2708 | if (ordered) | 2713 | if (ordered) |
2709 | btrfs_put_ordered_extent(ordered); | 2714 | btrfs_put_ordered_extent(ordered); |