diff options
| author | Robert Morris <rtm@csail.mit.edu> | 2017-08-08 13:48:48 -0400 | 
|---|---|---|
| committer | Robert Morris <rtm@csail.mit.edu> | 2017-08-08 13:48:48 -0400 | 
| commit | 70d912b332328cb30cd86fdf63074cf10ba5ed35 (patch) | |
| tree | 938191851b452357e63e3eff80d6946cd75a8cf2 | |
| parent | 3375df5061cefd188fefbc55cf57b066d7ed5da5 (diff) | |
| download | xv6-labs-70d912b332328cb30cd86fdf63074cf10ba5ed35.tar.gz xv6-labs-70d912b332328cb30cd86fdf63074cf10ba5ed35.tar.bz2 xv6-labs-70d912b332328cb30cd86fdf63074cf10ba5ed35.zip | |
protect ip->valid and ip->nlink with sleep lock in iput()
| -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--; | 
