summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrans Kaashoek <[email protected]>2015-04-10 07:15:06 -0400
committerFrans Kaashoek <[email protected]>2015-04-10 07:15:06 -0400
commit895af77fe6ff7c73f198e852a40976ed102a49e4 (patch)
treec951d87e397c48268fd9daf0925e2907a803a177
parentc24ac5d76353d04955cc348f1cb5b95743c42b38 (diff)
downloadxv6-labs-895af77fe6ff7c73f198e852a40976ed102a49e4.tar.gz
xv6-labs-895af77fe6ff7c73f198e852a40976ed102a49e4.tar.bz2
xv6-labs-895af77fe6ff7c73f198e852a40976ed102a49e4.zip
check blockno passed to idestart
-rw-r--r--ide.c4
-rw-r--r--mkfs.c13
-rw-r--r--param.h1
3 files changed, 9 insertions, 9 deletions
diff --git a/ide.c b/ide.c
index 96216ea..ed5a572 100644
--- a/ide.c
+++ b/ide.c
@@ -48,7 +48,7 @@ void
ideinit(void)
{
int i;
-
+
initlock(&idelock, "ide");
picenable(IRQ_IDE);
ioapicenable(IRQ_IDE, ncpu - 1);
@@ -73,6 +73,8 @@ idestart(struct buf *b)
{
if(b == 0)
panic("idestart");
+ if(b->blockno >= FSSIZE)
+ panic("incorrect blockno");
int sector_per_block = BSIZE/SECTOR_SIZE;
int sector = b->blockno * sector_per_block;
diff --git a/mkfs.c b/mkfs.c
index 2d2859d..7197bc1 100644
--- a/mkfs.c
+++ b/mkfs.c
@@ -13,13 +13,12 @@
#define static_assert(a, b) do { switch (0) case 0: case (a): ; } while (0)
-#define SIZE 1000
#define NINODES 200
// Disk layout:
// [ boot block | sb block | inode blocks | bit map | data blocks | log ]
-int nbitmap = SIZE/(BSIZE*8) + 1;
+int nbitmap = FSSIZE/(BSIZE*8) + 1;
int ninodeblocks = NINODES / IPB + 1;
int nlog = LOGSIZE;
int nmeta; // Number of meta blocks (inode, bitmap, and 2 extra)
@@ -90,18 +89,18 @@ main(int argc, char *argv[])
}
nmeta = 2 + ninodeblocks + nbitmap;
- nblocks = SIZE - nlog - nmeta;
+ nblocks = FSSIZE - nlog - nmeta;
- sb.size = xint(SIZE);
+ sb.size = xint(FSSIZE);
sb.nblocks = xint(nblocks); // so whole disk is size sectors
sb.ninodes = xint(NINODES);
sb.nlog = xint(nlog);
- printf("nmeta %d (boot, super, inode blocks %u, bitmap blocks %u) blocks %d log %u total %d\n", nmeta, ninodeblocks, nbitmap, nblocks, nlog, SIZE);
+ printf("nmeta %d (boot, super, inode blocks %u, bitmap blocks %u) blocks %d log %u total %d\n", nmeta, ninodeblocks, nbitmap, nblocks, nlog, FSSIZE);
freeblock = nmeta; // the first free block that we can allocate
- for(i = 0; i < SIZE; i++)
+ for(i = 0; i < FSSIZE; i++)
wsect(i, zeroes);
memset(buf, 0, sizeof(buf));
@@ -164,7 +163,6 @@ main(int argc, char *argv[])
void
wsect(uint sec, void *buf)
{
- printf("seek to %d\n", sec * BSIZE);
if(lseek(fsfd, sec * BSIZE, 0) != sec * BSIZE){
perror("lseek");
exit(1);
@@ -183,7 +181,6 @@ winode(uint inum, struct dinode *ip)
struct dinode *dip;
bn = IBLOCK(inum);
- printf("winode %d\n", bn);
rsect(bn, buf);
dip = ((struct dinode*)buf) + (inum % IPB);
*dip = *ip;
diff --git a/param.h b/param.h
index 1a73f42..a7e90ef 100644
--- a/param.h
+++ b/param.h
@@ -10,4 +10,5 @@
#define MAXOPBLOCKS 10 // max # of blocks any FS op writes
#define LOGSIZE (MAXOPBLOCKS*3) // max data blocks in on-disk log
#define NBUF (MAXOPBLOCKS*3) // size of disk block cache
+#define FSSIZE 1000 // size of file system in blocks