aboutsummaryrefslogtreecommitdiffstats
path: root/fs/gfs2/recovery.c
diff options
context:
space:
mode:
authorSteven Whitehouse <swhiteho@redhat.com>2006-04-26 13:21:55 -0400
committerSteven Whitehouse <swhiteho@redhat.com>2006-04-26 13:21:55 -0400
commit5965b1f4792a1a9364b4e1ed6be8778a50eb981b (patch)
tree77773aca2301eb2e11dc455e7152823bf3bde361 /fs/gfs2/recovery.c
parent3a2a9c96ac129d17aad1a5c46988ad28f72564b0 (diff)
[GFS2] Don't do recursive locking in glock layer
This patch changes the last user of recursive locking so that it no longer needs this feature and removes it from the glock layer. This makes the glock code a lot simpler and easier to understand. Its also a prerequsite to adding support for the AOP_TRUNCATED_PAGE return code (or at least it is if you don't want your brain to melt in the process) I've left in a couple of checks just in case there is some place else in the code which is still using this feature that I didn't spot yet, but they can probably be removed long term. Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
Diffstat (limited to 'fs/gfs2/recovery.c')
-rw-r--r--fs/gfs2/recovery.c79
1 files changed, 40 insertions, 39 deletions
diff --git a/fs/gfs2/recovery.c b/fs/gfs2/recovery.c
index e91c2bda6c32..7d467966f92c 100644
--- a/fs/gfs2/recovery.c
+++ b/fs/gfs2/recovery.c
@@ -436,30 +436,35 @@ int gfs2_recover_journal(struct gfs2_jdesc *jd)
436 unsigned int pass; 436 unsigned int pass;
437 int error; 437 int error;
438 438
439 fs_info(sdp, "jid=%u: Trying to acquire journal lock...\n", jd->jd_jid); 439 if (jd->jd_jid != sdp->sd_lockstruct.ls_jid) {
440 440 fs_info(sdp, "jid=%u: Trying to acquire journal lock...\n",
441 /* Aquire the journal lock so we can do recovery */ 441 jd->jd_jid);
442
443 error = gfs2_glock_nq_num(sdp, jd->jd_jid, &gfs2_journal_glops,
444 LM_ST_EXCLUSIVE,
445 LM_FLAG_NOEXP | LM_FLAG_TRY | GL_NOCACHE,
446 &j_gh);
447 switch (error) {
448 case 0:
449 break;
450 442
451 case GLR_TRYFAILED: 443 /* Aquire the journal lock so we can do recovery */
452 fs_info(sdp, "jid=%u: Busy\n", jd->jd_jid);
453 error = 0;
454 444
455 default: 445 error = gfs2_glock_nq_num(sdp, jd->jd_jid, &gfs2_journal_glops,
456 goto fail; 446 LM_ST_EXCLUSIVE,
457 }; 447 LM_FLAG_NOEXP | LM_FLAG_TRY | GL_NOCACHE,
448 &j_gh);
449 switch (error) {
450 case 0:
451 break;
452
453 case GLR_TRYFAILED:
454 fs_info(sdp, "jid=%u: Busy\n", jd->jd_jid);
455 error = 0;
456
457 default:
458 goto fail;
459 };
458 460
459 error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED, 461 error = gfs2_glock_nq_init(ip->i_gl, LM_ST_SHARED,
460 LM_FLAG_NOEXP, &ji_gh); 462 LM_FLAG_NOEXP, &ji_gh);
461 if (error) 463 if (error)
462 goto fail_gunlock_j; 464 goto fail_gunlock_j;
465 } else {
466 fs_info(sdp, "jid=%u, already locked for use\n", jd->jd_jid);
467 }
463 468
464 fs_info(sdp, "jid=%u: Looking at journal...\n", jd->jd_jid); 469 fs_info(sdp, "jid=%u: Looking at journal...\n", jd->jd_jid);
465 470
@@ -481,10 +486,8 @@ int gfs2_recover_journal(struct gfs2_jdesc *jd)
481 486
482 error = gfs2_glock_nq_init(sdp->sd_trans_gl, 487 error = gfs2_glock_nq_init(sdp->sd_trans_gl,
483 LM_ST_SHARED, 488 LM_ST_SHARED,
484 LM_FLAG_NOEXP | 489 LM_FLAG_NOEXP | LM_FLAG_PRIORITY |
485 LM_FLAG_PRIORITY | 490 GL_NEVER_RECURSE | GL_NOCANCEL |
486 GL_NEVER_RECURSE |
487 GL_NOCANCEL |
488 GL_NOCACHE, 491 GL_NOCACHE,
489 &t_gh); 492 &t_gh);
490 if (error) 493 if (error)
@@ -521,37 +524,35 @@ int gfs2_recover_journal(struct gfs2_jdesc *jd)
521 goto fail_gunlock_tr; 524 goto fail_gunlock_tr;
522 525
523 gfs2_glock_dq_uninit(&t_gh); 526 gfs2_glock_dq_uninit(&t_gh);
524
525 t = DIV_ROUND_UP(jiffies - t, HZ); 527 t = DIV_ROUND_UP(jiffies - t, HZ);
526
527 fs_info(sdp, "jid=%u: Journal replayed in %lus\n", 528 fs_info(sdp, "jid=%u: Journal replayed in %lus\n",
528 jd->jd_jid, t); 529 jd->jd_jid, t);
529 } 530 }
530 531
531 gfs2_glock_dq_uninit(&ji_gh); 532 if (jd->jd_jid != sdp->sd_lockstruct.ls_jid)
533 gfs2_glock_dq_uninit(&ji_gh);
532 534
533 gfs2_lm_recovery_done(sdp, jd->jd_jid, LM_RD_SUCCESS); 535 gfs2_lm_recovery_done(sdp, jd->jd_jid, LM_RD_SUCCESS);
534 536
535 gfs2_glock_dq_uninit(&j_gh); 537 if (jd->jd_jid != sdp->sd_lockstruct.ls_jid)
538 gfs2_glock_dq_uninit(&j_gh);
536 539
537 fs_info(sdp, "jid=%u: Done\n", jd->jd_jid); 540 fs_info(sdp, "jid=%u: Done\n", jd->jd_jid);
538
539 return 0; 541 return 0;
540 542
541 fail_gunlock_tr: 543fail_gunlock_tr:
542 gfs2_glock_dq_uninit(&t_gh); 544 gfs2_glock_dq_uninit(&t_gh);
543 545fail_gunlock_ji:
544 fail_gunlock_ji: 546 if (jd->jd_jid != sdp->sd_lockstruct.ls_jid) {
545 gfs2_glock_dq_uninit(&ji_gh); 547 gfs2_glock_dq_uninit(&ji_gh);
546 548fail_gunlock_j:
547 fail_gunlock_j: 549 gfs2_glock_dq_uninit(&j_gh);
548 gfs2_glock_dq_uninit(&j_gh); 550 }
549 551
550 fs_info(sdp, "jid=%u: %s\n", jd->jd_jid, (error) ? "Failed" : "Done"); 552 fs_info(sdp, "jid=%u: %s\n", jd->jd_jid, (error) ? "Failed" : "Done");
551 553
552 fail: 554fail:
553 gfs2_lm_recovery_done(sdp, jd->jd_jid, LM_RD_GAVEUP); 555 gfs2_lm_recovery_done(sdp, jd->jd_jid, LM_RD_GAVEUP);
554
555 return error; 556 return error;
556} 557}
557 558