]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
direct-io: Fix boundary block handling
authorJan Kara <jack@suse.cz>
Wed, 20 Mar 2013 04:07:09 +0000 (15:07 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Thu, 21 Mar 2013 05:28:25 +0000 (16:28 +1100)
When we read/write a file sequentially, we will read/write not only the
data blocks but also the indirect blocks that may not be physically
adjacent to the data blocks.  So filesystems set the BH_Boundary flag to
submit the previous I/O before reading/writing an indirect block.

However the generic direct IO code mishandles buffer_boundary(), setting
sdio->boundary before each submit_page_section() call which results in
sending only one page bios as underlying code thinks this page is the last
in the contiguous extent.  So fix the problem by setting sdio->boundary
only if the current page is really the last one in the mapped extent.

Signed-off-by: Jan Kara <jack@suse.cz>
Reported-by: Kazuya Mio <k-mio@sx.jp.nec.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
fs/direct-io.c

index f853263cf74f8abf29016db5e44eaa9e0de44abc..9644d0205dad5582d64433d4f4b86c172d0078e4 100644 (file)
@@ -969,7 +969,8 @@ do_holes:
                        this_chunk_bytes = this_chunk_blocks << blkbits;
                        BUG_ON(this_chunk_bytes == 0);
 
-                       sdio->boundary = buffer_boundary(map_bh);
+                       if (this_chunk_blocks == sdio->blocks_available)
+                               sdio->boundary = buffer_boundary(map_bh);
                        ret = submit_page_section(dio, sdio, page,
                                                  offset_in_page,
                                                  this_chunk_bytes,