[Ocfs2-devel] [PATCH] ocfs2: free up write context when direct IO failed

Wengang Wang wen.gang.wang at oracle.com
Thu Nov 1 14:15:31 PDT 2018


The write context should also be freed even when direct IO failed.
Otherwise a memory leak is introduced and entries remain in
oi->ip_unwritten_list causing the following BUG later in unlink path:

ERROR: bug expression: !list_empty(&oi->ip_unwritten_list)
ERROR: Clear inode of 215043, inode has unwritten extents
...
Call Trace:
? __set_current_blocked+0x42/0x68
ocfs2_evict_inode+0x91/0x6a0 [ocfs2]
? bit_waitqueue+0x40/0x33
evict+0xdb/0x1af
iput+0x1a2/0x1f7
do_unlinkat+0x194/0x28f
SyS_unlinkat+0x1b/0x2f
do_syscall_64+0x79/0x1ae
entry_SYSCALL_64_after_hwframe+0x151/0x0

Signed-off-by: Wengang Wang <wen.gang.wang at oracle.com>
---
 fs/ocfs2/aops.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c
index 302cd7c..a87ca42d 100644
--- a/fs/ocfs2/aops.c
+++ b/fs/ocfs2/aops.c
@@ -2412,8 +2412,15 @@ static int ocfs2_dio_end_io(struct kiocb *iocb,
 	/* this io's submitter should not have unlocked this before we could */
 	BUG_ON(!ocfs2_iocb_is_rw_locked(iocb));
 
-	if (bytes > 0 && private)
-		ret = ocfs2_dio_end_io_write(inode, private, offset, bytes);
+	if (private) {
+		if (bytes > 0) {
+			ret = ocfs2_dio_end_io_write(inode, private, offset,
+						     bytes);
+		} else {
+			mlog(ML_ERROR, "Direct IO failed, free write ctx");
+			ocfs2_dio_free_write_ctx(inode, private);
+		}
+	}
 
 	ocfs2_iocb_clear_rw_locked(iocb);
 
-- 
2.9.5




More information about the Ocfs2-devel mailing list