diff options
Diffstat (limited to 'fs/xfs/xfs_super.c')
| -rw-r--r-- | fs/xfs/xfs_super.c | 57 | 
1 files changed, 44 insertions, 13 deletions
| diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 904f637cfa5f..36bd8825bfb0 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -838,17 +838,18 @@ xfs_init_mount_workqueues(  		goto out_destroy_unwritten;  	mp->m_reclaim_workqueue = alloc_workqueue("xfs-reclaim/%s", -			WQ_FREEZABLE, 0, mp->m_fsname); +			WQ_MEM_RECLAIM|WQ_FREEZABLE, 0, mp->m_fsname);  	if (!mp->m_reclaim_workqueue)  		goto out_destroy_cil;  	mp->m_log_workqueue = alloc_workqueue("xfs-log/%s", -			WQ_FREEZABLE|WQ_HIGHPRI, 0, mp->m_fsname); +			WQ_MEM_RECLAIM|WQ_FREEZABLE|WQ_HIGHPRI, 0, +			mp->m_fsname);  	if (!mp->m_log_workqueue)  		goto out_destroy_reclaim;  	mp->m_eofblocks_workqueue = alloc_workqueue("xfs-eofblocks/%s", -			WQ_FREEZABLE, 0, mp->m_fsname); +			WQ_MEM_RECLAIM|WQ_FREEZABLE, 0, mp->m_fsname);  	if (!mp->m_eofblocks_workqueue)  		goto out_destroy_log; @@ -922,7 +923,7 @@ xfs_fs_destroy_inode(  	trace_xfs_destroy_inode(ip); -	XFS_STATS_INC(vn_reclaim); +	XFS_STATS_INC(ip->i_mount, vn_reclaim);  	ASSERT(XFS_FORCED_SHUTDOWN(ip->i_mount) || ip->i_delayed_blks == 0); @@ -983,8 +984,8 @@ xfs_fs_evict_inode(  	truncate_inode_pages_final(&inode->i_data);  	clear_inode(inode); -	XFS_STATS_INC(vn_rele); -	XFS_STATS_INC(vn_remove); +	XFS_STATS_INC(ip->i_mount, vn_rele); +	XFS_STATS_INC(ip->i_mount, vn_remove);  	xfs_inactive(ip);  } @@ -1474,9 +1475,16 @@ xfs_fs_fill_super(  	if (error)  		goto out_destroy_workqueues; +	/* Allocate stats memory before we do operations that might use it */ +	mp->m_stats.xs_stats = alloc_percpu(struct xfsstats); +	if (!mp->m_stats.xs_stats) { +		error = -ENOMEM; +		goto out_destroy_counters; +	} +  	error = xfs_readsb(mp, flags);  	if (error) -		goto out_destroy_counters; +		goto out_free_stats;  	error = xfs_finish_flags(mp);  	if (error) @@ -1545,9 +1553,11 @@ xfs_fs_fill_super(  	xfs_filestream_unmount(mp);   out_free_sb:  	xfs_freesb(mp); + out_free_stats: +	free_percpu(mp->m_stats.xs_stats);   out_destroy_counters:  	xfs_destroy_percpu_counters(mp); -out_destroy_workqueues: + out_destroy_workqueues:  	xfs_destroy_mount_workqueues(mp);   out_close_devices:  	xfs_close_devices(mp); @@ -1574,6 +1584,7 @@ xfs_fs_put_super(  	xfs_unmountfs(mp);  	xfs_freesb(mp); +	free_percpu(mp->m_stats.xs_stats);  	xfs_destroy_percpu_counters(mp);  	xfs_destroy_mount_workqueues(mp);  	xfs_close_devices(mp); @@ -1838,19 +1849,32 @@ init_xfs_fs(void)  	xfs_kset = kset_create_and_add("xfs", NULL, fs_kobj);  	if (!xfs_kset) {  		error = -ENOMEM; -		goto out_sysctl_unregister;; +		goto out_sysctl_unregister;  	} +	xfsstats.xs_kobj.kobject.kset = xfs_kset; + +	xfsstats.xs_stats = alloc_percpu(struct xfsstats); +	if (!xfsstats.xs_stats) { +		error = -ENOMEM; +		goto out_kset_unregister; +	} + +	error = xfs_sysfs_init(&xfsstats.xs_kobj, &xfs_stats_ktype, NULL, +			       "stats"); +	if (error) +		goto out_free_stats; +  #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_kset_unregister; +		goto out_remove_stats_kobj;  #endif  	error = xfs_qm_init();  	if (error) -		goto out_remove_kobj; +		goto out_remove_dbg_kobj;  	error = register_filesystem(&xfs_fs_type);  	if (error) @@ -1859,11 +1883,15 @@ init_xfs_fs(void)   out_qm_exit:  	xfs_qm_exit(); - out_remove_kobj: + out_remove_dbg_kobj:  #ifdef DEBUG  	xfs_sysfs_del(&xfs_dbg_kobj); - out_kset_unregister: + out_remove_stats_kobj:  #endif +	xfs_sysfs_del(&xfsstats.xs_kobj); + out_free_stats: +	free_percpu(xfsstats.xs_stats); + out_kset_unregister:  	kset_unregister(xfs_kset);   out_sysctl_unregister:  	xfs_sysctl_unregister(); @@ -1889,6 +1917,8 @@ exit_xfs_fs(void)  #ifdef DEBUG  	xfs_sysfs_del(&xfs_dbg_kobj);  #endif +	xfs_sysfs_del(&xfsstats.xs_kobj); +	free_percpu(xfsstats.xs_stats);  	kset_unregister(xfs_kset);  	xfs_sysctl_unregister();  	xfs_cleanup_procfs(); @@ -1896,6 +1926,7 @@ exit_xfs_fs(void)  	xfs_mru_cache_uninit();  	xfs_destroy_workqueues();  	xfs_destroy_zones(); +	xfs_uuid_table_free();  }  module_init(init_xfs_fs); | 
