mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	make d_splice_alias(ERR_PTR(err), dentry) = ERR_PTR(err)
... and simplify the living hell out of callers Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
		
							parent
							
								
									0c1aa9a952
								
							
						
					
					
						commit
						a9049376ee
					
				
					 15 changed files with 39 additions and 94 deletions
				
			
		| 
						 | 
				
			
			@ -4079,13 +4079,7 @@ static int btrfs_dentry_delete(const struct dentry *dentry)
 | 
			
		|||
static struct dentry *btrfs_lookup(struct inode *dir, struct dentry *dentry,
 | 
			
		||||
				   struct nameidata *nd)
 | 
			
		||||
{
 | 
			
		||||
	struct inode *inode;
 | 
			
		||||
 | 
			
		||||
	inode = btrfs_lookup_dentry(dir, dentry);
 | 
			
		||||
	if (IS_ERR(inode))
 | 
			
		||||
		return ERR_CAST(inode);
 | 
			
		||||
 | 
			
		||||
	return d_splice_alias(inode, dentry);
 | 
			
		||||
	return d_splice_alias(btrfs_lookup_dentry(dir, dentry), dentry);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
unsigned char btrfs_filetype_table[] = {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1652,6 +1652,9 @@ struct dentry *d_splice_alias(struct inode *inode, struct dentry *dentry)
 | 
			
		|||
{
 | 
			
		||||
	struct dentry *new = NULL;
 | 
			
		||||
 | 
			
		||||
	if (IS_ERR(inode))
 | 
			
		||||
		return ERR_CAST(inode);
 | 
			
		||||
 | 
			
		||||
	if (inode && S_ISDIR(inode->i_mode)) {
 | 
			
		||||
		spin_lock(&inode->i_lock);
 | 
			
		||||
		new = __d_find_alias(inode, 1);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -60,14 +60,11 @@ static efs_ino_t efs_find_entry(struct inode *inode, const char *name, int len)
 | 
			
		|||
 | 
			
		||||
struct dentry *efs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd) {
 | 
			
		||||
	efs_ino_t inodenum;
 | 
			
		||||
	struct inode * inode = NULL;
 | 
			
		||||
	struct inode *inode = NULL;
 | 
			
		||||
 | 
			
		||||
	inodenum = efs_find_entry(dir, dentry->d_name.name, dentry->d_name.len);
 | 
			
		||||
	if (inodenum) {
 | 
			
		||||
	if (inodenum)
 | 
			
		||||
		inode = efs_iget(dir->i_sb, inodenum);
 | 
			
		||||
		if (IS_ERR(inode))
 | 
			
		||||
			return ERR_CAST(inode);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return d_splice_alias(inode, dentry);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -55,12 +55,7 @@ static struct dentry *exofs_lookup(struct inode *dir, struct dentry *dentry,
 | 
			
		|||
		return ERR_PTR(-ENAMETOOLONG);
 | 
			
		||||
 | 
			
		||||
	ino = exofs_inode_by_name(dir, dentry);
 | 
			
		||||
	inode = NULL;
 | 
			
		||||
	if (ino) {
 | 
			
		||||
		inode = exofs_iget(dir->i_sb, ino);
 | 
			
		||||
		if (IS_ERR(inode))
 | 
			
		||||
			return ERR_CAST(inode);
 | 
			
		||||
	}
 | 
			
		||||
	inode = ino ? exofs_iget(dir->i_sb, ino) : NULL;
 | 
			
		||||
	return d_splice_alias(inode, dentry);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -67,15 +67,11 @@ static struct dentry *ext2_lookup(struct inode * dir, struct dentry *dentry, str
 | 
			
		|||
	inode = NULL;
 | 
			
		||||
	if (ino) {
 | 
			
		||||
		inode = ext2_iget(dir->i_sb, ino);
 | 
			
		||||
		if (IS_ERR(inode)) {
 | 
			
		||||
			if (PTR_ERR(inode) == -ESTALE) {
 | 
			
		||||
				ext2_error(dir->i_sb, __func__,
 | 
			
		||||
						"deleted inode referenced: %lu",
 | 
			
		||||
						(unsigned long) ino);
 | 
			
		||||
				return ERR_PTR(-EIO);
 | 
			
		||||
			} else {
 | 
			
		||||
				return ERR_CAST(inode);
 | 
			
		||||
			}
 | 
			
		||||
		if (inode == ERR_PTR(-ESTALE)) {
 | 
			
		||||
			ext2_error(dir->i_sb, __func__,
 | 
			
		||||
					"deleted inode referenced: %lu",
 | 
			
		||||
					(unsigned long) ino);
 | 
			
		||||
			return ERR_PTR(-EIO);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return d_splice_alias(inode, dentry);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1038,15 +1038,11 @@ static struct dentry *ext3_lookup(struct inode * dir, struct dentry *dentry, str
 | 
			
		|||
			return ERR_PTR(-EIO);
 | 
			
		||||
		}
 | 
			
		||||
		inode = ext3_iget(dir->i_sb, ino);
 | 
			
		||||
		if (IS_ERR(inode)) {
 | 
			
		||||
			if (PTR_ERR(inode) == -ESTALE) {
 | 
			
		||||
				ext3_error(dir->i_sb, __func__,
 | 
			
		||||
						"deleted inode referenced: %lu",
 | 
			
		||||
						ino);
 | 
			
		||||
				return ERR_PTR(-EIO);
 | 
			
		||||
			} else {
 | 
			
		||||
				return ERR_CAST(inode);
 | 
			
		||||
			}
 | 
			
		||||
		if (inode == ERR_PTR(-ESTALE)) {
 | 
			
		||||
			ext3_error(dir->i_sb, __func__,
 | 
			
		||||
					"deleted inode referenced: %lu",
 | 
			
		||||
					ino);
 | 
			
		||||
			return ERR_PTR(-EIO);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return d_splice_alias(inode, dentry);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1037,15 +1037,11 @@ static struct dentry *ext4_lookup(struct inode *dir, struct dentry *dentry, stru
 | 
			
		|||
			return ERR_PTR(-EIO);
 | 
			
		||||
		}
 | 
			
		||||
		inode = ext4_iget(dir->i_sb, ino);
 | 
			
		||||
		if (IS_ERR(inode)) {
 | 
			
		||||
			if (PTR_ERR(inode) == -ESTALE) {
 | 
			
		||||
				EXT4_ERROR_INODE(dir,
 | 
			
		||||
						 "deleted inode referenced: %u",
 | 
			
		||||
						 ino);
 | 
			
		||||
				return ERR_PTR(-EIO);
 | 
			
		||||
			} else {
 | 
			
		||||
				return ERR_CAST(inode);
 | 
			
		||||
			}
 | 
			
		||||
		if (inode == ERR_PTR(-ESTALE)) {
 | 
			
		||||
			EXT4_ERROR_INODE(dir,
 | 
			
		||||
					 "deleted inode referenced: %u",
 | 
			
		||||
					 ino);
 | 
			
		||||
			return ERR_PTR(-EIO);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return d_splice_alias(inode, dentry);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -209,29 +209,20 @@ static struct dentry *msdos_lookup(struct inode *dir, struct dentry *dentry,
 | 
			
		|||
	int err;
 | 
			
		||||
 | 
			
		||||
	lock_super(sb);
 | 
			
		||||
 | 
			
		||||
	err = msdos_find(dir, dentry->d_name.name, dentry->d_name.len, &sinfo);
 | 
			
		||||
	if (err) {
 | 
			
		||||
		if (err == -ENOENT) {
 | 
			
		||||
			inode = NULL;
 | 
			
		||||
			goto out;
 | 
			
		||||
		}
 | 
			
		||||
		goto error;
 | 
			
		||||
	switch (err) {
 | 
			
		||||
	case -ENOENT:
 | 
			
		||||
		inode = NULL;
 | 
			
		||||
		break;
 | 
			
		||||
	case 0:
 | 
			
		||||
		inode = fat_build_inode(sb, sinfo.de, sinfo.i_pos);
 | 
			
		||||
		brelse(sinfo.bh);
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		inode = ERR_PTR(err);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	inode = fat_build_inode(sb, sinfo.de, sinfo.i_pos);
 | 
			
		||||
	brelse(sinfo.bh);
 | 
			
		||||
	if (IS_ERR(inode)) {
 | 
			
		||||
		err = PTR_ERR(inode);
 | 
			
		||||
		goto error;
 | 
			
		||||
	}
 | 
			
		||||
out:
 | 
			
		||||
	unlock_super(sb);
 | 
			
		||||
	return d_splice_alias(inode, dentry);
 | 
			
		||||
 | 
			
		||||
error:
 | 
			
		||||
	unlock_super(sb);
 | 
			
		||||
	return ERR_PTR(err);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/***** Creates a directory entry (name is already formatted). */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -183,14 +183,9 @@ struct dentry *isofs_lookup(struct inode *dir, struct dentry *dentry, struct nam
 | 
			
		|||
				1024 + page_address(page));
 | 
			
		||||
	__free_page(page);
 | 
			
		||||
 | 
			
		||||
	inode = NULL;
 | 
			
		||||
	if (found) {
 | 
			
		||||
		inode = isofs_iget(dir->i_sb, block, offset);
 | 
			
		||||
		if (IS_ERR(inode)) {
 | 
			
		||||
			mutex_unlock(&sbi->s_mutex);
 | 
			
		||||
			return ERR_CAST(inode);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	inode = found ? isofs_iget(dir->i_sb, block, offset) : NULL;
 | 
			
		||||
 | 
			
		||||
	mutex_unlock(&sbi->s_mutex);
 | 
			
		||||
 | 
			
		||||
	return d_splice_alias(inode, dentry);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -102,10 +102,8 @@ static struct dentry *jffs2_lookup(struct inode *dir_i, struct dentry *target,
 | 
			
		|||
	mutex_unlock(&dir_f->sem);
 | 
			
		||||
	if (ino) {
 | 
			
		||||
		inode = jffs2_iget(dir_i->i_sb, ino);
 | 
			
		||||
		if (IS_ERR(inode)) {
 | 
			
		||||
		if (IS_ERR(inode))
 | 
			
		||||
			printk(KERN_WARNING "iget() failed for ino #%u\n", ino);
 | 
			
		||||
			return ERR_CAST(inode);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return d_splice_alias(inode, target);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1481,10 +1481,8 @@ static struct dentry *jfs_lookup(struct inode *dip, struct dentry *dentry, struc
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	ip = jfs_iget(dip->i_sb, inum);
 | 
			
		||||
	if (IS_ERR(ip)) {
 | 
			
		||||
	if (IS_ERR(ip))
 | 
			
		||||
		jfs_err("jfs_lookup: iget failed on inum %d", (uint) inum);
 | 
			
		||||
		return ERR_CAST(ip);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return d_splice_alias(ip, dentry);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -371,11 +371,9 @@ static struct dentry *logfs_lookup(struct inode *dir, struct dentry *dentry,
 | 
			
		|||
	page_cache_release(page);
 | 
			
		||||
 | 
			
		||||
	inode = logfs_iget(dir->i_sb, ino);
 | 
			
		||||
	if (IS_ERR(inode)) {
 | 
			
		||||
	if (IS_ERR(inode))
 | 
			
		||||
		printk(KERN_ERR"LogFS: Cannot read inode #%llx for dentry (%lx, %lx)n",
 | 
			
		||||
				ino, dir->i_ino, index);
 | 
			
		||||
		return ERR_CAST(inode);
 | 
			
		||||
	}
 | 
			
		||||
	return d_splice_alias(inode, dentry);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -72,12 +72,7 @@ nilfs_lookup(struct inode *dir, struct dentry *dentry, struct nameidata *nd)
 | 
			
		|||
		return ERR_PTR(-ENAMETOOLONG);
 | 
			
		||||
 | 
			
		||||
	ino = nilfs_inode_by_name(dir, &dentry->d_name);
 | 
			
		||||
	inode = NULL;
 | 
			
		||||
	if (ino) {
 | 
			
		||||
		inode = nilfs_iget(dir->i_sb, NILFS_I(dir)->i_root, ino);
 | 
			
		||||
		if (IS_ERR(inode))
 | 
			
		||||
			return ERR_CAST(inode);
 | 
			
		||||
	}
 | 
			
		||||
	inode = ino ? nilfs_iget(dir->i_sb, NILFS_I(dir)->i_root, ino) : NULL;
 | 
			
		||||
	return d_splice_alias(inode, dentry);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -220,11 +220,6 @@ static struct dentry *squashfs_lookup(struct inode *dir, struct dentry *dentry,
 | 
			
		|||
					blk, off, ino_num);
 | 
			
		||||
 | 
			
		||||
				inode = squashfs_iget(dir->i_sb, ino, ino_num);
 | 
			
		||||
				if (IS_ERR(inode)) {
 | 
			
		||||
					err = PTR_ERR(inode);
 | 
			
		||||
					goto failed;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				goto exit_lookup;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -59,8 +59,6 @@ static struct dentry *ufs_lookup(struct inode * dir, struct dentry *dentry, stru
 | 
			
		|||
	if (ino)
 | 
			
		||||
		inode = ufs_iget(dir->i_sb, ino);
 | 
			
		||||
	unlock_ufs(dir->i_sb);
 | 
			
		||||
	if (IS_ERR(inode))
 | 
			
		||||
		return ERR_CAST(inode);
 | 
			
		||||
	return d_splice_alias(inode, dentry);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue