dio: take updating ->result into do_direct_IO()
authorAl Viro <viro@zeniv.linux.org.uk>
Mon, 10 Mar 2014 06:30:55 +0000 (02:30 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Tue, 6 May 2014 21:32:50 +0000 (17:32 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/direct-io.c

index adfa1fb33456dcb9c128be2a29b5bd906a040601..387d91989c45c34b4ad226c7d90177dfd68ea938 100644 (file)
@@ -1003,6 +1003,7 @@ do_holes:
                                                1 << blkbits);
                                sdio->block_in_file++;
                                block_in_page++;
+                               dio->result += 1 << blkbits;
                                goto next_block;
                        }
 
@@ -1044,6 +1045,7 @@ do_holes:
                        sdio->block_in_file += this_chunk_blocks;
                        block_in_page += this_chunk_blocks;
                        sdio->blocks_available -= this_chunk_blocks;
+                       dio->result += this_chunk_blocks << blkbits;
 next_block:
                        BUG_ON(sdio->block_in_file > sdio->final_block_in_request);
                        if (sdio->block_in_file == sdio->final_block_in_request)
@@ -1271,10 +1273,6 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
 
                retval = do_direct_IO(dio, &sdio, &map_bh);
 
-               dio->result += iter->iov[seg].iov_len -
-                       ((sdio.final_block_in_request - sdio.block_in_file) <<
-                                       blkbits);
-
                if (retval) {
                        dio_cleanup(dio, &sdio);
                        break;