diff options
| -rw-r--r-- | kernel/defs.h | 6 | ||||
| -rw-r--r-- | kernel/fs.c | 17 | ||||
| -rw-r--r-- | kernel/log.c | 8 | ||||
| -rw-r--r-- | kernel/main.c | 1 | ||||
| -rw-r--r-- | kernel/proc.c | 7 | 
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(); | 
