Skip to content

Commit 9e98578

Browse files
Changwei Getorvalds
authored andcommitted
ocfs2: don't use iocb when EIOCBQUEUED returns
When -EIOCBQUEUED returns, it means that aio_complete() will be called from dio_complete(), which is an asynchronous progress against write_iter. Generally, IO is a very slow progress than executing instruction, but we still can't take the risk to access a freed iocb. And we do face a BUG crash issue. Using the crash tool, iocb is obviously freed already. crash> struct -x kiocb ffff881a350f5900 struct kiocb { ki_filp = 0xffff881a350f5a80, ki_pos = 0x0, ki_complete = 0x0, private = 0x0, ki_flags = 0x0 } And the backtrace shows: ocfs2_file_write_iter+0xcaa/0xd00 [ocfs2] aio_run_iocb+0x229/0x2f0 do_io_submit+0x291/0x540 SyS_io_submit+0x10/0x20 system_call_fastpath+0x16/0x75 Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Changwei Ge <[email protected]> Reviewed-by: Andrew Morton <[email protected]> Cc: Mark Fasheh <[email protected]> Cc: Joel Becker <[email protected]> Cc: Junxiao Bi <[email protected]> Cc: Joseph Qi <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 21158ca commit 9e98578

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

fs/ocfs2/file.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2343,7 +2343,7 @@ static ssize_t ocfs2_file_write_iter(struct kiocb *iocb,
23432343

23442344
written = __generic_file_write_iter(iocb, from);
23452345
/* buffered aio wouldn't have proper lock coverage today */
2346-
BUG_ON(written == -EIOCBQUEUED && !(iocb->ki_flags & IOCB_DIRECT));
2346+
BUG_ON(written == -EIOCBQUEUED && !direct_io);
23472347

23482348
/*
23492349
* deep in g_f_a_w_n()->ocfs2_direct_IO we pass in a ocfs2_dio_end_io
@@ -2463,7 +2463,7 @@ static ssize_t ocfs2_file_read_iter(struct kiocb *iocb,
24632463
trace_generic_file_read_iter_ret(ret);
24642464

24652465
/* buffered aio wouldn't have proper lock coverage today */
2466-
BUG_ON(ret == -EIOCBQUEUED && !(iocb->ki_flags & IOCB_DIRECT));
2466+
BUG_ON(ret == -EIOCBQUEUED && !direct_io);
24672467

24682468
/* see ocfs2_file_write_iter */
24692469
if (ret == -EIOCBQUEUED || !ocfs2_iocb_is_rw_locked(iocb)) {

0 commit comments

Comments
 (0)