OSDN Git Service

staging/lustre/lmv: Move suitable entries from procfs to sysfs
authorOleg Drokin <green@linuxhacker.ru>
Thu, 21 May 2015 19:32:23 +0000 (15:32 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 31 May 2015 02:18:24 +0000 (11:18 +0900)
Signed-off-by: Oleg Drokin <green@linuxhacker.ru>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/lustre/lustre/include/obd.h
drivers/staging/lustre/lustre/lmv/lmv_obd.c
drivers/staging/lustre/lustre/lmv/lproc_lmv.c
drivers/staging/lustre/sysfs-fs-lustre

index d674646..c24fb1c 100644 (file)
@@ -613,6 +613,7 @@ struct lmv_obd {
        struct lmv_tgt_desc     **tgts;
 
        struct obd_connect_data conn_data;
+       struct kobject          *lmv_tgts_kobj;
 };
 
 struct niobuf_local {
@@ -917,7 +918,6 @@ struct obd_device {
        struct lprocfs_stats  *md_stats;
 
        struct proc_dir_entry  *obd_proc_entry;
-       void              *obd_proc_private; /* type private PDEs */
        struct proc_dir_entry  *obd_proc_exports_entry;
        struct proc_dir_entry  *obd_svc_procroot;
        struct lprocfs_stats  *obd_svc_stats;
index 14764ee..695a4ed 100644 (file)
@@ -199,7 +199,6 @@ static int lmv_connect(const struct lu_env *env,
                       struct obd_uuid *cluuid, struct obd_connect_data *data,
                       void *localdata)
 {
-       struct proc_dir_entry *lmv_proc_dir;
        struct lmv_obd  *lmv = &obd->u.lmv;
        struct lustre_handle  conn = { 0 };
        int                 rc = 0;
@@ -230,19 +229,8 @@ static int lmv_connect(const struct lu_env *env,
        if (data)
                lmv->conn_data = *data;
 
-       if (obd->obd_proc_private != NULL) {
-               lmv_proc_dir = obd->obd_proc_private;
-       } else {
-               lmv_proc_dir = lprocfs_register("target_obds", obd->obd_proc_entry,
-                                               NULL, NULL);
-               if (IS_ERR(lmv_proc_dir)) {
-                       CERROR("could not register /proc/fs/lustre/%s/%s/target_obds.",
-                              obd->obd_type->typ_name, obd->obd_name);
-                       lmv_proc_dir = NULL;
-               }
-               obd->obd_proc_private = lmv_proc_dir;
-       }
-
+       lmv->lmv_tgts_kobj = kobject_create_and_add("target_obds",
+                                                   &obd->obd_kobj);
        /*
         * All real clients should perform actual connection right away, because
         * it is possible, that LMV will not have opportunity to connect targets
@@ -252,10 +240,8 @@ static int lmv_connect(const struct lu_env *env,
        if (data->ocd_connect_flags & OBD_CONNECT_REAL)
                rc = lmv_check_connect(obd);
 
-       if (rc && lmv_proc_dir) {
-               lprocfs_remove(&lmv_proc_dir);
-               obd->obd_proc_private = NULL;
-       }
+       if (rc && lmv->lmv_tgts_kobj)
+               kobject_put(lmv->lmv_tgts_kobj);
 
        return rc;
 }
@@ -337,7 +323,6 @@ static int lmv_init_ea_size(struct obd_export *exp, int easize,
 
 static int lmv_connect_mdc(struct obd_device *obd, struct lmv_tgt_desc *tgt)
 {
-       struct proc_dir_entry   *lmv_proc_dir;
        struct lmv_obd    *lmv = &obd->u.lmv;
        struct obd_uuid  *cluuid = &lmv->cluuid;
        struct obd_uuid   lmv_mdc_uuid = { "LMV_MDC_UUID" };
@@ -415,25 +400,10 @@ static int lmv_connect_mdc(struct obd_device *obd, struct lmv_tgt_desc *tgt)
                mdc_obd->obd_name, mdc_obd->obd_uuid.uuid,
                atomic_read(&obd->obd_refcount));
 
-       lmv_proc_dir = obd->obd_proc_private;
-       if (lmv_proc_dir) {
-               struct proc_dir_entry *mdc_symlink;
-
-               LASSERT(mdc_obd->obd_type != NULL);
-               LASSERT(mdc_obd->obd_type->typ_name != NULL);
-               mdc_symlink = lprocfs_add_symlink(mdc_obd->obd_name,
-                                                 lmv_proc_dir,
-                                                 "../../../%s/%s",
-                                                 mdc_obd->obd_type->typ_name,
-                                                 mdc_obd->obd_name);
-               if (mdc_symlink == NULL) {
-                       CERROR("Could not register LMV target /proc/fs/lustre/%s/%s/target_obds/%s.",
-                              obd->obd_type->typ_name, obd->obd_name,
-                              mdc_obd->obd_name);
-                       lprocfs_remove(&lmv_proc_dir);
-                       obd->obd_proc_private = NULL;
-               }
-       }
+       if (lmv->lmv_tgts_kobj)
+               /* Even if we failed to create the link, that's fine */
+               rc = sysfs_create_link(lmv->lmv_tgts_kobj, &mdc_obd->obd_kobj,
+                                      mdc_obd->obd_name);
        return 0;
 }
 
@@ -610,7 +580,6 @@ int lmv_check_connect(struct obd_device *obd)
 
 static int lmv_disconnect_mdc(struct obd_device *obd, struct lmv_tgt_desc *tgt)
 {
-       struct proc_dir_entry  *lmv_proc_dir;
        struct lmv_obd   *lmv = &obd->u.lmv;
        struct obd_device      *mdc_obd;
        int                  rc;
@@ -626,9 +595,9 @@ static int lmv_disconnect_mdc(struct obd_device *obd, struct lmv_tgt_desc *tgt)
                mdc_obd->obd_no_recov = obd->obd_no_recov;
        }
 
-       lmv_proc_dir = obd->obd_proc_private;
-       if (lmv_proc_dir)
-               lprocfs_remove_proc_entry(mdc_obd->obd_name, lmv_proc_dir);
+       if (lmv->lmv_tgts_kobj)
+               sysfs_remove_link(lmv->lmv_tgts_kobj,
+                                 mdc_obd->obd_name);
 
        rc = obd_fid_fini(tgt->ltd_exp->exp_obd);
        if (rc)
@@ -676,11 +645,8 @@ static int lmv_disconnect(struct obd_export *exp)
                lmv_disconnect_mdc(obd, lmv->tgts[i]);
        }
 
-       if (obd->obd_proc_private)
-               lprocfs_remove((struct proc_dir_entry **)&obd->obd_proc_private);
-       else
-               CERROR("/proc/fs/lustre/%s/%s/target_obds missing\n",
-                      obd->obd_type->typ_name, obd->obd_name);
+       if (lmv->lmv_tgts_kobj)
+               kobject_put(lmv->lmv_tgts_kobj);
 
 out_local:
        /*
index debd897..b113e5a 100644 (file)
 #include "../include/obd_class.h"
 #include "lmv_internal.h"
 
-static int lmv_numobd_seq_show(struct seq_file *m, void *v)
+static ssize_t numobd_show(struct kobject *kobj, struct attribute *attr,
+                          char *buf)
 {
-       struct obd_device       *dev = (struct obd_device *)m->private;
-       struct lmv_desc  *desc;
+       struct obd_device *dev = container_of(kobj, struct obd_device,
+                                             obd_kobj);
+       struct lmv_desc *desc;
 
-       LASSERT(dev != NULL);
        desc = &dev->u.lmv.desc;
-       seq_printf(m, "%u\n", desc->ld_tgt_count);
-       return 0;
+       return sprintf(buf, "%u\n", desc->ld_tgt_count);
 }
-LPROC_SEQ_FOPS_RO(lmv_numobd);
+LUSTRE_RO_ATTR(numobd);
 
 static const char *placement_name[] = {
        [PLACEMENT_CHAR_POLICY] = "CHAR",
@@ -77,66 +77,61 @@ static const char *placement_policy2name(enum placement_policy placement)
        return placement_name[placement];
 }
 
-static int lmv_placement_seq_show(struct seq_file *m, void *v)
+static ssize_t placement_show(struct kobject *kobj, struct attribute *attr,
+                             char *buf)
 {
-       struct obd_device       *dev = (struct obd_device *)m->private;
-       struct lmv_obd    *lmv;
+       struct obd_device *dev = container_of(kobj, struct obd_device,
+                                             obd_kobj);
+       struct lmv_obd *lmv;
 
-       LASSERT(dev != NULL);
        lmv = &dev->u.lmv;
-       seq_printf(m, "%s\n", placement_policy2name(lmv->lmv_placement));
-       return 0;
+       return sprintf(buf, "%s\n", placement_policy2name(lmv->lmv_placement));
 }
 
 #define MAX_POLICY_STRING_SIZE 64
 
-static ssize_t lmv_placement_seq_write(struct file *file,
-                                       const char __user *buffer,
-                                       size_t count, loff_t *off)
+static ssize_t placement_store(struct kobject *kobj, struct attribute *attr,
+                              const char *buffer,
+                              size_t count)
 {
-       struct obd_device *dev = ((struct seq_file *)file->private_data)->private;
-       char                 dummy[MAX_POLICY_STRING_SIZE + 1];
-       int                   len = count;
-       enum placement_policy       policy;
-       struct lmv_obd    *lmv;
+       struct obd_device *dev = container_of(kobj, struct obd_device,
+                                             obd_kobj);
+       char dummy[MAX_POLICY_STRING_SIZE + 1];
+       enum placement_policy policy;
+       struct lmv_obd *lmv = &dev->u.lmv;
 
-       if (copy_from_user(dummy, buffer, MAX_POLICY_STRING_SIZE))
-               return -EFAULT;
+       memcpy(dummy, buffer, MAX_POLICY_STRING_SIZE);
 
-       LASSERT(dev != NULL);
-       lmv = &dev->u.lmv;
+       if (count > MAX_POLICY_STRING_SIZE)
+               count = MAX_POLICY_STRING_SIZE;
 
-       if (len > MAX_POLICY_STRING_SIZE)
-               len = MAX_POLICY_STRING_SIZE;
+       if (dummy[count - 1] == '\n')
+               count--;
+       dummy[count] = '\0';
 
-       if (dummy[len - 1] == '\n')
-               len--;
-       dummy[len] = '\0';
-
-       policy = placement_name2policy(dummy, len);
+       policy = placement_name2policy(dummy, count);
        if (policy != PLACEMENT_INVAL_POLICY) {
                spin_lock(&lmv->lmv_lock);
                lmv->lmv_placement = policy;
                spin_unlock(&lmv->lmv_lock);
        } else {
-               CERROR("Invalid placement policy \"%s\"!\n", dummy);
                return -EINVAL;
        }
        return count;
 }
-LPROC_SEQ_FOPS(lmv_placement);
+LUSTRE_RW_ATTR(placement);
 
-static int lmv_activeobd_seq_show(struct seq_file *m, void *v)
+static ssize_t activeobd_show(struct kobject *kobj, struct attribute *attr,
+                             char *buf)
 {
-       struct obd_device       *dev = (struct obd_device *)m->private;
-       struct lmv_desc  *desc;
+       struct obd_device *dev = container_of(kobj, struct obd_device,
+                                             obd_kobj);
+       struct lmv_desc *desc;
 
-       LASSERT(dev != NULL);
        desc = &dev->u.lmv.desc;
-       seq_printf(m, "%u\n", desc->ld_active_tgt_count);
-       return 0;
+       return sprintf(buf, "%u\n", desc->ld_active_tgt_count);
 }
-LPROC_SEQ_FOPS_RO(lmv_activeobd);
+LUSTRE_RO_ATTR(activeobd);
 
 static int lmv_desc_uuid_seq_show(struct seq_file *m, void *v)
 {
@@ -205,9 +200,6 @@ static int lmv_target_seq_open(struct inode *inode, struct file *file)
 }
 
 static struct lprocfs_vars lprocfs_lmv_obd_vars[] = {
-       { "numobd",       &lmv_numobd_fops,       NULL, 0 },
-       { "placement",    &lmv_placement_fops,    NULL, 0 },
-       { "activeobd",    &lmv_activeobd_fops,    NULL, 0 },
        { "desc_uuid",    &lmv_desc_uuid_fops,    NULL, 0 },
        { NULL }
 };
@@ -220,7 +212,19 @@ struct file_operations lmv_proc_target_fops = {
        .release              = seq_release,
 };
 
+static struct attribute *lmv_attrs[] = {
+       &lustre_attr_activeobd.attr,
+       &lustre_attr_numobd.attr,
+       &lustre_attr_placement.attr,
+       NULL,
+};
+
+static struct attribute_group lmv_attr_group = {
+       .attrs = lmv_attrs,
+};
+
 void lprocfs_lmv_init_vars(struct lprocfs_static_vars *lvars)
 {
+       lvars->sysfs_vars     = &lmv_attr_group;
        lvars->obd_vars       = lprocfs_lmv_obd_vars;
 }
index c7fe14c..1e302e8 100644 (file)
@@ -518,3 +518,26 @@ Contact:   "Oleg Drokin" <oleg.drokin@intel.com>
 Description:
                Number of OSC targets managed by this LOV instance that are
                actually active.
+
+What:          /sys/fs/lustre/lmv/{connection_name}/numobd
+Date:          May 2015
+Contact:       "Oleg Drokin" <oleg.drokin@intel.com>
+Description:
+               Number of MDC targets managed by this LMV instance.
+
+What:          /sys/fs/lustre/lmv/{connection_name}/activeobd
+Date:          May 2015
+Contact:       "Oleg Drokin" <oleg.drokin@intel.com>
+Description:
+               Number of MDC targets managed by this LMV instance that are
+               actually active.
+
+What:          /sys/fs/lustre/lmv/{connection_name}/placement
+Date:          May 2015
+Contact:       "Oleg Drokin" <oleg.drokin@intel.com>
+Description:
+               Determines policy of inode placement in case of multiple
+               metadata servers:
+               CHAR - based on a hash of the file name used at creation time
+                      (Default)
+               NID - based on a hash of creating client network id.