MIT 6.S081---Lab: file system

Large files (moderate)

  1. 修改kernel/fs.h,修改和添加宏定义:
    在这里插入图片描述
  2. 修改kernel/file.h,修改inode结构体定义:
    在这里插入图片描述
  3. 修改kernel/fs.c中的bmap函数:
static uint
bmap(struct inode *ip, uint bn)
{
  uint addr, *a;
  struct buf *bp;

  if(bn < NDIRECT){
    if((addr = ip->addrs[bn]) == 0)
      ip->addrs[bn] = addr = balloc(ip->dev);
    return addr;
  }
  bn -= NDIRECT;

  if(bn < NINDIRECT){
    // Load indirect block, allocating if necessary.
    if((addr = ip->addrs[NDIRECT]) == 0)
      ip->addrs[NDIRECT] = addr = balloc(ip->dev);
    bp = bread(ip->dev, addr);
    a = (uint*)bp->data;
    if((addr = a[bn]) == 0){
      a[bn] = addr = balloc(ip->dev);
      log_write(bp);
    }
    brelse(bp);
    return addr;
  }
  bn -= NINDIRECT;

  if (bn < DBINDIRECT) {
    if((addr = ip->addrs[NDIRECT + 1]) == 0)
      ip->addrs[NDIRECT + 1] = addr = balloc(ip->dev);
    bp = bread(ip->dev, addr);
    a = (uint*)bp->data;
    if ((addr = a[bn / NINDIRECT]) == 0) {
      a[bn / NINDIRECT] = addr = balloc(ip->dev);
      log_write(bp);
    }
    brelse(bp);
    bp = bread(ip->dev, addr);
    a = (uint*)bp->data;
    if ((addr = a[bn % NINDIRECT]) == 0) {
      a[bn % NINDIRECT] = addr = balloc(ip->dev);
      log_write(bp);
    }
    brelse(bp);
    return addr;
  }

  panic("bmap: out of range");
}
  1. 修改kernel/fs.c中的itrunc函数:
void
itrunc(struct inode *ip)
{
  int i, j;
  struct buf *bp, *bp1;
  uint *a, *b;

  for(i = 0; i < NDIRECT; i++){
    if(ip->addrs[i]){
      bfree(ip->dev, ip->addrs[i]);
      ip->addrs[i] = 0;
    }
  }

  if(ip->addrs[NDIRECT]){
    bp = bread(ip->dev, ip->addrs[NDIRECT]);
    a = (uint*)bp->data;
    for(j = 0; j < NINDIRECT; j++){
      if(a[j])
        bfree(ip->dev, a[j]);
    }
    brelse(bp);
    bfree(ip->dev, ip->addrs[NDIRECT]);
    ip->addrs[NDIRECT] = 0;
  }

  if (ip->addrs[NDIRECT + 1]) {
    bp = bread(ip->dev, ip->addrs[NDIRECT + 1]);
    a = (uint*)bp->data;
    for (i = 0; i < NINDIRECT; ++i) {
      if (a[i]) {
        bp1 = bread(ip->dev, a[i]);
        b = (uint*)bp1->data;
        for(j = 0; j < NINDIRECT; j++){
          if(b[j])
            bfree(ip->dev, b[j]);
        }
        brelse(bp1);
        bfree(ip->dev, a[i]);
        a[i] = 0;
      }
    }
    brelse(bp);
    bfree(ip->dev, ip->addrs[NDIRECT + 1]);
    ip->addrs[NDIRECT + 1] = 0;
  }

  ip->size = 0;
  iupdate(ip);
}

测试结果如下:
在这里插入图片描述

Symbolic links (moderate)

  1. 修改user/usys.pl,添加symlink entry:
    在这里插入图片描述

  2. 修改user/user.h,添加symlink定义:
    在这里插入图片描述

  3. 修改kernel/syscall.h,添加新定义:
    在这里插入图片描述

  4. 修改kernel/stat.h,添加新file type:
    在这里插入图片描述

  5. 修改kernel/fcntl.h:
    在这里插入图片描述

  6. 修改kernel/syscall.c:
    在这里插入图片描述

  7. 修改kernel/sysfile.c,添加sys_symlink函数:

int sys_symlink(void) {
  char target[MAXPATH], path[MAXPATH];
  struct inode *dp, *ip;

  if(argstr(0, target, MAXPATH) < 0 || argstr(1, path, MAXPATH) < 0)
    return -1;

  begin_op();
  if(((ip = namei(target)) != 0) && ip->type == T_DIR){
    end_op();
    return -1;
  }

  if ((dp = create(path, T_SYMLINK, 0, 0)) == 0) {
    end_op();
    return -1;
  }
  if (writei(dp, 0, (uint64)target, 0, MAXPATH) != MAXPATH) {
    panic("symlink: writei");
  }
  iunlockput(dp);
  end_op();
  return 0;
}
  1. 修改kernel/sysfile.c中的sys_open函数:
    在这里插入图片描述
    在这里插入图片描述
  2. 修改Makefile:
    在这里插入图片描述
    测试结果如下:
    在这里插入图片描述
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值