+static int mdd_changelog_gc_seq_show(struct seq_file *m, void *data)
+{
+ struct mdd_device *mdd = m->private;
+
+ LASSERT(mdd != NULL);
+ seq_printf(m, "%u\n", mdd->mdd_changelog_gc);
+ return 0;
+}
+
+static ssize_t
+mdd_changelog_gc_seq_write(struct file *file, const char __user *buffer,
+ size_t count, loff_t *off)
+{
+ struct seq_file *m = file->private_data;
+ struct mdd_device *mdd = m->private;
+ int rc;
+ __s64 val;
+
+ LASSERT(mdd != NULL);
+ rc = lprocfs_str_to_s64(buffer, count, &val);
+ if (rc)
+ return rc;
+
+ mdd->mdd_changelog_gc = !!val;
+
+ return count;
+}
+LPROC_SEQ_FOPS(mdd_changelog_gc);
+
+static int mdd_changelog_max_idle_time_seq_show(struct seq_file *m, void *data)
+{
+ struct mdd_device *mdd = m->private;
+
+ LASSERT(mdd != NULL);
+ seq_printf(m, "%u\n", mdd->mdd_changelog_max_idle_time);
+ return 0;
+}
+
+static ssize_t
+mdd_changelog_max_idle_time_seq_write(struct file *file,
+ const char __user *buffer, size_t count,
+ loff_t *off)
+{
+ struct seq_file *m = file->private_data;
+ struct mdd_device *mdd = m->private;
+ int rc;
+ __s64 val;
+
+ LASSERT(mdd != NULL);
+ rc = lprocfs_str_to_s64(buffer, count, &val);
+ if (rc)
+ return rc;
+
+ /* XXX may need to limit with reasonable elapsed/idle times */
+ if (val < 1 || val > INT_MAX)
+ return -ERANGE;
+
+ mdd->mdd_changelog_max_idle_time = val;
+
+ return count;
+}
+LPROC_SEQ_FOPS(mdd_changelog_max_idle_time);
+
+static int mdd_changelog_max_idle_indexes_seq_show(struct seq_file *m,
+ void *data)
+{
+ struct mdd_device *mdd = m->private;
+
+ LASSERT(mdd != NULL);
+ seq_printf(m, "%lu\n", mdd->mdd_changelog_max_idle_indexes);
+ return 0;
+}
+
+static ssize_t
+mdd_changelog_max_idle_indexes_seq_write(struct file *file,
+ const char __user *buffer,
+ size_t count, loff_t *off)
+{
+ struct seq_file *m = file->private_data;
+ struct mdd_device *mdd = m->private;
+ int rc;
+ __s64 val;
+
+ LASSERT(mdd != NULL);
+ rc = lprocfs_str_to_s64(buffer, count, &val);
+ if (rc)
+ return rc;
+
+ /* XXX may need to limit/check with reasonable elapsed/idle indexes */
+ /* XXX may better allow to specify a % of full ChangeLogs */
+
+ mdd->mdd_changelog_max_idle_indexes = val;
+
+ return count;
+}
+LPROC_SEQ_FOPS(mdd_changelog_max_idle_indexes);
+
+static int mdd_changelog_min_gc_interval_seq_show(struct seq_file *m,
+ void *data)
+{
+ struct mdd_device *mdd = m->private;
+
+ LASSERT(mdd != NULL);
+ seq_printf(m, "%u\n", mdd->mdd_changelog_min_gc_interval);
+ return 0;
+}
+
+static ssize_t
+mdd_changelog_min_gc_interval_seq_write(struct file *file,
+ const char __user *buffer,
+ size_t count, loff_t *off)
+{
+ struct seq_file *m = file->private_data;
+ struct mdd_device *mdd = m->private;
+ int rc;
+ __s64 val;
+
+ LASSERT(mdd != NULL);
+ rc = lprocfs_str_to_s64(buffer, count, &val);
+ if (rc)
+ return rc;
+
+ /* XXX may need to limit with reasonable elapsed/interval times */
+ if (val < 1 || val > UINT_MAX)
+ return -ERANGE;
+
+ mdd->mdd_changelog_min_gc_interval = val;
+
+ return count;
+}
+LPROC_SEQ_FOPS(mdd_changelog_min_gc_interval);
+
+static int mdd_changelog_min_free_cat_entries_seq_show(struct seq_file *m,
+ void *data)
+{
+ struct mdd_device *mdd = m->private;
+
+ LASSERT(mdd != NULL);
+ seq_printf(m, "%u\n", mdd->mdd_changelog_min_free_cat_entries);
+ return 0;
+}
+
+static ssize_t
+mdd_changelog_min_free_cat_entries_seq_write(struct file *file,
+ const char __user *buffer,
+ size_t count, loff_t *off)
+{
+ struct seq_file *m = file->private_data;
+ struct mdd_device *mdd = m->private;
+ int rc;
+ __s64 val;
+
+ LASSERT(mdd != NULL);
+ rc = lprocfs_str_to_s64(buffer, count, &val);
+ if (rc)
+ return rc;
+
+ /* XXX may need to limit with more reasonable number of free entries */
+ if (val < 1 || (__u64)val > UINT_MAX)
+ return -ERANGE;
+
+ mdd->mdd_changelog_min_free_cat_entries = val;
+
+ return count;
+}
+LPROC_SEQ_FOPS(mdd_changelog_min_free_cat_entries);
+