diff options
| -rw-r--r-- | fs/xfs/xfs_buf_item.c | 7 | ||||
| -rw-r--r-- | fs/xfs/xfs_log_recover.c | 11 | 
2 files changed, 12 insertions, 6 deletions
diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index cf263476d6b..4ec43177704 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c @@ -262,12 +262,7 @@ xfs_buf_item_format_segment(  			vecp->i_addr = xfs_buf_offset(bp, buffer_offset);  			vecp->i_len = nbits * XFS_BLF_CHUNK;  			vecp->i_type = XLOG_REG_TYPE_BCHUNK; -/* - * You would think we need to bump the nvecs here too, but we do not - * this number is used by recovery, and it gets confused by the boundary - * split here - *			nvecs++; - */ +			nvecs++;  			vecp++;  			first_bit = next_bit;  			last_bit = next_bit; diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 93f03ec17ee..d9e4d3c3991 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -2097,6 +2097,17 @@ xlog_recover_do_reg_buffer(  		       ((uint)bit << XFS_BLF_SHIFT) + (nbits << XFS_BLF_SHIFT));  		/* +		 * The dirty regions logged in the buffer, even though +		 * contiguous, may span multiple chunks. This is because the +		 * dirty region may span a physical page boundary in a buffer +		 * and hence be split into two separate vectors for writing into +		 * the log. Hence we need to trim nbits back to the length of +		 * the current region being copied out of the log. +		 */ +		if (item->ri_buf[i].i_len < (nbits << XFS_BLF_SHIFT)) +			nbits = item->ri_buf[i].i_len >> XFS_BLF_SHIFT; + +		/*  		 * Do a sanity check if this is a dquot buffer. Just checking  		 * the first dquot in the buffer should do. XXXThis is  		 * probably a good thing to do for other buf types also.  |