Commit 12e971b6 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'xfs-4.15-fixes-10' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux

Pull XFS fixes from Darrick Wong:
 "I have just a few fixes for bugs and resource cleanup problems this
  week:

   - Fix resource cleanup of failed quota initialization

   - Fix integer overflow problems wrt s_maxbytes"

* tag 'xfs-4.15-fixes-10' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux:
  xfs: fix s_maxbytes overflow problems
  xfs: quota: check result of register_shrinker()
  xfs: quota: fix missed destroy of qi_tree_lock
parents f842839c b4d8ad7f
...@@ -399,7 +399,7 @@ xfs_map_blocks( ...@@ -399,7 +399,7 @@ xfs_map_blocks(
(ip->i_df.if_flags & XFS_IFEXTENTS)); (ip->i_df.if_flags & XFS_IFEXTENTS));
ASSERT(offset <= mp->m_super->s_maxbytes); ASSERT(offset <= mp->m_super->s_maxbytes);
if ((xfs_ufsize_t)offset + count > mp->m_super->s_maxbytes) if (offset > mp->m_super->s_maxbytes - count)
count = mp->m_super->s_maxbytes - offset; count = mp->m_super->s_maxbytes - offset;
end_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)offset + count); end_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)offset + count);
offset_fsb = XFS_B_TO_FSBT(mp, offset); offset_fsb = XFS_B_TO_FSBT(mp, offset);
...@@ -1312,7 +1312,7 @@ xfs_get_blocks( ...@@ -1312,7 +1312,7 @@ xfs_get_blocks(
lockmode = xfs_ilock_data_map_shared(ip); lockmode = xfs_ilock_data_map_shared(ip);
ASSERT(offset <= mp->m_super->s_maxbytes); ASSERT(offset <= mp->m_super->s_maxbytes);
if ((xfs_ufsize_t)offset + size > mp->m_super->s_maxbytes) if (offset > mp->m_super->s_maxbytes - size)
size = mp->m_super->s_maxbytes - offset; size = mp->m_super->s_maxbytes - offset;
end_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)offset + size); end_fsb = XFS_B_TO_FSB(mp, (xfs_ufsize_t)offset + size);
offset_fsb = XFS_B_TO_FSBT(mp, offset); offset_fsb = XFS_B_TO_FSBT(mp, offset);
......
...@@ -1006,7 +1006,7 @@ xfs_file_iomap_begin( ...@@ -1006,7 +1006,7 @@ xfs_file_iomap_begin(
} }
ASSERT(offset <= mp->m_super->s_maxbytes); ASSERT(offset <= mp->m_super->s_maxbytes);
if ((xfs_fsize_t)offset + length > mp->m_super->s_maxbytes) if (offset > mp->m_super->s_maxbytes - length)
length = mp->m_super->s_maxbytes - offset; length = mp->m_super->s_maxbytes - offset;
offset_fsb = XFS_B_TO_FSBT(mp, offset); offset_fsb = XFS_B_TO_FSBT(mp, offset);
end_fsb = XFS_B_TO_FSB(mp, offset + length); end_fsb = XFS_B_TO_FSB(mp, offset + length);
......
...@@ -48,7 +48,7 @@ ...@@ -48,7 +48,7 @@
STATIC int xfs_qm_init_quotainos(xfs_mount_t *); STATIC int xfs_qm_init_quotainos(xfs_mount_t *);
STATIC int xfs_qm_init_quotainfo(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); STATIC void xfs_qm_dqfree_one(struct xfs_dquot *dqp);
/* /*
* We use the batch lookup interface to iterate over the dquots as it * We use the batch lookup interface to iterate over the dquots as it
...@@ -695,9 +695,17 @@ xfs_qm_init_quotainfo( ...@@ -695,9 +695,17 @@ xfs_qm_init_quotainfo(
qinf->qi_shrinker.scan_objects = xfs_qm_shrink_scan; qinf->qi_shrinker.scan_objects = xfs_qm_shrink_scan;
qinf->qi_shrinker.seeks = DEFAULT_SEEKS; qinf->qi_shrinker.seeks = DEFAULT_SEEKS;
qinf->qi_shrinker.flags = SHRINKER_NUMA_AWARE; 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; return 0;
out_free_inos:
mutex_destroy(&qinf->qi_quotaofflock);
mutex_destroy(&qinf->qi_tree_lock);
xfs_qm_destroy_quotainos(qinf);
out_free_lru: out_free_lru:
list_lru_destroy(&qinf->qi_lru); list_lru_destroy(&qinf->qi_lru);
out_free_qinf: out_free_qinf:
...@@ -706,7 +714,6 @@ xfs_qm_init_quotainfo( ...@@ -706,7 +714,6 @@ xfs_qm_init_quotainfo(
return error; return error;
} }
/* /*
* Gets called when unmounting a filesystem or when all quotas get * Gets called when unmounting a filesystem or when all quotas get
* turned off. * turned off.
...@@ -723,19 +730,8 @@ xfs_qm_destroy_quotainfo( ...@@ -723,19 +730,8 @@ xfs_qm_destroy_quotainfo(
unregister_shrinker(&qi->qi_shrinker); unregister_shrinker(&qi->qi_shrinker);
list_lru_destroy(&qi->qi_lru); list_lru_destroy(&qi->qi_lru);
xfs_qm_destroy_quotainos(qi);
if (qi->qi_uquotaip) { mutex_destroy(&qi->qi_tree_lock);
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;
}
mutex_destroy(&qi->qi_quotaofflock); mutex_destroy(&qi->qi_quotaofflock);
kmem_free(qi); kmem_free(qi);
mp->m_quotainfo = NULL; mp->m_quotainfo = NULL;
...@@ -1599,6 +1595,24 @@ xfs_qm_init_quotainos( ...@@ -1599,6 +1595,24 @@ xfs_qm_init_quotainos(
return error; return error;
} }
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 STATIC void
xfs_qm_dqfree_one( xfs_qm_dqfree_one(
struct xfs_dquot *dqp) struct xfs_dquot *dqp)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment