From 70d912b332328cb30cd86fdf63074cf10ba5ed35 Mon Sep 17 00:00:00 2001 From: Robert Morris Date: Tue, 8 Aug 2017 13:48:48 -0400 Subject: protect ip->valid and ip->nlink with sleep lock in iput() --- fs.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) (limited to 'fs.c') diff --git a/fs.c b/fs.c index b67db5d..c73c530 100644 --- a/fs.c +++ b/fs.c @@ -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--; -- cgit v1.2.3