xfs
[Top] [All Lists]

[PATCH 4/9] xfs: introduce table-based init for error behaviours

To: xfs@xxxxxxxxxxx
Subject: [PATCH 4/9] xfs: introduce table-based init for error behaviours
From: Dave Chinner <david@xxxxxxxxxxxxx>
Date: Fri, 5 Feb 2016 12:23:22 +1100
Delivered-to: xfs@xxxxxxxxxxx
In-reply-to: <1454635407-22276-1-git-send-email-david@xxxxxxxxxxxxx>
References: <1454635407-22276-1-git-send-email-david@xxxxxxxxxxxxx>
From: Dave Chinner <dchinner@xxxxxxxxxx>

Before we start expanding the number of error classes and errors we
can configure behaviour for, we need a simple and clear way to
define the default behaviour that we initialised each mount with.
Introduce a table based method for keeping the initial configuration
in, and apply that to the existing initialisation code.

Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx>
---
 fs/xfs/xfs_sysfs.c | 72 +++++++++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 60 insertions(+), 12 deletions(-)

diff --git a/fs/xfs/xfs_sysfs.c b/fs/xfs/xfs_sysfs.c
index b8a6804..27487ce 100644
--- a/fs/xfs/xfs_sysfs.c
+++ b/fs/xfs/xfs_sysfs.c
@@ -340,11 +340,67 @@ struct kobj_type xfs_error_ktype = {
        .release = xfs_sysfs_release,
 };
 
+/*
+ * Error initialisation tables. These need to be ordered in the same
+ * order as the enums used to index the array. All class init tables need to
+ * define a "default" behaviour as the first entry, all other entries can be
+ * empty.
+ */
+struct xfs_error_init {
+       char            *name;
+       int             fail_speed;
+};
+
+static const struct xfs_error_init xfs_error_meta_init[XFS_ERR_ERRNO_MAX] = {
+       { .name = "Default",
+         .fail_speed = XFS_ERR_FAIL_NEVER,
+       },
+};
+
+static int
+xfs_error_sysfs_init_class(
+       struct xfs_mount        *mp,
+       int                     class,
+       const char              *parent_name,
+       struct xfs_kobj         *parent_kobj,
+       const struct xfs_error_init init[])
+{
+       struct xfs_error_cfg    *cfg;
+       int                     error;
+       int                     i;
+
+       ASSERT(class < XFS_ERR_CLASS_MAX);
+
+       error = xfs_sysfs_init(parent_kobj, &xfs_error_ktype,
+                               &mp->m_error_kobj, parent_name);
+       if (error)
+               return error;
+
+       for (i = 0; i < XFS_ERR_ERRNO_MAX; i++) {
+               cfg = &mp->m_error_cfg[class][i];
+               error = xfs_sysfs_init(&cfg->kobj, &xfs_error_cfg_ktype,
+                                       parent_kobj, init[i].name);
+               if (error)
+                       goto out_error;
+
+               cfg->fail_speed = init[i].fail_speed;
+       }
+       return 0;
+
+out_error:
+       /* unwind the entries that succeeded */
+       for (i--; i >= 0; i--) {
+               cfg = &mp->m_error_cfg[class][i];
+               xfs_sysfs_del(&cfg->kobj);
+       }
+       xfs_sysfs_del(parent_kobj);
+       return error;
+}
+
 int
 xfs_error_sysfs_init(
        struct xfs_mount        *mp)
 {
-       struct xfs_error_cfg    *cfg;
        int                     error;
 
        /* .../xfs/<dev>/error/ */
@@ -354,22 +410,14 @@ xfs_error_sysfs_init(
                return error;
 
        /* .../xfs/<dev>/error/metadata/ */
-       error = xfs_sysfs_init(&mp->m_error_meta_kobj, &xfs_error_ktype,
-                               &mp->m_error_kobj, "metadata");
+       error = xfs_error_sysfs_init_class(mp, XFS_ERR_METADATA,
+                               "metadata", &mp->m_error_meta_kobj,
+                               xfs_error_meta_init);
        if (error)
                goto out_error;
 
-       cfg = &mp->m_error_cfg[XFS_ERR_METADATA][XFS_ERR_DEFAULT];
-       error = xfs_sysfs_init(&cfg->kobj, &xfs_error_cfg_ktype,
-                               &mp->m_error_meta_kobj, "Default");
-       if (error)
-               goto out_error_meta;
-       cfg->fail_speed = XFS_ERR_FAIL_NEVER;
-
        return 0;
 
-out_error_meta:
-       xfs_sysfs_del(&mp->m_error_meta_kobj);
 out_error:
        xfs_sysfs_del(&mp->m_error_kobj);
        return error;
-- 
2.5.0

<Prev in Thread] Current Thread [Next in Thread>