fix iput() to more obviously avoid deadlock
This commit is contained in:
		
							parent
							
								
									1c7aa96005
								
							
						
					
					
						commit
						a4ee6f7de3
					
				
					 1 changed files with 9 additions and 7 deletions
				
			
		
							
								
								
									
										16
									
								
								fs.c
									
										
									
									
									
								
							
							
						
						
									
										16
									
								
								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);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue