diff options
Diffstat (limited to 'fs/xfs/xfs_fsops.c')
| -rw-r--r-- | fs/xfs/xfs_fsops.c | 20 | 
1 files changed, 14 insertions, 6 deletions
diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c index cbd451bb484..2d0b3e1da9e 100644 --- a/fs/xfs/xfs_fsops.c +++ b/fs/xfs/xfs_fsops.c @@ -167,17 +167,25 @@ xfs_growfs_data_private(  	new = nb - mp->m_sb.sb_dblocks;  	oagcount = mp->m_sb.sb_agcount;  	if (nagcount > oagcount) { +		void *new_perag, *old_perag; +  		xfs_filestream_flush(mp); + +		new_perag = kmem_zalloc(sizeof(xfs_perag_t) * nagcount, +					KM_MAYFAIL); +		if (!new_perag) +			return XFS_ERROR(ENOMEM); +  		down_write(&mp->m_peraglock); -		mp->m_perag = kmem_realloc(mp->m_perag, -			sizeof(xfs_perag_t) * nagcount, -			sizeof(xfs_perag_t) * oagcount, -			KM_SLEEP); -		memset(&mp->m_perag[oagcount], 0, -			(nagcount - oagcount) * sizeof(xfs_perag_t)); +		memcpy(new_perag, mp->m_perag, sizeof(xfs_perag_t) * oagcount); +		old_perag = mp->m_perag; +		mp->m_perag = new_perag; +  		mp->m_flags |= XFS_MOUNT_32BITINODES;  		nagimax = xfs_initialize_perag(mp, nagcount);  		up_write(&mp->m_peraglock); + +		kmem_free(old_perag);  	}  	tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFS);  	tp->t_flags |= XFS_TRANS_RESERVE;  | 
