[PATCH 49/58] staging/lustre/lmv: Move suitable entries from procfs to sysfs

green at linuxhacker.ru green at linuxhacker.ru
Thu May 21 19:32:23 UTC 2015


From: Oleg Drokin <green at linuxhacker.ru>

Signed-off-by: Oleg Drokin <green at linuxhacker.ru>
---
 drivers/staging/lustre/lustre/include/obd.h   |  2 +-
 drivers/staging/lustre/lustre/lmv/lmv_obd.c   | 60 ++++-------------
 drivers/staging/lustre/lustre/lmv/lproc_lmv.c | 92 ++++++++++++++-------------
 drivers/staging/lustre/sysfs-fs-lustre        | 23 +++++++
 4 files changed, 85 insertions(+), 92 deletions(-)

diff --git a/drivers/staging/lustre/lustre/include/obd.h b/drivers/staging/lustre/lustre/include/obd.h
index 2f7d08f..35f5fe7 100644
--- a/drivers/staging/lustre/lustre/include/obd.h
+++ b/drivers/staging/lustre/lustre/include/obd.h
@@ -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;
diff --git a/drivers/staging/lustre/lustre/lmv/lmv_obd.c b/drivers/staging/lustre/lustre/lmv/lmv_obd.c
index 14764ee..695a4ed 100644
--- a/drivers/staging/lustre/lustre/lmv/lmv_obd.c
+++ b/drivers/staging/lustre/lustre/lmv/lmv_obd.c
@@ -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:
 	/*
diff --git a/drivers/staging/lustre/lustre/lmv/lproc_lmv.c b/drivers/staging/lustre/lustre/lmv/lproc_lmv.c
index debd897..b113e5a 100644
--- a/drivers/staging/lustre/lustre/lmv/lproc_lmv.c
+++ b/drivers/staging/lustre/lustre/lmv/lproc_lmv.c
@@ -42,17 +42,17 @@
 #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;
 }
diff --git a/drivers/staging/lustre/sysfs-fs-lustre b/drivers/staging/lustre/sysfs-fs-lustre
index c7fe14c..1e302e8 100644
--- a/drivers/staging/lustre/sysfs-fs-lustre
+++ b/drivers/staging/lustre/sysfs-fs-lustre
@@ -518,3 +518,26 @@ Contact:	"Oleg Drokin" <oleg.drokin at 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 at 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 at 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 at 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.
-- 
2.1.0



More information about the devel mailing list