|
@@ -16,6 +16,8 @@
|
|
|
#include <linux/crc32.h>
|
|
|
#include <linux/lm_interface.h>
|
|
|
#include <linux/delay.h>
|
|
|
+#include <linux/kthread.h>
|
|
|
+#include <linux/freezer.h>
|
|
|
|
|
|
#include "gfs2.h"
|
|
|
#include "incore.h"
|
|
@@ -26,6 +28,7 @@
|
|
|
#include "meta_io.h"
|
|
|
#include "util.h"
|
|
|
#include "dir.h"
|
|
|
+#include "super.h"
|
|
|
|
|
|
#define PULL 1
|
|
|
|
|
@@ -208,7 +211,7 @@ static void gfs2_ail1_start(struct gfs2_sbd *sdp, int flags)
|
|
|
gfs2_log_unlock(sdp);
|
|
|
}
|
|
|
|
|
|
-int gfs2_ail1_empty(struct gfs2_sbd *sdp, int flags)
|
|
|
+static int gfs2_ail1_empty(struct gfs2_sbd *sdp, int flags)
|
|
|
{
|
|
|
struct gfs2_ail *ai, *s;
|
|
|
int ret;
|
|
@@ -859,3 +862,54 @@ void gfs2_meta_syncfs(struct gfs2_sbd *sdp)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+/**
|
|
|
+ * gfs2_logd - Update log tail as Active Items get flushed to in-place blocks
|
|
|
+ * @sdp: Pointer to GFS2 superblock
|
|
|
+ *
|
|
|
+ * Also, periodically check to make sure that we're using the most recent
|
|
|
+ * journal index.
|
|
|
+ */
|
|
|
+
|
|
|
+int gfs2_logd(void *data)
|
|
|
+{
|
|
|
+ struct gfs2_sbd *sdp = data;
|
|
|
+ struct gfs2_holder ji_gh;
|
|
|
+ unsigned long t;
|
|
|
+ int need_flush;
|
|
|
+
|
|
|
+ while (!kthread_should_stop()) {
|
|
|
+ /* Advance the log tail */
|
|
|
+
|
|
|
+ t = sdp->sd_log_flush_time +
|
|
|
+ gfs2_tune_get(sdp, gt_log_flush_secs) * HZ;
|
|
|
+
|
|
|
+ gfs2_ail1_empty(sdp, DIO_ALL);
|
|
|
+ gfs2_log_lock(sdp);
|
|
|
+ need_flush = sdp->sd_log_num_buf > gfs2_tune_get(sdp, gt_incore_log_blocks);
|
|
|
+ gfs2_log_unlock(sdp);
|
|
|
+ if (need_flush || time_after_eq(jiffies, t)) {
|
|
|
+ gfs2_log_flush(sdp, NULL);
|
|
|
+ sdp->sd_log_flush_time = jiffies;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Check for latest journal index */
|
|
|
+
|
|
|
+ t = sdp->sd_jindex_refresh_time +
|
|
|
+ gfs2_tune_get(sdp, gt_jindex_refresh_secs) * HZ;
|
|
|
+
|
|
|
+ if (time_after_eq(jiffies, t)) {
|
|
|
+ if (!gfs2_jindex_hold(sdp, &ji_gh))
|
|
|
+ gfs2_glock_dq_uninit(&ji_gh);
|
|
|
+ sdp->sd_jindex_refresh_time = jiffies;
|
|
|
+ }
|
|
|
+
|
|
|
+ t = gfs2_tune_get(sdp, gt_logd_secs) * HZ;
|
|
|
+ if (freezing(current))
|
|
|
+ refrigerator();
|
|
|
+ schedule_timeout_interruptible(t);
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|