Whamcloud - gitweb
LU-8130 obd: convert obd_nid_hash to rhashtable
[fs/lustre-release.git] / lustre / mdt / mdt_lproc.c
index a3adf18..e483884 100644 (file)
@@ -531,6 +531,34 @@ static ssize_t commit_on_sharing_store(struct kobject *kobj,
 }
 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;
@@ -737,6 +765,65 @@ static ssize_t enable_dir_migration_store(struct kobject *kobj,
 }
 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.
  *
@@ -816,7 +903,7 @@ static ssize_t sync_count_store(struct kobject *kobj, struct attribute *attr,
 }
 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",
@@ -1044,6 +1131,102 @@ static ssize_t enable_remote_rename_store(struct kobject *kobj,
 }
 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);
@@ -1083,8 +1266,11 @@ static struct attribute *mdt_attrs[] = {
        &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,
@@ -1093,6 +1279,9 @@ static struct attribute *mdt_attrs[] = {
        &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,
 };
 
@@ -1115,10 +1304,8 @@ static struct lprocfs_vars lprocfs_mdt_obd_vars[] = {
 };
 
 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) {
@@ -1139,12 +1326,9 @@ lprocfs_mdt_print_open_files(struct cfs_hash *hs, struct cfs_hash_bd *bd,
 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)
@@ -1198,6 +1382,7 @@ static const char * const mdt_stats[] = {
        [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)