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