*
* You should have received a copy of the GNU General Public License
* version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
+ * http://www.gnu.org/licenses/gpl-2.0.html
*
* GPL HEADER END
*/
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2012, 2014, Intel Corporation.
+ * Copyright (c) 2012, 2016, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
seq_printf(m, "%s ", changelog_type2str(i));
i++;
}
+ seq_putc(m, '\n');
return 0;
}
rec = (struct llog_changelog_user_rec *)hdr;
- seq_printf(m, CHANGELOG_USER_PREFIX"%-3d "LPU64"\n",
- rec->cur_id, rec->cur_endrec);
+ seq_printf(m, CHANGELOG_USER_PREFIX"%-3d %llu (%u)\n",
+ rec->cur_id, rec->cur_endrec, (__u32)get_seconds() -
+ rec->cur_time);
return 0;
}
cur = mdd->mdd_cl.mc_index;
spin_unlock(&mdd->mdd_cl.mc_lock);
- seq_printf(m, "current index: "LPU64"\n", cur);
- seq_printf(m, "%-5s %s\n", "ID", "index");
+ seq_printf(m, "current index: %llu\n", cur);
+ seq_printf(m, "%-5s %s %s\n", "ID", "index", "(idle seconds)");
llog_cat_process(&env, ctxt->loc_handle, lprocfs_changelog_users_cb,
m, 0, 0);
rc = mdd_changelog_size_ctxt(&env, mdd, LLOG_CHANGELOG_USER_ORIG_CTXT,
&tmp);
- seq_printf(m, LPU64"\n", tmp);
+ seq_printf(m, "%llu\n", tmp);
lu_env_fini(&env);
return rc;
}
LPROC_SEQ_FOPS_RO(mdd_changelog_size);
+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);
+
static int mdd_sync_perm_seq_show(struct seq_file *m, void *data)
{
struct mdd_device *mdd = m->private;
.fops = &mdd_changelog_users_fops },
{ .name = "changelog_size",
.fops = &mdd_changelog_size_fops },
+ { .name = "changelog_gc",
+ .fops = &mdd_changelog_gc_fops },
+ { .name = "changelog_max_idle_time",
+ .fops = &mdd_changelog_max_idle_time_fops },
+ { .name = "changelog_max_idle_indexes",
+ .fops = &mdd_changelog_max_idle_indexes_fops },
+ { .name = "changelog_min_gc_interval",
+ .fops = &mdd_changelog_min_gc_interval_fops },
+ { .name = "changelog_min_free_cat_entries",
+ .fops = &mdd_changelog_min_free_cat_entries_fops },
{ .name = "sync_permission",
.fops = &mdd_sync_perm_fops },
{ .name = "lfsck_speed_limit",