From 92f7996c19b9b7bd8e879cec76bdbd1107763b87 Mon Sep 17 00:00:00 2001 From: tappro Date: Thu, 30 Nov 2006 14:15:22 +0000 Subject: [PATCH] - call md_clear_open_replay_data() right before freeing och instead of doing that before ll_done_writing(). This fix prevents possible handle loss when replay happens between open/close and done_writting. --- lustre/llite/file.c | 6 +++--- lustre/llite/llite_close.c | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lustre/llite/file.c b/lustre/llite/file.c index 865311e..2ba3265 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -150,15 +150,15 @@ static int ll_close_inode_openhandle(struct obd_export *md_exp, ptlrpc_req_finished(req); /* This is close request */ EXIT; out: - md_clear_open_replay_data(md_exp, och); - + if (!epoch_close && S_ISREG(inode->i_mode) && (och->och_flags & FMODE_WRITE)) { ll_queue_done_writing(inode, LLIF_DONE_WRITING); } else { + md_clear_open_replay_data(md_exp, och); /* Free @och if it is not waiting for DONE_WRITING. */ och->och_fh.cookie = DEAD_HANDLE_MAGIC; - OBD_FREE(och, sizeof(*och)); + OBD_FREE_PTR(och); } return rc; diff --git a/lustre/llite/llite_close.c b/lustre/llite/llite_close.c index f91fb63..f39f91b 100644 --- a/lustre/llite/llite_close.c +++ b/lustre/llite/llite_close.c @@ -231,6 +231,7 @@ static void ll_done_writing(struct inode *inode) CERROR("inode %lu mdc done_writing failed: rc = %d\n", inode->i_ino, rc); } + md_clear_open_replay_data(ll_i2sbi(inode)->ll_md_exp, och); OBD_FREE_PTR(och); EXIT; } -- 1.8.3.1