From 76692373bcaa0650e97597b6fc5a5e762dd4661f Mon Sep 17 00:00:00 2001 From: tianzy Date: Thu, 11 Jun 2009 06:13:29 +0000 Subject: [PATCH] Branch HEAD fix MDS lockup during inode quota test b=19672 i=johann i=yong.fan --- lustre/quota/quota_context.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/lustre/quota/quota_context.c b/lustre/quota/quota_context.c index b5fef27..54a9de4 100644 --- a/lustre/quota/quota_context.c +++ b/lustre/quota/quota_context.c @@ -803,7 +803,7 @@ void dqacq_interrupt(struct lustre_quota_ctxt *qctxt) EXIT; } -static int got_qunit(struct lustre_qunit *qunit) +static int got_qunit(struct lustre_qunit *qunit, int is_master) { struct lustre_quota_ctxt *qctxt = qunit->lq_ctxt; int rc = 0; @@ -824,7 +824,9 @@ static int got_qunit(struct lustre_qunit *qunit) if (!rc) { spin_lock(&qctxt->lqc_lock); - rc = !qctxt->lqc_import || !qctxt->lqc_valid; + rc = !qctxt->lqc_valid; + if (!is_master) + rc |= !qctxt->lqc_import; spin_unlock(&qctxt->lqc_lock); } @@ -987,7 +989,8 @@ wait_completion: struct qunit_data *p = &qunit->lq_data; QDATA_DEBUG(p, "qunit(%p) is waiting for dqacq.\n", qunit); - l_wait_event(qunit->lq_waitq, got_qunit(qunit), &lwi); + l_wait_event(qunit->lq_waitq, got_qunit(qunit, is_master(qctxt)), + &lwi); /* rc = -EAGAIN, it means the quota master isn't ready yet * rc = QUOTA_REQ_RETURNED, it means a quota req is finished; * rc = -EDQUOT, it means out of quota @@ -1086,7 +1089,8 @@ qctxt_wait_pending_dqacq(struct lustre_quota_ctxt *qctxt, unsigned int id, struct qunit_data *p = &qunit->lq_data; QDATA_DEBUG(p, "qunit(%p) is waiting for dqacq.\n", qunit); - l_wait_event(qunit->lq_waitq, got_qunit(qunit), &lwi); + l_wait_event(qunit->lq_waitq, got_qunit(qunit, is_master(qctxt)), + &lwi); CDEBUG(D_QUOTA, "qunit(%p) finishes waiting: rc(%d) " "owner(%d)\n", qunit, qunit->lq_rc, qunit->lq_owner); /* keep same as schedule_dqacq() b=17030 */ -- 1.8.3.1