mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	[PATCH] switch all filesystems over to d_obtain_alias
Switch all users of d_alloc_anon to d_obtain_alias. Signed-off-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
		
							parent
							
								
									4ea3ada295
								
							
						
					
					
						commit
						440037287c
					
				
					 19 changed files with 78 additions and 305 deletions
				
			
		
							
								
								
									
										10
									
								
								fs/dcache.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								fs/dcache.c
									
									
									
									
									
								
							| 
						 | 
					@ -1187,17 +1187,17 @@ struct dentry * d_alloc_anon(struct inode *inode)
 | 
				
			||||||
 * allocating a new one.
 | 
					 * allocating a new one.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * On successful return, the reference to the inode has been transferred
 | 
					 * On successful return, the reference to the inode has been transferred
 | 
				
			||||||
 * to the dentry.  If %NULL is returned (indicating kmalloc failure),
 | 
					 * to the dentry.  In case of an error the reference on the inode is released.
 | 
				
			||||||
 * the reference on the inode has been released.  To make it easier
 | 
					 * To make it easier to use in export operations a %NULL or IS_ERR inode may
 | 
				
			||||||
 * to use in export operations a NULL or IS_ERR inode may be passed in
 | 
					 * be passed in and will be the error will be propagate to the return value,
 | 
				
			||||||
 * and will be casted to the corresponding NULL or IS_ERR dentry.
 | 
					 * with a %NULL @inode replaced by ERR_PTR(-ESTALE).
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
struct dentry *d_obtain_alias(struct inode *inode)
 | 
					struct dentry *d_obtain_alias(struct inode *inode)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct dentry *dentry;
 | 
						struct dentry *dentry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!inode)
 | 
						if (!inode)
 | 
				
			||||||
		return NULL;
 | 
							return ERR_PTR(-ESTALE);
 | 
				
			||||||
	if (IS_ERR(inode))
 | 
						if (IS_ERR(inode))
 | 
				
			||||||
		return ERR_CAST(inode);
 | 
							return ERR_CAST(inode);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -112,35 +112,14 @@ struct dentry *efs_fh_to_parent(struct super_block *sb, struct fid *fid,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct dentry *efs_get_parent(struct dentry *child)
 | 
					struct dentry *efs_get_parent(struct dentry *child)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct dentry *parent;
 | 
						struct dentry *parent = ERR_PTR(-ENOENT);
 | 
				
			||||||
	struct inode *inode;
 | 
					 | 
				
			||||||
	efs_ino_t ino;
 | 
						efs_ino_t ino;
 | 
				
			||||||
	long error;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	lock_kernel();
 | 
						lock_kernel();
 | 
				
			||||||
 | 
					 | 
				
			||||||
	error = -ENOENT;
 | 
					 | 
				
			||||||
	ino = efs_find_entry(child->d_inode, "..", 2);
 | 
						ino = efs_find_entry(child->d_inode, "..", 2);
 | 
				
			||||||
	if (!ino)
 | 
						if (ino)
 | 
				
			||||||
		goto fail;
 | 
							parent = d_obtain_alias(efs_iget(child->d_inode->i_sb, ino));
 | 
				
			||||||
 | 
					 | 
				
			||||||
	inode = efs_iget(child->d_inode->i_sb, ino);
 | 
					 | 
				
			||||||
	if (IS_ERR(inode)) {
 | 
					 | 
				
			||||||
		error = PTR_ERR(inode);
 | 
					 | 
				
			||||||
		goto fail;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	error = -ENOMEM;
 | 
					 | 
				
			||||||
	parent = d_alloc_anon(inode);
 | 
					 | 
				
			||||||
	if (!parent)
 | 
					 | 
				
			||||||
		goto fail_iput;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	unlock_kernel();
 | 
						unlock_kernel();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return parent;
 | 
						return parent;
 | 
				
			||||||
 | 
					 | 
				
			||||||
 fail_iput:
 | 
					 | 
				
			||||||
	iput(inode);
 | 
					 | 
				
			||||||
 fail:
 | 
					 | 
				
			||||||
	unlock_kernel();
 | 
					 | 
				
			||||||
	return ERR_PTR(error);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -366,8 +366,6 @@ struct dentry *exportfs_decode_fh(struct vfsmount *mnt, struct fid *fid,
 | 
				
			||||||
	 * Try to get any dentry for the given file handle from the filesystem.
 | 
						 * Try to get any dentry for the given file handle from the filesystem.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	result = nop->fh_to_dentry(mnt->mnt_sb, fid, fh_len, fileid_type);
 | 
						result = nop->fh_to_dentry(mnt->mnt_sb, fid, fh_len, fileid_type);
 | 
				
			||||||
	if (!result)
 | 
					 | 
				
			||||||
		result = ERR_PTR(-ESTALE);
 | 
					 | 
				
			||||||
	if (IS_ERR(result))
 | 
						if (IS_ERR(result))
 | 
				
			||||||
		return result;
 | 
							return result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -422,8 +420,6 @@ struct dentry *exportfs_decode_fh(struct vfsmount *mnt, struct fid *fid,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		target_dir = nop->fh_to_parent(mnt->mnt_sb, fid,
 | 
							target_dir = nop->fh_to_parent(mnt->mnt_sb, fid,
 | 
				
			||||||
				fh_len, fileid_type);
 | 
									fh_len, fileid_type);
 | 
				
			||||||
		if (!target_dir)
 | 
					 | 
				
			||||||
			goto err_result;
 | 
					 | 
				
			||||||
		err = PTR_ERR(target_dir);
 | 
							err = PTR_ERR(target_dir);
 | 
				
			||||||
		if (IS_ERR(target_dir))
 | 
							if (IS_ERR(target_dir))
 | 
				
			||||||
			goto err_result;
 | 
								goto err_result;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -73,8 +73,6 @@ static struct dentry *ext2_lookup(struct inode * dir, struct dentry *dentry, str
 | 
				
			||||||
struct dentry *ext2_get_parent(struct dentry *child)
 | 
					struct dentry *ext2_get_parent(struct dentry *child)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned long ino;
 | 
						unsigned long ino;
 | 
				
			||||||
	struct dentry *parent;
 | 
					 | 
				
			||||||
	struct inode *inode;
 | 
					 | 
				
			||||||
	struct dentry dotdot;
 | 
						struct dentry dotdot;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dotdot.d_name.name = "..";
 | 
						dotdot.d_name.name = "..";
 | 
				
			||||||
| 
						 | 
					@ -83,16 +81,7 @@ struct dentry *ext2_get_parent(struct dentry *child)
 | 
				
			||||||
	ino = ext2_inode_by_name(child->d_inode, &dotdot);
 | 
						ino = ext2_inode_by_name(child->d_inode, &dotdot);
 | 
				
			||||||
	if (!ino)
 | 
						if (!ino)
 | 
				
			||||||
		return ERR_PTR(-ENOENT);
 | 
							return ERR_PTR(-ENOENT);
 | 
				
			||||||
	inode = ext2_iget(child->d_inode->i_sb, ino);
 | 
						return d_obtain_alias(ext2_iget(child->d_inode->i_sb, ino));
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (IS_ERR(inode))
 | 
					 | 
				
			||||||
		return ERR_CAST(inode);
 | 
					 | 
				
			||||||
	parent = d_alloc_anon(inode);
 | 
					 | 
				
			||||||
	if (!parent) {
 | 
					 | 
				
			||||||
		iput(inode);
 | 
					 | 
				
			||||||
		parent = ERR_PTR(-ENOMEM);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return parent;
 | 
					 | 
				
			||||||
} 
 | 
					} 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1057,8 +1057,6 @@ static struct dentry *ext3_lookup(struct inode * dir, struct dentry *dentry, str
 | 
				
			||||||
struct dentry *ext3_get_parent(struct dentry *child)
 | 
					struct dentry *ext3_get_parent(struct dentry *child)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned long ino;
 | 
						unsigned long ino;
 | 
				
			||||||
	struct dentry *parent;
 | 
					 | 
				
			||||||
	struct inode *inode;
 | 
					 | 
				
			||||||
	struct dentry dotdot;
 | 
						struct dentry dotdot;
 | 
				
			||||||
	struct ext3_dir_entry_2 * de;
 | 
						struct ext3_dir_entry_2 * de;
 | 
				
			||||||
	struct buffer_head *bh;
 | 
						struct buffer_head *bh;
 | 
				
			||||||
| 
						 | 
					@ -1068,7 +1066,6 @@ struct dentry *ext3_get_parent(struct dentry *child)
 | 
				
			||||||
	dotdot.d_parent = child; /* confusing, isn't it! */
 | 
						dotdot.d_parent = child; /* confusing, isn't it! */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bh = ext3_find_entry(&dotdot, &de);
 | 
						bh = ext3_find_entry(&dotdot, &de);
 | 
				
			||||||
	inode = NULL;
 | 
					 | 
				
			||||||
	if (!bh)
 | 
						if (!bh)
 | 
				
			||||||
		return ERR_PTR(-ENOENT);
 | 
							return ERR_PTR(-ENOENT);
 | 
				
			||||||
	ino = le32_to_cpu(de->inode);
 | 
						ino = le32_to_cpu(de->inode);
 | 
				
			||||||
| 
						 | 
					@ -1080,16 +1077,7 @@ struct dentry *ext3_get_parent(struct dentry *child)
 | 
				
			||||||
		return ERR_PTR(-EIO);
 | 
							return ERR_PTR(-EIO);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	inode = ext3_iget(child->d_inode->i_sb, ino);
 | 
						return d_obtain_alias(ext3_iget(child->d_inode->i_sb, ino));
 | 
				
			||||||
	if (IS_ERR(inode))
 | 
					 | 
				
			||||||
		return ERR_CAST(inode);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	parent = d_alloc_anon(inode);
 | 
					 | 
				
			||||||
	if (!parent) {
 | 
					 | 
				
			||||||
		iput(inode);
 | 
					 | 
				
			||||||
		parent = ERR_PTR(-ENOMEM);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return parent;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S_SHIFT 12
 | 
					#define S_SHIFT 12
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1083,16 +1083,7 @@ struct dentry *ext4_get_parent(struct dentry *child)
 | 
				
			||||||
		return ERR_PTR(-EIO);
 | 
							return ERR_PTR(-EIO);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	inode = ext4_iget(child->d_inode->i_sb, ino);
 | 
						return d_obtain_alias(ext4_iget(child->d_inode->i_sb, ino));
 | 
				
			||||||
	if (IS_ERR(inode))
 | 
					 | 
				
			||||||
		return ERR_CAST(inode);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	parent = d_alloc_anon(inode);
 | 
					 | 
				
			||||||
	if (!parent) {
 | 
					 | 
				
			||||||
		iput(inode);
 | 
					 | 
				
			||||||
		parent = ERR_PTR(-ENOMEM);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return parent;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define S_SHIFT 12
 | 
					#define S_SHIFT 12
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -681,33 +681,24 @@ static struct dentry *fat_fh_to_dentry(struct super_block *sb,
 | 
				
			||||||
			inode = NULL;
 | 
								inode = NULL;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (!inode) {
 | 
					 | 
				
			||||||
		/* For now, do nothing
 | 
					 | 
				
			||||||
		 * What we could do is:
 | 
					 | 
				
			||||||
		 * follow the file starting at fh[4], and record
 | 
					 | 
				
			||||||
		 * the ".." entry, and the name of the fh[2] entry.
 | 
					 | 
				
			||||||
		 * The follow the ".." file finding the next step up.
 | 
					 | 
				
			||||||
		 * This way we build a path to the root of
 | 
					 | 
				
			||||||
		 * the tree. If this works, we lookup the path and so
 | 
					 | 
				
			||||||
		 * get this inode into the cache.
 | 
					 | 
				
			||||||
		 * Finally try the fat_iget lookup again
 | 
					 | 
				
			||||||
		 * If that fails, then weare totally out of luck
 | 
					 | 
				
			||||||
		 * But all that is for another day
 | 
					 | 
				
			||||||
		 */
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if (!inode)
 | 
					 | 
				
			||||||
		return ERR_PTR(-ESTALE);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
	/* now to find a dentry.
 | 
						 * For now, do nothing if the inode is not found.
 | 
				
			||||||
	 * If possible, get a well-connected one
 | 
						 *
 | 
				
			||||||
 | 
						 * What we could do is:
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 *	- follow the file starting at fh[4], and record the ".." entry,
 | 
				
			||||||
 | 
						 *	  and the name of the fh[2] entry.
 | 
				
			||||||
 | 
						 *	- then follow the ".." file finding the next step up.
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * This way we build a path to the root of the tree. If this works, we
 | 
				
			||||||
 | 
						 * lookup the path and so get this inode into the cache.  Finally try
 | 
				
			||||||
 | 
						 * the fat_iget lookup again.  If that fails, then we are totally out
 | 
				
			||||||
 | 
						 * of luck.  But all that is for another day
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	result = d_alloc_anon(inode);
 | 
						result = d_obtain_alias(inode);
 | 
				
			||||||
	if (result == NULL) {
 | 
						if (!IS_ERR(result))
 | 
				
			||||||
		iput(inode);
 | 
							result->d_op = sb->s_root->d_op;
 | 
				
			||||||
		return ERR_PTR(-ENOMEM);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	result->d_op = sb->s_root->d_op;
 | 
					 | 
				
			||||||
	return result;
 | 
						return result;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -754,15 +745,8 @@ static struct dentry *fat_get_parent(struct dentry *child)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	inode = fat_build_inode(sb, de, i_pos);
 | 
						inode = fat_build_inode(sb, de, i_pos);
 | 
				
			||||||
	brelse(bh);
 | 
						brelse(bh);
 | 
				
			||||||
	if (IS_ERR(inode)) {
 | 
					
 | 
				
			||||||
		parent = ERR_CAST(inode);
 | 
						parent = d_obtain_alias(inode);
 | 
				
			||||||
		goto out;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	parent = d_alloc_anon(inode);
 | 
					 | 
				
			||||||
	if (!parent) {
 | 
					 | 
				
			||||||
		iput(inode);
 | 
					 | 
				
			||||||
		parent = ERR_PTR(-ENOMEM);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
out:
 | 
					out:
 | 
				
			||||||
	unlock_super(sb);
 | 
						unlock_super(sb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -596,12 +596,8 @@ static struct dentry *fuse_get_dentry(struct super_block *sb,
 | 
				
			||||||
	if (inode->i_generation != handle->generation)
 | 
						if (inode->i_generation != handle->generation)
 | 
				
			||||||
		goto out_iput;
 | 
							goto out_iput;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	entry = d_alloc_anon(inode);
 | 
						entry = d_obtain_alias(inode);
 | 
				
			||||||
	err = -ENOMEM;
 | 
						if (!IS_ERR(entry) && get_node_id(inode) != FUSE_ROOT_ID) {
 | 
				
			||||||
	if (!entry)
 | 
					 | 
				
			||||||
		goto out_iput;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (get_node_id(inode) != FUSE_ROOT_ID) {
 | 
					 | 
				
			||||||
		entry->d_op = &fuse_dentry_operations;
 | 
							entry->d_op = &fuse_dentry_operations;
 | 
				
			||||||
		fuse_invalidate_entry_cache(entry);
 | 
							fuse_invalidate_entry_cache(entry);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -696,17 +692,14 @@ static struct dentry *fuse_get_parent(struct dentry *child)
 | 
				
			||||||
	name.name = "..";
 | 
						name.name = "..";
 | 
				
			||||||
	err = fuse_lookup_name(child_inode->i_sb, get_node_id(child_inode),
 | 
						err = fuse_lookup_name(child_inode->i_sb, get_node_id(child_inode),
 | 
				
			||||||
			       &name, &outarg, &inode);
 | 
								       &name, &outarg, &inode);
 | 
				
			||||||
	if (err && err != -ENOENT)
 | 
						if (err) {
 | 
				
			||||||
 | 
							if (err == -ENOENT)
 | 
				
			||||||
 | 
								return ERR_PTR(-ESTALE);
 | 
				
			||||||
		return ERR_PTR(err);
 | 
							return ERR_PTR(err);
 | 
				
			||||||
	if (err || !inode)
 | 
					 | 
				
			||||||
		return ERR_PTR(-ESTALE);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	parent = d_alloc_anon(inode);
 | 
					 | 
				
			||||||
	if (!parent) {
 | 
					 | 
				
			||||||
		iput(inode);
 | 
					 | 
				
			||||||
		return ERR_PTR(-ENOMEM);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (get_node_id(inode) != FUSE_ROOT_ID) {
 | 
					
 | 
				
			||||||
 | 
						parent = d_obtain_alias(inode);
 | 
				
			||||||
 | 
						if (!IS_ERR(parent) && get_node_id(inode) != FUSE_ROOT_ID) {
 | 
				
			||||||
		parent->d_op = &fuse_dentry_operations;
 | 
							parent->d_op = &fuse_dentry_operations;
 | 
				
			||||||
		fuse_invalidate_entry_cache(parent);
 | 
							fuse_invalidate_entry_cache(parent);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -130,28 +130,17 @@ static int gfs2_get_name(struct dentry *parent, char *name,
 | 
				
			||||||
static struct dentry *gfs2_get_parent(struct dentry *child)
 | 
					static struct dentry *gfs2_get_parent(struct dentry *child)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct qstr dotdot;
 | 
						struct qstr dotdot;
 | 
				
			||||||
	struct inode *inode;
 | 
					 | 
				
			||||||
	struct dentry *dentry;
 | 
						struct dentry *dentry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	gfs2_str2qstr(&dotdot, "..");
 | 
					 | 
				
			||||||
	inode = gfs2_lookupi(child->d_inode, &dotdot, 1);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (!inode)
 | 
					 | 
				
			||||||
		return ERR_PTR(-ENOENT);
 | 
					 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * In case of an error, @inode carries the error value, and we
 | 
						 * XXX(hch): it would be a good idea to keep this around as a
 | 
				
			||||||
	 * have to return that as a(n invalid) pointer to dentry.
 | 
						 *	     static variable.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	if (IS_ERR(inode))
 | 
						gfs2_str2qstr(&dotdot, "..");
 | 
				
			||||||
		return ERR_CAST(inode);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dentry = d_alloc_anon(inode);
 | 
						dentry = d_obtain_alias(gfs2_lookupi(child->d_inode, &dotdot, 1));
 | 
				
			||||||
	if (!dentry) {
 | 
						if (!IS_ERR(dentry))
 | 
				
			||||||
		iput(inode);
 | 
							dentry->d_op = &gfs2_dops;
 | 
				
			||||||
		return ERR_PTR(-ENOMEM);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	dentry->d_op = &gfs2_dops;
 | 
					 | 
				
			||||||
	return dentry;
 | 
						return dentry;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -233,13 +222,9 @@ static struct dentry *gfs2_get_dentry(struct super_block *sb,
 | 
				
			||||||
	gfs2_glock_dq_uninit(&i_gh);
 | 
						gfs2_glock_dq_uninit(&i_gh);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
out_inode:
 | 
					out_inode:
 | 
				
			||||||
	dentry = d_alloc_anon(inode);
 | 
						dentry = d_obtain_alias(inode);
 | 
				
			||||||
	if (!dentry) {
 | 
						if (!IS_ERR(dentry))
 | 
				
			||||||
		iput(inode);
 | 
							dentry->d_op = &gfs2_dops;
 | 
				
			||||||
		return ERR_PTR(-ENOMEM);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	dentry->d_op = &gfs2_dops;
 | 
					 | 
				
			||||||
	return dentry;
 | 
						return dentry;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fail_rgd:
 | 
					fail_rgd:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,7 +22,7 @@ isofs_export_iget(struct super_block *sb,
 | 
				
			||||||
		  __u32 generation)
 | 
							  __u32 generation)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct inode *inode;
 | 
						struct inode *inode;
 | 
				
			||||||
	struct dentry *result;
 | 
					
 | 
				
			||||||
	if (block == 0)
 | 
						if (block == 0)
 | 
				
			||||||
		return ERR_PTR(-ESTALE);
 | 
							return ERR_PTR(-ESTALE);
 | 
				
			||||||
	inode = isofs_iget(sb, block, offset);
 | 
						inode = isofs_iget(sb, block, offset);
 | 
				
			||||||
| 
						 | 
					@ -32,12 +32,7 @@ isofs_export_iget(struct super_block *sb,
 | 
				
			||||||
		iput(inode);
 | 
							iput(inode);
 | 
				
			||||||
		return ERR_PTR(-ESTALE);
 | 
							return ERR_PTR(-ESTALE);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	result = d_alloc_anon(inode);
 | 
						return d_obtain_alias(inode);
 | 
				
			||||||
	if (!result) {
 | 
					 | 
				
			||||||
		iput(inode);
 | 
					 | 
				
			||||||
		return ERR_PTR(-ENOMEM);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return result;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* This function is surprisingly simple.  The trick is understanding
 | 
					/* This function is surprisingly simple.  The trick is understanding
 | 
				
			||||||
| 
						 | 
					@ -51,7 +46,6 @@ static struct dentry *isofs_export_get_parent(struct dentry *child)
 | 
				
			||||||
	unsigned long parent_offset = 0;
 | 
						unsigned long parent_offset = 0;
 | 
				
			||||||
	struct inode *child_inode = child->d_inode;
 | 
						struct inode *child_inode = child->d_inode;
 | 
				
			||||||
	struct iso_inode_info *e_child_inode = ISOFS_I(child_inode);
 | 
						struct iso_inode_info *e_child_inode = ISOFS_I(child_inode);
 | 
				
			||||||
	struct inode *parent_inode = NULL;
 | 
					 | 
				
			||||||
	struct iso_directory_record *de = NULL;
 | 
						struct iso_directory_record *de = NULL;
 | 
				
			||||||
	struct buffer_head * bh = NULL;
 | 
						struct buffer_head * bh = NULL;
 | 
				
			||||||
	struct dentry *rv = NULL;
 | 
						struct dentry *rv = NULL;
 | 
				
			||||||
| 
						 | 
					@ -104,28 +98,11 @@ static struct dentry *isofs_export_get_parent(struct dentry *child)
 | 
				
			||||||
	/* Normalize */
 | 
						/* Normalize */
 | 
				
			||||||
	isofs_normalize_block_and_offset(de, &parent_block, &parent_offset);
 | 
						isofs_normalize_block_and_offset(de, &parent_block, &parent_offset);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Get the inode. */
 | 
						rv = d_obtain_alias(isofs_iget(child_inode->i_sb, parent_block,
 | 
				
			||||||
	parent_inode = isofs_iget(child_inode->i_sb,
 | 
									     parent_offset));
 | 
				
			||||||
				  parent_block,
 | 
					 | 
				
			||||||
				  parent_offset);
 | 
					 | 
				
			||||||
	if (IS_ERR(parent_inode)) {
 | 
					 | 
				
			||||||
		rv = ERR_CAST(parent_inode);
 | 
					 | 
				
			||||||
		if (rv != ERR_PTR(-ENOMEM))
 | 
					 | 
				
			||||||
			rv = ERR_PTR(-EACCES);
 | 
					 | 
				
			||||||
		goto out;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	/* Allocate the dentry. */
 | 
					 | 
				
			||||||
	rv = d_alloc_anon(parent_inode);
 | 
					 | 
				
			||||||
	if (rv == NULL) {
 | 
					 | 
				
			||||||
		rv = ERR_PTR(-ENOMEM);
 | 
					 | 
				
			||||||
		goto out;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 out:
 | 
					 out:
 | 
				
			||||||
	if (bh) {
 | 
						if (bh)
 | 
				
			||||||
		brelse(bh);
 | 
							brelse(bh);
 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return rv;
 | 
						return rv;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1511,25 +1511,12 @@ struct dentry *jfs_fh_to_parent(struct super_block *sb, struct fid *fid,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct dentry *jfs_get_parent(struct dentry *dentry)
 | 
					struct dentry *jfs_get_parent(struct dentry *dentry)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct super_block *sb = dentry->d_inode->i_sb;
 | 
					 | 
				
			||||||
	struct dentry *parent = ERR_PTR(-ENOENT);
 | 
					 | 
				
			||||||
	struct inode *inode;
 | 
					 | 
				
			||||||
	unsigned long parent_ino;
 | 
						unsigned long parent_ino;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	parent_ino =
 | 
						parent_ino =
 | 
				
			||||||
		le32_to_cpu(JFS_IP(dentry->d_inode)->i_dtroot.header.idotdot);
 | 
							le32_to_cpu(JFS_IP(dentry->d_inode)->i_dtroot.header.idotdot);
 | 
				
			||||||
	inode = jfs_iget(sb, parent_ino);
 | 
					 | 
				
			||||||
	if (IS_ERR(inode)) {
 | 
					 | 
				
			||||||
		parent = ERR_CAST(inode);
 | 
					 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		parent = d_alloc_anon(inode);
 | 
					 | 
				
			||||||
		if (!parent) {
 | 
					 | 
				
			||||||
			parent = ERR_PTR(-ENOMEM);
 | 
					 | 
				
			||||||
			iput(inode);
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return parent;
 | 
						return d_obtain_alias(jfs_iget(dentry->d_inode->i_sb, parent_ino));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const struct inode_operations jfs_dir_inode_operations = {
 | 
					const struct inode_operations jfs_dir_inode_operations = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -107,11 +107,10 @@ struct dentry *nfs_get_root(struct super_block *sb, struct nfs_fh *mntfh)
 | 
				
			||||||
	 * if the dentry tree reaches them; however if the dentry already
 | 
						 * if the dentry tree reaches them; however if the dentry already
 | 
				
			||||||
	 * exists, we'll pick it up at this point and use it as the root
 | 
						 * exists, we'll pick it up at this point and use it as the root
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	mntroot = d_alloc_anon(inode);
 | 
						mntroot = d_obtain_alias(inode);
 | 
				
			||||||
	if (!mntroot) {
 | 
						if (IS_ERR(mntroot)) {
 | 
				
			||||||
		iput(inode);
 | 
					 | 
				
			||||||
		dprintk("nfs_get_root: get root dentry failed\n");
 | 
							dprintk("nfs_get_root: get root dentry failed\n");
 | 
				
			||||||
		return ERR_PTR(-ENOMEM);
 | 
							return mntroot;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	security_d_instantiate(mntroot, inode);
 | 
						security_d_instantiate(mntroot, inode);
 | 
				
			||||||
| 
						 | 
					@ -277,11 +276,10 @@ struct dentry *nfs4_get_root(struct super_block *sb, struct nfs_fh *mntfh)
 | 
				
			||||||
	 * if the dentry tree reaches them; however if the dentry already
 | 
						 * if the dentry tree reaches them; however if the dentry already
 | 
				
			||||||
	 * exists, we'll pick it up at this point and use it as the root
 | 
						 * exists, we'll pick it up at this point and use it as the root
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	mntroot = d_alloc_anon(inode);
 | 
						mntroot = d_obtain_alias(inode);
 | 
				
			||||||
	if (!mntroot) {
 | 
						if (IS_ERR(mntroot)) {
 | 
				
			||||||
		iput(inode);
 | 
					 | 
				
			||||||
		dprintk("nfs_get_root: get root dentry failed\n");
 | 
							dprintk("nfs_get_root: get root dentry failed\n");
 | 
				
			||||||
		return ERR_PTR(-ENOMEM);
 | 
							return mntroot;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	security_d_instantiate(mntroot, inode);
 | 
						security_d_instantiate(mntroot, inode);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -304,8 +304,6 @@ static struct dentry *ntfs_get_parent(struct dentry *child_dent)
 | 
				
			||||||
	ntfs_attr_search_ctx *ctx;
 | 
						ntfs_attr_search_ctx *ctx;
 | 
				
			||||||
	ATTR_RECORD *attr;
 | 
						ATTR_RECORD *attr;
 | 
				
			||||||
	FILE_NAME_ATTR *fn;
 | 
						FILE_NAME_ATTR *fn;
 | 
				
			||||||
	struct inode *parent_vi;
 | 
					 | 
				
			||||||
	struct dentry *parent_dent;
 | 
					 | 
				
			||||||
	unsigned long parent_ino;
 | 
						unsigned long parent_ino;
 | 
				
			||||||
	int err;
 | 
						int err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -345,24 +343,8 @@ static struct dentry *ntfs_get_parent(struct dentry *child_dent)
 | 
				
			||||||
	/* Release the search context and the mft record of the child. */
 | 
						/* Release the search context and the mft record of the child. */
 | 
				
			||||||
	ntfs_attr_put_search_ctx(ctx);
 | 
						ntfs_attr_put_search_ctx(ctx);
 | 
				
			||||||
	unmap_mft_record(ni);
 | 
						unmap_mft_record(ni);
 | 
				
			||||||
	/* Get the inode of the parent directory. */
 | 
					
 | 
				
			||||||
	parent_vi = ntfs_iget(vi->i_sb, parent_ino);
 | 
						return d_obtain_alias(ntfs_iget(vi->i_sb, parent_ino));
 | 
				
			||||||
	if (IS_ERR(parent_vi) || unlikely(is_bad_inode(parent_vi))) {
 | 
					 | 
				
			||||||
		if (!IS_ERR(parent_vi))
 | 
					 | 
				
			||||||
			iput(parent_vi);
 | 
					 | 
				
			||||||
		ntfs_error(vi->i_sb, "Failed to get parent directory inode "
 | 
					 | 
				
			||||||
				"0x%lx of child inode 0x%lx.", parent_ino,
 | 
					 | 
				
			||||||
				vi->i_ino);
 | 
					 | 
				
			||||||
		return ERR_PTR(-EACCES);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	/* Finally get a dentry for the parent directory and return it. */
 | 
					 | 
				
			||||||
	parent_dent = d_alloc_anon(parent_vi);
 | 
					 | 
				
			||||||
	if (unlikely(!parent_dent)) {
 | 
					 | 
				
			||||||
		iput(parent_vi);
 | 
					 | 
				
			||||||
		return ERR_PTR(-ENOMEM);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	ntfs_debug("Done for inode 0x%lx.", vi->i_ino);
 | 
					 | 
				
			||||||
	return parent_dent;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct inode *ntfs_nfs_get_inode(struct super_block *sb,
 | 
					static struct inode *ntfs_nfs_get_inode(struct super_block *sb,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -68,14 +68,9 @@ static struct dentry *ocfs2_get_dentry(struct super_block *sb,
 | 
				
			||||||
		return ERR_PTR(-ESTALE);
 | 
							return ERR_PTR(-ESTALE);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	result = d_alloc_anon(inode);
 | 
						result = d_obtain_alias(inode);
 | 
				
			||||||
 | 
						if (!IS_ERR(result))
 | 
				
			||||||
	if (!result) {
 | 
							result->d_op = &ocfs2_dentry_ops;
 | 
				
			||||||
		iput(inode);
 | 
					 | 
				
			||||||
		mlog_errno(-ENOMEM);
 | 
					 | 
				
			||||||
		return ERR_PTR(-ENOMEM);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	result->d_op = &ocfs2_dentry_ops;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mlog_exit_ptr(result);
 | 
						mlog_exit_ptr(result);
 | 
				
			||||||
	return result;
 | 
						return result;
 | 
				
			||||||
| 
						 | 
					@ -86,7 +81,6 @@ static struct dentry *ocfs2_get_parent(struct dentry *child)
 | 
				
			||||||
	int status;
 | 
						int status;
 | 
				
			||||||
	u64 blkno;
 | 
						u64 blkno;
 | 
				
			||||||
	struct dentry *parent;
 | 
						struct dentry *parent;
 | 
				
			||||||
	struct inode *inode;
 | 
					 | 
				
			||||||
	struct inode *dir = child->d_inode;
 | 
						struct inode *dir = child->d_inode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mlog_entry("(0x%p, '%.*s')\n", child,
 | 
						mlog_entry("(0x%p, '%.*s')\n", child,
 | 
				
			||||||
| 
						 | 
					@ -109,21 +103,9 @@ static struct dentry *ocfs2_get_parent(struct dentry *child)
 | 
				
			||||||
		goto bail_unlock;
 | 
							goto bail_unlock;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	inode = ocfs2_iget(OCFS2_SB(dir->i_sb), blkno, 0, 0);
 | 
						parent = d_obtain_alias(ocfs2_iget(OCFS2_SB(dir->i_sb), blkno, 0, 0));
 | 
				
			||||||
	if (IS_ERR(inode)) {
 | 
						if (!IS_ERR(parent))
 | 
				
			||||||
		mlog(ML_ERROR, "Unable to create inode %llu\n",
 | 
							parent->d_op = &ocfs2_dentry_ops;
 | 
				
			||||||
		     (unsigned long long)blkno);
 | 
					 | 
				
			||||||
		parent = ERR_PTR(-EACCES);
 | 
					 | 
				
			||||||
		goto bail_unlock;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	parent = d_alloc_anon(inode);
 | 
					 | 
				
			||||||
	if (!parent) {
 | 
					 | 
				
			||||||
		iput(inode);
 | 
					 | 
				
			||||||
		parent = ERR_PTR(-ENOMEM);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	parent->d_op = &ocfs2_dentry_ops;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
bail_unlock:
 | 
					bail_unlock:
 | 
				
			||||||
	ocfs2_inode_unlock(dir, 0);
 | 
						ocfs2_inode_unlock(dir, 0);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1522,7 +1522,6 @@ static struct dentry *reiserfs_get_dentry(struct super_block *sb,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct cpu_key key;
 | 
						struct cpu_key key;
 | 
				
			||||||
	struct dentry *result;
 | 
					 | 
				
			||||||
	struct inode *inode;
 | 
						struct inode *inode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	key.on_disk_key.k_objectid = objectid;
 | 
						key.on_disk_key.k_objectid = objectid;
 | 
				
			||||||
| 
						 | 
					@ -1535,16 +1534,8 @@ static struct dentry *reiserfs_get_dentry(struct super_block *sb,
 | 
				
			||||||
		inode = NULL;
 | 
							inode = NULL;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	reiserfs_write_unlock(sb);
 | 
						reiserfs_write_unlock(sb);
 | 
				
			||||||
	if (!inode)
 | 
					
 | 
				
			||||||
		inode = ERR_PTR(-ESTALE);
 | 
						return d_obtain_alias(inode);
 | 
				
			||||||
	if (IS_ERR(inode))
 | 
					 | 
				
			||||||
		return ERR_CAST(inode);
 | 
					 | 
				
			||||||
	result = d_alloc_anon(inode);
 | 
					 | 
				
			||||||
	if (!result) {
 | 
					 | 
				
			||||||
		iput(inode);
 | 
					 | 
				
			||||||
		return ERR_PTR(-ENOMEM);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return result;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct dentry *reiserfs_fh_to_dentry(struct super_block *sb, struct fid *fid,
 | 
					struct dentry *reiserfs_fh_to_dentry(struct super_block *sb, struct fid *fid,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -383,7 +383,6 @@ struct dentry *reiserfs_get_parent(struct dentry *child)
 | 
				
			||||||
	struct inode *inode = NULL;
 | 
						struct inode *inode = NULL;
 | 
				
			||||||
	struct reiserfs_dir_entry de;
 | 
						struct reiserfs_dir_entry de;
 | 
				
			||||||
	INITIALIZE_PATH(path_to_entry);
 | 
						INITIALIZE_PATH(path_to_entry);
 | 
				
			||||||
	struct dentry *parent;
 | 
					 | 
				
			||||||
	struct inode *dir = child->d_inode;
 | 
						struct inode *dir = child->d_inode;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (dir->i_nlink == 0) {
 | 
						if (dir->i_nlink == 0) {
 | 
				
			||||||
| 
						 | 
					@ -401,15 +400,7 @@ struct dentry *reiserfs_get_parent(struct dentry *child)
 | 
				
			||||||
	inode = reiserfs_iget(dir->i_sb, (struct cpu_key *)&(de.de_dir_id));
 | 
						inode = reiserfs_iget(dir->i_sb, (struct cpu_key *)&(de.de_dir_id));
 | 
				
			||||||
	reiserfs_write_unlock(dir->i_sb);
 | 
						reiserfs_write_unlock(dir->i_sb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!inode || IS_ERR(inode)) {
 | 
						return d_obtain_alias(inode);
 | 
				
			||||||
		return ERR_PTR(-EACCES);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	parent = d_alloc_anon(inode);
 | 
					 | 
				
			||||||
	if (!parent) {
 | 
					 | 
				
			||||||
		iput(inode);
 | 
					 | 
				
			||||||
		parent = ERR_PTR(-ENOMEM);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return parent;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* add entry to the directory (entry can be hidden). 
 | 
					/* add entry to the directory (entry can be hidden). 
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1243,7 +1243,6 @@ static int udf_rename(struct inode *old_dir, struct dentry *old_dentry,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct dentry *udf_get_parent(struct dentry *child)
 | 
					static struct dentry *udf_get_parent(struct dentry *child)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct dentry *parent;
 | 
					 | 
				
			||||||
	struct inode *inode = NULL;
 | 
						struct inode *inode = NULL;
 | 
				
			||||||
	struct dentry dotdot;
 | 
						struct dentry dotdot;
 | 
				
			||||||
	struct fileIdentDesc cfi;
 | 
						struct fileIdentDesc cfi;
 | 
				
			||||||
| 
						 | 
					@ -1266,13 +1265,7 @@ static struct dentry *udf_get_parent(struct dentry *child)
 | 
				
			||||||
		goto out_unlock;
 | 
							goto out_unlock;
 | 
				
			||||||
	unlock_kernel();
 | 
						unlock_kernel();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	parent = d_alloc_anon(inode);
 | 
						return d_obtain_alias(inode);
 | 
				
			||||||
	if (!parent) {
 | 
					 | 
				
			||||||
		iput(inode);
 | 
					 | 
				
			||||||
		parent = ERR_PTR(-ENOMEM);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return parent;
 | 
					 | 
				
			||||||
out_unlock:
 | 
					out_unlock:
 | 
				
			||||||
	unlock_kernel();
 | 
						unlock_kernel();
 | 
				
			||||||
	return ERR_PTR(-EACCES);
 | 
						return ERR_PTR(-EACCES);
 | 
				
			||||||
| 
						 | 
					@ -1283,7 +1276,6 @@ static struct dentry *udf_nfs_get_inode(struct super_block *sb, u32 block,
 | 
				
			||||||
					u16 partref, __u32 generation)
 | 
										u16 partref, __u32 generation)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct inode *inode;
 | 
						struct inode *inode;
 | 
				
			||||||
	struct dentry *result;
 | 
					 | 
				
			||||||
	kernel_lb_addr loc;
 | 
						kernel_lb_addr loc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (block == 0)
 | 
						if (block == 0)
 | 
				
			||||||
| 
						 | 
					@ -1300,12 +1292,7 @@ static struct dentry *udf_nfs_get_inode(struct super_block *sb, u32 block,
 | 
				
			||||||
		iput(inode);
 | 
							iput(inode);
 | 
				
			||||||
		return ERR_PTR(-ESTALE);
 | 
							return ERR_PTR(-ESTALE);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	result = d_alloc_anon(inode);
 | 
						return d_obtain_alias(inode);
 | 
				
			||||||
	if (!result) {
 | 
					 | 
				
			||||||
		iput(inode);
 | 
					 | 
				
			||||||
		return ERR_PTR(-ENOMEM);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return result;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct dentry *udf_fh_to_dentry(struct super_block *sb,
 | 
					static struct dentry *udf_fh_to_dentry(struct super_block *sb,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -148,7 +148,6 @@ xfs_fs_fh_to_dentry(struct super_block *sb, struct fid *fid,
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct xfs_fid64	*fid64 = (struct xfs_fid64 *)fid;
 | 
						struct xfs_fid64	*fid64 = (struct xfs_fid64 *)fid;
 | 
				
			||||||
	struct inode		*inode = NULL;
 | 
						struct inode		*inode = NULL;
 | 
				
			||||||
	struct dentry		*result;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (fh_len < xfs_fileid_length(fileid_type))
 | 
						if (fh_len < xfs_fileid_length(fileid_type))
 | 
				
			||||||
		return NULL;
 | 
							return NULL;
 | 
				
			||||||
| 
						 | 
					@ -164,16 +163,7 @@ xfs_fs_fh_to_dentry(struct super_block *sb, struct fid *fid,
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!inode)
 | 
						return d_obtain_alias(inode);
 | 
				
			||||||
		return NULL;
 | 
					 | 
				
			||||||
	if (IS_ERR(inode))
 | 
					 | 
				
			||||||
		return ERR_CAST(inode);
 | 
					 | 
				
			||||||
	result = d_alloc_anon(inode);
 | 
					 | 
				
			||||||
	if (!result) {
 | 
					 | 
				
			||||||
		iput(inode);
 | 
					 | 
				
			||||||
		return ERR_PTR(-ENOMEM);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return result;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
STATIC struct dentry *
 | 
					STATIC struct dentry *
 | 
				
			||||||
| 
						 | 
					@ -182,7 +172,6 @@ xfs_fs_fh_to_parent(struct super_block *sb, struct fid *fid,
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct xfs_fid64	*fid64 = (struct xfs_fid64 *)fid;
 | 
						struct xfs_fid64	*fid64 = (struct xfs_fid64 *)fid;
 | 
				
			||||||
	struct inode		*inode = NULL;
 | 
						struct inode		*inode = NULL;
 | 
				
			||||||
	struct dentry		*result;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	switch (fileid_type) {
 | 
						switch (fileid_type) {
 | 
				
			||||||
	case FILEID_INO32_GEN_PARENT:
 | 
						case FILEID_INO32_GEN_PARENT:
 | 
				
			||||||
| 
						 | 
					@ -195,16 +184,7 @@ xfs_fs_fh_to_parent(struct super_block *sb, struct fid *fid,
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!inode)
 | 
						return d_obtain_alias(inode);
 | 
				
			||||||
		return NULL;
 | 
					 | 
				
			||||||
	if (IS_ERR(inode))
 | 
					 | 
				
			||||||
		return ERR_CAST(inode);
 | 
					 | 
				
			||||||
	result = d_alloc_anon(inode);
 | 
					 | 
				
			||||||
	if (!result) {
 | 
					 | 
				
			||||||
		iput(inode);
 | 
					 | 
				
			||||||
		return ERR_PTR(-ENOMEM);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return result;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
STATIC struct dentry *
 | 
					STATIC struct dentry *
 | 
				
			||||||
| 
						 | 
					@ -213,18 +193,12 @@ xfs_fs_get_parent(
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int			error;
 | 
						int			error;
 | 
				
			||||||
	struct xfs_inode	*cip;
 | 
						struct xfs_inode	*cip;
 | 
				
			||||||
	struct dentry		*parent;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	error = xfs_lookup(XFS_I(child->d_inode), &xfs_name_dotdot, &cip, NULL);
 | 
						error = xfs_lookup(XFS_I(child->d_inode), &xfs_name_dotdot, &cip, NULL);
 | 
				
			||||||
	if (unlikely(error))
 | 
						if (unlikely(error))
 | 
				
			||||||
		return ERR_PTR(-error);
 | 
							return ERR_PTR(-error);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	parent = d_alloc_anon(VFS_I(cip));
 | 
						return d_obtain_alias(VFS_I(cip));
 | 
				
			||||||
	if (unlikely(!parent)) {
 | 
					 | 
				
			||||||
		iput(VFS_I(cip));
 | 
					 | 
				
			||||||
		return ERR_PTR(-ENOMEM);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return parent;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const struct export_operations xfs_export_operations = {
 | 
					const struct export_operations xfs_export_operations = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -311,11 +311,10 @@ xfs_open_by_handle(
 | 
				
			||||||
		return new_fd;
 | 
							return new_fd;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dentry = d_alloc_anon(inode);
 | 
						dentry = d_obtain_alias(inode);
 | 
				
			||||||
	if (dentry == NULL) {
 | 
						if (IS_ERR(dentry)) {
 | 
				
			||||||
		iput(inode);
 | 
					 | 
				
			||||||
		put_unused_fd(new_fd);
 | 
							put_unused_fd(new_fd);
 | 
				
			||||||
		return -XFS_ERROR(ENOMEM);
 | 
							return PTR_ERR(dentry);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Ensure umount returns EBUSY on umounts while this file is open. */
 | 
						/* Ensure umount returns EBUSY on umounts while this file is open. */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue