summaryrefslogtreecommitdiffstats
path: root/fs/direct-io.c
diff options
context:
space:
mode:
authorJens Axboe <axboe@fb.com>2015-11-10 18:14:38 +0100
committerJens Axboe <axboe@fb.com>2015-11-10 18:14:38 +0100
commitc1c534609fe8a859f9c8108a5591e6e8a97e34d1 (patch)
treef064a2591788be8ac0fcaf4315ed38f8e33bff3a /fs/direct-io.c
parentdirectio: add block polling support (diff)
downloadlinux-c1c534609fe8a859f9c8108a5591e6e8a97e34d1.tar.xz
linux-c1c534609fe8a859f9c8108a5591e6e8a97e34d1.zip
direct-io: be sure to assign dio->bio_bdev for both paths
btrfs sets ->submit_io(), and we failed to set the block dev for that path. That resulted in a potential NULL dereference when we later wait for IO in dio_await_one(). Reported-by: kernel test robot <ying.huang@linux.intel.com> Signed-off-by: Jens Axboe <axboe@fb.com>
Diffstat (limited to '')
-rw-r--r--fs/direct-io.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/fs/direct-io.c b/fs/direct-io.c
index 7025029c666f..15381c474a11 100644
--- a/fs/direct-io.c
+++ b/fs/direct-io.c
@@ -399,14 +399,14 @@ static inline void dio_bio_submit(struct dio *dio, struct dio_submit *sdio)
if (dio->is_async && dio->rw == READ && dio->should_dirty)
bio_set_pages_dirty(bio);
+ dio->bio_bdev = bio->bi_bdev;
+
if (sdio->submit_io) {
sdio->submit_io(dio->rw, bio, dio->inode,
sdio->logical_offset_in_bio);
dio->bio_cookie = BLK_QC_T_NONE;
- } else {
+ } else
dio->bio_cookie = submit_bio(dio->rw, bio);
- dio->bio_bdev = bio->bi_bdev;
- }
sdio->bio = NULL;
sdio->boundary = 0;