These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / fs / xfs / xfs_sysfs.c
index aa03670..ee70f5d 100644 (file)
 #include "xfs_log_format.h"
 #include "xfs_log.h"
 #include "xfs_log_priv.h"
+#include "xfs_stats.h"
 
 struct xfs_sysfs_attr {
        struct attribute attr;
-       ssize_t (*show)(char *buf, void *data);
-       ssize_t (*store)(const char *buf, size_t count, void *data);
+       ssize_t (*show)(struct kobject *kobject, char *buf);
+       ssize_t (*store)(struct kobject *kobject, const char *buf,
+                        size_t count);
 };
 
 static inline struct xfs_sysfs_attr *
@@ -38,6 +40,8 @@ to_attr(struct attribute *attr)
        static struct xfs_sysfs_attr xfs_sysfs_attr_##name = __ATTR_RW(name)
 #define XFS_SYSFS_ATTR_RO(name) \
        static struct xfs_sysfs_attr xfs_sysfs_attr_##name = __ATTR_RO(name)
+#define XFS_SYSFS_ATTR_WO(name) \
+       static struct xfs_sysfs_attr xfs_sysfs_attr_##name = __ATTR_WO(name)
 
 #define ATTR_LIST(name) &xfs_sysfs_attr_##name.attr
 
@@ -51,14 +55,42 @@ struct kobj_type xfs_mp_ktype = {
        .release = xfs_sysfs_release,
 };
 
