From: Robert Morris Date: Tue, 8 Aug 2017 18:19:54 +0000 (-0400) Subject: fix iput() to more obviously avoid deadlock X-Git-Url: https://git.devinivas.org/?a=commitdiff_plain;h=a4ee6f7de32bfbd73499ac7da19e69ad0741e993;p=cs3210-lab1.git fix iput() to more obviously avoid deadlock --- 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); }