view final_main/src/fs_impl1.cbc @ 17:c8fee0262ead

fix chapter5
author menikon
date Thu, 13 Feb 2020 01:50:45 +0900
parents c8adccdd011a
children
line wrap: on
line source

#interface "Err.h"
#interface "fs.dg"

fs* createfs_impl(struct Context* cbc_context) {
    struct fs* fs  = new fs();
    struct fs_impl* fs_impl = new fs_impl();
    fs->fs = (union Data*)fs_impl;
    fs_impl->fs_impl = NULL;
    fs_impl->sb = NULL;
    fs_impl->ret  = 0;
    fs_impl->dev  = 0;
    fs_impl->type  = 0;
    fs_impl->bp = NULL;
    fs_impl->dip = NULL;
    fs_impl->inum  = 0;
    fs_impl->dp = NULL;
    fs_impl->name = NULL;
    fs_impl->off  = 0;
    fs_impl->poff = NULL;
    fs_impl->de = NULL;
    fs_impl->tot  = 0;
    fs_impl->m  = 0;
    fs_impl->dst = NULL;
    fs_impl->n  = 0;
    fs_impl->src = NULL;
    fs_impl->allocinode = C_allocinode;
    fs_impl->allocinode_loop = C_allocinode_loop;
    fs_impl->allocinode_loopcheck = C_allocinode_loopcheck;
    fs_impl->allocinode_noloop = C_allocinode_noloop;
    fs_impl->lockinode1 = C_lockinode1;
    fs_impl->lockinode2 = C_lockinode2;
    fs_impl->lockinode_sleepcheck = C_lockinode_sleepcheck;
    fs_impl->iput_check = C_iput_check;
    fs_impl->iput_inode_nolink = C_iput_inode_nolink;
    fs_impl->readi_check_diskinode = C_readi_check_diskinode;
    fs_impl->readi_loopcheck = C_readi_loopcheck;
    fs_impl->readi_loop = C_readi_loop;
    fs_impl->readi_noloop = C_readi_noloop;
    fs_impl->writei_check_diskinode = C_writei_check_diskinode;
    fs_impl->writei_loopcheck = C_writei_loopcheck;
    fs_impl->writei_loop = C_writei_loop;
    fs_impl->writei_noloop = C_writei_noloop;
    fs_impl->dirlookup_loopcheck = C_dirlookup_loopcheck;
    fs_impl->dirlookup_loop = C_dirlookup_loop;
    fs_impl->dirlookup_noloop = C_dirlookup_noloop;
    fs_impl->dirlink_namecheck = C_dirlink_namecheck;
    fs_impl->dirlink_loopcheck = C_dirlink_loopcheck;
    fs_impl->dirlink_loop = C_dirlink_loop;
    fs_impl->dirlink_noloop = C_dirlink_noloop;
    fs->readsb = C_readsbfs_impl;
    fs->iinit = C_iinitfs_impl;
    fs->ialloc = C_iallocfs_impl;
    fs->iupdate = C_iupdatefs_impl;
    fs->idup = C_idupfs_impl;
    fs->ilock = C_ilockfs_impl;
    fs->iunlock = C_iunlockfs_impl;
    fs->iput = C_iputfs_impl;
    fs->iunlockput = C_iunlockputfs_impl;
    fs->stati = C_statifs_impl;
    fs->readi = C_readifs_impl;
    fs->writei = C_writeifs_impl;
    fs->namecmp = C_namecmpfs_impl;
    fs->dirlookup = C_dirlookupfs_impl;
    fs->dirlink = C_dirlinkfs_impl;
    fs->namei = C_nameifs_impl;
    fs->nameiparent = C_nameiparentfs_impl;
    return fs;
}

typedef struct superblock superblock;
__code readsbfs_impl(struct fs_impl* fs, uint dev, struct superblock* sb, __code next(...)) { //:skip

    struct buf* bp;

    bp = bread(dev, 1);
    memmove(sb, bp->data, sizeof(*sb));
    brelse(bp);

    goto next(...);
}

__code iinitfs_impl(struct fs_impl* fs, __code next(...)) {

     initlock(&icache.lock, "icache");

    goto next(...);
}

__code iallocfs_impl(struct fs_impl* fs, uint dev, short type, __code next(...)) {
    goto allocinode(fs, dev, sb, next(...));
}

__code iupdatefs_impl(struct fs_impl* fs, struct inode* ip, __code next(...)) {

    struct buf *bp;
    struct dinode *dip;

    bp = bread(ip->dev, IBLOCK(ip->inum));

    dip = (struct dinode*) bp->data + ip->inum % IPB;
    dip->type = ip->type;
    dip->major = ip->major;
    dip->minor = ip->minor;
    dip->nlink = ip->nlink;
    dip->size = ip->size;

    memmove(dip->addrs, ip->addrs, sizeof(ip->addrs));
    log_write(bp);
    brelse(bp);

    goto next(...);
}

__code idupfs_impl(struct fs_impl* fs, struct inode* ip, __code next(...)) {

    acquire(&icache.lock);
    ip->ref++;
    release(&icache.lock);

    goto next(ip, ...);
}

__code ilockfs_impl(struct fs_impl* fs, struct inode* ip, __code next(...)) {

    goto lockinode1(fs, ip, bp, dip, next(...));
}

__code iunlockfs_impl(struct fs_impl* fs, struct inode* ip, __code next(...)) {

    if (ip == 0 || !(ip->flags & I_BUSY) || ip->ref < 1) {
       char* msg = "iunlock";
       struct Err* err = createKernelError(&proc->cbc_context);
       Gearef(cbc_context, Err)->msg = msg;
       goto meta(cbc_context, err->panic);
    }

    acquire(&icache.lock);
    ip->flags &= ~I_BUSY;
    wakeup(ip);
    release(&icache.lock);

    goto next(...);
}

__code iputfs_impl(struct fs_impl* fs, struct inode* ip, __code next(...)) {
    if (next == C_iputfs_impl) {
        next = fs->next2;
    }
    goto iput_check(fs, ip, next(...));
}

....