|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.