aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNathan Scott <nathans@sgi.com>2006-01-10 23:33:36 -0500
committerNathan Scott <nathans@sgi.com>2006-01-10 23:33:36 -0500
commitee2a4f7caa4a72cdf2329081a1f7eb9939df3aab (patch)
treec4061472d5b83877254e10d39e3f9628bd883833
parent3ddb8fa98ccce6c3b2afd2f4b95a10b3bb60d1f0 (diff)
[XFS] Fix an intermittent pquota panic caused by dodgey quota flags to an
umount dquot flush call. SGI-PV: 946444 SGI-Modid: xfs-linux-melb:xfs-kern:24680a Signed-off-by: Nathan Scott <nathans@sgi.com>
-rw-r--r--fs/xfs/quota/xfs_qm.c10
-rw-r--r--fs/xfs/xfs_mount.c3
2 files changed, 7 insertions, 6 deletions
diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c
index c04c34776c43..7dcdd0640c32 100644
--- a/fs/xfs/quota/xfs_qm.c
+++ b/fs/xfs/quota/xfs_qm.c
@@ -1920,9 +1920,7 @@ xfs_qm_quotacheck(
1920 * at this point (because we intentionally didn't in dqget_noattach). 1920 * at this point (because we intentionally didn't in dqget_noattach).
1921 */ 1921 */
1922 if (error) { 1922 if (error) {
1923 xfs_qm_dqpurge_all(mp, 1923 xfs_qm_dqpurge_all(mp, XFS_QMOPT_QUOTALL | XFS_QMOPT_QUOTAOFF);
1924 XFS_QMOPT_UQUOTA|XFS_QMOPT_GQUOTA|
1925 XFS_QMOPT_PQUOTA|XFS_QMOPT_QUOTAOFF);
1926 goto error_return; 1924 goto error_return;
1927 } 1925 }
1928 /* 1926 /*
@@ -2745,6 +2743,7 @@ xfs_qm_vop_dqattach_and_dqmod_newinode(
2745 xfs_dqunlock(udqp); 2743 xfs_dqunlock(udqp);
2746 ASSERT(ip->i_udquot == NULL); 2744 ASSERT(ip->i_udquot == NULL);
2747 ip->i_udquot = udqp; 2745 ip->i_udquot = udqp;
2746 ASSERT(XFS_IS_UQUOTA_ON(tp->t_mountp));
2748 ASSERT(ip->i_d.di_uid == be32_to_cpu(udqp->q_core.d_id)); 2747 ASSERT(ip->i_d.di_uid == be32_to_cpu(udqp->q_core.d_id));
2749 xfs_trans_mod_dquot(tp, udqp, XFS_TRANS_DQ_ICOUNT, 1); 2748 xfs_trans_mod_dquot(tp, udqp, XFS_TRANS_DQ_ICOUNT, 1);
2750 } 2749 }
@@ -2754,7 +2753,10 @@ xfs_qm_vop_dqattach_and_dqmod_newinode(
2754 xfs_dqunlock(gdqp); 2753 xfs_dqunlock(gdqp);
2755 ASSERT(ip->i_gdquot == NULL); 2754 ASSERT(ip->i_gdquot == NULL);
2756 ip->i_gdquot = gdqp; 2755 ip->i_gdquot = gdqp;
2757 ASSERT(ip->i_d.di_gid == be32_to_cpu(gdqp->q_core.d_id)); 2756 ASSERT(XFS_IS_OQUOTA_ON(tp->t_mountp));
2757 ASSERT((XFS_IS_GQUOTA_ON(tp->t_mountp) ?
2758 ip->i_d.di_gid : ip->i_d.di_projid) ==
2759 be32_to_cpu(gdqp->q_core.d_id));
2758 xfs_trans_mod_dquot(tp, gdqp, XFS_TRANS_DQ_ICOUNT, 1); 2760 xfs_trans_mod_dquot(tp, gdqp, XFS_TRANS_DQ_ICOUNT, 1);
2759 } 2761 }
2760} 2762}
diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c
index f9754896cd3b..6088e14f84e3 100644
--- a/fs/xfs/xfs_mount.c
+++ b/fs/xfs/xfs_mount.c
@@ -1077,8 +1077,7 @@ xfs_unmountfs(xfs_mount_t *mp, struct cred *cr)
1077 1077
1078 xfs_iflush_all(mp); 1078 xfs_iflush_all(mp);
1079 1079
1080 XFS_QM_DQPURGEALL(mp, 1080 XFS_QM_DQPURGEALL(mp, XFS_QMOPT_QUOTALL | XFS_QMOPT_UMOUNTING);
1081 XFS_QMOPT_UQUOTA | XFS_QMOPT_GQUOTA | XFS_QMOPT_UMOUNTING);
1082 1081
1083 /* 1082 /*
1084 * Flush out the log synchronously so that we know for sure 1083 * Flush out the log synchronously so that we know for sure