Skip to content
Snippets Groups Projects
Commit f1ed2644 authored by Wang Di's avatar Wang Di
Browse files

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
parent b5cb0214
No related branches found
No related tags found
No related merge requests found
...@@ -92,6 +92,14 @@ Description: move common funcs to test-frame.sh ...@@ -92,6 +92,14 @@ Description: move common funcs to test-frame.sh
Details : cleanup those test-scripts and move some common funcs to Details : cleanup those test-scripts and move some common funcs to
test-frame.sh 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> 2007-08-27 Cluster File Systems, Inc. <info@clusterfs.com>
......
...@@ -45,6 +45,7 @@ ...@@ -45,6 +45,7 @@
#include <lustre_log.h> #include <lustre_log.h>
#include <libcfs/list.h> #include <libcfs/list.h>
#include <lvfs.h> #include <lvfs.h>
#include <lustre_fsfilt.h>
#ifdef __KERNEL__ #ifdef __KERNEL__
int llog_origin_connect(struct llog_ctxt *ctxt, int count, int llog_origin_connect(struct llog_ctxt *ctxt, int count,
...@@ -57,7 +58,9 @@ 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; struct llogd_conn_body *req_body;
int size[2] = { sizeof(struct ptlrpc_body), int size[2] = { sizeof(struct ptlrpc_body),
sizeof(struct llogd_conn_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; ENTRY;
if (list_empty(&ctxt->loc_handle->u.chd.chd_head)) { if (list_empty(&ctxt->loc_handle->u.chd.chd_head)) {
...@@ -74,11 +77,25 @@ int llog_origin_connect(struct llog_ctxt *ctxt, int count, ...@@ -74,11 +77,25 @@ int llog_origin_connect(struct llog_ctxt *ctxt, int count,
RETURN(-ENOMEM); RETURN(-ENOMEM);
lgr->lgr_hdr.lrh_len = lgr->lgr_tail.lrt_len = sizeof(*lgr); lgr->lgr_hdr.lrh_len = lgr->lgr_tail.lrt_len = sizeof(*lgr);
lgr->lgr_hdr.lrh_type = LLOG_GEN_REC; 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; lgr->lgr_gen = ctxt->loc_gen;
rc = llog_add(ctxt, &lgr->lgr_hdr, NULL, NULL, 1); rc = llog_add(ctxt, &lgr->lgr_hdr, NULL, NULL, 1);
OBD_FREE(lgr, sizeof(*lgr)); 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); RETURN(rc);
}
LASSERT(ctxt->loc_imp); LASSERT(ctxt->loc_imp);
imp = ctxt->loc_imp; imp = ctxt->loc_imp;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment