summaryrefslogtreecommitdiffstats
path: root/fs/direct-io.c
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2016-11-04 18:08:12 +0100
committerJens Axboe <axboe@fb.com>2016-11-04 14:34:47 -0600
commitf734c89cc96e9b6f903865cd2656d9d8a7e160e7 (patch)
tree9c233c6e9a202f9566f3b901e6289ac7c34abf15 /fs/direct-io.c
parent29f3ad7d8380364c86556eedf4eedd3b3d4921dc (diff)
downloadlinux-f734c89cc96e9b6f903865cd2656d9d8a7e160e7.tar.gz
linux-f734c89cc96e9b6f903865cd2656d9d8a7e160e7.tar.bz2
linux-f734c89cc96e9b6f903865cd2656d9d8a7e160e7.zip
direct-io: Use clean_bdev_aliases() instead of handmade iteration
Use new provided function instead of an iteration through all allocated blocks. Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to 'fs/direct-io.c')
-rw-r--r--fs/direct-io.c28
1 files changed, 7 insertions, 21 deletions
diff --git a/fs/direct-io.c b/fs/direct-io.c
index a5138c564019..4ea57edf3e54 100644
--- a/fs/direct-io.c
+++ b/fs/direct-io.c
@@ -843,24 +843,6 @@ out:
}
/*
- * Clean any dirty buffers in the blockdev mapping which alias newly-created
- * file blocks. Only called for S_ISREG files - blockdevs do not set
- * buffer_new
- */
-static void clean_blockdev_aliases(struct dio *dio, struct buffer_head *map_bh)
-{
- unsigned i;
- unsigned nblocks;
-
- nblocks = map_bh->b_size >> dio->inode->i_blkbits;
-
- for (i = 0; i < nblocks; i++) {
- unmap_underlying_metadata(map_bh->b_bdev,
- map_bh->b_blocknr + i);
- }
-}
-
-/*
* If we are not writing the entire block and get_block() allocated
* the block for us, we need to fill-in the unused portion of the
* block with zeros. This happens only if user-buffer, fileoffset or
@@ -960,11 +942,15 @@ static int do_direct_IO(struct dio *dio, struct dio_submit *sdio,
goto do_holes;
sdio->blocks_available =
- map_bh->b_size >> sdio->blkbits;
+ map_bh->b_size >> blkbits;
sdio->next_block_for_io =
map_bh->b_blocknr << sdio->blkfactor;
- if (buffer_new(map_bh))
- clean_blockdev_aliases(dio, map_bh);
+ if (buffer_new(map_bh)) {
+ clean_bdev_aliases(
+ map_bh->b_bdev,
+ map_bh->b_blocknr,
+ map_bh->b_size >> blkbits);
+ }
if (!sdio->blkfactor)
goto do_holes;