mirror of https://gitee.com/openkylin/linux.git
staging/lustre/lmv: Move suitable entries from procfs to sysfs
Signed-off-by: Oleg Drokin <green@linuxhacker.ru> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
cb1debff6d
commit
b5fa70d76f
|
@ -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;
|
||||
|
|
|
@ -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:
|
||||
/*
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Reference in New Issue