|
@@ -167,17 +167,25 @@ xfs_growfs_data_private(
|
|
new = nb - mp->m_sb.sb_dblocks;
|
|
new = nb - mp->m_sb.sb_dblocks;
|
|
oagcount = mp->m_sb.sb_agcount;
|
|
oagcount = mp->m_sb.sb_agcount;
|
|
if (nagcount > oagcount) {
|
|
if (nagcount > oagcount) {
|
|
|
|
+ void *new_perag, *old_perag;
|
|
|
|
+
|
|
xfs_filestream_flush(mp);
|
|
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);
|
|
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;
|
|
mp->m_flags |= XFS_MOUNT_32BITINODES;
|
|
nagimax = xfs_initialize_perag(mp, nagcount);
|
|
nagimax = xfs_initialize_perag(mp, nagcount);
|
|
up_write(&mp->m_peraglock);
|
|
up_write(&mp->m_peraglock);
|
|
|
|
+
|
|
|
|
+ kmem_free(old_perag);
|
|
}
|
|
}
|
|
tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFS);
|
|
tp = xfs_trans_alloc(mp, XFS_TRANS_GROWFS);
|
|
tp->t_flags |= XFS_TRANS_RESERVE;
|
|
tp->t_flags |= XFS_TRANS_RESERVE;
|