xfs_errortag_init(
struct xfs_mount *mp)
{
- int ret;
-
- mp->m_errortag = kzalloc(sizeof(unsigned int) * XFS_ERRTAG_MAX,
- GFP_KERNEL | __GFP_RETRY_MAYFAIL);
- if (!mp->m_errortag)
- return -ENOMEM;
-
- ret = xfs_sysfs_init(&mp->m_errortag_kobj, &xfs_errortag_ktype,
+ return xfs_sysfs_init(&mp->m_errortag_kobj, &xfs_errortag_ktype,
&mp->m_kobj, "errortag");
- if (ret)
- kfree(mp->m_errortag);
- return ret;
}
void
struct xfs_mount *mp)
{
xfs_sysfs_del(&mp->m_errortag_kobj);
- kfree(mp->m_errortag);
}
static bool
struct xfs_mount *mp,
unsigned int tag)
{
- if (!mp->m_errortag)
- return false;
if (!xfs_errortag_valid(tag))
return false;
{
unsigned int randfactor;
- /*
- * To be able to use error injection anywhere, we need to ensure error
- * injection mechanism is already initialized.
- *
- * Code paths like I/O completion can be called before the
- * initialization is complete, but be able to inject errors in such
- * places is still useful.
- */
- if (!mp->m_errortag)
- return false;
-
if (!xfs_errortag_valid(error_tag))
return false;
#include "xfs_defer.h"
#include "xfs_attr_item.h"
#include "xfs_xattr.h"
+#include "xfs_errortag.h"
#include "xfs_iunlink_item.h"
#include "xfs_dahash_test.h"
#include "xfs_rtbitmap.h"
debugfs_remove(mp->m_debugfs);
kfree(mp->m_rtname);
kfree(mp->m_logname);
+#ifdef DEBUG
+ kfree(mp->m_errortag);
+#endif
kfree(mp);
}
mp = kzalloc(sizeof(struct xfs_mount), GFP_KERNEL);
if (!mp)
return -ENOMEM;
+#ifdef DEBUG
+ mp->m_errortag = kcalloc(XFS_ERRTAG_MAX, sizeof(*mp->m_errortag),
+ GFP_KERNEL);
+ if (!mp->m_errortag) {
+ kfree(mp);
+ return -ENOMEM;
+ }
+#endif
spin_lock_init(&mp->m_sb_lock);
for (i = 0; i < XG_TYPE_MAX; i++)