|
@@ -3224,12 +3224,24 @@ xfs_bmap_extsize_align(
|
|
|
align_alen += temp;
|
|
|
align_off -= temp;
|
|
|
}
|
|
|
+
|
|
|
+ /* Same adjustment for the end of the requested area. */
|
|
|
+ temp = (align_alen % extsz);
|
|
|
+ if (temp)
|
|
|
+ align_alen += extsz - temp;
|
|
|
+
|
|
|
/*
|
|
|
- * Same adjustment for the end of the requested area.
|
|
|
+ * For large extent hint sizes, the aligned extent might be larger than
|
|
|
+ * MAXEXTLEN. In that case, reduce the size by an extsz so that it pulls
|
|
|
+ * the length back under MAXEXTLEN. The outer allocation loops handle
|
|
|
+ * short allocation just fine, so it is safe to do this. We only want to
|
|
|
+ * do it when we are forced to, though, because it means more allocation
|
|
|
+ * operations are required.
|
|
|
*/
|
|
|
- if ((temp = (align_alen % extsz))) {
|
|
|
- align_alen += extsz - temp;
|
|
|
- }
|
|
|
+ while (align_alen > MAXEXTLEN)
|
|
|
+ align_alen -= extsz;
|
|
|
+ ASSERT(align_alen <= MAXEXTLEN);
|
|
|
+
|
|
|
/*
|
|
|
* If the previous block overlaps with this proposed allocation
|
|
|
* then move the start forward without adjusting the length.
|
|
@@ -3318,7 +3330,9 @@ xfs_bmap_extsize_align(
|
|
|
return -EINVAL;
|
|
|
} else {
|
|
|
ASSERT(orig_off >= align_off);
|
|
|
- ASSERT(orig_end <= align_off + align_alen);
|
|
|
+ /* see MAXEXTLEN handling above */
|
|
|
+ ASSERT(orig_end <= align_off + align_alen ||
|
|
|
+ align_alen + extsz > MAXEXTLEN);
|
|
|
}
|
|
|
|
|
|
#ifdef DEBUG
|
|
@@ -4099,13 +4113,6 @@ xfs_bmapi_reserve_delalloc(
|
|
|
/* Figure out the extent size, adjust alen */
|
|
|
extsz = xfs_get_extsz_hint(ip);
|
|
|
if (extsz) {
|
|
|
- /*
|
|
|
- * Make sure we don't exceed a single extent length when we
|
|
|
- * align the extent by reducing length we are going to
|
|
|
- * allocate by the maximum amount extent size aligment may
|
|
|
- * require.
|
|
|
- */
|
|
|
- alen = XFS_FILBLKS_MIN(len, MAXEXTLEN - (2 * extsz - 1));
|
|
|
error = xfs_bmap_extsize_align(mp, got, prev, extsz, rt, eof,
|
|
|
1, 0, &aoff, &alen);
|
|
|
ASSERT(!error);
|