xfs: clean up xfs_mount allocation and dynamic initializers
Most of the generic data structures embedded in xfs_mount are dynamically initialized immediately after mp is allocated. A few fields are left out and initialized during the xfs_mountfs() sequence, after mp has been attached to the superblock. To clean this up and help prevent premature access of associated fields, refactor xfs_mount allocation and all dependent init calls into a new helper. This self-documents that all low level data structures (i.e., locks, trees, etc.) should be initialized before xfs_mount is attached to the superblock. Signed-off-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
parent
fa4493f0d9
commit
72c44e35f0
3 changed files with 30 additions and 14 deletions
|
@ -731,7 +731,6 @@ xfs_sb_mount_common(
|
||||||
struct xfs_sb *sbp)
|
struct xfs_sb *sbp)
|
||||||
{
|
{
|
||||||
mp->m_agfrotor = mp->m_agirotor = 0;
|
mp->m_agfrotor = mp->m_agirotor = 0;
|
||||||
spin_lock_init(&mp->m_agirotor_lock);
|
|
||||||
mp->m_maxagi = mp->m_sb.sb_agcount;
|
mp->m_maxagi = mp->m_sb.sb_agcount;
|
||||||
mp->m_blkbit_log = sbp->sb_blocklog + XFS_NBBYLOG;
|
mp->m_blkbit_log = sbp->sb_blocklog + XFS_NBBYLOG;
|
||||||
mp->m_blkbb_log = sbp->sb_blocklog - BBSHIFT;
|
mp->m_blkbb_log = sbp->sb_blocklog - BBSHIFT;
|
||||||
|
|
|
@ -817,8 +817,6 @@ xfs_mountfs(
|
||||||
/*
|
/*
|
||||||
* Allocate and initialize the per-ag data.
|
* Allocate and initialize the per-ag data.
|
||||||
*/
|
*/
|
||||||
spin_lock_init(&mp->m_perag_lock);
|
|
||||||
INIT_RADIX_TREE(&mp->m_perag_tree, GFP_ATOMIC);
|
|
||||||
error = xfs_initialize_perag(mp, sbp->sb_agcount, &mp->m_maxagi);
|
error = xfs_initialize_perag(mp, sbp->sb_agcount, &mp->m_maxagi);
|
||||||
if (error) {
|
if (error) {
|
||||||
xfs_warn(mp, "Failed per-ag init: %d", error);
|
xfs_warn(mp, "Failed per-ag init: %d", error);
|
||||||
|
|
|
@ -1579,6 +1579,31 @@ xfs_destroy_percpu_counters(
|
||||||
percpu_counter_destroy(&mp->m_fdblocks);
|
percpu_counter_destroy(&mp->m_fdblocks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct xfs_mount *
|
||||||
|
xfs_mount_alloc(
|
||||||
|
struct super_block *sb)
|
||||||
|
{
|
||||||
|
struct xfs_mount *mp;
|
||||||
|
|
||||||
|
mp = kzalloc(sizeof(struct xfs_mount), GFP_KERNEL);
|
||||||
|
if (!mp)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
mp->m_super = sb;
|
||||||
|
spin_lock_init(&mp->m_sb_lock);
|
||||||
|
spin_lock_init(&mp->m_agirotor_lock);
|
||||||
|
INIT_RADIX_TREE(&mp->m_perag_tree, GFP_ATOMIC);
|
||||||
|
spin_lock_init(&mp->m_perag_lock);
|
||||||
|
mutex_init(&mp->m_growlock);
|
||||||
|
atomic_set(&mp->m_active_trans, 0);
|
||||||
|
INIT_DELAYED_WORK(&mp->m_reclaim_work, xfs_reclaim_worker);
|
||||||
|
INIT_DELAYED_WORK(&mp->m_eofblocks_work, xfs_eofblocks_worker);
|
||||||
|
INIT_DELAYED_WORK(&mp->m_cowblocks_work, xfs_cowblocks_worker);
|
||||||
|
mp->m_kobj.kobject.kset = xfs_kset;
|
||||||
|
return mp;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
STATIC int
|
STATIC int
|
||||||
xfs_fs_fill_super(
|
xfs_fs_fill_super(
|
||||||
struct super_block *sb,
|
struct super_block *sb,
|
||||||
|
@ -1589,19 +1614,13 @@ xfs_fs_fill_super(
|
||||||
struct xfs_mount *mp = NULL;
|
struct xfs_mount *mp = NULL;
|
||||||
int flags = 0, error = -ENOMEM;
|
int flags = 0, error = -ENOMEM;
|
||||||
|
|
||||||
mp = kzalloc(sizeof(struct xfs_mount), GFP_KERNEL);
|
/*
|
||||||
|
* allocate mp and do all low-level struct initializations before we
|
||||||
|
* attach it to the super
|
||||||
|
*/
|
||||||
|
mp = xfs_mount_alloc(sb);
|
||||||
if (!mp)
|
if (!mp)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
spin_lock_init(&mp->m_sb_lock);
|
|
||||||
mutex_init(&mp->m_growlock);
|
|
||||||
atomic_set(&mp->m_active_trans, 0);
|
|
||||||
INIT_DELAYED_WORK(&mp->m_reclaim_work, xfs_reclaim_worker);
|
|
||||||
INIT_DELAYED_WORK(&mp->m_eofblocks_work, xfs_eofblocks_worker);
|
|
||||||
INIT_DELAYED_WORK(&mp->m_cowblocks_work, xfs_cowblocks_worker);
|
|
||||||
mp->m_kobj.kobject.kset = xfs_kset;
|
|
||||||
|
|
||||||
mp->m_super = sb;
|
|
||||||
sb->s_fs_info = mp;
|
sb->s_fs_info = mp;
|
||||||
|
|
||||||
error = xfs_parseargs(mp, (char *)data);
|
error = xfs_parseargs(mp, (char *)data);
|
||||||
|
|
Loading…
Add table
Reference in a new issue