diff options
Diffstat (limited to 'fs/xfs/xfs_super.c')
| -rw-r--r-- | fs/xfs/xfs_super.c | 53 | 
1 files changed, 48 insertions, 5 deletions
diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index c79eac048456..1f77014c6e1a 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -42,6 +42,7 @@  #include "xfs_xattr.h"  #include "xfs_iunlink_item.h"  #include "xfs_dahash_test.h" +#include "scrub/stats.h"  #include <linux/magic.h>  #include <linux/fs_context.h> @@ -49,6 +50,7 @@  static const struct super_operations xfs_super_operations; +static struct dentry *xfs_debugfs;	/* top-level xfs debugfs dir */  static struct kset *xfs_kset;		/* top-level xfs sysfs dir */  #ifdef DEBUG  static struct xfs_kobj xfs_dbg_kobj;	/* global debug sysfs attrs */ @@ -783,6 +785,7 @@ xfs_mount_free(  	if (mp->m_ddev_targp)  		xfs_free_buftarg(mp->m_ddev_targp); +	debugfs_remove(mp->m_debugfs);  	kfree(mp->m_rtname);  	kfree(mp->m_logname);  	kmem_free(mp); @@ -1163,6 +1166,7 @@ xfs_fs_put_super(  	xfs_unmountfs(mp);  	xfs_freesb(mp); +	xchk_mount_stats_free(mp);  	free_percpu(mp->m_stats.xs_stats);  	xfs_mount_list_del(mp);  	xfs_inodegc_free_percpu(mp); @@ -1497,6 +1501,21 @@ xfs_fs_validate_params(  	return 0;  } +struct dentry * +xfs_debugfs_mkdir( +	const char	*name, +	struct dentry	*parent) +{ +	struct dentry	*child; + +	/* Apparently we're expected to ignore error returns?? */ +	child = debugfs_create_dir(name, parent); +	if (IS_ERR(child)) +		return NULL; + +	return child; +} +  static int  xfs_fs_fill_super(  	struct super_block	*sb, @@ -1539,6 +1558,13 @@ xfs_fs_fill_super(  	if (error)  		return error; +	if (xfs_debugfs) { +		mp->m_debugfs = xfs_debugfs_mkdir(mp->m_super->s_id, +						  xfs_debugfs); +	} else { +		mp->m_debugfs = NULL; +	} +  	error = xfs_init_mount_workqueues(mp);  	if (error)  		goto out_shutdown_devices; @@ -1565,10 +1591,14 @@ xfs_fs_fill_super(  		goto out_destroy_inodegc;  	} -	error = xfs_readsb(mp, flags); +	error = xchk_mount_stats_alloc(mp);  	if (error)  		goto out_free_stats; +	error = xfs_readsb(mp, flags); +	if (error) +		goto out_free_scrub_stats; +  	error = xfs_finish_flags(mp);  	if (error)  		goto out_free_sb; @@ -1746,6 +1776,8 @@ xfs_fs_fill_super(  	xfs_filestream_unmount(mp);   out_free_sb:  	xfs_freesb(mp); + out_free_scrub_stats: +	xchk_mount_stats_free(mp);   out_free_stats:  	free_percpu(mp->m_stats.xs_stats);   out_destroy_inodegc: @@ -2377,10 +2409,12 @@ init_xfs_fs(void)  	if (error)  		goto out_cleanup_procfs; +	xfs_debugfs = xfs_debugfs_mkdir("xfs", NULL); +  	xfs_kset = kset_create_and_add("xfs", NULL, fs_kobj);  	if (!xfs_kset) {  		error = -ENOMEM; -		goto out_sysctl_unregister; +		goto out_debugfs_unregister;  	}  	xfsstats.xs_kobj.kobject.kset = xfs_kset; @@ -2396,11 +2430,15 @@ init_xfs_fs(void)  	if (error)  		goto out_free_stats; +	error = xchk_global_stats_setup(xfs_debugfs); +	if (error) +		goto out_remove_stats_kobj; +  #ifdef DEBUG  	xfs_dbg_kobj.kobject.kset = xfs_kset;  	error = xfs_sysfs_init(&xfs_dbg_kobj, &xfs_dbg_ktype, NULL, "debug");  	if (error) -		goto out_remove_stats_kobj; +		goto out_remove_scrub_stats;  #endif  	error = xfs_qm_init(); @@ -2417,14 +2455,17 @@ init_xfs_fs(void)   out_remove_dbg_kobj:  #ifdef DEBUG  	xfs_sysfs_del(&xfs_dbg_kobj); - out_remove_stats_kobj: + out_remove_scrub_stats:  #endif +	xchk_global_stats_teardown(); + out_remove_stats_kobj:  	xfs_sysfs_del(&xfsstats.xs_kobj);   out_free_stats:  	free_percpu(xfsstats.xs_stats);   out_kset_unregister:  	kset_unregister(xfs_kset); - out_sysctl_unregister: + out_debugfs_unregister: +	debugfs_remove(xfs_debugfs);  	xfs_sysctl_unregister();   out_cleanup_procfs:  	xfs_cleanup_procfs(); @@ -2448,9 +2489,11 @@ exit_xfs_fs(void)  #ifdef DEBUG  	xfs_sysfs_del(&xfs_dbg_kobj);  #endif +	xchk_global_stats_teardown();  	xfs_sysfs_del(&xfsstats.xs_kobj);  	free_percpu(xfsstats.xs_stats);  	kset_unregister(xfs_kset); +	debugfs_remove(xfs_debugfs);  	xfs_sysctl_unregister();  	xfs_cleanup_procfs();  	xfs_mru_cache_uninit();  |