zero out all of dirent.name when creating
don't increase length of directory
This commit is contained in:
parent
cd93074e5b
commit
05e975511b
4 changed files with 20 additions and 17 deletions
4
Notes
4
Notes
|
@ -363,5 +363,5 @@ more than one directory content block
|
||||||
sh arguments
|
sh arguments
|
||||||
sh redirection
|
sh redirection
|
||||||
indirect blocks
|
indirect blocks
|
||||||
two bugs in unlink
|
two bugs in unlink: don't just return if nlink > 0,
|
||||||
how come unlink xxx fails? iput problem?
|
and search for name, not inum
|
||||||
|
|
4
bio.c
4
bio.c
|
@ -90,13 +90,13 @@ bread(uint dev, uint sector)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
bwrite(uint dev, struct buf *b, uint sector)
|
bwrite(struct buf *b, uint sector)
|
||||||
{
|
{
|
||||||
void *c;
|
void *c;
|
||||||
extern struct spinlock ide_lock;
|
extern struct spinlock ide_lock;
|
||||||
|
|
||||||
acquire(&ide_lock);
|
acquire(&ide_lock);
|
||||||
c = ide_start_rw(dev & 0xff, sector, b->data, 1, 0);
|
c = ide_start_rw(b->dev & 0xff, sector, b->data, 1, 0);
|
||||||
sleep (c, &ide_lock);
|
sleep (c, &ide_lock);
|
||||||
ide_finish(c);
|
ide_finish(c);
|
||||||
b->flags |= B_VALID;
|
b->flags |= B_VALID;
|
||||||
|
|
2
defs.h
2
defs.h
|
@ -106,7 +106,7 @@ void binit(void);
|
||||||
struct buf;
|
struct buf;
|
||||||
struct buf * getblk(uint dev, uint sector);
|
struct buf * getblk(uint dev, uint sector);
|
||||||
struct buf *bread(uint, uint);
|
struct buf *bread(uint, uint);
|
||||||
void bwrite(uint, struct buf *, uint);
|
void bwrite(struct buf *, uint);
|
||||||
void brelse(struct buf *);
|
void brelse(struct buf *);
|
||||||
|
|
||||||
// fs.c
|
// fs.c
|
||||||
|
|
27
fs.c
27
fs.c
|
@ -56,7 +56,7 @@ balloc(uint dev)
|
||||||
|
|
||||||
cprintf ("balloc: allocate block %d\n", b);
|
cprintf ("balloc: allocate block %d\n", b);
|
||||||
bp->data[bi/8] |= 0x1 << (bi % 8);
|
bp->data[bi/8] |= 0x1 << (bi % 8);
|
||||||
bwrite (dev, bp, BBLOCK(b, ninodes)); // mark it allocated on disk
|
bwrite (bp, BBLOCK(b, ninodes)); // mark it allocated on disk
|
||||||
brelse(bp);
|
brelse(bp);
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
@ -80,7 +80,7 @@ bfree(int dev, uint b)
|
||||||
bi = b % BPB;
|
bi = b % BPB;
|
||||||
m = ~(0x1 << (bi %8));
|
m = ~(0x1 << (bi %8));
|
||||||
bp->data[bi/8] &= m;
|
bp->data[bi/8] &= m;
|
||||||
bwrite (dev, bp, BBLOCK(b, ninodes)); // mark it free on disk
|
bwrite (bp, BBLOCK(b, ninodes)); // mark it free on disk
|
||||||
brelse(bp);
|
brelse(bp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -147,7 +147,7 @@ iupdate (struct inode *ip)
|
||||||
dip->nlink = ip->nlink;
|
dip->nlink = ip->nlink;
|
||||||
dip->size = ip->size;
|
dip->size = ip->size;
|
||||||
memmove(dip->addrs, ip->addrs, sizeof(ip->addrs));
|
memmove(dip->addrs, ip->addrs, sizeof(ip->addrs));
|
||||||
bwrite (ip->dev, bp, IBLOCK(ip->inum)); // mark it allocated on the disk
|
bwrite (bp, IBLOCK(ip->inum)); // mark it allocated on the disk
|
||||||
brelse(bp);
|
brelse(bp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -181,7 +181,7 @@ ialloc(uint dev, short type)
|
||||||
|
|
||||||
cprintf ("ialloc: %d\n", inum);
|
cprintf ("ialloc: %d\n", inum);
|
||||||
dip->type = type;
|
dip->type = type;
|
||||||
bwrite (dev, bp, IBLOCK(inum)); // mark it allocated on the disk
|
bwrite (bp, IBLOCK(inum)); // mark it allocated on the disk
|
||||||
brelse(bp);
|
brelse(bp);
|
||||||
ip = iget (dev, inum);
|
ip = iget (dev, inum);
|
||||||
return ip;
|
return ip;
|
||||||
|
@ -353,7 +353,7 @@ writei(struct inode *ip, char *addr, uint off, uint n)
|
||||||
m = min(BSIZE - off % BSIZE, n-r);
|
m = min(BSIZE - off % BSIZE, n-r);
|
||||||
bp = bread(ip->dev, bmap(ip, off / BSIZE));
|
bp = bread(ip->dev, bmap(ip, off / BSIZE));
|
||||||
memmove (bp->data + off % BSIZE, addr, m);
|
memmove (bp->data + off % BSIZE, addr, m);
|
||||||
bwrite (ip->dev, bp, bmap(ip, off/BSIZE));
|
bwrite (bp, bmap(ip, off/BSIZE));
|
||||||
brelse (bp);
|
brelse (bp);
|
||||||
r += m;
|
r += m;
|
||||||
off += m;
|
off += m;
|
||||||
|
@ -484,13 +484,16 @@ mknod(char *cp, short type, short major, short minor)
|
||||||
|
|
||||||
found:
|
found:
|
||||||
ep->inum = ip->inum;
|
ep->inum = ip->inum;
|
||||||
for(i = 0; i < DIRSIZ && cp[i]; i++) ep->name[i] = cp[i];
|
for(i = 0; i < DIRSIZ && cp[i]; i++)
|
||||||
bwrite (dp->dev, bp, bmap(dp, off/BSIZE)); // write directory block
|
ep->name[i] = cp[i];
|
||||||
|
for( ; i < DIRSIZ; i++)
|
||||||
|
ep->name[i] = '\0';
|
||||||
|
bwrite (bp, bmap(dp, off/BSIZE)); // write directory block
|
||||||
brelse(bp);
|
brelse(bp);
|
||||||
dp->size += sizeof(struct dirent); // update directory inode
|
|
||||||
iupdate (dp);
|
iput(dp);
|
||||||
iput(dp);
|
|
||||||
return ip;
|
return ip;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -531,7 +534,7 @@ unlink(char *cp)
|
||||||
|
|
||||||
found:
|
found:
|
||||||
ep->inum = 0;
|
ep->inum = 0;
|
||||||
bwrite (dp->dev, bp, bmap(dp, off/BSIZE)); // write directory block
|
bwrite (bp, bmap(dp, off/BSIZE)); // write directory block
|
||||||
brelse(bp);
|
brelse(bp);
|
||||||
iupdate (dp);
|
iupdate (dp);
|
||||||
iput(dp);
|
iput(dp);
|
||||||
|
|
Loading…
Reference in a new issue