diff options
| -rw-r--r-- | fs/xfs/xfs_buf.c | 16 | ||||
| -rw-r--r-- | fs/xfs/xfs_buf.h | 3 | 
2 files changed, 19 insertions, 0 deletions
diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index fbc965fc075..bd1a948ee39 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -569,7 +569,9 @@ found:  	 */  	if (bp->b_flags & XBF_STALE) {  		ASSERT((bp->b_flags & _XBF_DELWRI_Q) == 0); +		ASSERT(bp->b_iodone == NULL);  		bp->b_flags &= _XBF_KMEM | _XBF_PAGES; +		bp->b_pre_io = NULL;  	}  	trace_xfs_buf_find(bp, flags, _RET_IP_); @@ -1324,6 +1326,20 @@ _xfs_buf_ioapply(  	rw |= REQ_META;  	/* +	 * run the pre-io callback function if it exists. If this function +	 * fails it will mark the buffer with an error and the IO should +	 * not be dispatched. +	 */ +	if (bp->b_pre_io) { +		bp->b_pre_io(bp); +		if (bp->b_error) { +			xfs_force_shutdown(bp->b_target->bt_mount, +					   SHUTDOWN_CORRUPT_INCORE); +			return; +		} +	} + +	/*  	 * Walk all the vectors issuing IO on them. Set up the initial offset  	 * into the buffer and the desired IO size before we start -  	 * _xfs_buf_ioapply_vec() will modify them appropriately for each diff --git a/fs/xfs/xfs_buf.h b/fs/xfs/xfs_buf.h index 677b1dc822f..51bc16a1cd9 100644 --- a/fs/xfs/xfs_buf.h +++ b/fs/xfs/xfs_buf.h @@ -155,6 +155,9 @@ typedef struct xfs_buf {  	unsigned int		b_offset;	/* page offset in first page */  	unsigned short		b_error;	/* error code on I/O */ +	void			(*b_pre_io)(struct xfs_buf *); +						/* pre-io callback function */ +  #ifdef XFS_BUF_LOCK_TRACKING  	int			b_last_holder;  #endif  |