|
@@ -632,10 +632,26 @@ static int dio_send_cur_page(struct dio *dio)
|
|
|
int ret = 0;
|
|
|
|
|
|
if (dio->bio) {
|
|
|
+ loff_t cur_offset = dio->block_in_file << dio->blkbits;
|
|
|
+ loff_t bio_next_offset = dio->logical_offset_in_bio +
|
|
|
+ dio->bio->bi_size;
|
|
|
+
|
|
|
/*
|
|
|
- * See whether this new request is contiguous with the old
|
|
|
+ * See whether this new request is contiguous with the old.
|
|
|
+ *
|
|
|
+ * Btrfs cannot handl having logically non-contiguous requests
|
|
|
+ * submitted. For exmple if you have
|
|
|
+ *
|
|
|
+ * Logical: [0-4095][HOLE][8192-12287]
|
|
|
+ * Phyiscal: [0-4095] [4096-8181]
|
|
|
+ *
|
|
|
+ * We cannot submit those pages together as one BIO. So if our
|
|
|
+ * current logical offset in the file does not equal what would
|
|
|
+ * be the next logical offset in the bio, submit the bio we
|
|
|
+ * have.
|
|
|
*/
|
|
|
- if (dio->final_block_in_bio != dio->cur_page_block)
|
|
|
+ if (dio->final_block_in_bio != dio->cur_page_block ||
|
|
|
+ cur_offset != bio_next_offset)
|
|
|
dio_bio_submit(dio);
|
|
|
/*
|
|
|
* Submit now if the underlying fs is about to perform a
|