On Wed, Aug 05, 2015 at 09:08:36PM +1000, Dave Chinner wrote: > 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 3667d33..9d66095 100644 > --- a/fs/xfs/xfs_sysfs.c > +++ b/fs/xfs/xfs_sysfs.c > @@ -303,11 +303,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); 'parent_kobj' is a bit confusing of a name here since you're initializing it as well. Perhaps 'base_kobj,' 'class_kobj,' or something along those lines? Brian > + 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/ */ > @@ -317,22 +373,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.1.4 > > _______________________________________________ > xfs mailing list > xfs@xxxxxxxxxxx > http://oss.sgi.com/mailman/listinfo/xfs _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs