diff options
-rw-r--r-- | file.h | 4 | ||||
-rw-r--r-- | fs.c | 18 |
2 files changed, 12 insertions, 10 deletions
@@ -14,8 +14,8 @@ struct inode { uint dev; // Device number uint inum; // Inode number int ref; // Reference count - struct sleeplock lock; - int valid; // remainder has been read from disk? + struct sleeplock lock; // protects everything below here + int valid; // inode has been read from disk? short type; // copy of disk inode short major; @@ -320,15 +320,17 @@ void iput(struct inode *ip) { acquire(&icache.lock); - if(ip->ref == 1 && ip->valid && ip->nlink == 0){ - // inode has no links and no other references: truncate and free. + if(ip->ref == 1){ acquiresleep(&ip->lock); - release(&icache.lock); - itrunc(ip); - ip->type = 0; - iupdate(ip); - acquire(&icache.lock); - ip->valid = 0; + if(ip->valid && ip->nlink == 0){ + // inode has no links and no other references: truncate and free. + release(&icache.lock); + itrunc(ip); + ip->type = 0; + iupdate(ip); + ip->valid = 0; + acquire(&icache.lock); + } releasesleep(&ip->lock); } ip->ref--; |