Large files (moderate)
- 修改kernel/fs.h,修改和添加宏定义:
- 修改kernel/file.h,修改inode结构体定义:
- 修改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");
}
- 修改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)
-
修改user/usys.pl,添加symlink entry:
-
修改user/user.h,添加symlink定义:
-
修改kernel/syscall.h,添加新定义:
-
修改kernel/stat.h,添加新file type:
-
修改kernel/fcntl.h:
-
修改kernel/syscall.c:
-
修改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;
}
- 修改kernel/sysfile.c中的sys_open函数:
- 修改Makefile:
测试结果如下: