|
@@ -2299,15 +2299,22 @@ xfs_alloc_file_space(
|
|
|
e = allocatesize_fsb;
|
|
|
}
|
|
|
|
|
|
+ /*
|
|
|
+ * The transaction reservation is limited to a 32-bit block
|
|
|
+ * count, hence we need to limit the number of blocks we are
|
|
|
+ * trying to reserve to avoid an overflow. We can't allocate
|
|
|
+ * more than @nimaps extents, and an extent is limited on disk
|
|
|
+ * to MAXEXTLEN (21 bits), so use that to enforce the limit.
|
|
|
+ */
|
|
|
+ resblks = min_t(xfs_fileoff_t, (e - s), (MAXEXTLEN * nimaps));
|
|
|
if (unlikely(rt)) {
|
|
|
- resrtextents = qblocks = (uint)(e - s);
|
|
|
+ resrtextents = qblocks = resblks;
|
|
|
resrtextents /= mp->m_sb.sb_rextsize;
|
|
|
resblks = XFS_DIOSTRAT_SPACE_RES(mp, 0);
|
|
|
quota_flag = XFS_QMOPT_RES_RTBLKS;
|
|
|
} else {
|
|
|
resrtextents = 0;
|
|
|
- resblks = qblocks = \
|
|
|
- XFS_DIOSTRAT_SPACE_RES(mp, (uint)(e - s));
|
|
|
+ resblks = qblocks = XFS_DIOSTRAT_SPACE_RES(mp, resblks);
|
|
|
quota_flag = XFS_QMOPT_RES_REGBLKS;
|
|
|
}
|
|
|
|