[3/6] direct-io: do not merge logically non-contiguous requests
diff mbox

Message ID 1274461422-18433-3-git-send-email-josef@redhat.com
State Accepted
Headers show

Commit Message

Josef Bacik May 21, 2010, 5:03 p.m. UTC
None

Patch
diff mbox

diff --git a/fs/direct-io.c b/fs/direct-io.c
index 5949947..da111aa 100644
--- a/fs/direct-io.c
+++ b/fs/direct-io.c
@@ -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