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 --- |