Add the fs_context_operations method .free that performs fs context cleanup on context release. Signed-off-by: Ian Kent <raven@xxxxxxxxxx> --- fs/xfs/xfs_super.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 06f650fb3a8c..4f2963ff9e06 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -2133,10 +2133,36 @@ static const struct super_operations xfs_super_operations = { .free_cached_objects = xfs_fs_free_cached_objects, }; +static void xfs_fc_free(struct fs_context *fc) +{ + struct xfs_fs_context *ctx = fc->fs_private; + struct xfs_mount *mp = fc->s_fs_info; + + /* + * When the mount context is initialized the private + * struct xfs_mount info (mp) is allocated and stored in + * the fs context along with the struct xfs_fs_context + * (ctx) mount context working working storage. + * + * On super block allocation the mount info struct, mp, + * is moved into private super block info field ->s_fs_info + * of the newly allocated super block. But if an error occurs + * before this happens it's the responsibility of the fs + * context to release the mount info struct. + */ + if (mp) { + kfree(mp->m_logname); + kfree(mp->m_rtname); + kfree(mp); + } + kfree(ctx); +} + static const struct fs_context_operations xfs_context_ops = { .parse_param = xfs_parse_param, .get_tree = xfs_get_tree, .reconfigure = xfs_reconfigure, + .free = xfs_fc_free, }; static struct file_system_type xfs_fs_type = {