+STATIC ssize_t
+xfs_sysfs_object_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(kobject, buf) : 0;
+}
+
+STATIC ssize_t
+xfs_sysfs_object_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(kobject, buf, count) : 0;
+}
+
+static const struct sysfs_ops xfs_sysfs_ops = {
+       .show = xfs_sysfs_object_show,
+       .store = xfs_sysfs_object_store,
+};
+
 #ifdef DEBUG
 /* debug */
 
 STATIC ssize_t
 log_recovery_delay_store(
+       struct kobject  *kobject,
        const char      *buf,
-       size_t          count,
-       void            *data)
+       size_t          count)
 {
        int             ret;
        int             val;
@@ -77,8 +109,8 @@ log_recovery_delay_store(
 
 STATIC ssize_t
 log_recovery_delay_show(
-       char    *buf,
-       void    *data)
+       struct kobject  *kobject,
+       char            *buf)
 {
        return snprintf(buf, PAGE_SIZE, "%d\n", xfs_globals.log_recovery_delay);
 }
@@ -89,52 +121,87 @@ static struct attribute *xfs_dbg_attrs[] = {
        NULL,
 };
 
+struct kobj_type xfs_dbg_ktype = {
+       .release = xfs_sysfs_release,
+       .sysfs_ops = &xfs_sysfs_ops,
+       .default_attrs = xfs_dbg_attrs,
+};
+
+#endif /* DEBUG */
+
+/* stats */
+
+static inline struct xstats *
+to_xstats(struct kobject *kobject)
+{
+       struct xfs_kobj *kobj = to_kobj(kobject);
+
+       return container_of(kobj, struct xstats, xs_kobj);
+}
+
 STATIC ssize_t
-xfs_dbg_show(
-       struct kobject          *kobject,
-       struct attribute        *attr,
-       char                    *buf)
+stats_show(
+       struct kobject  *kobject,
+       char            *buf)
 {
-       struct xfs_sysfs_attr *xfs_attr = to_attr(attr);
+       struct xstats   *stats = to_xstats(kobject);
 
-       return xfs_attr->show ? xfs_attr->show(buf, NULL) : 0;
+       return xfs_stats_format(stats->xs_stats, buf);
 }
+XFS_SYSFS_ATTR_RO(stats);
 
 STATIC ssize_t
-xfs_dbg_store(
-       struct kobject          *kobject,
-       struct attribute        *attr,
-       const char              *buf,
-       size_t                  count)
+stats_clear_store(
+       struct kobject  *kobject,
+       const char      *buf,
+       size_t          count)
 {
-       struct xfs_sysfs_attr *xfs_attr = to_attr(attr);
+       int             ret;
+       int             val;
+       struct xstats   *stats = to_xstats(kobject);
+
+       ret = kstrtoint(buf, 0, &val);
+       if (ret)
+               return ret;
 
-       return xfs_attr->store ? xfs_attr->store(buf, count, NULL) : 0;
+       if (val != 1)
+               return -EINVAL;
+
+       xfs_stats_clearall(stats->xs_stats);
+       return count;
 }
+XFS_SYSFS_ATTR_WO(stats_clear);
 
-static struct sysfs_ops xfs_dbg_ops = {
-       .show = xfs_dbg_show,
-       .store = xfs_dbg_store,
+static struct attribute *xfs_stats_attrs[] = {
+       ATTR_LIST(stats),
+       ATTR_LIST(stats_clear),
+       NULL,
 };
 
-struct kobj_type xfs_dbg_ktype = {
+struct kobj_type xfs_stats_ktype = {
        .release = xfs_sysfs_release,
-       .sysfs_ops = &xfs_dbg_ops,
-       .default_attrs = xfs_dbg_attrs,
+       .sysfs_ops = &xfs_sysfs_ops,
+       .default_attrs = xfs_stats_attrs,
 };
 
-#endif /* DEBUG */
-
 /* xlog */
 
+static inline struct xlog *
+to_xlog(struct kobject *kobject)
+{
+       struct xfs_kobj *kobj = to_kobj(kobject);
+
+       return container_of(kobj, struct xlog, l_kobj);
+}
+
 STATIC ssize_t
 log_head_lsn_show(
-       char    *buf,
-       void    *data)
+       struct kobject  *kobject,
+       char            *buf)
 {
-       struct xlog *log = data;
        int cycle;
        int block;
+       struct xlog *log = to_xlog(kobject);
 
        spin_lock(&log->l_icloglock);
        cycle = log->l_curr_cycle;
@@ -147,12 +214,12 @@ XFS_SYSFS_ATTR_RO(log_head_lsn);
 
 STATIC ssize_t
 log_tail_lsn_show(
-       char    *buf,
-       void    *data)
+       struct kobject  *kobject,
+       char            *buf)
 {
-       struct xlog *log = data;
        int cycle;
        int block;
+       struct xlog *log = to_xlog(kobject);
 
        xlog_crack_atomic_lsn(&log->l_tail_lsn, &cycle, &block);
        return snprintf(buf, PAGE_SIZE, "%d:%d\n", cycle, block);
@@ -161,12 +228,13 @@ XFS_SYSFS_ATTR_RO(log_tail_lsn);
 
 STATIC ssize_t
 reserve_grant_head_show(
-       char    *buf,
-       void    *data)
+       struct kobject  *kobject,
+       char            *buf)
+
 {
-       struct xlog *log = data;
        int cycle;
        int bytes;
+       struct xlog *log = to_xlog(kobject);
 
        xlog_crack_grant_head(&log->l_reserve_head.grant, &cycle, &bytes);
        return snprintf(buf, PAGE_SIZE, "%d:%d\n", cycle, bytes);
@@ -175,12 +243,12 @@ XFS_SYSFS_ATTR_RO(reserve_grant_head);
 
 STATIC ssize_t
 write_grant_head_show(
-       char    *buf,
-       void    *data)
+       struct kobject  *kobject,
+       char            *buf)
 {
-       struct xlog *log = data;
        int cycle;
        int bytes;
+       struct xlog *log = to_xlog(kobject);
 
        xlog_crack_grant_head(&log->l_write_head.grant, &cycle, &bytes);
        return snprintf(buf, PAGE_SIZE, "%d:%d\n", cycle, bytes);
@@ -195,45 +263,8 @@ static struct attribute *xfs_log_attrs[] = {
        NULL,
 };
 
-static inline struct xlog *
-to_xlog(struct kobject *kobject)
-{
-       struct xfs_kobj *kobj = to_kobj(kobject);
-       return container_of(kobj, struct xlog, l_kobj);
-}
-
-STATIC ssize_t
-xfs_log_show(
-       struct kobject          *kobject,
-       struct attribute        *attr,
-       char                    *buf)
-{
-       struct xlog *log = to_xlog(kobject);
-       struct xfs_sysfs_attr *xfs_attr = to_attr(attr);
-
-       return xfs_attr->show ? xfs_attr->show(buf, log) : 0;
-}
-
-STATIC ssize_t
-xfs_log_store(
-       struct kobject          *kobject,
-       struct attribute        *attr,
-       const char              *buf,
-       size_t                  count)
-{
-       struct xlog *log = to_xlog(kobject);
-       struct xfs_sysfs_attr *xfs_attr = to_attr(attr);
-
-       return xfs_attr->store ? xfs_attr->store(buf, count, log) : 0;
-}
-
-static struct sysfs_ops xfs_log_ops = {
-       .show = xfs_log_show,
-       .store = xfs_log_store,
-};
-
 struct kobj_type xfs_log_ktype = {
        .release = xfs_sysfs_release,
-       .sysfs_ops = &xfs_log_ops,
+       .sysfs_ops = &xfs_sysfs_ops,
        .default_attrs = xfs_log_attrs,
 };