[XFS] Ensure xfs_bawrite() errors are checked.
xfs_bawrite() can return immediate error status on async writes. Unlike xfsbdstrat() we don't ever check the error on the buffer after the call, so we currently do not catch errors at all here. Ensure we catch and propagate or warn to the syslog about up-front async write errors. SGI-PV: 980084 SGI-Modid: xfs-linux-melb:xfs-kern:30824a Signed-off-by: David Chinner <dgc@sgi.com> Signed-off-by: Niv Sardi <xaiki@sgi.com> Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
This commit is contained in:
parent
d64e31a2f5
commit
db7a19f2c8
5 changed files with 28 additions and 6 deletions
|
@ -1291,7 +1291,7 @@ xfs_qm_dqflush(
|
|||
if (flags & XFS_QMOPT_DELWRI) {
|
||||
xfs_bdwrite(mp, bp);
|
||||
} else if (flags & XFS_QMOPT_ASYNC) {
|
||||
xfs_bawrite(mp, bp);
|
||||
error = xfs_bawrite(mp, bp);
|
||||
} else {
|
||||
error = xfs_bwrite(mp, bp);
|
||||
}
|
||||
|
@ -1582,12 +1582,18 @@ xfs_qm_dqflock_pushbuf_wait(
|
|||
XFS_INCORE_TRYLOCK);
|
||||
if (bp != NULL) {
|
||||
if (XFS_BUF_ISDELAYWRITE(bp)) {
|
||||
int error;
|
||||
if (XFS_BUF_ISPINNED(bp)) {
|
||||
xfs_log_force(dqp->q_mount,
|
||||
(xfs_lsn_t)0,
|
||||
XFS_LOG_FORCE);
|
||||
}
|
||||
xfs_bawrite(dqp->q_mount, bp);
|
||||
error = xfs_bawrite(dqp->q_mount, bp);
|
||||
if (error)
|
||||
xfs_fs_cmn_err(CE_WARN, dqp->q_mount,
|
||||
"xfs_qm_dqflock_pushbuf_wait: "
|
||||
"pushbuf error %d on dqp %p, bp %p",
|
||||
error, dqp, bp);
|
||||
} else {
|
||||
xfs_buf_relse(bp);
|
||||
}
|
||||
|
|
|
@ -267,11 +267,16 @@ xfs_qm_dquot_logitem_pushbuf(
|
|||
XFS_LOG_FORCE);
|
||||
}
|
||||
if (dopush) {
|
||||
int error;
|
||||
#ifdef XFSRACEDEBUG
|
||||
delay_for_intr();
|
||||
delay(300);
|
||||
#endif
|
||||
xfs_bawrite(mp, bp);
|
||||
error = xfs_bawrite(mp, bp);
|
||||
if (error)
|
||||
xfs_fs_cmn_err(CE_WARN, mp,
|
||||
"xfs_qm_dquot_logitem_pushbuf: pushbuf error %d on qip %p, bp %p",
|
||||
error, qip, bp);
|
||||
} else {
|
||||
xfs_buf_relse(bp);
|
||||
}
|
||||
|
|
|
@ -645,7 +645,12 @@ xfs_buf_item_push(
|
|||
bp = bip->bli_buf;
|
||||
|
||||
if (XFS_BUF_ISDELAYWRITE(bp)) {
|
||||
xfs_bawrite(bip->bli_item.li_mountp, bp);
|
||||
int error;
|
||||
error = xfs_bawrite(bip->bli_item.li_mountp, bp);
|
||||
if (error)
|
||||
xfs_fs_cmn_err(CE_WARN, bip->bli_item.li_mountp,
|
||||
"xfs_buf_item_push: pushbuf error %d on bip %p, bp %p",
|
||||
error, bip, bp);
|
||||
} else {
|
||||
xfs_buf_relse(bp);
|
||||
}
|
||||
|
|
|
@ -3276,7 +3276,7 @@ xfs_iflush(
|
|||
if (flags & INT_DELWRI) {
|
||||
xfs_bdwrite(mp, bp);
|
||||
} else if (flags & INT_ASYNC) {
|
||||
xfs_bawrite(mp, bp);
|
||||
error = xfs_bawrite(mp, bp);
|
||||
} else {
|
||||
error = xfs_bwrite(mp, bp);
|
||||
}
|
||||
|
|
|
@ -40,6 +40,7 @@
|
|||
#include "xfs_btree.h"
|
||||
#include "xfs_ialloc.h"
|
||||
#include "xfs_rw.h"
|
||||
#include "xfs_error.h"
|
||||
|
||||
|
||||
kmem_zone_t *xfs_ili_zone; /* inode log item zone */
|
||||
|
@ -813,7 +814,12 @@ xfs_inode_item_pushbuf(
|
|||
XFS_LOG_FORCE);
|
||||
}
|
||||
if (dopush) {
|
||||
xfs_bawrite(mp, bp);
|
||||
int error;
|
||||
error = xfs_bawrite(mp, bp);
|
||||
if (error)
|
||||
xfs_fs_cmn_err(CE_WARN, mp,
|
||||
"xfs_inode_item_pushbuf: pushbuf error %d on iip %p, bp %p",
|
||||
error, iip, bp);
|
||||
} else {
|
||||
xfs_buf_relse(bp);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue