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
This commit is contained in:
+2
-2
@@ -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(
|
|||||||
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);
|
||||||
|
|||||||
+1
-1
@@ -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);
|
||||||
|
|||||||
+30
-16
@@ -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(
|
|||||||
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 @@ out_free_qinf:
|
|||||||
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(
|
|||||||
|
|
||||||
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 @@ error_rele:
|
|||||||
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)
|
||||||
|
|||||||
Reference in New Issue
Block a user