parallel lookups: actual switch to rwsem
ta-da! The main issue is the lack of down_write_killable(), so the places like readdir.c switched to plain inode_lock(); once killable variants of rwsem primitives appear, that'll be dealt with. lockdep side also might need more work Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
@@ -2932,7 +2932,8 @@ struct dentry *d_ancestor(struct dentry *p1, struct dentry *p2)
|
||||
static int __d_unalias(struct inode *inode,
|
||||
struct dentry *dentry, struct dentry *alias)
|
||||
{
|
||||
struct mutex *m1 = NULL, *m2 = NULL;
|
||||
struct mutex *m1 = NULL;
|
||||
struct rw_semaphore *m2 = NULL;
|
||||
int ret = -ESTALE;
|
||||
|
||||
/* If alias and dentry share a parent, then no extra locks required */
|
||||
@@ -2943,15 +2944,15 @@ static int __d_unalias(struct inode *inode,
|
||||
if (!mutex_trylock(&dentry->d_sb->s_vfs_rename_mutex))
|
||||
goto out_err;
|
||||
m1 = &dentry->d_sb->s_vfs_rename_mutex;
|
||||
if (!inode_trylock(alias->d_parent->d_inode))
|
||||
if (!inode_trylock_shared(alias->d_parent->d_inode))
|
||||
goto out_err;
|
||||
m2 = &alias->d_parent->d_inode->i_mutex;
|
||||
m2 = &alias->d_parent->d_inode->i_rwsem;
|
||||
out_unalias:
|
||||
__d_move(alias, dentry, false);
|
||||
ret = 0;
|
||||
out_err:
|
||||
if (m2)
|
||||
mutex_unlock(m2);
|
||||
up_read(m2);
|
||||
if (m1)
|
||||
mutex_unlock(m1);
|
||||
return ret;
|
||||
|
Reference in New Issue
Block a user