ocfs2: do not return DLM_MIGRATE_RESPONSE_MASTERY_REF to avoid endless, loop during umount
PATCH 7/8 ocfs2: do not return DLM_MIGRATE_RESPONSE_MASTERY_REF to avoid endless, loop during umount
From: jiangyiwen <[email protected]>
Subject: ocfs2: do not return DLM_MIGRATE_RESPONSE_MASTERY_REF to avoid endless,loop during umount
The following case may lead to endless loop during umount.
node A node B node C node D
umount volume,
migrate lockres1
to B
want to lock lockres1, send MASTER_REQUEST_MSG to C
init block mle
send
MIGRATE_REQUEST_MSG
to C
find a block
mle, and then
return DLM_MIGRATE_RESPONSE_MASTERY_REF to B
set C in refmap
umount successfully
try to umount, endless
loop occurs when migrate
lockres1 since C is in
refmap
So we can fix this endless loop case by only returning DLM_MIGRATE_RESPONSE_MASTERY_REF if it has a mastery mle when receiving MIGRATE_REQUEST_MSG.
---
fs/ocfs2/dlm/dlmmaster.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
fs/ocfs2/dlm/dlmmaster.c renamed from fs/ocfs2/dlm/dlmmaster.c~ocfs2-do-not-return-dlm_migrate_response_mastery_ref-to-avoid-endlessloop-during-umount +9 -5
@@ -3088,11 +3088,15 @@ static int dlm_add_migration_mle(struct/* remove it so that only one mle will be found */ __dlm_unlink_mle (dlm, tmp);__dlm_mle_detach_hb_events (dlm, tmp); - ret =DLM_MIGRATE_RESPONSE_MASTERY_REF ; -mlog (0 ,"%s:%.*s: master=%u, newmaster=%u, " -"telling master to get ref for cleared out mle " -"during migration\n" , dlm->name, namelen, name, - master, new_master); +if (tmp->type ==DLM_MLE_MASTER ) { + ret =DLM_MIGRATE_RESPONSE_MASTERY_REF ; +mlog (0 ,"%s:%.*s: master=%u, newmaster=%u, " +"telling master to get ref " +"for cleared out mle during " +"migration\n" , dlm->name, + namelen, name, master, + new_master); + } }spin_unlock (&tmp->spinlock); }
_
PATCH 7/8 ocfs2: do not return DLM_MIGRATE_RESPONSE_MASTERY_REF to avoid endless, loop during umount
Mark:
Please help me to review following patch, Thank you very much!
----jiangyiwen
Quoted 72 lines · akpm at linux-foundation.org
From: jiangyiwen <[email protected]>
Subject: ocfs2: do not returnDLM_MIGRATE_RESPONSE_MASTERY_REFto avoid endless,loop during umountThe following case may lead to endless loop during umount.
node A node B node C node D
umount volume,
migrate lockres1
to B
want to lock lockres1, sendMASTER_REQUEST_MSGto C
init block mle
send
MIGRATE_REQUEST_MSG
to C
find a block
mle, and then
returnDLM_MIGRATE_RESPONSE_MASTERY_REFto B
set C in refmap
umount successfully
try to umount, endless
loop occurs when migrate
lockres1 since C is in
refmapSo we can fix this endless loop case by only returning
DLM_MIGRATE_RESPONSE_MASTERY_REFif it has a mastery mle when receivingMIGRATE_REQUEST_MSG.[akpm at linux-foundation.org: coding-style fixes]Signed-off-by jiangyiwen <[email protected]>Cc Mark Fasheh <[email protected]>Cc Joel Becker <[email protected]>Cc Xue jiufei <[email protected]>Signed-off-by Andrew Morton <[email protected]>---
fs/ocfs2/dlm/dlmmaster.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)diff -puN
fs/ocfs2/dlm/dlmmaster.c~ocfs2-do-not-return-dlm_migrate_response_mastery_ref-to-avoid-endlessloop-during-umountfs/ocfs2/dlm/dlmmaster.cfs/ocfs2/dlm/dlmmaster.c renamed from fs/ocfs2/dlm/dlmmaster.c~ocfs2-do-not-return-dlm_migrate_response_mastery_ref-to-avoid-endlessloop-during-umount +9
-5@@ -3088,11 +3088,15 @@ static int dlm_add_migration_mle(struct/* remove it so that only one mle will be found */ __dlm_unlink_mle (dlm, tmp);__dlm_mle_detach_hb_events (dlm, tmp); - ret =DLM_MIGRATE_RESPONSE_MASTERY_REF ; -mlog (0 ,"%s:%.*s: master=%u, newmaster=%u, " -"telling master to get ref for cleared out mle " -"during migration\n" , dlm->name, namelen, name, - master, new_master); +if (tmp->type ==DLM_MLE_MASTER ) { + ret =DLM_MIGRATE_RESPONSE_MASTERY_REF ; +mlog (0 ,"%s:%.*s: master=%u, newmaster=%u, " +"telling master to get ref " +"for cleared out mle during " +"migration\n" , dlm->name, + namelen, name, master, + new_master); + } }spin_unlock (&tmp->spinlock); }_
.
PATCH 7/8 ocfs2: do not return DLM_MIGRATE_RESPONSE_MASTERY_REF to avoid endless, loop during umount
In reply to akpm at linux-foundation.orgQuoted 2 lines · Andrew Morton
From: jiangyiwen <[email protected]>
Subject: ocfs2: do not returnDLM_MIGRATE_RESPONSE_MASTERY_REFto avoid endless,loop during umount
This looks good, thanks!
Quoted 30 lines
The following case may lead to endless loop during umount.
node A node B node C node D
umount volume,
migrate lockres1
to B
want to lock lockres1, sendMASTER_REQUEST_MSGto C
init block mle
send
MIGRATE_REQUEST_MSG
to C
find a block
mle, and then
returnDLM_MIGRATE_RESPONSE_MASTERY_REFto B
set C in refmap
umount successfully
try to umount, endless
loop occurs when migrate
lockres1 since C is in
refmapSo we can fix this endless loop case by only returning
DLM_MIGRATE_RESPONSE_MASTERY_REFif it has a mastery mle when receivingMIGRATE_REQUEST_MSG.
Quoted 6 lines
[akpm at linux-foundation.org: coding-style fixes]Signed-off-by jiangyiwen <[email protected]>Cc Mark Fasheh <[email protected]>Cc Joel Becker <[email protected]>Cc Xue jiufei <[email protected]>Signed-off-by Andrew Morton <[email protected]>
--Mark
--
Mark Fasheh