From 1c60c2efbe23643b89ffe3a7f0880704509f1481 Mon Sep 17 00:00:00 2001 From: johann <johann> Date: Mon, 29 Sep 2008 16:07:59 +0000 Subject: [PATCH] Branch b1_6 b=17030 i=johann (original patch from Tianzy) i=andrew qctxt_wait_pending_dqacq() must return the same value as schedule_dqacq() otherwise ost threads can be stuck in got_qunit() for a long time, causing a watchdog storm during failover. --- lustre/quota/quota_context.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lustre/quota/quota_context.c b/lustre/quota/quota_context.c index 0d8f62b74b..7e05d4324b 100644 --- a/lustre/quota/quota_context.c +++ b/lustre/quota/quota_context.c @@ -1054,6 +1054,7 @@ qctxt_wait_pending_dqacq(struct lustre_quota_ctxt *qctxt, unsigned int id, struct timeval work_end; long timediff; struct l_wait_info lwi = { 0 }; + int rc = 0; ENTRY; do_gettimeofday(&work_start); @@ -1086,6 +1087,13 @@ qctxt_wait_pending_dqacq(struct lustre_quota_ctxt *qctxt, unsigned int id, isblk ? LQUOTA_WAIT_PENDING_BLK_QUOTA : LQUOTA_WAIT_PENDING_INO_QUOTA, timediff); + /* keep same as schedule_dqacq() b=17030 */ + spin_lock(&qunit->lq_lock); + if (qunit->lq_rc == 0) + rc = -EAGAIN; + else + rc = qunit->lq_rc; + spin_unlock(&qunit->lq_lock); } else { do_gettimeofday(&work_end); timediff = cfs_timeval_sub(&work_end, &work_start, NULL); @@ -1095,7 +1103,7 @@ qctxt_wait_pending_dqacq(struct lustre_quota_ctxt *qctxt, unsigned int id, timediff); } - RETURN(0); + RETURN(rc); } int -- GitLab