* 16kB: { samples: 12, pct: 3, cum_pct: 81 }
**/
-#define pct(a, b) (b ? a * 100 / b : 0)
-
static void display_rename_stats(struct seq_file *seq, char *name,
struct obd_histogram *hist)
{
else
seq_printf(seq, "%6s%d%s", " ", 1<<(i-20), "MB:");
- seq_printf(seq, " { sample: %3lu, pct: %3lu, cum_pct: %3lu }\n",
- t, pct(t, tot), pct(cum, tot));
+ seq_printf(seq, " { sample: %3lu, pct: %3u, cum_pct: %3u }\n",
+ t, pct(t, tot), pct(cum, tot));
if (cum == tot)
break;
&rename_stats->hist[RENAME_CROSSDIR_TGT_SIZE]);
}
-#undef pct
-
static int mdt_rename_stats_seq_show(struct seq_file *seq, void *v)
{
struct mdt_device *mdt = seq->private;
}
LPROC_SEQ_FOPS(mdt_enable_remote_dir_gid);
-/**
- * Show MDT policy for handling dirty metadata under a lock being cancelled.
- *
- * \param[in] m seq_file handle
- * \param[in] data unused for single entry
- *
- * \retval 0 on success
- * \retval negative value on error
- */
-static int mdt_slc_seq_show(struct seq_file *m, void *data)
+static int mdt_enable_striped_dir_seq_show(struct seq_file *m, void *data)
{
struct obd_device *obd = m->private;
- struct lu_target *tgt = obd->u.obt.obt_lut;
- char *slc_states[] = {"never", "blocking", "always" };
+ struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev);
- seq_printf(m, "%s\n", slc_states[tgt->lut_sync_lock_cancel]);
+ seq_printf(m, "%u\n", mdt->mdt_enable_striped_dir);
return 0;
}
-LPROC_SEQ_FOPS_RO(mdt_slc);
+
+static ssize_t
+mdt_enable_striped_dir_seq_write(struct file *file, const char __user *buffer,
+ size_t count, loff_t *off)
+{
+ struct seq_file *m = file->private_data;
+ struct obd_device *obd = m->private;
+ struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev);
+ bool val;
+ int rc;
+
+ rc = kstrtobool_from_user(buffer, count, &val);
+ if (rc)
+ return rc;
+
+ mdt->mdt_enable_striped_dir = val;
+ return count;
+}
+LPROC_SEQ_FOPS(mdt_enable_striped_dir);
+
+static int mdt_enable_dir_migration_seq_show(struct seq_file *m, void *data)
+{
+ struct obd_device *obd = m->private;
+ struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev);
+
+ seq_printf(m, "%u\n", mdt->mdt_enable_dir_migration);
+ return 0;
+}
+
+static ssize_t
+mdt_enable_dir_migration_seq_write(struct file *file, const char __user *buffer,
+ size_t count, loff_t *off)
+{
+ struct seq_file *m = file->private_data;
+ struct obd_device *obd = m->private;
+ struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev);
+ bool val;
+ int rc;
+
+ rc = kstrtobool_from_user(buffer, count, &val);
+ if (rc)
+ return rc;
+
+ mdt->mdt_enable_dir_migration = val;
+ return count;
+}
+LPROC_SEQ_FOPS(mdt_enable_dir_migration);
/**
* Show MDT async commit count.
}
LPROC_SEQ_FOPS(mdt_migrate_hsm_allowed);
+static int mdt_readonly_seq_show(struct seq_file *m, void *data)
+{
+ struct obd_device *obd = m->private;
+ struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev);
+
+ seq_printf(m, "%u\n", mdt->mdt_readonly);
+ return 0;
+}
+
+static ssize_t
+mdt_readonly_seq_write(struct file *file, const char __user *buffer,
+ size_t count, loff_t *off)
+{
+ struct seq_file *m = file->private_data;
+ struct obd_device *obd = m->private;
+ struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev);
+ bool val;
+ int rc;
+
+ rc = kstrtobool_from_user(buffer, count, &val);
+ if (rc)
+ return rc;
+
+ mdt->mdt_readonly = val;
+ return count;
+}
+LPROC_SEQ_FOPS(mdt_readonly);
+
+static int mdt_enable_remote_rename_seq_show(struct seq_file *m, void *data)
+{
+ struct obd_device *obd = m->private;
+ struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev);
+
+ seq_printf(m, "%u\n", mdt->mdt_enable_remote_rename);
+ return 0;
+}
+
+static ssize_t
+mdt_enable_remote_rename_seq_write(struct file *file, const char __user *buffer,
+ size_t count, loff_t *off)
+{
+ struct seq_file *m = file->private_data;
+ struct obd_device *obd = m->private;
+ struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev);
+ bool val;
+ int rc;
+
+ rc = kstrtobool_from_user(buffer, count, &val);
+ if (rc)
+ return rc;
+
+ mdt->mdt_enable_remote_rename = val;
+ return count;
+}
+LPROC_SEQ_FOPS(mdt_enable_remote_rename);
+
LPROC_SEQ_FOPS_RO_TYPE(mdt, recovery_status);
LPROC_SEQ_FOPS_RO_TYPE(mdt, num_exports);
LPROC_SEQ_FOPS_RO_TYPE(mdt, target_instance);
.fops = &mdt_enable_remote_dir_fops },
{ .name = "enable_remote_dir_gid",
.fops = &mdt_enable_remote_dir_gid_fops },
+ { .name = "enable_striped_dir",
+ .fops = &mdt_enable_striped_dir_fops },
+ { .name = "enable_dir_migration",
+ .fops = &mdt_enable_dir_migration_fops },
+ { .name = "enable_remote_rename",
+ .fops = &mdt_enable_remote_rename_fops },
{ .name = "hsm_control",
.fops = &mdt_hsm_cdt_control_fops },
{ .name = "recovery_time_hard",
.fops = &mdt_recovery_time_hard_fops },
{ .name = "recovery_time_soft",
.fops = &mdt_recovery_time_soft_fops },
- { .name = "sync_lock_cancel",
- .fops = &mdt_slc_fops },
{ .name = "async_commit_count",
.fops = &mdt_async_commit_count_fops },
{ .name = "sync_count",
.fops = &mdt_sync_count_fops },
{ .name = "dom_lock",
.fops = &mdt_dom_lock_fops },
+ { .name = "dom_read_open",
+ .fops = &mdt_dom_read_open_fops },
{ .name = "migrate_hsm_allowed",
.fops = &mdt_migrate_hsm_allowed_fops },
+ { .name = "readonly",
+ .fops = &mdt_readonly_fops },
{ NULL }
};
return rc;
}
+ rc = tgt_tunables_init(&mdt->mdt_lut);
+ if (rc) {
+ CERROR("%s: failed to init target tunables: rc = %d\n",
+ mdt_obd_name(mdt), rc);
+ return rc;
+ }
+
rc = hsm_cdt_procfs_init(mdt);
if (rc) {
CERROR("%s: cannot create hsm proc entries: rc = %d\n",
lprocfs_free_per_client_stats(obd);
hsm_cdt_procfs_fini(mdt);
+ tgt_tunables_fini(&mdt->mdt_lut);
lprocfs_obd_cleanup(obd);
lprocfs_free_md_stats(obd);
lprocfs_free_obd_stats(obd);