summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrans Kaashoek <[email protected]>2019-08-18 14:35:11 -0400
committerFrans Kaashoek <[email protected]>2019-08-18 14:35:11 -0400
commit2501560cd691fcdb9c310dccc14ac4e7486c99d9 (patch)
tree2bbda111baaeda8c4b8363422b8e9f39910177e6
parenta9953236cc9f1befb625575671bc39f1ab254bf0 (diff)
downloadxv6-labs-2501560cd691fcdb9c310dccc14ac4e7486c99d9.tar.gz
xv6-labs-2501560cd691fcdb9c310dccc14ac4e7486c99d9.tar.bz2
xv6-labs-2501560cd691fcdb9c310dccc14ac4e7486c99d9.zip
Cosmetic cleanup: fsinit reads sb and calls loginit. initialize icache
in main.c and don't make it disk specific; the icache is shared. This doesn't matter since we have only one disk, but conceptually cleaner and maybe helpful to students for mount lab.
-rw-r--r--kernel/defs.h6
-rw-r--r--kernel/fs.c17
-rw-r--r--kernel/log.c8
-rw-r--r--kernel/main.c1
-rw-r--r--kernel/proc.c7
5 files changed, 21 insertions, 18 deletions
diff --git a/kernel/defs.h b/kernel/defs.h
index 2689bed..23dcd41 100644
--- a/kernel/defs.h
+++ b/kernel/defs.h
@@ -35,12 +35,12 @@ int filestat(struct file*, uint64 addr);
int filewrite(struct file*, uint64, int n);
// fs.c
-void readsb(int dev, struct superblock *sb);
+void fsinit(int);
int dirlink(struct inode*, char*, uint);
struct inode* dirlookup(struct inode*, char*, uint*);
struct inode* ialloc(uint, short);
struct inode* idup(struct inode*);
-void iinit(int dev);
+void iinit();
void ilock(struct inode*);
void iput(struct inode*);
void iunlock(struct inode*);
@@ -64,7 +64,7 @@ void kfree(void *);
void kinit();
// log.c
-void initlog(int dev);
+void initlog(int, struct superblock*);
void log_write(struct buf*);
void begin_op();
void end_op();
diff --git a/kernel/fs.c b/kernel/fs.c
index 98284e8..3a74c1f 100644
--- a/kernel/fs.c
+++ b/kernel/fs.c
@@ -28,7 +28,7 @@ static void itrunc(struct inode*);
struct superblock sb;
// Read the super block.
-void
+static void
readsb(int dev, struct superblock *sb)
{
struct buf *bp;
@@ -38,6 +38,15 @@ readsb(int dev, struct superblock *sb)
brelse(bp);
}
+// Init fs
+void
+fsinit(int dev) {
+ readsb(dev, &sb);
+ if(sb.magic != FSMAGIC)
+ panic("invalid file system");
+ initlog(dev, &sb);
+}
+
// Zero a block.
static void
bzero(int dev, int bno)
@@ -170,7 +179,7 @@ struct {
} icache;
void
-iinit(int dev)
+iinit()
{
int i = 0;
@@ -178,10 +187,6 @@ iinit(int dev)
for(i = 0; i < NINODE; i++) {
initsleeplock(&icache.inode[i].lock, "inode");
}
-
- readsb(dev, &sb);
- if(sb.magic != FSMAGIC)
- panic("invalid file system");
}
static struct inode* iget(uint dev, uint inum);
diff --git a/kernel/log.c b/kernel/log.c
index 59984db..5e884bb 100644
--- a/kernel/log.c
+++ b/kernel/log.c
@@ -52,16 +52,14 @@ static void recover_from_log(void);
static void commit();
void
-initlog(int dev)
+initlog(int dev, struct superblock *sb)
{
if (sizeof(struct logheader) >= BSIZE)
panic("initlog: too big logheader");
- struct superblock sb;
initlock(&log.lock, "log");
- readsb(dev, &sb);
- log.start = sb.logstart;
- log.size = sb.nlog;
+ log.start = sb->logstart;
+ log.size = sb->nlog;
log.dev = dev;
recover_from_log();
}
diff --git a/kernel/main.c b/kernel/main.c
index 077f645..a936fd3 100644
--- a/kernel/main.c
+++ b/kernel/main.c
@@ -23,6 +23,7 @@ main()
plicinit(); // set up interrupt controller
plicinithart(); // ask PLIC for device interrupts
binit(); // buffer cache
+ iinit(); // inode cache
fileinit(); // file table
virtio_disk_init(); // emulated hard disk
userinit(); // first user process
diff --git a/kernel/proc.c b/kernel/proc.c
index 1f6bfcc..3d65b46 100644
--- a/kernel/proc.c
+++ b/kernel/proc.c
@@ -493,12 +493,11 @@ forkret(void)
release(&myproc()->lock);
if (first) {
- // Some initialization functions must be run in the context
- // of a regular process (e.g., they call sleep), and thus cannot
+ // File system initialization must be run in the context of a
+ // regular process (e.g., because it calls sleep), and thus cannot
// be run from main().
first = 0;
- iinit(ROOTDEV);
- initlog(ROOTDEV);
+ fsinit(ROOTDEV);
}
usertrapret();