fuse: Freeze client on suspend when request sent to userspace
[firefly-linux-kernel-4.4.55.git] / fs / xfs / xfs_sysfs.c
index a094e20f567b36339fba12851ef3b424092489c7..ee70f5dec9dccf088eada0d354b06cb847577a2a 100644 (file)
@@ -25,8 +25,9 @@
 
 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 *
@@ -54,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;
@@ -80,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);
 }
@@ -92,62 +121,44 @@ 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,
+       .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
 stats_show(
-       char    *buf,
-       void    *data)
+       struct kobject  *kobject,
+       char            *buf)
 {
-       return xfs_stats_format(buf);
+       struct xstats   *stats = to_xstats(kobject);
+
+       return xfs_stats_format(stats->xs_stats, buf);
 }
 XFS_SYSFS_ATTR_RO(stats);
 
 STATIC ssize_t
 stats_clear_store(
+       struct kobject  *kobject,
        const char      *buf,
-       size_t          count,
-       void            *data)
+       size_t          count)
 {
        int             ret;
        int             val;
+       struct xstats   *stats = to_xstats(kobject);
 
        ret = kstrtoint(buf, 0, &val);
        if (ret)
@@ -155,7 +166,8 @@ stats_clear_store(
 
        if (val != 1)
                return -EINVAL;
-       xfs_stats_clearall();
+
+       xfs_stats_clearall(stats->xs_stats);
        return count;
 }
 XFS_SYSFS_ATTR_WO(stats_clear);
@@ -166,50 +178,30 @@ static struct attribute *xfs_stats_attrs[] = {
        NULL,
 };
 
-STATIC ssize_t
-xfs_stats_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_stats_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_stats_ops = {
-       .show = xfs_stats_show,
-       .store = xfs_stats_store,
-};
-
 struct kobj_type xfs_stats_ktype = {
        .release = xfs_sysfs_release,
-       .sysfs_ops = &xfs_stats_ops,
+       .sysfs_ops = &xfs_sysfs_ops,
        .default_attrs = xfs_stats_attrs,
 };
 
 /* 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;
@@ -222,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);
@@ -236,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);
@@ -250,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);
@@ -270,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,
 };