From 9ac3e273d1be37a20e7e425adc822b8f678bc407 Mon Sep 17 00:00:00 2001 From: David Teigland Date: Tue, 25 Jul 2006 13:53:33 -0500 Subject: [PATCH] --- yaml --- r: 38760 b: refs/heads/master c: f7da790d743d2f0b4f39e4fa442079b3b54f3bef h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/dlm/recover.c | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index cc9d36145642..ec8cdec81257 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 5de6319b1839300ba6b461ed19531cdab90db9fc +refs/heads/master: f7da790d743d2f0b4f39e4fa442079b3b54f3bef diff --git a/trunk/fs/dlm/recover.c b/trunk/fs/dlm/recover.c index 34876f60f298..1a86dfc8034e 100644 --- a/trunk/fs/dlm/recover.c +++ b/trunk/fs/dlm/recover.c @@ -305,7 +305,8 @@ static void set_master_lkbs(struct dlm_rsb *r) /* * Propogate the new master nodeid to locks * The NEW_MASTER flag tells dlm_recover_locks() which rsb's to consider. - * The NEW_MASTER2 flag tells recover_lvb() which rsb's to consider. + * The NEW_MASTER2 flag tells recover_lvb() and set_locks_purged() which + * rsb's to consider. */ static void set_new_master(struct dlm_rsb *r, int nodeid) @@ -681,6 +682,16 @@ static void recover_conversion(struct dlm_rsb *r) } } +/* We've become the new master for this rsb and waiting/converting locks may + need to be granted in dlm_grant_after_purge() due to locks that may have + existed from a removed node. */ + +static void set_locks_purged(struct dlm_rsb *r) +{ + if (!list_empty(&r->res_waitqueue) || !list_empty(&r->res_convertqueue)) + rsb_set_flag(r, RSB_LOCKS_PURGED); +} + void dlm_recover_rsbs(struct dlm_ls *ls) { struct dlm_rsb *r; @@ -694,10 +705,13 @@ void dlm_recover_rsbs(struct dlm_ls *ls) if (is_master(r)) { if (rsb_flag(r, RSB_RECOVER_CONVERT)) recover_conversion(r); + if (rsb_flag(r, RSB_NEW_MASTER2)) + set_locks_purged(r); recover_lvb(r); count++; } rsb_clear_flag(r, RSB_RECOVER_CONVERT); + rsb_clear_flag(r, RSB_NEW_MASTER2); unlock_rsb(r); } up_read(&ls->ls_root_sem);