Annotation of 43BSDReno/sbin/newfs/newfs.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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