summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrsc <rsc>2006-09-07 15:15:32 +0000
committerrsc <rsc>2006-09-07 15:15:32 +0000
commit0d6bbd3172b995ef8a1450ebbd29811eb3875d4a (patch)
tree51e4bbf4ef2ac02d8f62639ebfaf08e7cf0861cb
parent7a054598fa35a7c538d79589619ef3be1ff47866 (diff)
downloadxv6-labs-0d6bbd3172b995ef8a1450ebbd29811eb3875d4a.tar.gz
xv6-labs-0d6bbd3172b995ef8a1450ebbd29811eb3875d4a.tar.bz2
xv6-labs-0d6bbd3172b995ef8a1450ebbd29811eb3875d4a.zip
clean namei search loop
-rw-r--r--fs.c45
1 files changed, 23 insertions, 22 deletions
diff --git a/fs.c b/fs.c
index 341a586..9b687fd 100644
--- a/fs.c
+++ b/fs.c
@@ -122,7 +122,7 @@ iget(uint dev, uint inum)
loop:
nip = 0;
for(ip = &inode[0]; ip < &inode[NINODE]; ip++){
- if(ip->count > 0 && ip->dev == dev && ip->inum == inum){
+ if(ip->ref > 0 && ip->dev == dev && ip->inum == inum){
if(ip->busy){
sleep(ip, &inode_table_lock);
// Since we droped inode_table_lock, ip might have been reused
@@ -131,12 +131,12 @@ iget(uint dev, uint inum)
// and it will not be busy.
goto loop;
}
- ip->count++;
+ ip->ref++;
ip->busy = 1;
release(&inode_table_lock);
return ip;
}
- if(nip == 0 && ip->count == 0)
+ if(nip == 0 && ip->ref == 0)
nip = ip;
}
@@ -145,7 +145,7 @@ iget(uint dev, uint inum)
nip->dev = dev;
nip->inum = inum;
- nip->count = 1;
+ nip->ref = 1;
nip->busy = 1;
release(&inode_table_lock);
@@ -236,7 +236,7 @@ ifree(struct inode *ip)
void
ilock(struct inode *ip)
{
- if(ip->count < 1)
+ if(ip->ref < 1)
panic("ilock");
acquire(&inode_table_lock);
@@ -254,7 +254,7 @@ ilock(struct inode *ip)
void
iunlock(struct inode *ip)
{
- if(ip->busy != 1 || ip->count < 1)
+ if(ip->busy != 1 || ip->ref < 1)
panic("iunlock");
acquire(&inode_table_lock);
@@ -326,17 +326,17 @@ itrunc(struct inode *ip)
void
iput(struct inode *ip)
{
- if(ip->count < 1 || ip->busy != 1)
+ if(ip->ref < 1 || ip->busy != 1)
panic("iput");
- if((ip->count == 1) && (ip->nlink == 0)) {
+ if((ip->ref == 1) && (ip->nlink == 0)) {
itrunc(ip);
ifree(ip);
}
acquire(&inode_table_lock);
- ip->count -= 1;
+ ip->ref -= 1;
ip->busy = 0;
wakeup(ip);
@@ -357,7 +357,7 @@ void
iincref(struct inode *ip)
{
ilock(ip);
- ip->count++;
+ ip->ref++;
iunlock(ip);
}
@@ -522,10 +522,10 @@ namei(char *path, int mode, uint *ret_off,
ilock(dp);
}
- while(*cp == '/')
- cp++;
-
for(;;){
+ while(*cp == '/')
+ cp++;
+
if(*cp == '\0'){
if(mode == NAMEI_LOOKUP)
return dp;
@@ -542,6 +542,13 @@ namei(char *path, int mode, uint *ret_off,
return 0;
}
+ for(i = 0; cp[i] != 0 && cp[i] != '/'; i++)
+ ;
+ if(i > DIRSIZ){
+ iput(dp);
+ return 0;
+ }
+
for(off = 0; off < dp->size; off += BSIZE){
bp = bread(dp->dev, bmap(dp, off / BSIZE));
for(ep = (struct dirent*) bp->data;
@@ -549,13 +556,9 @@ namei(char *path, int mode, uint *ret_off,
ep++){
if(ep->inum == 0)
continue;
- for(i = 0; i < DIRSIZ && cp[i] != '/' && cp[i]; i++)
- if(cp[i] != ep->name[i])
- break;
- if((cp[i] == '\0' || cp[i] == '/' || i >= DIRSIZ) &&
- (i >= DIRSIZ || ep->name[i] == '\0')){
- while(cp[i] != '\0' && cp[i] != '/')
- i++;
+ if(memcmp(cp, ep->name, i) == 0 &&
+ (i == DIRSIZ || ep->name[i]== 0)){
+ // entry matches path element
off += (uchar*)ep - bp->data;
ninum = ep->inum;
brelse(bp);
@@ -591,8 +594,6 @@ namei(char *path, int mode, uint *ret_off,
dp = iget(dev, ninum);
if(dp->type == 0 || dp->nlink < 1)
panic("namei");
- while(*cp == '/')
- cp++;
}
}