diff options
Diffstat (limited to 'fs/gfs2/recovery.c')
| -rw-r--r-- | fs/gfs2/recovery.c | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/fs/gfs2/recovery.c b/fs/gfs2/recovery.c index d5e91f4f6a0b..efd09c3d2b26 100644 --- a/fs/gfs2/recovery.c +++ b/fs/gfs2/recovery.c | |||
| @@ -14,6 +14,8 @@ | |||
| 14 | #include <linux/gfs2_ondisk.h> | 14 | #include <linux/gfs2_ondisk.h> |
| 15 | #include <linux/crc32.h> | 15 | #include <linux/crc32.h> |
| 16 | #include <linux/lm_interface.h> | 16 | #include <linux/lm_interface.h> |
| 17 | #include <linux/kthread.h> | ||
| 18 | #include <linux/freezer.h> | ||
| 17 | 19 | ||
| 18 | #include "gfs2.h" | 20 | #include "gfs2.h" |
| 19 | #include "incore.h" | 21 | #include "incore.h" |
| @@ -583,13 +585,35 @@ fail: | |||
| 583 | return error; | 585 | return error; |
| 584 | } | 586 | } |
| 585 | 587 | ||
| 588 | static struct gfs2_jdesc *gfs2_jdesc_find_dirty(struct gfs2_sbd *sdp) | ||
| 589 | { | ||
| 590 | struct gfs2_jdesc *jd; | ||
| 591 | int found = 0; | ||
| 592 | |||
| 593 | spin_lock(&sdp->sd_jindex_spin); | ||
| 594 | |||
| 595 | list_for_each_entry(jd, &sdp->sd_jindex_list, jd_list) { | ||
| 596 | if (jd->jd_dirty) { | ||
| 597 | jd->jd_dirty = 0; | ||
| 598 | found = 1; | ||
| 599 | break; | ||
| 600 | } | ||
| 601 | } | ||
| 602 | spin_unlock(&sdp->sd_jindex_spin); | ||
| 603 | |||
| 604 | if (!found) | ||
| 605 | jd = NULL; | ||
| 606 | |||
| 607 | return jd; | ||
| 608 | } | ||
| 609 | |||
| 586 | /** | 610 | /** |
| 587 | * gfs2_check_journals - Recover any dirty journals | 611 | * gfs2_check_journals - Recover any dirty journals |
| 588 | * @sdp: the filesystem | 612 | * @sdp: the filesystem |
| 589 | * | 613 | * |
| 590 | */ | 614 | */ |
| 591 | 615 | ||
| 592 | void gfs2_check_journals(struct gfs2_sbd *sdp) | 616 | static void gfs2_check_journals(struct gfs2_sbd *sdp) |
| 593 | { | 617 | { |
| 594 | struct gfs2_jdesc *jd; | 618 | struct gfs2_jdesc *jd; |
| 595 | 619 | ||
| @@ -603,3 +627,25 @@ void gfs2_check_journals(struct gfs2_sbd *sdp) | |||
| 603 | } | 627 | } |
| 604 | } | 628 | } |
| 605 | 629 | ||
| 630 | /** | ||
| 631 | * gfs2_recoverd - Recover dead machine's journals | ||
| 632 | * @sdp: Pointer to GFS2 superblock | ||
| 633 | * | ||
| 634 | */ | ||
| 635 | |||
| 636 | int gfs2_recoverd(void *data) | ||
| 637 | { | ||
| 638 | struct gfs2_sbd *sdp = data; | ||
| 639 | unsigned long t; | ||
| 640 | |||
| 641 | while (!kthread_should_stop()) { | ||
| 642 | gfs2_check_journals(sdp); | ||
| 643 | t = gfs2_tune_get(sdp, gt_recoverd_secs) * HZ; | ||
| 644 | if (freezing(current)) | ||
| 645 | refrigerator(); | ||
| 646 | schedule_timeout_interruptible(t); | ||
| 647 | } | ||
| 648 | |||
| 649 | return 0; | ||
| 650 | } | ||
| 651 | |||
