Skip to content

Commit

Permalink
xfs: introduce metadata IO error class
Browse files Browse the repository at this point in the history
Now we have the basic infrastructure, add the first error class so
we can build up the infrastructure in a meaningful way. Add the
metadata async write IO error class and sysfs entry, and introduce a
default configuration that matches the existing "retry forever"
behavior for async write metadata buffers.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Carlos Maiolino <cmaiolino@redhat.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
  • Loading branch information
Carlos Maiolino authored and Dave Chinner committed May 18, 2016
1 parent 192852b commit ffd40ef
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 0 deletions.
3 changes: 3 additions & 0 deletions fs/xfs/xfs_mount.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,9 +44,11 @@ enum {
* Error numbers define the errors that are configurable.
*/
enum {
XFS_ERR_METADATA,
XFS_ERR_CLASS_MAX,
};
enum {
XFS_ERR_DEFAULT,
XFS_ERR_ERRNO_MAX,
};

Expand Down Expand Up @@ -146,6 +148,7 @@ typedef struct xfs_mount {
/* low free space thresholds */
struct xfs_kobj m_kobj;
struct xfs_kobj m_error_kobj;
struct xfs_kobj m_error_meta_kobj;
struct xfs_error_cfg m_error_cfg[XFS_ERR_CLASS_MAX][XFS_ERR_ERRNO_MAX];
struct xstats m_stats; /* per-fs stats */

Expand Down
34 changes: 34 additions & 0 deletions fs/xfs/xfs_sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -399,17 +399,51 @@ int
xfs_error_sysfs_init(
struct xfs_mount *mp)
{
struct xfs_error_cfg *cfg;
int error;

/* .../xfs/<dev>/error/ */
error = xfs_sysfs_init(&mp->m_error_kobj, &xfs_error_ktype,
&mp->m_kobj, "error");
if (error)
return error;

/* .../xfs/<dev>/error/metadata/ */
error = xfs_sysfs_init(&mp->m_error_meta_kobj, &xfs_error_ktype,
&mp->m_error_kobj, "metadata");
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->max_retries = -1;

return 0;

out_error_meta:
xfs_sysfs_del(&mp->m_error_meta_kobj);
out_error:
xfs_sysfs_del(&mp->m_error_kobj);
return error;
}

void
xfs_error_sysfs_del(
struct xfs_mount *mp)
{
struct xfs_error_cfg *cfg;
int i, j;

for (i = 0; i < XFS_ERR_CLASS_MAX; i++) {
for (j = 0; j < XFS_ERR_ERRNO_MAX; j++) {
cfg = &mp->m_error_cfg[i][j];

xfs_sysfs_del(&cfg->kobj);
}
}
xfs_sysfs_del(&mp->m_error_meta_kobj);
xfs_sysfs_del(&mp->m_error_kobj);
}

0 comments on commit ffd40ef

Please sign in to comment.