+ /*
+ * determine feasability/values of rotational layout tables
+ */
+ if (sblock.fs_ntrak == 1) {
+ sblock.fs_cpc = 0;
+ goto next;
+ }
+ for (sblock.fs_cpc = NSPB(&sblock), i = sblock.fs_spc;
+ sblock.fs_cpc > 1 && (i & 1) == 0;
+ sblock.fs_cpc >>= 1, i >>= 1)
+ /* void */;
+ if (sblock.fs_spc * sblock.fs_cpc > MAXBPC * NSPB(&sblock) ||
+ sblock.fs_nsect > (1 << NBBY) * NSPB(&sblock)) {
+ printf("%s %s %d %s %d.%s",
+ "Warning: insufficient space in super block for\n",
+ "rotational layout tables with nsect", sblock.fs_nsect,
+ "and ntrak", sblock.fs_ntrak,
+ "\nFile system performance may be impared.\n");
+ sblock.fs_cpc = 0;
+ goto next;
+ }
+ /*
+ * calculate the available blocks for each rotational position
+ */
+ for (cylno = 0; cylno < MAXCPG; cylno++)
+ for (rpos = 0; rpos < NRPOS; rpos++)
+ sblock.fs_postbl[cylno][rpos] = -1;
+ blk = sblock.fs_spc * sblock.fs_cpc / NSPF(&sblock);
+ for (i = 0; i < blk; i += sblock.fs_frag)
+ /* void */;
+ for (i -= sblock.fs_frag; i >= 0; i -= sblock.fs_frag) {
+ cylno = cbtocylno(&sblock, i);
+ rpos = cbtorpos(&sblock, i);
+ blk = i / sblock.fs_frag;
+ if (sblock.fs_postbl[cylno][rpos] == -1)
+ sblock.fs_rotbl[blk] = 0;
+ else
+ sblock.fs_rotbl[blk] =
+ sblock.fs_postbl[cylno][rpos] - blk;
+ sblock.fs_postbl[cylno][rpos] = blk;
+ }
+next: