提交 65b65735 编写于 作者: B Brian Foster 提交者: Dave Chinner

xfs: add debug sysfs attribute set

Create a top-level debug directory for global debug sysfs attributes.
This directory is added and removed on XFS module initialization and
removal respectively for DEBUG mode kernels only. It typically resides
at /sys/fs/xfs/debug. It is located at the top level of the xfs sysfs
hierarchy as attributes might define global behavior or behavior that
must be configured before an xfs mount is available (e.g., log recovery
behavior).

Define the global debug kobject that represents the debug sysfs
directory and add generic attribute show/store helpers to support future
attributes. No debug attributes are exported as of yet.
Signed-off-by: NBrian Foster <bfoster@redhat.com>
Reviewed-by: NDave Chinner <dchinner@redhat.com>
Signed-off-by: NDave Chinner <david@fromorbit.com>
上级 e1b05723
...@@ -47,6 +47,7 @@ ...@@ -47,6 +47,7 @@
#include "xfs_dinode.h" #include "xfs_dinode.h"
#include "xfs_filestream.h" #include "xfs_filestream.h"
#include "xfs_quota.h" #include "xfs_quota.h"
#include "xfs_sysfs.h"
#include <linux/namei.h> #include <linux/namei.h>
#include <linux/init.h> #include <linux/init.h>
...@@ -61,7 +62,11 @@ ...@@ -61,7 +62,11 @@
static const struct super_operations xfs_super_operations; static const struct super_operations xfs_super_operations;
static kmem_zone_t *xfs_ioend_zone; static kmem_zone_t *xfs_ioend_zone;
mempool_t *xfs_ioend_pool; mempool_t *xfs_ioend_pool;
struct kset *xfs_kset;
struct kset *xfs_kset; /* top-level xfs sysfs dir */
#ifdef DEBUG
static struct xfs_kobj xfs_dbg_kobj; /* global debug sysfs attrs */
#endif
#define MNTOPT_LOGBUFS "logbufs" /* number of XFS log buffers */ #define MNTOPT_LOGBUFS "logbufs" /* number of XFS log buffers */
#define MNTOPT_LOGBSIZE "logbsize" /* size of XFS log buffers */ #define MNTOPT_LOGBSIZE "logbsize" /* size of XFS log buffers */
...@@ -1769,9 +1774,16 @@ init_xfs_fs(void) ...@@ -1769,9 +1774,16 @@ init_xfs_fs(void)
goto out_sysctl_unregister;; goto out_sysctl_unregister;;
} }
error = xfs_qm_init(); #ifdef DEBUG
xfs_dbg_kobj.kobject.kset = xfs_kset;
error = xfs_sysfs_init(&xfs_dbg_kobj, &xfs_dbg_ktype, NULL, "debug");
if (error) if (error)
goto out_kset_unregister; goto out_kset_unregister;
#endif
error = xfs_qm_init();
if (error)
goto out_remove_kobj;
error = register_filesystem(&xfs_fs_type); error = register_filesystem(&xfs_fs_type);
if (error) if (error)
...@@ -1780,7 +1792,11 @@ init_xfs_fs(void) ...@@ -1780,7 +1792,11 @@ init_xfs_fs(void)
out_qm_exit: out_qm_exit:
xfs_qm_exit(); xfs_qm_exit();
out_remove_kobj:
#ifdef DEBUG
xfs_sysfs_del(&xfs_dbg_kobj);
out_kset_unregister: out_kset_unregister:
#endif
kset_unregister(xfs_kset); kset_unregister(xfs_kset);
out_sysctl_unregister: out_sysctl_unregister:
xfs_sysctl_unregister(); xfs_sysctl_unregister();
...@@ -1803,6 +1819,9 @@ exit_xfs_fs(void) ...@@ -1803,6 +1819,9 @@ exit_xfs_fs(void)
{ {
xfs_qm_exit(); xfs_qm_exit();
unregister_filesystem(&xfs_fs_type); unregister_filesystem(&xfs_fs_type);
#ifdef DEBUG
xfs_sysfs_del(&xfs_dbg_kobj);
#endif
kset_unregister(xfs_kset); kset_unregister(xfs_kset);
xfs_sysctl_unregister(); xfs_sysctl_unregister();
xfs_cleanup_procfs(); xfs_cleanup_procfs();
......
...@@ -51,6 +51,49 @@ struct kobj_type xfs_mp_ktype = { ...@@ -51,6 +51,49 @@ struct kobj_type xfs_mp_ktype = {
.release = xfs_sysfs_release, .release = xfs_sysfs_release,
}; };
#ifdef DEBUG
/* debug */
static struct attribute *xfs_dbg_attrs[] = {
NULL,
};
STATIC ssize_t
xfs_dbg_show(
struct kobject *kobject,
struct attribute *attr,
char *buf)
{
struct xfs_sysfs_attr *xfs_attr = to_attr(attr);
return xfs_attr->show ? xfs_attr->show(buf, NULL) : 0;
}
STATIC ssize_t
xfs_dbg_store(
struct kobject *kobject,
struct attribute *attr,
const char *buf,
size_t count)
{
struct xfs_sysfs_attr *xfs_attr = to_attr(attr);
return xfs_attr->store ? xfs_attr->store(buf, count, NULL) : 0;
}
static struct sysfs_ops xfs_dbg_ops = {
.show = xfs_dbg_show,
.store = xfs_dbg_store,
};
struct kobj_type xfs_dbg_ktype = {
.release = xfs_sysfs_release,
.sysfs_ops = &xfs_dbg_ops,
.default_attrs = xfs_dbg_attrs,
};
#endif /* DEBUG */
/* xlog */ /* xlog */
STATIC ssize_t STATIC ssize_t
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#define __XFS_SYSFS_H__ #define __XFS_SYSFS_H__
extern struct kobj_type xfs_mp_ktype; /* xfs_mount */ extern struct kobj_type xfs_mp_ktype; /* xfs_mount */
extern struct kobj_type xfs_dbg_ktype; /* debug */
extern struct kobj_type xfs_log_ktype; /* xlog */ extern struct kobj_type xfs_log_ktype; /* xlog */
static inline struct xfs_kobj * static inline struct xfs_kobj *
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册