vfs: do_last(): common slow lookup
Make the slow lookup part of O_CREAT and non-O_CREAT opens common. This allows atomic_open to be hooked into the slow lookup part. Signed-off-by: Miklos Szeredi <mszeredi@suse.cz> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
		
					parent
					
						
							
								b6183df7b2
							
						
					
				
			
			
				commit
				
					
						7157486541
					
				
			
		
					 1 changed files with 5 additions and 22 deletions
				
			
		
							
								
								
									
										23
									
								
								fs/namei.c
									
										
									
									
									
								
							
							
						
						
									
										23
									
								
								fs/namei.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -2250,30 +2250,13 @@ static struct file *do_last(struct nameidata *nd, struct path *path,
 | 
			
		|||
			symlink_ok = 1;
 | 
			
		||||
		/* we _can_ be in RCU mode here */
 | 
			
		||||
		error = lookup_fast(nd, &nd->last, path, &inode);
 | 
			
		||||
		if (unlikely(error)) {
 | 
			
		||||
		if (likely(!error))
 | 
			
		||||
			goto finish_lookup;
 | 
			
		||||
 | 
			
		||||
		if (error < 0)
 | 
			
		||||
			goto exit;
 | 
			
		||||
 | 
			
		||||
		BUG_ON(nd->inode != dir->d_inode);
 | 
			
		||||
 | 
			
		||||
			mutex_lock(&dir->d_inode->i_mutex);
 | 
			
		||||
			dentry = __lookup_hash(&nd->last, dir, nd);
 | 
			
		||||
			mutex_unlock(&dir->d_inode->i_mutex);
 | 
			
		||||
			error = PTR_ERR(dentry);
 | 
			
		||||
			if (IS_ERR(dentry))
 | 
			
		||||
				goto exit;
 | 
			
		||||
			path->mnt = nd->path.mnt;
 | 
			
		||||
			path->dentry = dentry;
 | 
			
		||||
			error = follow_managed(path, nd->flags);
 | 
			
		||||
			if (unlikely(error < 0))
 | 
			
		||||
				goto exit_dput;
 | 
			
		||||
 | 
			
		||||
			if (error)
 | 
			
		||||
				nd->flags |= LOOKUP_JUMPED;
 | 
			
		||||
 | 
			
		||||
			inode = path->dentry->d_inode;
 | 
			
		||||
		}
 | 
			
		||||
		goto finish_lookup;
 | 
			
		||||
	} else {
 | 
			
		||||
		/* create side of things */
 | 
			
		||||
		/*
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue