xfs: list_lru_init returns a negative error

And we don't invert it properly when initialising the dquot lru
list.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Jie Liu <jeff.liu@oracle.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
Dave Chinner 2014-05-15 09:23:24 +10:00 committed by Dave Chinner
parent bc147822d5
commit ee4eec478b

View File

@ -843,22 +843,17 @@ xfs_qm_init_quotainfo(
qinf = mp->m_quotainfo = kmem_zalloc(sizeof(xfs_quotainfo_t), KM_SLEEP); qinf = mp->m_quotainfo = kmem_zalloc(sizeof(xfs_quotainfo_t), KM_SLEEP);
if ((error = list_lru_init(&qinf->qi_lru))) { error = -list_lru_init(&qinf->qi_lru);
kmem_free(qinf); if (error)
mp->m_quotainfo = NULL; goto out_free_qinf;
return error;
}
/* /*
* See if quotainodes are setup, and if not, allocate them, * See if quotainodes are setup, and if not, allocate them,
* and change the superblock accordingly. * and change the superblock accordingly.
*/ */
if ((error = xfs_qm_init_quotainos(mp))) { error = xfs_qm_init_quotainos(mp);
list_lru_destroy(&qinf->qi_lru); if (error)
kmem_free(qinf); goto out_free_lru;
mp->m_quotainfo = NULL;
return error;
}
INIT_RADIX_TREE(&qinf->qi_uquota_tree, GFP_NOFS); INIT_RADIX_TREE(&qinf->qi_uquota_tree, GFP_NOFS);
INIT_RADIX_TREE(&qinf->qi_gquota_tree, GFP_NOFS); INIT_RADIX_TREE(&qinf->qi_gquota_tree, GFP_NOFS);
@ -918,7 +913,7 @@ xfs_qm_init_quotainfo(
qinf->qi_isoftlimit = be64_to_cpu(ddqp->d_ino_softlimit); qinf->qi_isoftlimit = be64_to_cpu(ddqp->d_ino_softlimit);
qinf->qi_rtbhardlimit = be64_to_cpu(ddqp->d_rtb_hardlimit); qinf->qi_rtbhardlimit = be64_to_cpu(ddqp->d_rtb_hardlimit);
qinf->qi_rtbsoftlimit = be64_to_cpu(ddqp->d_rtb_softlimit); qinf->qi_rtbsoftlimit = be64_to_cpu(ddqp->d_rtb_softlimit);
xfs_qm_dqdestroy(dqp); xfs_qm_dqdestroy(dqp);
} else { } else {
qinf->qi_btimelimit = XFS_QM_BTIMELIMIT; qinf->qi_btimelimit = XFS_QM_BTIMELIMIT;
@ -935,6 +930,13 @@ xfs_qm_init_quotainfo(
qinf->qi_shrinker.flags = SHRINKER_NUMA_AWARE; qinf->qi_shrinker.flags = SHRINKER_NUMA_AWARE;
register_shrinker(&qinf->qi_shrinker); register_shrinker(&qinf->qi_shrinker);
return 0; return 0;
out_free_lru:
list_lru_destroy(&qinf->qi_lru);
out_free_qinf:
kmem_free(qinf);
mp->m_quotainfo = NULL;
return error;
} }