fs: Avoid invalidation in interrupt context in dio_complete()
authorLukas Czerner <lczerner@redhat.com>
Tue, 17 Oct 2017 14:43:09 +0000 (08:43 -0600)
committerJens Axboe <axboe@kernel.dk>
Tue, 17 Oct 2017 14:43:09 +0000 (08:43 -0600)
commitffe51f0142a291a957eebb9687cafb15f2b3fc14
treeceaf9afe924903913d20088bdb2065a108481677
parent639812a1ed9bf49ae2c026086fbf975339cd1eef
fs: Avoid invalidation in interrupt context in dio_complete()

Currently we try to defer completion of async DIO to the process context
in case there are any mapped pages associated with the inode so that we
can invalidate the pages when the IO completes. However the check is racy
and the pages can be mapped afterwards. If this happens we might end up
calling invalidate_inode_pages2_range() in dio_complete() in interrupt
context which could sleep. This can be reproduced by generic/451.

Fix this by passing the information whether we can or can't invalidate
to the dio_complete(). Thanks Eryu Guan for reporting this and Jan Kara
for suggesting a fix.

Fixes: 332391a9935d ("fs: Fix page cache inconsistency when mixing buffered and AIO DIO")
Reported-by: Eryu Guan <eguan@redhat.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Tested-by: Eryu Guan <eguan@redhat.com>
Signed-off-by: Lukas Czerner <lczerner@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
fs/direct-io.c