diff options
author | Christoph Hellwig <hch@infradead.org> | 2008-04-22 03:34:06 -0400 |
---|---|---|
committer | Lachlan McIlroy <lachlan@redback.melbourne.sgi.com> | 2008-04-29 01:54:12 -0400 |
commit | cfa853e47df4fbee441ac0ac3fb592f076233145 (patch) | |
tree | 7e4baafba5ee0f05561580c301c5d360236063f3 /fs/xfs/xfs_utils.c | |
parent | 579aa9caf552c639fc78168db4cfe7ffcf00c3b3 (diff) |
[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>
Diffstat (limited to 'fs/xfs/xfs_utils.c')
-rw-r--r-- | fs/xfs/xfs_utils.c | 43 |
1 files changed, 0 insertions, 43 deletions
diff --git a/fs/xfs/xfs_utils.c b/fs/xfs/xfs_utils.c index 27075c9060ef..98e5f110ba5f 100644 --- a/fs/xfs/xfs_utils.c +++ b/fs/xfs/xfs_utils.c | |||
@@ -41,49 +41,6 @@ | |||
41 | #include "xfs_utils.h" | 41 | #include "xfs_utils.h" |
42 | 42 | ||
43 | 43 | ||
44 | int | ||
45 | xfs_dir_lookup_int( | ||
46 | xfs_inode_t *dp, | ||
47 | uint lock_mode, | ||
48 | struct xfs_name *name, | ||
49 | xfs_ino_t *inum, | ||
50 | xfs_inode_t **ipp) | ||
51 | { | ||
52 | int error; | ||
53 | |||
54 | xfs_itrace_entry(dp); | ||
55 | |||
56 | error = xfs_dir_lookup(NULL, dp, name, inum); | ||
57 | if (!error) { | ||
58 | /* | ||
59 | * Unlock the directory. We do this because we can't | ||
60 | * hold the directory lock while doing the vn_get() | ||
61 | * in xfs_iget(). Doing so could cause us to hold | ||
62 | * a lock while waiting for the inode to finish | ||
63 | * being inactive while it's waiting for a log | ||
64 | * reservation in the inactive routine. | ||
65 | */ | ||
66 | xfs_iunlock(dp, lock_mode); | ||
67 | error = xfs_iget(dp->i_mount, NULL, *inum, 0, 0, ipp, 0); | ||
68 | xfs_ilock(dp, lock_mode); | ||
69 | |||
70 | if (error) { | ||
71 | *ipp = NULL; | ||
72 | } else if ((*ipp)->i_d.di_mode == 0) { | ||
73 | /* | ||
74 | * The inode has been freed. Something is | ||
75 | * wrong so just get out of here. | ||
76 | */ | ||
77 | xfs_iunlock(dp, lock_mode); | ||
78 | xfs_iput_new(*ipp, 0); | ||
79 | *ipp = NULL; | ||
80 | xfs_ilock(dp, lock_mode); | ||
81 | error = XFS_ERROR(ENOENT); | ||
82 | } | ||
83 | } | ||
84 | return error; | ||
85 | } | ||
86 | |||
87 | /* | 44 | /* |
88 | * Allocates a new inode from disk and return a pointer to the | 45 | * Allocates a new inode from disk and return a pointer to the |
89 | * incore copy. This routine will internally commit the current | 46 | * incore copy. This routine will internally commit the current |