diff options
author | Nathan Scott <nathans@sgi.com> | 2006-01-10 23:33:36 -0500 |
---|---|---|
committer | Nathan Scott <nathans@sgi.com> | 2006-01-10 23:33:36 -0500 |
commit | ee2a4f7caa4a72cdf2329081a1f7eb9939df3aab (patch) | |
tree | c4061472d5b83877254e10d39e3f9628bd883833 | |
parent | 3ddb8fa98ccce6c3b2afd2f4b95a10b3bb60d1f0 (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.c | 10 | ||||
-rw-r--r-- | fs/xfs/xfs_mount.c | 3 |
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 |