-[current cvs]
+xfsprogs-2.0.5 (02 May 2002)
+ - size AGs so that they do not always start on the same
+ part of a striped disk
+ - Fix an off-by-one error on rounding down an AG that is
+ too small to be an AG
+ - don't auto-grow the log to be larger than an AG
+ - change the error philosophy for -d su=,sw= away from forcing
+ the XFS stripe size to match the XLV stripe size and instead
+ accept, with a warning, the stripe unit & width supplied on
+ the commandline.
- Update xfs_growfs man page
- Don't build libxlog.a with DEBUG enabled
- xfs_db fixes from ASANO Masahiro at NEC
if (!daflag &&
(dblocks % agsize < XFS_AG_MIN_BLOCKS(blocklog))) {
dblocks -= dblocks % agsize;
+ agcount--;
}
/*
fprintf(stderr, "%s: "
"Specified data stripe unit %d is not the same as the xlv stripe unit %d\n",
progname, dsunit, xlv_dsunit);
- exit(1);
}
if (xlv_dswidth && xlv_dswidth != dswidth) {
fprintf(stderr, "%s: "
-"Specified data stripe width (%d) is not the same as the xlv stripe width (%d)\n",
+"Specified data stripe width %d is not the same as the xlv stripe width %d\n",
progname, dswidth, xlv_dswidth);
- exit(1);
}
} else {
dsunit = xlv_dsunit;
}
}
}
+ if ((agsize % dswidth) == 0) {
+ /* This is a non-optimal configuration because all AGs
+ * start on the same disk in the stripe. Decreasing
+ * the AG size by one sunit will guarantee that this
+ * does not happen
+ */
+ tmp_agsize = agsize - dsunit;
+ if (tmp_agsize < XFS_AG_MIN_BLOCKS(blocklog))
+ tmp_agsize = agsize + dsunit;
+ if (daflag || dasize) {
+ fprintf(stderr,
+"Warning: AG size is a multiple of stripe width. This can cause performance\n"
+"problems by aligning all AGs on the same disk. To avoid this, rerun mkfs with\n"
+"an AG size that is one stripe unit smaller, for example %lld\n",
+ tmp_agsize);
+ } else {
+ agsize = tmp_agsize;
+ agcount = dblocks/agsize + (dblocks % agsize != 0);
+ }
+ }
} else {
if (nodsflag)
dsunit = dswidth = 0;
sbp->sb_agblklog = (__uint8_t)libxfs_log2_roundup((unsigned int)agsize);
mp->m_blkbb_log = sbp->sb_blocklog - BBSHIFT;
if (loginternal) {
+ /*
+ * Readjust the log size to fit within an AG if it was sized
+ * automaticly.
+ */
+ if (!logsize) {
+ logblocks = MIN(logblocks,
+ agsize - XFS_PREALLOC_BLOCKS(mp));
+ }
if (logblocks > agsize - XFS_PREALLOC_BLOCKS(mp)) {
fprintf(stderr,
"internal log size %lld too large, must fit in allocation group\n",