mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-03 07:38:10 +00:00
iget/iget5: don't bother with ->i_lock until we find a match
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
b18825a7c8
commit
5a3cd99285
4 changed files with 18 additions and 18 deletions
|
@ -455,3 +455,11 @@ in your dentry operations instead.
|
||||||
vfs_follow_link has been removed. Filesystems must use nd_set_link
|
vfs_follow_link has been removed. Filesystems must use nd_set_link
|
||||||
from ->follow_link for normal symlinks, or nd_jump_link for magic
|
from ->follow_link for normal symlinks, or nd_jump_link for magic
|
||||||
/proc/<pid> style links.
|
/proc/<pid> style links.
|
||||||
|
--
|
||||||
|
[mandatory]
|
||||||
|
iget5_locked()/ilookup5()/ilookup5_nowait() test() callback used to be
|
||||||
|
called with both ->i_lock and inode_hash_lock held; the former is *not*
|
||||||
|
taken anymore, so verify that your callbacks do not rely on it (none
|
||||||
|
of the in-tree instances did). inode_hash_lock is still held,
|
||||||
|
of course, so they are still serialized wrt removal from inode hash,
|
||||||
|
as well as wrt set() callback of iget5_locked().
|
||||||
|
|
|
@ -83,7 +83,7 @@ int ll_unlock(__u32 mode, struct lustre_handle *lockh)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* called from iget5_locked->find_inode() under inode_lock spinlock */
|
/* called from iget5_locked->find_inode() under inode_hash_lock spinlock */
|
||||||
static int ll_test_inode(struct inode *inode, void *opaque)
|
static int ll_test_inode(struct inode *inode, void *opaque)
|
||||||
{
|
{
|
||||||
struct ll_inode_info *lli = ll_i2info(inode);
|
struct ll_inode_info *lli = ll_i2info(inode);
|
||||||
|
|
24
fs/inode.c
24
fs/inode.c
|
@ -773,15 +773,11 @@ static struct inode *find_inode(struct super_block *sb,
|
||||||
|
|
||||||
repeat:
|
repeat:
|
||||||
hlist_for_each_entry(inode, head, i_hash) {
|
hlist_for_each_entry(inode, head, i_hash) {
|
||||||
|
if (inode->i_sb != sb)
|
||||||
|
continue;
|
||||||
|
if (!test(inode, data))
|
||||||
|
continue;
|
||||||
spin_lock(&inode->i_lock);
|
spin_lock(&inode->i_lock);
|
||||||
if (inode->i_sb != sb) {
|
|
||||||
spin_unlock(&inode->i_lock);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!test(inode, data)) {
|
|
||||||
spin_unlock(&inode->i_lock);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (inode->i_state & (I_FREEING|I_WILL_FREE)) {
|
if (inode->i_state & (I_FREEING|I_WILL_FREE)) {
|
||||||
__wait_on_freeing_inode(inode);
|
__wait_on_freeing_inode(inode);
|
||||||
goto repeat;
|
goto repeat;
|
||||||
|
@ -804,15 +800,11 @@ static struct inode *find_inode_fast(struct super_block *sb,
|
||||||
|
|
||||||
repeat:
|
repeat:
|
||||||
hlist_for_each_entry(inode, head, i_hash) {
|
hlist_for_each_entry(inode, head, i_hash) {
|
||||||
|
if (inode->i_ino != ino)
|
||||||
|
continue;
|
||||||
|
if (inode->i_sb != sb)
|
||||||
|
continue;
|
||||||
spin_lock(&inode->i_lock);
|
spin_lock(&inode->i_lock);
|
||||||
if (inode->i_ino != ino) {
|
|
||||||
spin_unlock(&inode->i_lock);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (inode->i_sb != sb) {
|
|
||||||
spin_unlock(&inode->i_lock);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (inode->i_state & (I_FREEING|I_WILL_FREE)) {
|
if (inode->i_state & (I_FREEING|I_WILL_FREE)) {
|
||||||
__wait_on_freeing_inode(inode);
|
__wait_on_freeing_inode(inode);
|
||||||
goto repeat;
|
goto repeat;
|
||||||
|
|
|
@ -55,7 +55,7 @@
|
||||||
*
|
*
|
||||||
* Return 1 if the attributes match and 0 if not.
|
* Return 1 if the attributes match and 0 if not.
|
||||||
*
|
*
|
||||||
* NOTE: This function runs with the inode->i_lock spin lock held so it is not
|
* NOTE: This function runs with the inode_hash_lock spin lock held so it is not
|
||||||
* allowed to sleep.
|
* allowed to sleep.
|
||||||
*/
|
*/
|
||||||
int ntfs_test_inode(struct inode *vi, ntfs_attr *na)
|
int ntfs_test_inode(struct inode *vi, ntfs_attr *na)
|
||||||
|
|
Loading…
Reference in a new issue