Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit db7a19f2 authored by David Chinner's avatar David Chinner Committed by Lachlan McIlroy
Browse files

[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: default avatarDavid Chinner <dgc@sgi.com>
Signed-off-by: default avatarNiv Sardi <xaiki@sgi.com>
Signed-off-by: default avatarLachlan McIlroy <lachlan@sgi.com>
parent d64e31a2
Loading
Loading
Loading
Loading
+8 −2
Original line number Diff line number Diff line
@@ -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);
		}
+6 −1
Original line number Diff line number Diff line
@@ -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);
			}
+6 −1
Original line number Diff line number Diff line
@@ -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);
	}
+1 −1
Original line number Diff line number Diff line
@@ -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);
	}
+7 −1
Original line number Diff line number Diff line
@@ -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);
			}