Annotation of researchv10no/cmd/chuck/mkfs.c, revision 1.1.1.1

1.1       root        1: #include "fs.h"
                      2: 
                      3: /* always bit-mapped.  only question is how many blocks of inodes */
                      4: mknew()
                      5: {      int n;
                      6:        if(pblk < 4)
                      7:                fatal("%d blocks is too few\n", pblk);
                      8:        fd = open(file, 2);
                      9:        inopb = bsize/sizeof(struct dinode);
                     10:        fblk = (pblk-2)/(1+inopb);
                     11:        ninode = (fblk-2)*inopb;
                     12:        if(ninode > 65536) {    /* temporary, I hope FIX */
                     13:                fblk = 65536/inopb + 2;
                     14:        }
                     15:        else if(ninode <= 0)
                     16:                fblk = 3;
                     17:        ninode = (fblk-2)*inopb;
                     18:        if(fblk + BITMAP*8*sizeof(long) < pblk)
                     19:                lblk = pblk - (pblk + 8*bsize - 1)/(8*bsize);
                     20:        else
                     21:                lblk = pblk;
                     22:        pmesg("%d blocks, %d inodes, fblk %d, lblk %d (%d data blocks)\n",
                     23:                pblk, ninode, fblk, lblk, lblk-fblk);
                     24:        /* we could give the sucker a chance to adjust this */
                     25:        if(qry("is this ok? (yq)\n") != 'y')
                     26:                fatal("too bad, quitting\n");
                     27:        n = pblk - lblk + fblk; /* inodes plus bit maps */
                     28:        buf = (char *) malloc(bsize * n);
                     29:        memset(buf, 0, bsize * n);
                     30:        newsuper();
                     31:        sblk.U.B.S_valid = 1;
                     32:        newroot();
                     33:        newbits();
                     34:        writeem();
                     35:        exit(0);
                     36: }
                     37: 
                     38: newsuper()
                     39: {      int i;
                     40:        long *p;
                     41:        sblk.s_isize = fblk;
                     42:        sblk.s_fsize = pblk;
                     43:        sblk.s_tinode = ninode - 1;
                     44:        for(i = 0; i < NICINOD; i++) {
                     45:                if(i+3 >= ninode)       /* maybe >? */
                     46:                        break;
                     47:                sblk.s_inode[i] = i+3;
                     48:        }
                     49:        sblk.s_ninode = i;
                     50:        sblk.s_time = time(0);
                     51:        sblk.s_tfree = lblk-fblk-1;
                     52:        if(pblk > lblk)
                     53:                return;
                     54:        p = sblk.U.B.S_bfree;
                     55:        for(i = 0; i < (lblk-fblk)/(8*sizeof(long)); i++)
                     56:                p[i] = ~0;
                     57:        /* and the (possible) last bunch */
                     58:        for(i = i*8*sizeof(long) + fblk; i < lblk; i++)
                     59:                setfree(p, i-fblk);
                     60:        /* fblk is used by the root */
                     61:        *p &= ~1;
                     62: }
                     63: 
                     64: setfree(p, n)
                     65: long *p;
                     66: {      int j, k;
                     67:        j = n/(8*sizeof(int));
                     68:        k = n%(8*sizeof(int));
                     69:        p[j] |= (1 << k);
                     70: }
                     71: 
                     72: /* the root goes in inode 2, and in block fblk */
                     73: newroot()
                     74: {      struct dinode *p = (struct dinode *) (buf + 2*bsize);
                     75:        struct direct *d = (struct direct *) (buf + bsize);
                     76:        p++;    /* root is inode 2 */
                     77:        p->di_mode = IFDIR | (~umask(0) & 0777);        /* sets umask */
                     78:        p->di_nlink = 2;
                     79:        p->di_uid = getuid();
                     80:        p->di_gid = getgid();
                     81:        p->di_size = 32;        /* temporary, I hope FIX */
                     82:        p->di_atime = p->di_mtime = p->di_ctime = time(0);
                     83:        ltol3(p->di_addr, &fblk, 1);
                     84:        d->d_ino = 2;
                     85:        strcpy(d->d_name, ".");
                     86:        d++;
                     87:        d->d_ino = 2;
                     88:        strcpy(d->d_name, "..");
                     89: }
                     90: 
                     91: newbits()
                     92: {      int i;
                     93:        long *p;
                     94:        if(pblk <= lblk)
                     95:                return;
                     96:        p = (long *)(buf + fblk*bsize);
                     97:        for(i = fblk+1; i % (8*sizeof(int)); i++)
                     98:                setfree(p, i);
                     99:        for(; i+8*sizeof(int) < lblk; i += 8*sizeof(int))
                    100:                p[i/(8*sizeof(int))] = ~0;
                    101:        for(; i < lblk; i++)
                    102:                setfree(p, i);
                    103: /*     sblk.U.N.S_flag = 1;    /* bit map blocks */
                    104: /*     sblk.U.N.S_bsize = 4096*8;*/
                    105: }
                    106: writeem()
                    107: {
                    108:        fd = open(file, 2);
                    109:        if(fd < 0)
                    110:                fatal("can't write\n");
                    111:        if(bwrite(pblk-1, buf, 1))
                    112:                fatal("can't write last block (%d)\n", pblk-1);
                    113:        if(pblk > lblk)
                    114:                if(bwrite(lblk, buf+fblk*bsize, pblk-lblk))
                    115:                        fatal("couldn't write bit maps\n");
                    116:        if(bwrite(fblk, buf+bsize, 1))
                    117:                fatal("couldn't write root dir\n");
                    118:        if(bwrite(2, buf+2*bsize, fblk-2))
                    119:                fatal("couldn't write inodes\n");
                    120:        if(bwrite(1, (char *)&sblk, 1))
                    121:                fatal("couldn't write superblock\n");
                    122: }

unix.superglobalmegacorp.com

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