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) {
            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;
        }
 
                page_cache_release(sdio->cur_page);
                sdio->cur_page = NULL;
                if (ret)
-                       goto out;
+                       return ret;
        }
 
        page_cache_get(page);           /* It is in dio */
        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;
 }