}
LUSTRE_RW_ATTR(commit_on_sharing);
+static ssize_t local_recovery_show(struct kobject *kobj,
+ struct attribute *attr, char *buf)
+{
+ struct obd_device *obd = container_of(kobj, struct obd_device,
+ obd_kset.kobj);
+
+ return scnprintf(buf, PAGE_SIZE, "%u\n",
+ obd->u.obt.obt_lut->lut_local_recovery);
+}
+
+static ssize_t local_recovery_store(struct kobject *kobj,
+ struct attribute *attr,
+ const char *buffer, size_t count)
+{
+ struct obd_device *obd = container_of(kobj, struct obd_device,
+ obd_kset.kobj);
+ bool val;
+ int rc;
+
+ rc = kstrtobool(buffer, &val);
+ if (rc)
+ return rc;
+
+ obd->u.obt.obt_lut->lut_local_recovery = !!val;
+ return count;
+}
+LUSTRE_RW_ATTR(local_recovery);
+
static int mdt_root_squash_seq_show(struct seq_file *m, void *data)
{
struct obd_device *obd = m->private;
}
LUSTRE_RW_ATTR(enable_remote_dir_gid);
+static ssize_t enable_chprojid_gid_show(struct kobject *kobj,
+ struct attribute *attr, char *buf)
+{
+ struct obd_device *obd = container_of(kobj, struct obd_device,
+ obd_kset.kobj);
+ struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev);
+
+ return scnprintf(buf, PAGE_SIZE, "%d\n",
+ (int)mdt->mdt_enable_chprojid_gid);
+}
+
+static ssize_t enable_chprojid_gid_store(struct kobject *kobj,
+ struct attribute *attr,
+ const char *buffer, size_t count)
+{
+ struct obd_device *obd = container_of(kobj, struct obd_device,
+ obd_kset.kobj);
+ struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev);
+ int val;
+ int rc;
+
+ rc = kstrtoint(buffer, 0, &val);
+ if (rc)
+ return rc;
+
+ mdt->mdt_enable_chprojid_gid = val;
+ return count;
+}
+LUSTRE_RW_ATTR(enable_chprojid_gid);
+
static ssize_t enable_striped_dir_show(struct kobject *kobj,
struct attribute *attr, char *buf)
{
}
LUSTRE_RW_ATTR(enable_dir_migration);
+static ssize_t enable_dir_restripe_show(struct kobject *kobj,
+ struct attribute *attr, char *buf)
+{
+ struct obd_device *obd = container_of(kobj, struct obd_device,
+ obd_kset.kobj);
+ struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev);
+
+ return scnprintf(buf, PAGE_SIZE, "%u\n", mdt->mdt_enable_dir_restripe);
+}
+
+static ssize_t enable_dir_restripe_store(struct kobject *kobj,
+ struct attribute *attr,
+ const char *buffer, size_t count)
+{
+ struct obd_device *obd = container_of(kobj, struct obd_device,
+ obd_kset.kobj);
+ struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev);
+ bool val;
+ int rc;
+
+ rc = kstrtobool(buffer, &val);
+ if (rc)
+ return rc;
+
+ mdt->mdt_enable_dir_restripe = val;
+ return count;
+}
+LUSTRE_RW_ATTR(enable_dir_restripe);
+
+static ssize_t enable_dir_auto_split_show(struct kobject *kobj,
+ struct attribute *attr, char *buf)
+{
+ struct obd_device *obd = container_of(kobj, struct obd_device,
+ obd_kset.kobj);
+ struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev);
+
+ return scnprintf(buf, PAGE_SIZE, "%u\n",
+ mdt->mdt_enable_dir_auto_split);
+}
+
+static ssize_t enable_dir_auto_split_store(struct kobject *kobj,
+ struct attribute *attr,
+ const char *buffer, size_t count)
+{
+ struct obd_device *obd = container_of(kobj, struct obd_device,
+ obd_kset.kobj);
+ struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev);
+ bool val;
+ int rc;
+
+ rc = kstrtobool(buffer, &val);
+ if (rc)
+ return rc;
+
+ mdt->mdt_enable_dir_auto_split = val;
+ return count;
+}
+LUSTRE_RW_ATTR(enable_dir_auto_split);
+
/**
* Show MDT async commit count.
*
}
LUSTRE_RW_ATTR(sync_count);
-static char *dom_open_lock_modes[NUM_DOM_LOCK_ON_OPEN_MODES] = {
+static const char *dom_open_lock_modes[NUM_DOM_LOCK_ON_OPEN_MODES] = {
[NO_DOM_LOCK_ON_OPEN] = "never",
[TRYLOCK_DOM_ON_OPEN] = "trylock",
[ALWAYS_DOM_LOCK_ON_OPEN] = "always",
}
LUSTRE_RW_ATTR(enable_remote_rename);
+static ssize_t dir_split_count_show(struct kobject *kobj,
+ struct attribute *attr,
+ char *buf)
+{
+ struct obd_device *obd = container_of(kobj, struct obd_device,
+ obd_kset.kobj);
+ struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev);
+
+ return scnprintf(buf, PAGE_SIZE, "%llu\n",
+ mdt->mdt_restriper.mdr_dir_split_count);
+}
+
+static ssize_t dir_split_count_store(struct kobject *kobj,
+ struct attribute *attr,
+ const char *buffer, size_t count)
+{
+ struct obd_device *obd = container_of(kobj, struct obd_device,
+ obd_kset.kobj);
+ struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev);
+ s64 val;
+ int rc;
+
+ rc = sysfs_memparse(buffer, count, &val, "B");
+ if (rc < 0)
+ return rc;
+
+ if (val < 0)
+ return -ERANGE;
+
+ mdt->mdt_restriper.mdr_dir_split_count = val;
+
+ return count;
+}
+LUSTRE_RW_ATTR(dir_split_count);
+
+static ssize_t dir_split_delta_show(struct kobject *kobj,
+ struct attribute *attr,
+ char *buf)
+{
+ struct obd_device *obd = container_of(kobj, struct obd_device,
+ obd_kset.kobj);
+ struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev);
+
+ return scnprintf(buf, PAGE_SIZE, "%u\n",
+ mdt->mdt_restriper.mdr_dir_split_delta);
+}
+
+static ssize_t dir_split_delta_store(struct kobject *kobj,
+ struct attribute *attr,
+ const char *buffer, size_t count)
+{
+ struct obd_device *obd = container_of(kobj, struct obd_device,
+ obd_kset.kobj);
+ struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev);
+ u32 val;
+ int rc;
+
+ rc = kstrtouint(buffer, 0, &val);
+ if (rc)
+ return rc;
+
+ mdt->mdt_restriper.mdr_dir_split_delta = val;
+
+ return count;
+}
+LUSTRE_RW_ATTR(dir_split_delta);
+
+static ssize_t dir_restripe_nsonly_show(struct kobject *kobj,
+ struct attribute *attr, char *buf)
+{
+ struct obd_device *obd = container_of(kobj, struct obd_device,
+ obd_kset.kobj);
+ struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev);
+
+ return scnprintf(buf, PAGE_SIZE, "%u\n", mdt->mdt_dir_restripe_nsonly);
+}
+
+static ssize_t dir_restripe_nsonly_store(struct kobject *kobj,
+ struct attribute *attr,
+ const char *buffer, size_t count)
+{
+ struct obd_device *obd = container_of(kobj, struct obd_device,
+ obd_kset.kobj);
+ struct mdt_device *mdt = mdt_dev(obd->obd_lu_dev);
+ bool val;
+ int rc;
+
+ rc = kstrtobool(buffer, &val);
+ if (rc)
+ return rc;
+
+ mdt->mdt_dir_restripe_nsonly = val;
+ return count;
+}
+LUSTRE_RW_ATTR(dir_restripe_nsonly);
+
LPROC_SEQ_FOPS_RO_TYPE(mdt, hash);
LPROC_SEQ_FOPS_WR_ONLY(mdt, mds_evict_client);
LUSTRE_RW_ATTR(job_cleanup_interval);
&lustre_attr_evict_tgt_nids.attr,
&lustre_attr_enable_remote_dir.attr,
&lustre_attr_enable_remote_dir_gid.attr,
+ &lustre_attr_enable_chprojid_gid.attr,
&lustre_attr_enable_striped_dir.attr,
&lustre_attr_enable_dir_migration.attr,
+ &lustre_attr_enable_dir_restripe.attr,
+ &lustre_attr_enable_dir_auto_split.attr,
&lustre_attr_enable_remote_rename.attr,
&lustre_attr_commit_on_sharing.attr,
+ &lustre_attr_local_recovery.attr,
&lustre_attr_async_commit_count.attr,
&lustre_attr_sync_count.attr,
&lustre_attr_dom_lock.attr,
&lustre_attr_hsm_control.attr,
&lustre_attr_job_cleanup_interval.attr,
&lustre_attr_readonly.attr,
+ &lustre_attr_dir_split_count.attr,
+ &lustre_attr_dir_split_delta.attr,
+ &lustre_attr_dir_restripe_nsonly.attr,
NULL,
};
};
static int
-lprocfs_mdt_print_open_files(struct cfs_hash *hs, struct cfs_hash_bd *bd,
- struct hlist_node *hnode, void *v)
+lprocfs_mdt_print_open_files(struct obd_export *exp, void *v)
{
- struct obd_export *exp = cfs_hash_object(hs, hnode);
struct seq_file *seq = v;
if (exp->exp_lock_hash != NULL) {
static int lprocfs_mdt_open_files_seq_show(struct seq_file *seq, void *v)
{
struct nid_stat *stats = seq->private;
- struct obd_device *obd = stats->nid_obd;
- cfs_hash_for_each_key(obd->obd_nid_hash, &stats->nid,
- lprocfs_mdt_print_open_files, seq);
-
- return 0;
+ return obd_nid_export_for_each(stats->nid_obd, stats->nid,
+ lprocfs_mdt_print_open_files, seq);
}
int lprocfs_mdt_open_files_seq_open(struct inode *inode, struct file *file)
[LPROC_MDT_IO_READ] = "read_bytes",
[LPROC_MDT_IO_WRITE] = "write_bytes",
[LPROC_MDT_IO_PUNCH] = "punch",
+ [LPROC_MDT_MIGRATE] = "migrate",
};
void mdt_stats_counter_init(struct lprocfs_stats *stats)