summaryrefslogtreecommitdiff
path: root/mkfs.c
diff options
context:
space:
mode:
authorkaashoek <kaashoek>2006-08-24 02:44:41 +0000
committerkaashoek <kaashoek>2006-08-24 02:44:41 +0000
commitea2909b6b5ceb54383ab23fd195ebae29cfdb7ca (patch)
tree78a7076d23319c0c38b7f62108b6d06908379c42 /mkfs.c
parent8b58e81077abf4e843873f16c03077e2fafce52d (diff)
downloadxv6-labs-ea2909b6b5ceb54383ab23fd195ebae29cfdb7ca.tar.gz
xv6-labs-ea2909b6b5ceb54383ab23fd195ebae29cfdb7ca.tar.bz2
xv6-labs-ea2909b6b5ceb54383ab23fd195ebae29cfdb7ca.zip
user-level malloc (untested)
nit in sbrk indirect block fix dup to share fd struct
Diffstat (limited to 'mkfs.c')
-rw-r--r--mkfs.c32
1 files changed, 26 insertions, 6 deletions
diff --git a/mkfs.c b/mkfs.c
index 15870d9..2d84610 100644
--- a/mkfs.c
+++ b/mkfs.c
@@ -106,6 +106,7 @@ main(int argc, char *argv[])
for(i = 2; i < argc; i++){
assert(index(argv[i], '/') == 0);
+
if((fd = open(argv[i], 0)) < 0){
perror(argv[i]);
exit(1);
@@ -234,21 +235,40 @@ iappend(uint inum, void *xp, int n)
uint fbn, off, n1;
struct dinode din;
char buf[512];
+ uint indirect[NINDIRECT];
+ uint x;
rinode(inum, &din);
off = xint(din.size);
while(n > 0){
fbn = off / 512;
- assert(fbn < NDIRECT);
- if(din.addrs[fbn] == 0) {
- din.addrs[fbn] = xint(freeblock++);
- usedblocks++;
+ assert(fbn < MAXFILE);
+ if (fbn < NDIRECT) {
+ if(xint(din.addrs[fbn]) == 0) {
+ din.addrs[fbn] = xint(freeblock++);
+ usedblocks++;
+ }
+ x = xint(din.addrs[fbn]);
+ } else {
+ if(xint(din.addrs[INDIRECT]) == 0) {
+ printf("allocate indirect block\n");
+ din.addrs[INDIRECT] = xint(freeblock++);
+ usedblocks++;
+ }
+ printf("read indirect block\n");
+ rsect(xint(din.addrs[INDIRECT]), (char *) indirect);
+ if (indirect[fbn - NDIRECT] == 0) {
+ indirect[fbn - NDIRECT] = xint(freeblock++);
+ usedblocks++;
+ wsect(INDIRECT, (char *) indirect);
+ }
+ x = xint(indirect[fbn-NDIRECT]);
}
n1 = min(n, (fbn + 1) * 512 - off);
- rsect(xint(din.addrs[fbn]), buf);
+ rsect(x, buf);
bcopy(p, buf + off - (fbn * 512), n1);
- wsect(xint(din.addrs[fbn]), buf);
+ wsect(x, buf);
n -= n1;
off += n1;
p += n1;