aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ocfs2/dlm/dlmmaster.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ocfs2/dlm/dlmmaster.c')
-rw-r--r--fs/ocfs2/dlm/dlmmaster.c34
1 files changed, 23 insertions, 11 deletions
diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c
index 0a2813947853..0aa4b043f4de 100644
--- a/fs/ocfs2/dlm/dlmmaster.c
+++ b/fs/ocfs2/dlm/dlmmaster.c
@@ -318,6 +318,21 @@ static void dlm_init_mle(struct dlm_master_list_entry *mle,
318 __dlm_mle_attach_hb_events(dlm, mle); 318 __dlm_mle_attach_hb_events(dlm, mle);
319} 319}
320 320
321void __dlm_unlink_mle(struct dlm_ctxt *dlm, struct dlm_master_list_entry *mle)
322{
323 assert_spin_locked(&dlm->spinlock);
324 assert_spin_locked(&dlm->master_lock);
325
326 if (!list_empty(&mle->list))
327 list_del_init(&mle->list);
328}
329
330void __dlm_insert_mle(struct dlm_ctxt *dlm, struct dlm_master_list_entry *mle)
331{
332 assert_spin_locked(&dlm->master_lock);
333
334 list_add(&mle->list, &dlm->master_list);
335}
321 336
322/* returns 1 if found, 0 if not */ 337/* returns 1 if found, 0 if not */
323static int dlm_find_mle(struct dlm_ctxt *dlm, 338static int dlm_find_mle(struct dlm_ctxt *dlm,
@@ -420,8 +435,7 @@ static void dlm_mle_release(struct kref *kref)
420 assert_spin_locked(&dlm->master_lock); 435 assert_spin_locked(&dlm->master_lock);
421 436
422 /* remove from list if not already */ 437 /* remove from list if not already */
423 if (!list_empty(&mle->list)) 438 __dlm_unlink_mle(dlm, mle);
424 list_del_init(&mle->list);
425 439
426 /* detach the mle from the domain node up/down events */ 440 /* detach the mle from the domain node up/down events */
427 __dlm_mle_detach_hb_events(dlm, mle); 441 __dlm_mle_detach_hb_events(dlm, mle);
@@ -843,7 +857,7 @@ lookup:
843 alloc_mle = NULL; 857 alloc_mle = NULL;
844 dlm_init_mle(mle, DLM_MLE_MASTER, dlm, res, NULL, 0); 858 dlm_init_mle(mle, DLM_MLE_MASTER, dlm, res, NULL, 0);
845 set_bit(dlm->node_num, mle->maybe_map); 859 set_bit(dlm->node_num, mle->maybe_map);
846 list_add(&mle->list, &dlm->master_list); 860 __dlm_insert_mle(dlm, mle);
847 861
848 /* still holding the dlm spinlock, check the recovery map 862 /* still holding the dlm spinlock, check the recovery map
849 * to see if there are any nodes that still need to be 863 * to see if there are any nodes that still need to be
@@ -1575,7 +1589,7 @@ way_up_top:
1575 // "add the block.\n"); 1589 // "add the block.\n");
1576 dlm_init_mle(mle, DLM_MLE_BLOCK, dlm, NULL, name, namelen); 1590 dlm_init_mle(mle, DLM_MLE_BLOCK, dlm, NULL, name, namelen);
1577 set_bit(request->node_idx, mle->maybe_map); 1591 set_bit(request->node_idx, mle->maybe_map);
1578 list_add(&mle->list, &dlm->master_list); 1592 __dlm_insert_mle(dlm, mle);
1579 response = DLM_MASTER_RESP_NO; 1593 response = DLM_MASTER_RESP_NO;
1580 } else { 1594 } else {
1581 // mlog(0, "mle was found\n"); 1595 // mlog(0, "mle was found\n");
@@ -1967,7 +1981,7 @@ ok:
1967 assert->node_idx, rr, extra_ref, mle->inuse); 1981 assert->node_idx, rr, extra_ref, mle->inuse);
1968 dlm_print_one_mle(mle); 1982 dlm_print_one_mle(mle);
1969 } 1983 }
1970 list_del_init(&mle->list); 1984 __dlm_unlink_mle(dlm, mle);
1971 __dlm_mle_detach_hb_events(dlm, mle); 1985 __dlm_mle_detach_hb_events(dlm, mle);
1972 __dlm_put_mle(mle); 1986 __dlm_put_mle(mle);
1973 if (extra_ref) { 1987 if (extra_ref) {
@@ -3159,10 +3173,8 @@ static int dlm_add_migration_mle(struct dlm_ctxt *dlm,
3159 tmp->master = master; 3173 tmp->master = master;
3160 atomic_set(&tmp->woken, 1); 3174 atomic_set(&tmp->woken, 1);
3161 wake_up(&tmp->wq); 3175 wake_up(&tmp->wq);
3162 /* remove it from the list so that only one 3176 /* remove it so that only one mle will be found */
3163 * mle will be found */ 3177 __dlm_unlink_mle(dlm, tmp);
3164 list_del_init(&tmp->list);
3165 /* this was obviously WRONG. mle is uninited here. should be tmp. */
3166 __dlm_mle_detach_hb_events(dlm, tmp); 3178 __dlm_mle_detach_hb_events(dlm, tmp);
3167 ret = DLM_MIGRATE_RESPONSE_MASTERY_REF; 3179 ret = DLM_MIGRATE_RESPONSE_MASTERY_REF;
3168 mlog(0, "%s:%.*s: master=%u, newmaster=%u, " 3180 mlog(0, "%s:%.*s: master=%u, newmaster=%u, "
@@ -3181,7 +3193,7 @@ static int dlm_add_migration_mle(struct dlm_ctxt *dlm,
3181 mle->master = master; 3193 mle->master = master;
3182 /* do this for consistency with other mle types */ 3194 /* do this for consistency with other mle types */
3183 set_bit(new_master, mle->maybe_map); 3195 set_bit(new_master, mle->maybe_map);
3184 list_add(&mle->list, &dlm->master_list); 3196 __dlm_insert_mle(dlm, mle);
3185 3197
3186 return ret; 3198 return ret;
3187} 3199}
@@ -3264,7 +3276,7 @@ top:
3264 * list_head while in list_for_each_safe */ 3276 * list_head while in list_for_each_safe */
3265 __dlm_mle_detach_hb_events(dlm, mle); 3277 __dlm_mle_detach_hb_events(dlm, mle);
3266 spin_lock(&mle->spinlock); 3278 spin_lock(&mle->spinlock);
3267 list_del_init(&mle->list); 3279 __dlm_unlink_mle(dlm, mle);
3268 atomic_set(&mle->woken, 1); 3280 atomic_set(&mle->woken, 1);
3269 spin_unlock(&mle->spinlock); 3281 spin_unlock(&mle->spinlock);
3270 wake_up(&mle->wq); 3282 wake_up(&mle->wq);