| From foo@baz Wed Feb 28 16:16:23 CET 2018 |
| From: Aliaksei Karaliou <akaraliou.dev@gmail.com> |
| Date: Thu, 21 Dec 2017 13:18:26 -0800 |
| Subject: xfs: quota: check result of register_shrinker() |
| |
| From: Aliaksei Karaliou <akaraliou.dev@gmail.com> |
| |
| |
| [ Upstream commit 3a3882ff26fbdbaf5f7e13f6a0bccfbf7121041d ] |
| |
| xfs_qm_init_quotainfo() does not check result of register_shrinker() |
| which was tagged as __must_check recently, reported by sparse. |
| |
| Signed-off-by: Aliaksei Karaliou <akaraliou.dev@gmail.com> |
| [darrick: move xfs_qm_destroy_quotainos nearer xfs_qm_init_quotainos] |
| Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> |
| Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> |
| |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| fs/xfs/xfs_qm.c | 45 +++++++++++++++++++++++++++++---------------- |
| 1 file changed, 29 insertions(+), 16 deletions(-) |
| |
| --- a/fs/xfs/xfs_qm.c |
| +++ b/fs/xfs/xfs_qm.c |
| @@ -49,7 +49,7 @@ |
| STATIC int xfs_qm_init_quotainos(xfs_mount_t *); |
| STATIC int xfs_qm_init_quotainfo(xfs_mount_t *); |
| |
| - |
| +STATIC void xfs_qm_destroy_quotainos(xfs_quotainfo_t *qi); |
| STATIC void xfs_qm_dqfree_one(struct xfs_dquot *dqp); |
| /* |
| * We use the batch lookup interface to iterate over the dquots as it |
| @@ -662,9 +662,17 @@ xfs_qm_init_quotainfo( |
| qinf->qi_shrinker.scan_objects = xfs_qm_shrink_scan; |
| qinf->qi_shrinker.seeks = DEFAULT_SEEKS; |
| qinf->qi_shrinker.flags = SHRINKER_NUMA_AWARE; |
| - register_shrinker(&qinf->qi_shrinker); |
| + |
| + error = register_shrinker(&qinf->qi_shrinker); |
| + if (error) |
| + goto out_free_inos; |
| + |
| return 0; |
| |
| +out_free_inos: |
| + mutex_destroy(&qinf->qi_quotaofflock); |
| + mutex_destroy(&qinf->qi_tree_lock); |
| + xfs_qm_destroy_quotainos(qinf); |
| out_free_lru: |
| list_lru_destroy(&qinf->qi_lru); |
| out_free_qinf: |
| @@ -673,7 +681,6 @@ out_free_qinf: |
| return error; |
| } |
| |
| - |
| /* |
| * Gets called when unmounting a filesystem or when all quotas get |
| * turned off. |
| @@ -690,19 +697,7 @@ xfs_qm_destroy_quotainfo( |
| |
| unregister_shrinker(&qi->qi_shrinker); |
| list_lru_destroy(&qi->qi_lru); |
| - |
| - if (qi->qi_uquotaip) { |
| - IRELE(qi->qi_uquotaip); |
| - qi->qi_uquotaip = NULL; /* paranoia */ |
| - } |
| - if (qi->qi_gquotaip) { |
| - IRELE(qi->qi_gquotaip); |
| - qi->qi_gquotaip = NULL; |
| - } |
| - if (qi->qi_pquotaip) { |
| - IRELE(qi->qi_pquotaip); |
| - qi->qi_pquotaip = NULL; |
| - } |
| + xfs_qm_destroy_quotainos(qi); |
| mutex_destroy(&qi->qi_tree_lock); |
| mutex_destroy(&qi->qi_quotaofflock); |
| kmem_free(qi); |
| @@ -1574,6 +1569,24 @@ error_rele: |
| } |
| |
| STATIC void |
| +xfs_qm_destroy_quotainos( |
| + xfs_quotainfo_t *qi) |
| +{ |
| + if (qi->qi_uquotaip) { |
| + IRELE(qi->qi_uquotaip); |
| + qi->qi_uquotaip = NULL; /* paranoia */ |
| + } |
| + if (qi->qi_gquotaip) { |
| + IRELE(qi->qi_gquotaip); |
| + qi->qi_gquotaip = NULL; |
| + } |
| + if (qi->qi_pquotaip) { |
| + IRELE(qi->qi_pquotaip); |
| + qi->qi_pquotaip = NULL; |
| + } |
| +} |
| + |
| +STATIC void |
| xfs_qm_dqfree_one( |
| struct xfs_dquot *dqp) |
| { |