From f1ed2644876787f890ccba8d9c14bea91b43b73b Mon Sep 17 00:00:00 2001 From: wangdi <wangdi> Date: Mon, 27 Aug 2007 03:32:01 +0000 Subject: [PATCH] Branch: b1_6 in llog_origin_connect, we should start journal_start, to keep the order of journal_start and loghandle->lgh_lock. b=13142 i=green i=shadow --- lustre/ChangeLog | 8 ++++++++ lustre/ptlrpc/llog_net.c | 21 +++++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/lustre/ChangeLog b/lustre/ChangeLog index 79a87dbc1c..993886a274 100644 --- a/lustre/ChangeLog +++ b/lustre/ChangeLog @@ -92,6 +92,14 @@ Description: move common funcs to test-frame.sh Details : cleanup those test-scripts and move some common funcs to test-frame.sh +Severity : normal +Frequency : rare +Bugzilla : 13142 +Description: disorder of journal start and llog_add cause deadlock. +Details : in llog_origin_connect, journal start should happen before + llog_add keep the same order as other functions to avoid + the deadlock. + -------------------------------------------------------------------------------- 2007-08-27 Cluster File Systems, Inc. <info@clusterfs.com> diff --git a/lustre/ptlrpc/llog_net.c b/lustre/ptlrpc/llog_net.c index eee2b4f2f2..3779ed5a52 100644 --- a/lustre/ptlrpc/llog_net.c +++ b/lustre/ptlrpc/llog_net.c @@ -45,6 +45,7 @@ #include <lustre_log.h> #include <libcfs/list.h> #include <lvfs.h> +#include <lustre_fsfilt.h> #ifdef __KERNEL__ int llog_origin_connect(struct llog_ctxt *ctxt, int count, @@ -57,7 +58,9 @@ int llog_origin_connect(struct llog_ctxt *ctxt, int count, struct llogd_conn_body *req_body; int size[2] = { sizeof(struct ptlrpc_body), sizeof(struct llogd_conn_body) }; - int rc; + struct inode* inode = ctxt->loc_handle->lgh_file->f_dentry->d_inode; + void *handle; + int rc, rc1; ENTRY; if (list_empty(&ctxt->loc_handle->u.chd.chd_head)) { @@ -74,11 +77,25 @@ int llog_origin_connect(struct llog_ctxt *ctxt, int count, RETURN(-ENOMEM); lgr->lgr_hdr.lrh_len = lgr->lgr_tail.lrt_len = sizeof(*lgr); lgr->lgr_hdr.lrh_type = LLOG_GEN_REC; + + handle = fsfilt_start_log(ctxt->loc_exp->exp_obd, inode, + FSFILT_OP_CANCEL_UNLINK, NULL, 1); + + if (IS_ERR(handle)) { + CERROR("fsfilt_start failed: %ld\n", PTR_ERR(handle)); + OBD_FREE(lgr, sizeof(*lgr)); + rc = PTR_ERR(handle); + RETURN(rc); + } lgr->lgr_gen = ctxt->loc_gen; rc = llog_add(ctxt, &lgr->lgr_hdr, NULL, NULL, 1); OBD_FREE(lgr, sizeof(*lgr)); - if (rc != 1) + + rc1 = fsfilt_commit(ctxt->loc_exp->exp_obd, inode, handle, 0); + if (rc != 1 || rc1 != 0) { + rc = (rc != 1) ? rc : rc1; RETURN(rc); + } LASSERT(ctxt->loc_imp); imp = ctxt->loc_imp; -- GitLab