aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs
diff options
context:
space:
mode:
authorDavid Chinner <dgc@sgi.com>2008-04-09 22:20:24 -0400
committerLachlan McIlroy <lachlan@redback.melbourne.sgi.com>2008-04-17 21:56:55 -0400
commit3c56836f92683cb871ebbf44c512069b0d48a08f (patch)
treeac0ef5d76e086aa6e2542fb5548db26af5967297 /fs/xfs
parent4b8879df8c21bed3efd1eb2da5d72501199aba29 (diff)
[XFS] Check for dquot flush errors
xfs_qm_dqflush() can fail, but the return is not checked anywhere. Hence we never know if we've failed to flush a dquot to disk. Propagate the error and warn to the syslog if a flush ever fails. SGI-PV: 980084 SGI-Modid: xfs-linux-melb:xfs-kern:30787a Signed-off-by: David Chinner <dgc@sgi.com> Signed-off-by: Niv Sardi <xaiki@sgi.com> Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
Diffstat (limited to 'fs/xfs')
-rw-r--r--fs/xfs/quota/xfs_dquot.c10
-rw-r--r--fs/xfs/quota/xfs_dquot_item.c7
-rw-r--r--fs/xfs/quota/xfs_qm.c14
3 files changed, 24 insertions, 7 deletions
diff --git a/fs/xfs/quota/xfs_dquot.c b/fs/xfs/quota/xfs_dquot.c
index 665babcca6a6..15214fbb9aa7 100644
--- a/fs/xfs/quota/xfs_dquot.c
+++ b/fs/xfs/quota/xfs_dquot.c
@@ -1439,9 +1439,7 @@ xfs_qm_dqpurge(
1439 uint flags) 1439 uint flags)
1440{ 1440{
1441 xfs_dqhash_t *thishash; 1441 xfs_dqhash_t *thishash;
1442 xfs_mount_t *mp; 1442 xfs_mount_t *mp = dqp->q_mount;
1443
1444 mp = dqp->q_mount;
1445 1443
1446 ASSERT(XFS_QM_IS_MPLIST_LOCKED(mp)); 1444 ASSERT(XFS_QM_IS_MPLIST_LOCKED(mp));
1447 ASSERT(XFS_DQ_IS_HASH_LOCKED(dqp->q_hash)); 1445 ASSERT(XFS_DQ_IS_HASH_LOCKED(dqp->q_hash));
@@ -1485,6 +1483,7 @@ xfs_qm_dqpurge(
1485 * we're unmounting, we do care, so we flush it and wait. 1483 * we're unmounting, we do care, so we flush it and wait.
1486 */ 1484 */
1487 if (XFS_DQ_IS_DIRTY(dqp)) { 1485 if (XFS_DQ_IS_DIRTY(dqp)) {
1486 int error;
1488 xfs_dqtrace_entry(dqp, "DQPURGE ->DQFLUSH: DQDIRTY"); 1487 xfs_dqtrace_entry(dqp, "DQPURGE ->DQFLUSH: DQDIRTY");
1489 /* dqflush unlocks dqflock */ 1488 /* dqflush unlocks dqflock */
1490 /* 1489 /*
@@ -1495,7 +1494,10 @@ xfs_qm_dqpurge(
1495 * We don't care about getting disk errors here. We need 1494 * We don't care about getting disk errors here. We need
1496 * to purge this dquot anyway, so we go ahead regardless. 1495 * to purge this dquot anyway, so we go ahead regardless.
1497 */ 1496 */
1498 (void) xfs_qm_dqflush(dqp, XFS_QMOPT_SYNC); 1497 error = xfs_qm_dqflush(dqp, XFS_QMOPT_SYNC);
1498 if (error)
1499 xfs_fs_cmn_err(CE_WARN, mp,
1500 "xfs_qm_dqpurge: dquot %p flush failed", dqp);
1499 xfs_dqflock(dqp); 1501 xfs_dqflock(dqp);
1500 } 1502 }
1501 ASSERT(dqp->q_pincount == 0); 1503 ASSERT(dqp->q_pincount == 0);
diff --git a/fs/xfs/quota/xfs_dquot_item.c b/fs/xfs/quota/xfs_dquot_item.c
index 1800e8d1f646..3dedce1d9cde 100644
--- a/fs/xfs/quota/xfs_dquot_item.c
+++ b/fs/xfs/quota/xfs_dquot_item.c
@@ -146,6 +146,7 @@ xfs_qm_dquot_logitem_push(
146 xfs_dq_logitem_t *logitem) 146 xfs_dq_logitem_t *logitem)
147{ 147{
148 xfs_dquot_t *dqp; 148 xfs_dquot_t *dqp;
149 int error;
149 150
150 dqp = logitem->qli_dquot; 151 dqp = logitem->qli_dquot;
151 152
@@ -161,7 +162,11 @@ xfs_qm_dquot_logitem_push(
161 * lock without sleeping, then there must not have been 162 * lock without sleeping, then there must not have been
162 * anyone in the process of flushing the dquot. 163 * anyone in the process of flushing the dquot.
163 */ 164 */
164 xfs_qm_dqflush(dqp, XFS_B_DELWRI); 165 error = xfs_qm_dqflush(dqp, XFS_QMOPT_DELWRI);
166 if (error)
167 xfs_fs_cmn_err(CE_WARN, dqp->q_mount,
168 "xfs_qm_dquot_logitem_push: push error %d on dqp %p",
169 error, dqp);
165 xfs_dqunlock(dqp); 170 xfs_dqunlock(dqp);
166} 171}
167 172
diff --git a/fs/xfs/quota/xfs_qm.c b/fs/xfs/quota/xfs_qm.c
index 04b29c672141..0ed3c8277fcd 100644
--- a/fs/xfs/quota/xfs_qm.c
+++ b/fs/xfs/quota/xfs_qm.c
@@ -2094,12 +2094,17 @@ xfs_qm_shake_freelist(
2094 * dirty dquots. 2094 * dirty dquots.
2095 */ 2095 */
2096 if (XFS_DQ_IS_DIRTY(dqp)) { 2096 if (XFS_DQ_IS_DIRTY(dqp)) {
2097 int error;
2097 xfs_dqtrace_entry(dqp, "DQSHAKE: DQDIRTY"); 2098 xfs_dqtrace_entry(dqp, "DQSHAKE: DQDIRTY");
2098 /* 2099 /*
2099 * We flush it delayed write, so don't bother 2100 * We flush it delayed write, so don't bother
2100 * releasing the mplock. 2101 * releasing the mplock.
2101 */ 2102 */
2102 (void) xfs_qm_dqflush(dqp, XFS_QMOPT_DELWRI); 2103 error = xfs_qm_dqflush(dqp, XFS_QMOPT_DELWRI);
2104 if (error) {
2105 xfs_fs_cmn_err(CE_WARN, dqp->q_mount,
2106 "xfs_qm_dqflush_all: dquot %p flush failed", dqp);
2107 }
2103 xfs_dqunlock(dqp); /* dqflush unlocks dqflock */ 2108 xfs_dqunlock(dqp); /* dqflush unlocks dqflock */
2104 dqp = dqp->dq_flnext; 2109 dqp = dqp->dq_flnext;
2105 continue; 2110 continue;
@@ -2266,12 +2271,17 @@ xfs_qm_dqreclaim_one(void)
2266 * dirty dquots. 2271 * dirty dquots.
2267 */ 2272 */
2268 if (XFS_DQ_IS_DIRTY(dqp)) { 2273 if (XFS_DQ_IS_DIRTY(dqp)) {
2274 int error;
2269 xfs_dqtrace_entry(dqp, "DQRECLAIM: DQDIRTY"); 2275 xfs_dqtrace_entry(dqp, "DQRECLAIM: DQDIRTY");
2270 /* 2276 /*
2271 * We flush it delayed write, so don't bother 2277 * We flush it delayed write, so don't bother
2272 * releasing the freelist lock. 2278 * releasing the freelist lock.
2273 */ 2279 */
2274 (void) xfs_qm_dqflush(dqp, XFS_QMOPT_DELWRI); 2280 error = xfs_qm_dqflush(dqp, XFS_QMOPT_DELWRI);
2281 if (error) {
2282 xfs_fs_cmn_err(CE_WARN, dqp->q_mount,
2283 "xfs_qm_dqreclaim: dquot %p flush failed", dqp);
2284 }
2275 xfs_dqunlock(dqp); /* dqflush unlocks dqflock */ 2285 xfs_dqunlock(dqp); /* dqflush unlocks dqflock */
2276 continue; 2286 continue;
2277 } 2287 }