Skip to content

Commit 30d161c

Browse files
pibrochBen Myers
authored andcommitted
xfs: fix false assertion at xfs_qm_vop_create_dqattach
After the previous fix, there still has another ASSERT failure if turning off any type of quota while fsstress is running at the same time. Backtrace in this case: [ 50.867897] XFS: Assertion failed: XFS_IS_GQUOTA_ON(mp), file: fs/xfs/xfs_qm.c, line: 2118 [ 50.867924] ------------[ cut here ]------------ ... <snip> [ 50.867957] Kernel BUG at ffffffffa0b55a32 [verbose debug info unavailable] [ 50.867999] invalid opcode: 0000 [#1] SMP [ 50.869407] Call Trace: [ 50.869446] [<ffffffffa0bc408a>] xfs_qm_vop_create_dqattach+0x19a/0x2d0 [xfs] [ 50.869512] [<ffffffffa0b9cc45>] xfs_create+0x5c5/0x6a0 [xfs] [ 50.869564] [<ffffffffa0b5307c>] xfs_vn_mknod+0xac/0x1d0 [xfs] [ 50.869615] [<ffffffffa0b531d6>] xfs_vn_mkdir+0x16/0x20 [xfs] [ 50.869655] [<ffffffff811becd5>] vfs_mkdir+0x95/0x130 [ 50.869689] [<ffffffff811bf63a>] SyS_mkdirat+0xaa/0xe0 [ 50.869723] [<ffffffff811bf689>] SyS_mkdir+0x19/0x20 [ 50.869757] [<ffffffff8170f7dd>] system_call_fastpath+0x1a/0x1f [ 50.869793] Code: 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 55 48 89 <snip> [ 50.870003] RIP [<ffffffffa0b55a32>] assfail+0x22/0x30 [xfs] [ 50.870050] RSP <ffff88002941fd60> [ 50.879251] ---[ end trace c93a2b342341c65b ]--- We're hitting the ASSERT(XFS_IS_*QUOTA_ON(mp)) in xfs_qm_vop_create_dqattach(), however the assertion itself is not right IMHO. While performing quota off, we firstly clear the XFS_*QUOTA_ACTIVE bit(s) from struct xfs_mount without taking any special locks, see xfs_qm_scall_quotaoff(). Hence there is no guarantee that the desired quota is still active. Signed-off-by: Jie Liu <[email protected]> Reviewed-by: Christoph Hellwig <[email protected]> Signed-off-by: Ben Myers <[email protected]> (cherry picked from commit 37eb970)
1 parent 3a8c920 commit 30d161c

File tree

1 file changed

+3
-6
lines changed

1 file changed

+3
-6
lines changed

fs/xfs/xfs_qm.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2082,24 +2082,21 @@ xfs_qm_vop_create_dqattach(
20822082
ASSERT(xfs_isilocked(ip, XFS_ILOCK_EXCL));
20832083
ASSERT(XFS_IS_QUOTA_RUNNING(mp));
20842084

2085-
if (udqp) {
2085+
if (udqp && XFS_IS_UQUOTA_ON(mp)) {
20862086
ASSERT(ip->i_udquot == NULL);
2087-
ASSERT(XFS_IS_UQUOTA_ON(mp));
20882087
ASSERT(ip->i_d.di_uid == be32_to_cpu(udqp->q_core.d_id));
20892088

20902089
ip->i_udquot = xfs_qm_dqhold(udqp);
20912090
xfs_trans_mod_dquot(tp, udqp, XFS_TRANS_DQ_ICOUNT, 1);
20922091
}
2093-
if (gdqp) {
2092+
if (gdqp && XFS_IS_GQUOTA_ON(mp)) {
20942093
ASSERT(ip->i_gdquot == NULL);
2095-
ASSERT(XFS_IS_GQUOTA_ON(mp));
20962094
ASSERT(ip->i_d.di_gid == be32_to_cpu(gdqp->q_core.d_id));
20972095
ip->i_gdquot = xfs_qm_dqhold(gdqp);
20982096
xfs_trans_mod_dquot(tp, gdqp, XFS_TRANS_DQ_ICOUNT, 1);
20992097
}
2100-
if (pdqp) {
2098+
if (pdqp && XFS_IS_PQUOTA_ON(mp)) {
21012099
ASSERT(ip->i_pdquot == NULL);
2102-
ASSERT(XFS_IS_PQUOTA_ON(mp));
21032100
ASSERT(xfs_get_projid(ip) == be32_to_cpu(pdqp->q_core.d_id));
21042101

21052102
ip->i_pdquot = xfs_qm_dqhold(pdqp);

0 commit comments

Comments
 (0)