zero out all of dirent.name when creating

don't increase length of directory
This commit is contained in:
rtm 2006-08-12 22:44:26 +00:00
parent cd93074e5b
commit 05e975511b
4 changed files with 20 additions and 17 deletions

4
Notes
View file

@ -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
View file

@ -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
View file

@ -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

23
fs.c
View file

@ -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,12 +484,15 @@ 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;
} }
@ -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);