Annotation of 43BSDTahoe/etc/newfs/newfs.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1983 Regents of the University of California.
                      3:  * All rights reserved.  The Berkeley software License Agreement
                      4:  * specifies the terms and conditions for redistribution.
                      5:  */
                      6: 
                      7: #ifndef lint
                      8: char copyright[] =
                      9: "@(#) Copyright (c) 1983 Regents of the University of California.\n\
                     10:  All rights reserved.\n";
                     11: #endif not lint
                     12: 
                     13: #ifndef lint
                     14: static char sccsid[] = "@(#)newfs.c    6.16 (Berkeley) 5/1/88";
                     15: #endif not lint
                     16: 
                     17: /*
                     18:  * newfs: friendly front end to mkfs
                     19:  */
                     20: #include <sys/param.h>
                     21: #include <sys/stat.h>
                     22: #include <sys/fs.h>
                     23: #include <sys/dir.h>
                     24: #include <sys/ioctl.h>
                     25: #include <sys/disklabel.h>
                     26: #include <sys/file.h>
                     27: 
                     28: #include <stdio.h>
                     29: #include <ctype.h>
                     30: 
                     31: #define COMPAT                 /* allow non-labeled disks */
                     32: 
                     33: /*
                     34:  * The following two constants set the default block and fragment sizes.
                     35:  * Both constants must be a power of 2 and meet the following constraints:
                     36:  *     MINBSIZE <= DESBLKSIZE <= MAXBSIZE
                     37:  *     sectorsize <= DESFRAGSIZE <= DESBLKSIZE
                     38:  *     DESBLKSIZE / DESFRAGSIZE <= 8
                     39:  */
                     40: #define        DFL_FRAGSIZE    1024
                     41: #define        DFL_BLKSIZE     8192
                     42: 
                     43: /*
                     44:  * Cylinder groups may have up to many cylinders. The actual
                     45:  * number used depends upon how much information can be stored
                     46:  * on a single cylinder. The default is to use 16 cylinders
                     47:  * per group.
                     48:  */
                     49: #define        DESCPG          16      /* desired fs_cpg */
                     50: 
                     51: /*
                     52:  * MINFREE gives the minimum acceptable percentage of file system
                     53:  * blocks which may be free. If the freelist drops below this level
                     54:  * only the superuser may continue to allocate blocks. This may
                     55:  * be set to 0 if no reserve of free blocks is deemed necessary,
                     56:  * however throughput drops by fifty percent if the file system
                     57:  * is run at between 90% and 100% full; thus the default value of
                     58:  * fs_minfree is 10%. With 10% free space, fragmentation is not a
                     59:  * problem, so we choose to optimize for time.
                     60:  */
                     61: #define MINFREE                10
                     62: #define DEFAULTOPT     FS_OPTTIME
                     63: 
                     64: /*
                     65:  * ROTDELAY gives the minimum number of milliseconds to initiate
                     66:  * another disk transfer on the same cylinder. It is used in
                     67:  * determining the rotationally optimal layout for disk blocks
                     68:  * within a file; the default of fs_rotdelay is 4ms.
                     69:  */
                     70: #define ROTDELAY       4
                     71: 
                     72: /*
                     73:  * MAXCONTIG sets the default for the maximum number of blocks
                     74:  * that may be allocated sequentially. Since UNIX drivers are
                     75:  * not capable of scheduling multi-block transfers, this defaults
                     76:  * to 1 (ie no contiguous blocks are allocated).
                     77:  */
                     78: #define MAXCONTIG      1
                     79: 
                     80: /*
                     81:  * MAXBLKPG determines the maximum number of data blocks which are
                     82:  * placed in a single cylinder group. The default is one indirect
                     83:  * block worth of data blocks.
                     84:  */
                     85: #define MAXBLKPG(bsize)        ((bsize) / sizeof(daddr_t))
                     86: 
                     87: /*
                     88:  * Each file system has a number of inodes statically allocated.
                     89:  * We allocate one inode slot per NBPI bytes, expecting this
                     90:  * to be far more than we will ever need.
                     91:  */
                     92: #define        NBPI            2048
                     93: 
                     94: /*
                     95:  * For each cylinder we keep track of the availability of blocks at different
                     96:  * rotational positions, so that we can lay out the data to be picked
                     97:  * up with minimum rotational latency.  NRPOS is the default number of
                     98:  * rotational positions that we distinguish.  With NRPOS of 8 the resolution
                     99:  * of our summary information is 2ms for a typical 3600 rpm drive.
                    100:  */
                    101: #define        NRPOS           8       /* number distinct rotational positions */
                    102: 
                    103: 
                    104: int    Nflag;                  /* run without writing file system */
                    105: int    fssize;                 /* file system size */
                    106: int    ntracks;                /* # tracks/cylinder */
                    107: int    nsectors;               /* # sectors/track */
                    108: int    nphyssectors;           /* # sectors/track including spares */
                    109: int    secpercyl;              /* sectors per cylinder */
                    110: int    trackspares = -1;       /* spare sectors per track */
                    111: int    cylspares = -1;         /* spare sectors per cylinder */
                    112: int    sectorsize;             /* bytes/sector */
                    113: #ifdef tahoe
                    114: int    realsectorsize;         /* bytes/sector in hardware */
                    115: #endif
                    116: int    rpm;                    /* revolutions/minute of drive */
                    117: int    interleave;             /* hardware sector interleave */
                    118: int    trackskew = -1;         /* sector 0 skew, per track */
                    119: int    headswitch;             /* head switch time, usec */
                    120: int    trackseek;              /* track-to-track seek, usec */
                    121: int    fsize = 0;              /* fragment size */
                    122: int    bsize = 0;              /* block size */
                    123: int    cpg = DESCPG;           /* cylinders/cylinder group */
                    124: int    cpgflg;                 /* cylinders/cylinder group flag was given */
                    125: int    minfree = MINFREE;      /* free space threshold */
                    126: int    opt = DEFAULTOPT;       /* optimization preference (space or time) */
                    127: int    density = NBPI;         /* number of bytes per inode */
                    128: int    maxcontig = MAXCONTIG;  /* max contiguous blocks to allocate */
                    129: int    rotdelay = ROTDELAY;    /* rotational delay between blocks */
                    130: int    maxbpg;                 /* maximum blocks per file in a cyl group */
                    131: int    nrpos = NRPOS;          /* # of distinguished rotational positions */
                    132: int    bbsize = BBSIZE;        /* boot block size */
                    133: int    sbsize = SBSIZE;        /* superblock size */
                    134: #ifdef COMPAT
                    135: int    unlabelled;
                    136: #endif
                    137: 
                    138: char   device[MAXPATHLEN];
                    139: 
                    140: extern int errno;
                    141: char   *index();
                    142: char   *rindex();
                    143: 
                    144: main(argc, argv)
                    145:        int argc;
                    146:        char *argv[];
                    147: {
                    148:        char *cp, *special;
                    149:        register struct partition *pp;
                    150:        register struct disklabel *lp;
                    151:        struct disklabel *getdisklabel();
                    152:        struct partition oldpartition;
                    153:        struct stat st;
                    154:        int fsi, fso;
                    155:        register int i;
                    156:        int status;
                    157: 
                    158:        argc--, argv++;
                    159:        while (argc > 0 && argv[0][0] == '-') {
                    160:                for (cp = &argv[0][1]; *cp; cp++)
                    161:                        switch (*cp) {
                    162: 
                    163:                        case 'N':
                    164:                                Nflag++;
                    165:                                break;
                    166: 
                    167:                        case 'S':
                    168:                                if (argc < 1)
                    169:                                        fatal("-S: missing sector size");
                    170:                                argc--, argv++;
                    171:                                sectorsize = atoi(*argv);
                    172:                                if (sectorsize <= 0)
                    173:                                        fatal("%s: bad sector size", *argv);
                    174:                                goto next;
                    175: 
                    176:                        case 'a':
                    177:                                if (argc < 1)
                    178:                                        fatal("-a: missing max contiguous blocks\n");
                    179:                                argc--, argv++;
                    180:                                maxcontig = atoi(*argv);
                    181:                                if (maxcontig <= 0)
                    182:                                        fatal("%s: bad max contiguous blocks\n",
                    183:                                                *argv);
                    184:                                goto next;
                    185: 
                    186:                        case 'b':
                    187:                                if (argc < 1)
                    188:                                        fatal("-b: missing block size");
                    189:                                argc--, argv++;
                    190:                                bsize = atoi(*argv);
                    191:                                if (bsize < MINBSIZE)
                    192:                                        fatal("%s: bad block size", *argv);
                    193:                                goto next;
                    194: 
                    195:                        case 'c':
                    196:                                if (argc < 1)
                    197:                                        fatal("-c: missing cylinders/group");
                    198:                                argc--, argv++;
                    199:                                cpg = atoi(*argv);
                    200:                                if (cpg <= 0)
                    201:                                        fatal("%s: bad cylinders/group", *argv);
                    202:                                cpgflg++;
                    203:                                goto next;
                    204: 
                    205:                        case 'd':
                    206:                                if (argc < 1)
                    207:                                        fatal("-d: missing rotational delay\n");
                    208:                                argc--, argv++;
                    209:                                rotdelay = atoi(*argv);
                    210:                                if (rotdelay < 0)
                    211:                                        fatal("%s: bad rotational delay\n",
                    212:                                                *argv);
                    213:                                goto next;
                    214: 
                    215:                        case 'e':
                    216:                                if (argc < 1)
                    217:                                        fatal("-e: missing blocks pre file in a cyl group\n");
                    218:                                argc--, argv++;
                    219:                                maxbpg = atoi(*argv);
                    220:                                if (maxbpg <= 0)
                    221:                                        fatal("%s: bad blocks per file in a cyl group\n",
                    222:                                                *argv);
                    223:                                goto next;
                    224: 
                    225:                        case 'f':
                    226:                                if (argc < 1)
                    227:                                        fatal("-f: missing frag size");
                    228:                                argc--, argv++;
                    229:                                fsize = atoi(*argv);
                    230:                                if (fsize <= 0)
                    231:                                        fatal("%s: bad frag size", *argv);
                    232:                                goto next;
                    233: 
                    234:                        case 'i':
                    235:                                if (argc < 1)
                    236:                                        fatal("-i: missing bytes per inode\n");
                    237:                                argc--, argv++;
                    238:                                density = atoi(*argv);
                    239:                                if (density <= 0)
                    240:                                        fatal("%s: bad bytes per inode\n",
                    241:                                                *argv);
                    242:                                goto next;
                    243: 
                    244:                        case 'k':
                    245:                                if (argc < 1)
                    246:                                        fatal("-k: track skew");
                    247:                                argc--, argv++;
                    248:                                trackskew = atoi(*argv);
                    249:                                if (trackskew < 0)
                    250:                                        fatal("%s: bad track skew", *argv);
                    251:                                goto next;
                    252: 
                    253:                        case 'l':
                    254:                                if (argc < 1)
                    255:                                        fatal("-l: interleave");
                    256:                                argc--, argv++;
                    257:                                interleave = atoi(*argv);
                    258:                                if (interleave <= 0)
                    259:                                        fatal("%s: bad interleave", *argv);
                    260:                                goto next;
                    261: 
                    262:                        case 'm':
                    263:                                if (argc < 1)
                    264:                                        fatal("-m: missing free space %%\n");
                    265:                                argc--, argv++;
                    266:                                minfree = atoi(*argv);
                    267:                                if (minfree < 0 || minfree > 99)
                    268:                                        fatal("%s: bad free space %%\n",
                    269:                                                *argv);
                    270:                                goto next;
                    271: 
                    272:                        case 'n':
                    273:                                if (argc < 1)
                    274:                                        fatal("-n: missing rotational layout count\n");
                    275:                                argc--, argv++;
                    276:                                nrpos = atoi(*argv);
                    277:                                if (nrpos <= 0)
                    278:                                        fatal("%s: bad rotational layout count\n",
                    279:                                                *argv);
                    280:                                goto next;
                    281: 
                    282:                        case 'o':
                    283:                                if (argc < 1)
                    284:                                        fatal("-o: missing optimization preference");
                    285:                                argc--, argv++;
                    286:                                if (strcmp(*argv, "space") == 0)
                    287:                                        opt = FS_OPTSPACE;
                    288:                                else if (strcmp(*argv, "time") == 0)
                    289:                                        opt = FS_OPTTIME;
                    290:                                else
                    291:                                        fatal("%s: bad optimization preference %s",
                    292:                                            *argv,
                    293:                                            "(options are `space' or `time')");
                    294:                                goto next;
                    295: 
                    296:                        case 'p':
                    297:                                if (argc < 1)
                    298:                                        fatal("-p: spare sectors per track");
                    299:                                argc--, argv++;
                    300:                                trackspares = atoi(*argv);
                    301:                                if (trackspares < 0)
                    302:                                        fatal("%s: bad spare sectors per track", *argv);
                    303:                                goto next;
                    304: 
                    305:                        case 'r':
                    306:                                if (argc < 1)
                    307:                                        fatal("-r: missing revs/minute\n");
                    308:                                argc--, argv++;
                    309:                                rpm = atoi(*argv);
                    310:                                if (rpm <= 0)
                    311:                                        fatal("%s: bad revs/minute\n", *argv);
                    312:                                goto next;
                    313: 
                    314:                        case 's':
                    315:                                if (argc < 1)
                    316:                                        fatal("-s: missing file system size");
                    317:                                argc--, argv++;
                    318:                                fssize = atoi(*argv);
                    319:                                if (fssize <= 0)
                    320:                                        fatal("%s: bad file system size",
                    321:                                                *argv);
                    322:                                goto next;
                    323: 
                    324:                        case 't':
                    325:                                if (argc < 1)
                    326:                                        fatal("-t: missing track total");
                    327:                                argc--, argv++;
                    328:                                ntracks = atoi(*argv);
                    329:                                if (ntracks <= 0)
                    330:                                        fatal("%s: bad total tracks", *argv);
                    331:                                goto next;
                    332: 
                    333:                        case 'u':
                    334:                                if (argc < 1)
                    335:                                        fatal("-u: missing sectors/track");
                    336:                                argc--, argv++;
                    337:                                nsectors = atoi(*argv);
                    338:                                if (nsectors <= 0)
                    339:                                        fatal("%s: bad sectors/track", *argv);
                    340:                                goto next;
                    341: 
                    342:                        case 'x':
                    343:                                if (argc < 1)
                    344:                                        fatal("-x: spare sectors per cylinder");
                    345:                                argc--, argv++;
                    346:                                cylspares = atoi(*argv);
                    347:                                if (cylspares < 0)
                    348:                                        fatal("%s: bad spare sectors per cylinder", *argv);
                    349:                                goto next;
                    350: 
                    351:                        default:
                    352:                                fatal("-%c: unknown flag", *cp);
                    353:                        }
                    354: next:
                    355:                argc--, argv++;
                    356:        }
                    357:        if (argc < 1) {
                    358: #ifdef COMPAT
                    359:                fprintf(stderr,
                    360:                "usage: newfs [ fsoptions ] special-device [device-type]\n");
                    361: #else
                    362:                fprintf(stderr, "usage: newfs [ fsoptions ] special-device\n");
                    363: #endif
                    364:                fprintf(stderr, "where fsoptions are:\n");
                    365:                fprintf(stderr, "\t-N do not create file system, %s\n",
                    366:                        "just print out parameters");
                    367:                fprintf(stderr, "\t-b block size\n");
                    368:                fprintf(stderr, "\t-f frag size\n");
                    369:                fprintf(stderr, "\t-m minimum free space %%\n");
                    370:                fprintf(stderr, "\t-o optimization preference %s\n",
                    371:                        "(`space' or `time')");
                    372:                fprintf(stderr, "\t-a maximum contiguous blocks\n");
                    373:                fprintf(stderr, "\t-d rotational delay between %s\n",
                    374:                        "contiguous blocks");
                    375:                fprintf(stderr, "\t-e maximum blocks per file in a %s\n",
                    376:                        "cylinder group");
                    377:                fprintf(stderr, "\t-i number of bytes per inode\n");
                    378:                fprintf(stderr, "\t-c cylinders/group\n");
                    379:                fprintf(stderr, "\t-n number of distinguished %s\n",
                    380:                        "rotational positions");
                    381:                fprintf(stderr, "\t-s file system size (sectors)\n");
                    382:                fprintf(stderr, "\t-r revolutions/minute\n");
                    383:                fprintf(stderr, "\t-S sector size\n");
                    384:                fprintf(stderr, "\t-u sectors/track\n");
                    385:                fprintf(stderr, "\t-t tracks/cylinder\n");
                    386:                fprintf(stderr, "\t-p spare sectors per track\n");
                    387:                fprintf(stderr, "\t-x spare sectors per cylinder\n");
                    388:                fprintf(stderr, "\t-l hardware sector interleave\n");
                    389:                fprintf(stderr, "\t-k sector 0 skew, per track\n");
                    390:                exit(1);
                    391:        }
                    392:        special = argv[0];
                    393:        cp = rindex(special, '/');
                    394:        if (cp != 0)
                    395:                special = cp + 1;
                    396:        if (*special == 'r' && special[1] != 'a' && special[1] != 'b')
                    397:                special++;
                    398:        (void)sprintf(device, "/dev/r%s", special);
                    399:        special = device;
                    400:        if (!Nflag) {
                    401:                fso = open(special, O_WRONLY);
                    402:                if (fso < 0) {
                    403:                        perror(special);
                    404:                        exit(1);
                    405:                }
                    406:        } else
                    407:                fso = -1;
                    408:        fsi = open(special, O_RDONLY);
                    409:        if (fsi < 0) {
                    410:                perror(special);
                    411:                exit(1);
                    412:        }
                    413:        if (fstat(fsi, &st) < 0) {
                    414:                fprintf(stderr, "newfs: "); perror(special);
                    415:                exit(2);
                    416:        }
                    417:        if ((st.st_mode & S_IFMT) != S_IFCHR)
                    418:                fatal("%s: not a character device", special);
                    419:        cp = index(argv[0], '\0') - 1;
                    420:        if (cp == 0 || (*cp < 'a' || *cp > 'h') && !isdigit(*cp))
                    421:                fatal("%s: can't figure out file system partition", argv[0]);
                    422: #ifdef COMPAT
                    423:        lp = getdisklabel(special, fsi, argv[1]);
                    424: #else
                    425:        lp = getdisklabel(special, fsi);
                    426: #endif
                    427:        if (isdigit(*cp))
                    428:                pp = &lp->d_partitions[0];
                    429:        else
                    430:                pp = &lp->d_partitions[*cp - 'a'];
                    431:        if (pp->p_size == 0)
                    432:                fatal("%s: `%c' partition is unavailable", argv[0], *cp);
                    433:        if (fssize == 0)
                    434:                fssize = pp->p_size;
                    435:        if (fssize > pp->p_size)
                    436:               fatal("%s: maximum file system size on the `%c' partition is %d",
                    437:                        argv[0], *cp, pp->p_size);
                    438:        if (rpm == 0) {
                    439:                rpm = lp->d_rpm;
                    440:                if (rpm <= 0)
                    441:                        rpm = 3600;
                    442:        }
                    443:        if (ntracks == 0) {
                    444:                ntracks = lp->d_ntracks;
                    445:                if (ntracks <= 0)
                    446:                        fatal("%s: no default #tracks", argv[0]);
                    447:        }
                    448:        if (nsectors == 0) {
                    449:                nsectors = lp->d_nsectors;
                    450:                if (nsectors <= 0)
                    451:                        fatal("%s: no default #sectors/track", argv[0]);
                    452:        }
                    453:        if (sectorsize == 0) {
                    454:                sectorsize = lp->d_secsize;
                    455:                if (sectorsize <= 0)
                    456:                        fatal("%s: no default sector size", argv[0]);
                    457:        }
                    458:        if (trackskew == -1) {
                    459:                trackskew = lp->d_trackskew;
                    460:                if (trackskew < 0)
                    461:                        trackskew = 0;
                    462:        }
                    463:        if (interleave == 0) {
                    464:                interleave = lp->d_interleave;
                    465:                if (interleave <= 0)
                    466:                        interleave = 1;
                    467:        }
                    468:        if (fsize == 0) {
                    469:                fsize = pp->p_fsize;
                    470:                if (fsize <= 0)
                    471:                        fsize = MAX(DFL_FRAGSIZE, lp->d_secsize);
                    472:        }
                    473:        if (bsize == 0) {
                    474:                bsize = pp->p_frag * pp->p_fsize;
                    475:                if (bsize <= 0)
                    476:                        bsize = MIN(DFL_BLKSIZE, 8 * fsize);
                    477:        }
                    478:        if (minfree < 10 && opt != FS_OPTSPACE) {
                    479:                fprintf(stderr, "Warning: changing optimization to space ");
                    480:                fprintf(stderr, "because minfree is less than 10%%\n");
                    481:                opt = FS_OPTSPACE;
                    482:        }
                    483:        if (trackspares == -1) {
                    484:                trackspares = lp->d_sparespertrack;
                    485:                if (trackspares < 0)
                    486:                        trackspares = 0;
                    487:        }
                    488:        nphyssectors = nsectors + trackspares;
                    489:        if (cylspares == -1) {
                    490:                cylspares = lp->d_sparespercyl;
                    491:                if (cylspares < 0)
                    492:                        cylspares = 0;
                    493:        }
                    494:        secpercyl = nsectors * ntracks - cylspares;
                    495:        if (secpercyl != lp->d_secpercyl)
                    496:                fprintf(stderr, "%s (%d) %s (%d)\n",
                    497:                        "Warning: calculated sectors per cylinder", secpercyl,
                    498:                        "disagrees with disk label", lp->d_secpercyl);
                    499:        if (maxbpg == 0)
                    500:                maxbpg = MAXBLKPG(bsize);
                    501:        headswitch = lp->d_headswitch;
                    502:        trackseek = lp->d_trkseek;
                    503:        bbsize = lp->d_bbsize;
                    504:        sbsize = lp->d_sbsize;
                    505:        oldpartition = *pp;
                    506: #ifdef tahoe
                    507:        realsectorsize = sectorsize;
                    508:        if (sectorsize != DEV_BSIZE) {          /* XXX */
                    509:                int secperblk = DEV_BSIZE / sectorsize;
                    510: 
                    511:                sectorsize = DEV_BSIZE;
                    512:                nsectors /= secperblk;
                    513:                nphyssectors /= secperblk;
                    514:                secpercyl /= secperblk;
                    515:                fssize /= secperblk;
                    516:                pp->p_size /= secperblk;
                    517:        }
                    518: #endif
                    519:        mkfs(pp, special, fsi, fso);
                    520: #ifdef tahoe
                    521:        if (realsectorsize != DEV_BSIZE)
                    522:                pp->p_size *= DEV_BSIZE / realsectorsize;
                    523: #endif
                    524:        if (!Nflag && bcmp(pp, &oldpartition, sizeof(oldpartition)))
                    525:                rewritelabel(special, fso, lp);
                    526:        exit(0);
                    527: }
                    528: 
                    529: #ifdef COMPAT
                    530: struct disklabel *
                    531: getdisklabel(s, fd, type)
                    532:        char *s, *type;
                    533:        int fd;
                    534: {
                    535:        static struct disklabel lab;
                    536:        struct disklabel *getdiskbyname();
                    537: 
                    538:        if (ioctl(fd, DIOCGDINFO, (char *)&lab) < 0) {
                    539:                if (type == NULL) {
                    540:                        perror("ioctl (GDINFO)");
                    541:                        fatal(
                    542:                   "%s: can't read disk label; disk type must be specified", s);
                    543:                }
                    544:                unlabelled++;
                    545:                return (getdiskbyname(type));
                    546:        }
                    547:        return (&lab);
                    548: }
                    549: #else
                    550: struct disklabel *
                    551: getdisklabel(s, fd)
                    552:        char *s;
                    553:        int fd;
                    554: {
                    555:        static struct disklabel lab;
                    556: 
                    557:        if (ioctl(fd, DIOCGDINFO, (char *)&lab) < 0) {
                    558:                perror("ioctl (GDINFO)");
                    559:                fatal("%s: can't read disk label", s);
                    560:        }
                    561:        return (&lab);
                    562: }
                    563: #endif
                    564: 
                    565: rewritelabel(s, fd, lp)
                    566:        char *s;
                    567:        int fd;
                    568:        register struct disklabel *lp;
                    569: {
                    570: 
                    571: #ifdef COMPAT
                    572:        if (unlabelled)
                    573:                return;
                    574: #endif
                    575:        lp->d_checksum = 0;
                    576:        lp->d_checksum = dkcksum(lp);
                    577:        if (ioctl(fd, DIOCWDINFO, (char *)lp) < 0) {
                    578:                perror("ioctl (WDINFO)");
                    579:                fatal("%s: can't rewrite disk label", s);
                    580:        }
                    581: #if vax
                    582:        if (lp->d_type == DTYPE_SMD && lp->d_flags & D_BADSECT) {
                    583:                register i;
                    584:                int cfd;
                    585:                daddr_t alt;
                    586:                char specname[64];
                    587:                char blk[1024];
                    588:                char *cp;
                    589: 
                    590:                /*
                    591:                 * Make name for 'c' partition.
                    592:                 */
                    593:                strcpy(specname, s);
                    594:                cp = specname + strlen(specname) - 1;
                    595:                if (!isdigit(*cp))
                    596:                        *cp = 'c';
                    597:                cfd = open(specname, O_WRONLY);
                    598:                if (cfd < 0) {
                    599:                        perror(specname);
                    600:                        exit(2);
                    601:                }
                    602:                bzero(blk, sizeof(blk));
                    603:                *(struct disklabel *)(blk + LABELOFFSET) = *lp;
                    604:                alt = lp->d_ncylinders * lp->d_secpercyl - lp->d_nsectors;
                    605:                for (i = 1; i < 11 && i < lp->d_nsectors; i += 2) {
                    606:                        if (lseek(cfd, (off_t)(alt + i) * lp->d_secsize, L_SET) == -1) {
                    607:                                perror("lseek to badsector area");
                    608:                                exit(30);
                    609:                        }
                    610:                        if (write(cfd, blk, lp->d_secsize) < lp->d_secsize) {
                    611:                                int oerrno = errno;
                    612:                                fprintf(stderr, "alternate label %d ", i/2);
                    613:                                errno = oerrno;
                    614:                                perror("write");
                    615:                        }
                    616:                }
                    617:        }
                    618: #endif
                    619: }
                    620: 
                    621: /*VARARGS*/
                    622: fatal(fmt, arg1, arg2)
                    623:        char *fmt;
                    624: {
                    625: 
                    626:        fprintf(stderr, "newfs: ");
                    627:        fprintf(stderr, fmt, arg1, arg2);
                    628:        putc('\n', stderr);
                    629:        exit(10);
                    630: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.