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);