mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
[XFS] remove manual lookup from xfs_rename and simplify locking
->rename already gets the target inode passed if it exits. Pass it down to xfs_rename so that we can avoid looking it up again. Also simplify locking as the first lock section in xfs_rename can go away now: the isdir is an invariant over the lifetime of the inode, and new_parent and the nlink check are namespace topology protected by i_mutex in the VFS. The projid check needs to move into the second lock section anyway to not be racy. Also kill the now unused xfs_dir_lookup_int and remove the now-unused first_locked argumet to xfs_lock_inodes. SGI-PV: 976035 SGI-Modid: xfs-linux-melb:xfs-kern:30903a Signed-off-by: Christoph Hellwig <hch@infradead.org> Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
This commit is contained in:
parent
579aa9caf5
commit
cfa853e47d
8 changed files with 62 additions and 207 deletions
|
@ -41,49 +41,6 @@
|
|||
#include "xfs_utils.h"
|
||||
|
||||
|
||||
int
|
||||
xfs_dir_lookup_int(
|
||||
xfs_inode_t *dp,
|
||||
uint lock_mode,
|
||||
struct xfs_name *name,
|
||||
xfs_ino_t *inum,
|
||||
xfs_inode_t **ipp)
|
||||
{
|
||||
int error;
|
||||
|
||||
xfs_itrace_entry(dp);
|
||||
|
||||
error = xfs_dir_lookup(NULL, dp, name, inum);
|
||||
if (!error) {
|
||||
/*
|
||||
* Unlock the directory. We do this because we can't
|
||||
* hold the directory lock while doing the vn_get()
|
||||
* in xfs_iget(). Doing so could cause us to hold
|
||||
* a lock while waiting for the inode to finish
|
||||
* being inactive while it's waiting for a log
|
||||
* reservation in the inactive routine.
|
||||
*/
|
||||
xfs_iunlock(dp, lock_mode);
|
||||
error = xfs_iget(dp->i_mount, NULL, *inum, 0, 0, ipp, 0);
|
||||
xfs_ilock(dp, lock_mode);
|
||||
|
||||
if (error) {
|
||||
*ipp = NULL;
|
||||
} else if ((*ipp)->i_d.di_mode == 0) {
|
||||
/*
|
||||
* The inode has been freed. Something is
|
||||
* wrong so just get out of here.
|
||||
*/
|
||||
xfs_iunlock(dp, lock_mode);
|
||||
xfs_iput_new(*ipp, 0);
|
||||
*ipp = NULL;
|
||||
xfs_ilock(dp, lock_mode);
|
||||
error = XFS_ERROR(ENOENT);
|
||||
}
|
||||
}
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocates a new inode from disk and return a pointer to the
|
||||
* incore copy. This routine will internally commit the current
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue