summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--fs.c16
1 files changed, 9 insertions, 7 deletions
diff --git a/fs.c b/fs.c
index 67616a4..8bec001 100644
--- a/fs.c
+++ b/fs.c
@@ -329,20 +329,22 @@ iunlock(struct inode *ip)
void
iput(struct inode *ip)
{
- acquire(&icache.lock);
- if(ip->ref == 1){
- acquiresleep(&ip->lock);
- if(ip->valid && ip->nlink == 0){
+ acquiresleep(&ip->lock);
+ if(ip->valid && ip->nlink == 0){
+ acquire(&icache.lock);
+ int r = ip->ref;
+ release(&icache.lock);
+ if(r == 1){
// 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);
}
+ releasesleep(&ip->lock);
+
+ acquire(&icache.lock);
ip->ref--;
release(&icache.lock);
}