]) # LIBCFS_GET_REQUEST_KEY_AUTH
#
+# LIBCFS_KOBJ_TYPE_DEFAULT_GROUPS
+#
+# Linux commit v5.1-rc3-29-gaa30f47cf666
+# kobject: Add support for default attribute groups to kobj_type
+# Linux commit v5.18-rc1-2-gcdb4f26a63c3
+# kobject: kobj_type: remove default_attrs
+#
+AC_DEFUN([LIBCFS_KOBJ_TYPE_DEFAULT_GROUPS],[
+LB_CHECK_COMPILE([does struct kobj_type have 'default_groups' member],
+kobj_type_default_groups, [
+ #include <linux/kobject.h>
+ ],[
+ struct kobj_type *kobj_type = NULL;
+ void *has = kobj_type->default_groups;
+ (void) has;
+ ],[
+ AC_DEFINE(HAVE_KOBJ_TYPE_DEFAULT_GROUPS, 1,
+ [struct kobj_type has 'default_groups' member])
+ ])
+]) # LIBCFS_KOBJ_TYPE_DEFAULT_GROUPS
+
+#
# LIBCFS_LOOKUP_USER_KEY
#
# kernel 5.3 commit 3cf5d076fb4d48979f382bc9452765bf8b79e740
LIBCFS_GENRADIX
LIBCFS_MM_TOTALRAM_PAGES_FUNC
LIBCFS_GET_REQUEST_KEY_AUTH
+# 5.2
+LIBCFS_KOBJ_TYPE_DEFAULT_GROUPS
# 5.3
LIBCFS_LOOKUP_USER_KEY
LIBCFS_FORCE_SIG_WITH_TASK
}
#endif
+#ifndef HAVE_KOBJ_TYPE_DEFAULT_GROUPS
+#define default_groups default_attrs
+#define KOBJ_ATTR_GROUPS(_name) _name##_attrs
+#define KOBJ_ATTRIBUTE_GROUPS(_name)
+#else
+#define KOBJ_ATTR_GROUPS(_name) _name##_groups
+#define KOBJ_ATTRIBUTE_GROUPS(_name) ATTRIBUTE_GROUPS(_name)
+#endif
+
#endif /* __LIBCFS_LINUX_MISC_H__ */
unsigned int time_second, unsigned int weight,
unsigned int period_second);
extern void obd_heat_clear(struct obd_heat_instance *instance, int count);
+
+/* struct kobj_type */
+static inline
+struct attribute *_get_attr_matches(const struct kobj_type *typ,
+ const char *key, size_t keylen,
+ int (*is_match)(const char *, const char *,
+ size_t))
+{
+ int i;
+
+#ifdef HAVE_KOBJ_TYPE_DEFAULT_GROUPS
+ for (i = 0; typ->default_groups[i]; i++) {
+ int k;
+ struct attribute **attrs;
+
+ attrs = (struct attribute **)typ->default_groups[i]->attrs;
+ for (k = 0; attrs[k]; k++) {
+ if (is_match(attrs[k]->name, key, keylen))
+ return (struct attribute *)attrs[k];
+ }
+ }
+#else
+ for (i = 0; typ->default_attrs[i]; i++) {
+ if (is_match(typ->default_attrs[i]->name, key, keylen))
+ return typ->default_attrs[i];
+ }
+#endif
+ return NULL;
+}
+
+static inline
+int _attr_name_exact(const char *attr_name, const char *key, size_t len)
+{
+ return !strcmp(attr_name, key);
+}
+
+static inline
+struct attribute *get_attr_by_name(const struct kobj_type *typ,
+ const char *name)
+{
+ return _get_attr_matches(typ, name, 0, _attr_name_exact);
+}
+
+static inline
+int _attr_name_starts_with(const char *attr_name, const char *name, size_t len)
+{
+ return !strncmp(attr_name, name, len);
+}
+
+static inline
+struct attribute *get_attr_starts_with(const struct kobj_type *typ,
+ const char *name,
+ size_t len)
+{
+ return _get_attr_matches(typ, name, len, _attr_name_starts_with);
+}
+
#endif /* __LINUX_OBD_CLASS_H */
NULL,
};
+KOBJ_ATTRIBUTE_GROUPS(ldlm_pl);
+
static void ldlm_pl_release(struct kobject *kobj)
{
struct ldlm_pool *pl = container_of(kobj, struct ldlm_pool,
}
static struct kobj_type ldlm_pl_ktype = {
- .default_attrs = ldlm_pl_attrs,
+ .default_groups = KOBJ_ATTR_GROUPS(ldlm_pl),
.sysfs_ops = &lustre_sysfs_ops,
.release = ldlm_pl_release,
};
complete(&ns->ns_kobj_unregister);
}
+KOBJ_ATTRIBUTE_GROUPS(ldlm_ns);
+
static struct kobj_type ldlm_ns_ktype = {
- .default_attrs = ldlm_ns_attrs,
+ .default_groups = KOBJ_ATTR_GROUPS(ldlm_ns),
.sysfs_ops = &lustre_sysfs_ops,
.release = ldlm_ns_release,
};
NULL,
};
+KOBJ_ATTRIBUTE_GROUPS(llite); /* creates llite_groups */
+
static void sbi_kobj_release(struct kobject *kobj)
{
struct ll_sb_info *sbi = container_of(kobj, struct ll_sb_info,
}
static struct kobj_type sbi_ktype = {
- .default_attrs = llite_attrs,
+ .default_groups = KOBJ_ATTR_GROUPS(llite),
.sysfs_ops = &lustre_sysfs_ops,
.release = sbi_kobj_release,
};
NULL,
};
+KOBJ_ATTRIBUTE_GROUPS(lmv); /* creates lmv_groups */
+
int lmv_tunables_init(struct obd_device *obd)
{
int rc;
- obd->obd_ktype.default_attrs = lmv_attrs;
+ obd->obd_ktype.default_groups = KOBJ_ATTR_GROUPS(lmv);
rc = lprocfs_obd_setup(obd, true);
if (rc)
goto out_failed;
NULL,
};
+KOBJ_ATTRIBUTE_GROUPS(lod); /* creates lod_groups from lod_attrs */
+
/**
* Initialize procfs entries for LOD.
*
struct kobject *lov;
int rc;
- lod->lod_dt_dev.dd_ktype.default_attrs = lod_attrs;
+ lod->lod_dt_dev.dd_ktype.default_groups = KOBJ_ATTR_GROUPS(lod);
rc = dt_tunables_init(&lod->lod_dt_dev, obd->obd_type, obd->obd_name,
NULL);
if (rc) {
NULL,
};
+KOBJ_ATTRIBUTE_GROUPS(lov); /* creates lov_groups */
+
int lov_tunables_init(struct obd_device *obd)
{
struct lov_obd *lov = &obd->u.lov;
int rc;
- obd->obd_ktype.default_attrs = lov_attrs;
+ obd->obd_ktype.default_groups = KOBJ_ATTR_GROUPS(lov);
rc = lprocfs_obd_setup(obd, false);
if (rc)
GOTO(out, rc);
NULL,
};
+KOBJ_ATTRIBUTE_GROUPS(mdc); /* creates mdc_groups */
+
int mdc_tunables_init(struct obd_device *obd)
{
int rc;
- obd->obd_ktype.default_attrs = mdc_attrs;
+ obd->obd_ktype.default_groups = KOBJ_ATTR_GROUPS(mdc);
obd->obd_vars = lprocfs_mdc_obd_vars;
rc = lprocfs_obd_setup(obd, false);
NULL,
};
+KOBJ_ATTRIBUTE_GROUPS(mdd); /* creates mdd_groups */
+
static void mdd_sysfs_release(struct kobject *kobj)
{
struct mdd_device *mdd = container_of(kobj, struct mdd_device,
/* put reference taken by class_search_type */
kobject_put(&type->typ_kobj);
- mdd->mdd_ktype.default_attrs = mdd_attrs;
+ mdd->mdd_ktype.default_groups = KOBJ_ATTR_GROUPS(mdd);
mdd->mdd_ktype.release = mdd_sysfs_release;
mdd->mdd_ktype.sysfs_ops = &lustre_sysfs_ops;
NULL,
};
+KOBJ_ATTRIBUTE_GROUPS(hsm); /* creates hsm_groups from hsm_attrs */
+
static void hsm_kobj_release(struct kobject *kobj)
{
struct coordinator *cdt = container_of(kobj, struct coordinator,
}
static struct kobj_type hsm_ktype = {
- .default_attrs = hsm_attrs,
+ .default_groups = KOBJ_ATTR_GROUPS(hsm),
.sysfs_ops = &lustre_sysfs_ops,
.release = hsm_kobj_release,
};
NULL,
};
+KOBJ_ATTRIBUTE_GROUPS(mdt); /* creates mdt_groups from mdt_attrs */
+
static struct lprocfs_vars lprocfs_mdt_obd_vars[] = {
{ .name = "recovery_status",
.fops = &mdt_recovery_status_fops },
ENTRY;
LASSERT(name != NULL);
- obd->obd_ktype.default_attrs = mdt_attrs;
+ obd->obd_ktype.default_groups = KOBJ_ATTR_GROUPS(mdt);
obd->obd_vars = lprocfs_mdt_obd_vars;
rc = lprocfs_obd_setup(obd, true);
if (rc) {
NULL,
};
+KOBJ_ATTRIBUTE_GROUPS(mgc);
+
int mgc_tunables_init(struct obd_device *obd)
{
int rc;
- obd->obd_ktype.default_attrs = mgc_attrs;
+ obd->obd_ktype.default_groups = KOBJ_ATTR_GROUPS(mgc);
obd->obd_debugfs_vars = ldebugfs_mgc_obd_vars;
rc = lprocfs_obd_setup(obd, true);
if (rc)
NULL,
};
+KOBJ_ATTRIBUTE_GROUPS(mgs); /* creates mgs_groups from mgs_attrs */
+
int lproc_mgs_setup(struct mgs_device *mgs, const char *osd_name)
{
int osd_len = strlen(osd_name) - strlen("-osd");
struct obd_device *obd = mgs->mgs_obd;
const struct kobj_type *bottom_type;
+ struct attribute *attr;
struct obd_device *osd_obd;
int rc;
- int i;
obd->obd_vars = lprocfs_mgs_obd_vars;
- obd->obd_ktype.default_attrs = mgs_attrs;
+ obd->obd_ktype.default_groups = KOBJ_ATTR_GROUPS(mgs);
rc = lprocfs_obd_setup(obd, true);
if (rc != 0)
GOTO(out, rc);
}
bottom_type = get_ktype(&mgs->mgs_bottom->dd_kobj);
-
- for (i = 0; bottom_type->default_attrs[i]; i++) {
- if (strcmp(bottom_type->default_attrs[i]->name, "fstype") == 0) {
- mgs->mgs_fstype = bottom_type->default_attrs[i];
- break;
- }
- }
-
- for (i = 0; bottom_type->default_attrs[i]; i++) {
- if (strcmp(bottom_type->default_attrs[i]->name, "mntdev") == 0) {
- mgs->mgs_mntdev = bottom_type->default_attrs[i];
- break;
- }
- }
-
+ attr = get_attr_by_name(bottom_type, "fstype");
+ if (attr)
+ mgs->mgs_fstype = attr;
+ attr = get_attr_by_name(bottom_type, "mntdev");
+ if (attr)
+ mgs->mgs_fstype = mgs->mgs_mntdev;
osd_obd = mgs->mgs_bottom->dd_lu_dev.ld_obd;
mgs->mgs_proc_osd = lprocfs_add_symlink("osd",
obd->obd_proc_entry,
}
typ = get_ktype(kobj);
- if (!typ || !typ->default_attrs)
+ if (!typ || !typ->default_groups)
return -ENODEV;
print_lustre_cfg(lcfg);
* or lctl conf_param lustre-OST0000.osc.max_dirty_mb=36
*/
for (i = 1; i < lcfg->lcfg_bufcount; i++) {
- struct attribute *attr;
+ struct attribute *attr = NULL;
size_t keylen;
char *value;
char *key;
- int j;
key = lustre_cfg_buf(lcfg, i);
/* Strip off prefix */
keylen = value - key;
value++;
- attr = NULL;
- for (j = 0; typ->default_attrs[j]; j++) {
- if (!strncmp(typ->default_attrs[j]->name, key,
- keylen)) {
- attr = typ->default_attrs[j];
- break;
- }
- }
-
+ attr = get_attr_starts_with(typ, key, keylen);
if (!attr) {
char *envp[4], *param, *path;
NULL,
};
+KOBJ_ATTRIBUTE_GROUPS(ofd); /* creates ofd_groups from ofd_attrs */
+
/**
* Initialize all needed procfs entries for OFD device.
*
/* lprocfs must be setup before the ofd so state can be safely added
* to /proc incrementally as the ofd is setup
*/
- obd->obd_ktype.default_attrs = ofd_attrs;
+ obd->obd_ktype.default_groups = KOBJ_ATTR_GROUPS(ofd);
obd->obd_vars = lprocfs_ofd_obd_vars;
rc = lprocfs_obd_setup(obd, false);
if (rc) {
NULL,
};
+KOBJ_ATTRIBUTE_GROUPS(osc); /* creates osc_groups */
+
int osc_tunables_init(struct obd_device *obd)
{
int rc;
obd->obd_vars = lprocfs_osc_obd_vars;
- obd->obd_ktype.default_attrs = osc_attrs;
+ obd->obd_ktype.default_groups = KOBJ_ATTR_GROUPS(osc);
rc = lprocfs_obd_setup(obd, false);
if (rc)
return rc;
NULL,
};
+KOBJ_ATTRIBUTE_GROUPS(ldiskfs); /* creates ldiskfs_groups from ldiskfs_attrs */
+
int osd_procfs_init(struct osd_device *osd, const char *name)
{
struct obd_type *type;
/* put reference taken by class_search_type */
kobject_put(&type->typ_kobj);
- osd->od_dt_dev.dd_ktype.default_attrs = ldiskfs_attrs;
+ osd->od_dt_dev.dd_ktype.default_groups = KOBJ_ATTR_GROUPS(ldiskfs);
rc = dt_tunables_init(&osd->od_dt_dev, type, name,
ldebugfs_osd_obd_vars);
if (rc) {
{ 0 }
};
+KOBJ_ATTRIBUTE_GROUPS(zfs); /* creates zfs_groups from zfs_attrs */
+
int osd_procfs_init(struct osd_device *osd, const char *name)
{
struct obd_type *type;
/* put reference taken by class_search_type */
kobject_put(&type->typ_kobj);
- osd->od_dt_dev.dd_ktype.default_attrs = zfs_attrs;
+ osd->od_dt_dev.dd_ktype.default_groups = KOBJ_ATTR_GROUPS(zfs);
rc = dt_tunables_init(&osd->od_dt_dev, type, name,
ldebugfs_osd_obd_vars);
if (rc) {
NULL,
};
+KOBJ_ATTRIBUTE_GROUPS(osp_obd); /* creates osp_obd_groups from osp_obd_attrs */
+
static struct attribute *osp_md_attrs[] = {
/* First two for compatiability reasons */
&lustre_attr_lfsck_max_rpcs_in_flight.attr,
NULL,
};
+KOBJ_ATTRIBUTE_GROUPS(osp_md); /* creates osp_md_groups from osp_md_attrs */
+
void osp_tunables_fini(struct osp_device *osp)
{
struct obd_device *obd = osp->opd_obd;
int rc;
if (osp->opd_connect_mdt) {
- osp->opd_dt_dev.dd_ktype.default_attrs = osp_md_attrs;
+ osp->opd_dt_dev.dd_ktype.default_groups =
+ KOBJ_ATTR_GROUPS(osp_md);
obd->obd_debugfs_vars = ldebugfs_osp_md_vars;
} else {
- osp->opd_dt_dev.dd_ktype.default_attrs = osp_obd_attrs;
+ osp->opd_dt_dev.dd_ktype.default_groups =
+ KOBJ_ATTR_GROUPS(osp_obd);
obd->obd_debugfs_vars = ldebugfs_osp_obd_vars;
}
NULL,
};
+KOBJ_ATTRIBUTE_GROUPS(ptlrpc_svc); /* creates ptlrpc_svc_groups */
+
static void ptlrpc_sysfs_svc_release(struct kobject *kobj)
{
struct ptlrpc_service *svc = container_of(kobj, struct ptlrpc_service,
}
static struct kobj_type ptlrpc_svc_ktype = {
- .default_attrs = ptlrpc_svc_attrs,
+ .default_groups = KOBJ_ATTR_GROUPS(ptlrpc_svc),
.sysfs_ops = &lustre_sysfs_ops,
.release = ptlrpc_sysfs_svc_release,
};