recover.c (c04fecb4d9f7753e0cbff7edd03ec68f8721cdce) recover.c (1d7c484eeb167fc374294e38ae402de4097c8611)
1/******************************************************************************
2*******************************************************************************
3**
4** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
5** Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved.
6**
7** This copyrighted material is made available to anyone wishing to use,
8** modify, copy, or redistribute it subject to the terms and conditions

--- 263 unchanged lines hidden (view full) ---

272 spin_lock(&ls->ls_recover_list_lock);
273 list_del_init(&r->res_recover_list);
274 ls->ls_recover_list_count--;
275 spin_unlock(&ls->ls_recover_list_lock);
276
277 dlm_put_rsb(r);
278}
279
1/******************************************************************************
2*******************************************************************************
3**
4** Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
5** Copyright (C) 2004-2005 Red Hat, Inc. All rights reserved.
6**
7** This copyrighted material is made available to anyone wishing to use,
8** modify, copy, or redistribute it subject to the terms and conditions

--- 263 unchanged lines hidden (view full) ---

272 spin_lock(&ls->ls_recover_list_lock);
273 list_del_init(&r->res_recover_list);
274 ls->ls_recover_list_count--;
275 spin_unlock(&ls->ls_recover_list_lock);
276
277 dlm_put_rsb(r);
278}
279
280static struct dlm_rsb *recover_list_find(struct dlm_ls *ls, uint64_t id)
281{
282 struct dlm_rsb *r = NULL;
283
284 spin_lock(&ls->ls_recover_list_lock);
285
286 list_for_each_entry(r, &ls->ls_recover_list, res_recover_list) {
287 if (id == (unsigned long) r)
288 goto out;
289 }
290 r = NULL;
291 out:
292 spin_unlock(&ls->ls_recover_list_lock);
293 return r;
294}
295
296static void recover_list_clear(struct dlm_ls *ls)
297{
298 struct dlm_rsb *r, *s;
299
300 spin_lock(&ls->ls_recover_list_lock);
301 list_for_each_entry_safe(r, s, &ls->ls_recover_list, res_recover_list) {
302 list_del_init(&r->res_recover_list);
303 r->res_recover_locks_count = 0;

--- 4 unchanged lines hidden (view full) ---

308 if (ls->ls_recover_list_count != 0) {
309 log_error(ls, "warning: recover_list_count %d",
310 ls->ls_recover_list_count);
311 ls->ls_recover_list_count = 0;
312 }
313 spin_unlock(&ls->ls_recover_list_lock);
314}
315
280static void recover_list_clear(struct dlm_ls *ls)
281{
282 struct dlm_rsb *r, *s;
283
284 spin_lock(&ls->ls_recover_list_lock);
285 list_for_each_entry_safe(r, s, &ls->ls_recover_list, res_recover_list) {
286 list_del_init(&r->res_recover_list);
287 r->res_recover_locks_count = 0;

--- 4 unchanged lines hidden (view full) ---

292 if (ls->ls_recover_list_count != 0) {
293 log_error(ls, "warning: recover_list_count %d",
294 ls->ls_recover_list_count);
295 ls->ls_recover_list_count = 0;
296 }
297 spin_unlock(&ls->ls_recover_list_lock);
298}
299
300static int recover_idr_empty(struct dlm_ls *ls)
301{
302 int empty = 1;
316
303
304 spin_lock(&ls->ls_recover_idr_lock);
305 if (ls->ls_recover_list_count)
306 empty = 0;
307 spin_unlock(&ls->ls_recover_idr_lock);
308
309 return empty;
310}
311
312static int recover_idr_add(struct dlm_rsb *r)
313{
314 struct dlm_ls *ls = r->res_ls;
315 int rv, id;
316
317 rv = idr_pre_get(&ls->ls_recover_idr, GFP_NOFS);
318 if (!rv)
319 return -ENOMEM;
320
321 spin_lock(&ls->ls_recover_idr_lock);
322 if (r->res_id) {
323 spin_unlock(&ls->ls_recover_idr_lock);
324 return -1;
325 }
326 rv = idr_get_new_above(&ls->ls_recover_idr, r, 1, &id);
327 if (rv) {
328 spin_unlock(&ls->ls_recover_idr_lock);
329 return rv;
330 }
331 r->res_id = id;
332 ls->ls_recover_list_count++;
333 dlm_hold_rsb(r);
334 spin_unlock(&ls->ls_recover_idr_lock);
335 return 0;
336}
337
338static void recover_idr_del(struct dlm_rsb *r)
339{
340 struct dlm_ls *ls = r->res_ls;
341
342 spin_lock(&ls->ls_recover_idr_lock);
343 idr_remove(&ls->ls_recover_idr, r->res_id);
344 r->res_id = 0;
345 ls->ls_recover_list_count--;
346 spin_unlock(&ls->ls_recover_idr_lock);
347
348 dlm_put_rsb(r);
349}
350
351static struct dlm_rsb *recover_idr_find(struct dlm_ls *ls, uint64_t id)
352{
353 struct dlm_rsb *r;
354
355 spin_lock(&ls->ls_recover_idr_lock);
356 r = idr_find(&ls->ls_recover_idr, (int)id);
357 spin_unlock(&ls->ls_recover_idr_lock);
358 return r;
359}
360
361static int recover_idr_clear_rsb(int id, void *p, void *data)
362{
363 struct dlm_ls *ls = data;
364 struct dlm_rsb *r = p;
365
366 r->res_id = 0;
367 r->res_recover_locks_count = 0;
368 ls->ls_recover_list_count--;
369
370 dlm_put_rsb(r);
371 return 0;
372}
373
374static void recover_idr_clear(struct dlm_ls *ls)
375{
376 spin_lock(&ls->ls_recover_idr_lock);
377 idr_for_each(&ls->ls_recover_idr, recover_idr_clear_rsb, ls);
378 idr_remove_all(&ls->ls_recover_idr);
379
380 if (ls->ls_recover_list_count != 0) {
381 log_error(ls, "warning: recover_list_count %d",
382 ls->ls_recover_list_count);
383 ls->ls_recover_list_count = 0;
384 }
385 spin_unlock(&ls->ls_recover_idr_lock);
386}
387
388
317/* Master recovery: find new master node for rsb's that were
318 mastered on nodes that have been removed.
319
320 dlm_recover_masters
321 recover_master
322 dlm_send_rcom_lookup -> receive_rcom_lookup
323 dlm_dir_lookup
324 receive_rcom_lookup_reply <-

--- 78 unchanged lines hidden (view full) ---

403 }
404
405 /* set master of lkbs to ourself when is_removed, or to
406 another new master which we set along with NEW_MASTER
407 in dlm_master_lookup */
408 set_new_master(r);
409 error = 0;
410 } else {
389/* Master recovery: find new master node for rsb's that were
390 mastered on nodes that have been removed.
391
392 dlm_recover_masters
393 recover_master
394 dlm_send_rcom_lookup -> receive_rcom_lookup
395 dlm_dir_lookup
396 receive_rcom_lookup_reply <-

--- 78 unchanged lines hidden (view full) ---

475 }
476
477 /* set master of lkbs to ourself when is_removed, or to
478 another new master which we set along with NEW_MASTER
479 in dlm_master_lookup */
480 set_new_master(r);
481 error = 0;
482 } else {
411 recover_list_add(r);
483 recover_idr_add(r);
412 error = dlm_send_rcom_lookup(r, dir_nodeid);
413 }
414
415 (*count)++;
416 return error;
417}
418
419/*

--- 68 unchanged lines hidden (view full) ---

488 up_read(&ls->ls_root_sem);
489 goto out;
490 }
491 }
492 up_read(&ls->ls_root_sem);
493
494 log_debug(ls, "dlm_recover_masters %u of %u", count, total);
495
484 error = dlm_send_rcom_lookup(r, dir_nodeid);
485 }
486
487 (*count)++;
488 return error;
489}
490
491/*

--- 68 unchanged lines hidden (view full) ---

560 up_read(&ls->ls_root_sem);
561 goto out;
562 }
563 }
564 up_read(&ls->ls_root_sem);
565
566 log_debug(ls, "dlm_recover_masters %u of %u", count, total);
567
496 error = dlm_wait_function(ls, &recover_list_empty);
568 error = dlm_wait_function(ls, &recover_idr_empty);
497 out:
498 if (error)
569 out:
570 if (error)
499 recover_list_clear(ls);
571 recover_idr_clear(ls);
500 return error;
501}
502
503int dlm_recover_master_reply(struct dlm_ls *ls, struct dlm_rcom *rc)
504{
505 struct dlm_rsb *r;
506 int ret_nodeid, new_master;
507
572 return error;
573}
574
575int dlm_recover_master_reply(struct dlm_ls *ls, struct dlm_rcom *rc)
576{
577 struct dlm_rsb *r;
578 int ret_nodeid, new_master;
579
508 r = recover_list_find(ls, rc->rc_id);
580 r = recover_idr_find(ls, rc->rc_id);
509 if (!r) {
510 log_error(ls, "dlm_recover_master_reply no id %llx",
511 (unsigned long long)rc->rc_id);
512 goto out;
513 }
514
515 ret_nodeid = rc->rc_result;
516
517 if (ret_nodeid == dlm_our_nodeid())
518 new_master = 0;
519 else
520 new_master = ret_nodeid;
521
522 lock_rsb(r);
523 r->res_master_nodeid = ret_nodeid;
524 r->res_nodeid = new_master;
525 set_new_master(r);
526 unlock_rsb(r);
581 if (!r) {
582 log_error(ls, "dlm_recover_master_reply no id %llx",
583 (unsigned long long)rc->rc_id);
584 goto out;
585 }
586
587 ret_nodeid = rc->rc_result;
588
589 if (ret_nodeid == dlm_our_nodeid())
590 new_master = 0;
591 else
592 new_master = ret_nodeid;
593
594 lock_rsb(r);
595 r->res_master_nodeid = ret_nodeid;
596 r->res_nodeid = new_master;
597 set_new_master(r);
598 unlock_rsb(r);
527 recover_list_del(r);
599 recover_idr_del(r);
528
600
529 if (recover_list_empty(ls))
601 if (recover_idr_empty(ls))
530 wake_up(&ls->ls_wait_general);
531 out:
532 return 0;
533}
534
535
536/* Lock recovery: rebuild the process-copy locks we hold on a
537 remastered rsb on the new rsb master.

--- 328 unchanged lines hidden ---
602 wake_up(&ls->ls_wait_general);
603 out:
604 return 0;
605}
606
607
608/* Lock recovery: rebuild the process-copy locks we hold on a
609 remastered rsb on the new rsb master.

--- 328 unchanged lines hidden ---