]> Pileus Git - ~andy/linux/blobdiff - fs/direct-io.c
direct-io: submit bio after boundary buffer is added to it
[~andy/linux] / fs / direct-io.c
index f853263cf74f8abf29016db5e44eaa9e0de44abc..cfb816dc6d9f65b73fdba6d0fadbe15041bf96ad 100644 (file)
@@ -672,12 +672,6 @@ static inline int dio_send_cur_page(struct dio *dio, struct dio_submit *sdio,
                if (sdio->final_block_in_bio != sdio->cur_page_block ||
                    cur_offset != bio_next_offset)
                        dio_bio_submit(dio, sdio);
-               /*
-                * Submit now if the underlying fs is about to perform a
-                * metadata read
-                */
-               else if (sdio->boundary)
-                       dio_bio_submit(dio, sdio);
        }
 
        if (sdio->bio == NULL) {
@@ -737,16 +731,6 @@ submit_page_section(struct dio *dio, struct dio_submit *sdio, struct page *page,
            sdio->cur_page_block +
            (sdio->cur_page_len >> sdio->blkbits) == blocknr) {
                sdio->cur_page_len += len;
-
-               /*
-                * If sdio->boundary then we want to schedule the IO now to
-                * avoid metadata seeks.
-                */
-               if (sdio->boundary) {
-                       ret = dio_send_cur_page(dio, sdio, map_bh);
-                       page_cache_release(sdio->cur_page);
-                       sdio->cur_page = NULL;
-               }
                goto out;
        }
 
@@ -758,7 +742,7 @@ submit_page_section(struct dio *dio, struct dio_submit *sdio, struct page *page,
                page_cache_release(sdio->cur_page);
                sdio->cur_page = NULL;
                if (ret)
-                       goto out;
+                       return ret;
        }
 
        page_cache_get(page);           /* It is in dio */
@@ -768,6 +752,16 @@ submit_page_section(struct dio *dio, struct dio_submit *sdio, struct page *page,
        sdio->cur_page_block = blocknr;
        sdio->cur_page_fs_offset = sdio->block_in_file << sdio->blkbits;
 out:
+       /*
+        * If sdio->boundary then we want to schedule the IO now to
+        * avoid metadata seeks.
+        */
+       if (sdio->boundary) {
+               ret = dio_send_cur_page(dio, sdio, map_bh);
+               dio_bio_submit(dio, sdio);
+               page_cache_release(sdio->cur_page);
+               sdio->cur_page = NULL;
+       }
        return ret;
 }
 
@@ -969,7 +963,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,