From 43f89d7eff319c017c752fcb71ba5e064acdaf5a Mon Sep 17 00:00:00 2001 From: Ben Gras Date: Wed, 3 Aug 2005 14:22:07 +0000 Subject: [PATCH] Fixes for mkfs so that making a FS from a proto file works again --- commands/simple/mkfs.c | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/commands/simple/mkfs.c b/commands/simple/mkfs.c index 25d01ae56..1db8bf521 100755 --- a/commands/simple/mkfs.c +++ b/commands/simple/mkfs.c @@ -420,6 +420,7 @@ char *device; int fd; struct partition entry; block_t d; + struct stat st; if ((fd = open(device, O_RDONLY)) == -1) { perror("sizeup open"); @@ -427,7 +428,13 @@ char *device; } if (ioctl(fd, DIOCGETP, &entry) == -1) { perror("sizeup ioctl"); - entry.size = cvu64(0); + if(fstat(fd, &st) < 0) { + perror("fstat"); + entry.size = cvu64(0); + } else { + fprintf(stderr, "used fstat instead\n"); + entry.size = cvu64(st.st_size); + } } close(fd); d = div64u(entry.size, block_size); @@ -594,8 +601,9 @@ ino_t parent; if ((f = open(token[4], O_RDONLY)) < 0) { fprintf(stderr, "%s: Can't open %s: %s\n", progname, token[4], strerror(errno)); - } else + } else { eat_file(n, f); + } } } @@ -827,8 +835,11 @@ ino_t n; { /* Increment the link count to inode n */ int off; + static int enter = 0; block_t b; + if(enter) exit(1); + b = ((n - 1) / inodes_per_block) + inode_offset; off = (n - 1) % inodes_per_block; if (fs_version == 1) { @@ -838,17 +849,18 @@ ino_t n; inode1[off].d1_nlinks++; put_block(b, (char *) inode1); } else { - d2_inode *inode2; + static d2_inode *inode2 = NULL; + int n; - if(!(inode2 = malloc(V2_INODES_PER_BLOCK(block_size)))) + n = sizeof(*inode2) * V2_INODES_PER_BLOCK(block_size); + if(!inode2 && !(inode2 = malloc(n))) pexit("couldn't allocate a block of inodes"); get_block(b, (char *) inode2); inode2[off].d2_nlinks++; put_block(b, (char *) inode2); - - free(inode2); } + enter = 0; } @@ -870,7 +882,7 @@ long count; put_block(b, (char *) inode1); } else { d2_inode *inode2; - if(!(inode2 = malloc(V2_INODES_PER_BLOCK(block_size)))) + if(!(inode2 = malloc(V2_INODES_PER_BLOCK(block_size) * sizeof(*inode2)))) pexit("couldn't allocate a block of inodes"); get_block(b, (char *) inode2); @@ -892,7 +904,10 @@ int mode, usrid, grpid; block_t b; num = next_inode++; - if (num > nrinodes) pexit("File system does not have enough inodes"); + if (num > nrinodes) { + fprintf(stderr, "have %d inodoes\n", nrinodes); + pexit("File system does not have enough inodes"); + } b = ((num - 1) / inodes_per_block) + inode_offset; off = (num - 1) % inodes_per_block; if (fs_version == 1) { @@ -906,7 +921,7 @@ int mode, usrid, grpid; } else { d2_inode *inode2; - if(!(inode2 = malloc(V2_INODES_PER_BLOCK(block_size)))) + if(!(inode2 = malloc(V2_INODES_PER_BLOCK(block_size) * sizeof(*inode2)))) pexit("couldn't allocate a block of inodes"); get_block(b, (char *) inode2); @@ -1117,7 +1132,7 @@ void print_fs() block_t b, inode_limit; struct direct *dir; - if(!(inode2 = malloc(V2_INODES_PER_BLOCK(block_size)))) + if(!(inode2 = malloc(V2_INODES_PER_BLOCK(block_size) * sizeof(*inode2)))) pexit("couldn't allocate a block of inodes"); if(!(dir = malloc(NR_DIR_ENTRIES(block_size)*sizeof(*dir)))) -- 2.44.0