diff options
Diffstat (limited to 'fs/xfs/xfs_fsops.c')
| -rw-r--r-- | fs/xfs/xfs_fsops.c | 21 | 
1 files changed, 19 insertions, 2 deletions
diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index c25b094efbf..4beaede4327 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -399,9 +399,26 @@ xfs_growfs_data_private(  	/* update secondary superblocks. */  	for (agno = 1; agno < nagcount; agno++) { -		error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp, +		error = 0; +		/* +		 * new secondary superblocks need to be zeroed, not read from +		 * disk as the contents of the new area we are growing into is +		 * completely unknown. +		 */ +		if (agno < oagcount) { +			error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp,  				  XFS_AGB_TO_DADDR(mp, agno, XFS_SB_BLOCK(mp)),  				  XFS_FSS_TO_BB(mp, 1), 0, &bp); +		} else { +			bp = xfs_trans_get_buf(NULL, mp->m_ddev_targp, +				  XFS_AGB_TO_DADDR(mp, agno, XFS_SB_BLOCK(mp)), +				  XFS_FSS_TO_BB(mp, 1), 0); +			if (bp) +				xfs_buf_zero(bp, 0, BBTOB(bp->b_length)); +			else +				error = ENOMEM; +		} +  		if (error) {  			xfs_warn(mp,  		"error %d reading secondary superblock for ag %d", @@ -423,7 +440,7 @@ xfs_growfs_data_private(  			break; /* no point in continuing */  		}  	} -	return 0; +	return error;   error0:  	xfs_trans_cancel(tp, XFS_TRANS_ABORT);  |