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:
@@ -647,7 +647,7 @@ struct inode {
|
||||
|
||||
/* Misc */
|
||||
unsigned long i_state;
|
||||
struct mutex i_mutex;
|
||||
struct rw_semaphore i_rwsem;
|
||||
|
||||
unsigned long dirtied_when; /* jiffies of first dirtying */
|
||||
unsigned long dirtied_time_when;
|
||||
@@ -734,27 +734,42 @@ enum inode_i_mutex_lock_class
|
||||
|
||||
static inline void inode_lock(struct inode *inode)
|
||||
{
|
||||
mutex_lock(&inode->i_mutex);
|
||||
down_write(&inode->i_rwsem);
|
||||
}
|
||||
|
||||
static inline void inode_unlock(struct inode *inode)
|
||||
{
|
||||
mutex_unlock(&inode->i_mutex);
|
||||
up_write(&inode->i_rwsem);
|
||||
}
|
||||
|
||||
static inline void inode_lock_shared(struct inode *inode)
|
||||
{
|
||||
down_read(&inode->i_rwsem);
|
||||
}
|
||||
|
||||
static inline void inode_unlock_shared(struct inode *inode)
|
||||
{
|
||||
up_read(&inode->i_rwsem);
|
||||
}
|
||||
|
||||
static inline int inode_trylock(struct inode *inode)
|
||||
{
|
||||
return mutex_trylock(&inode->i_mutex);
|
||||
return down_write_trylock(&inode->i_rwsem);
|
||||
}
|
||||
|
||||
static inline int inode_trylock_shared(struct inode *inode)
|
||||
{
|
||||
return down_read_trylock(&inode->i_rwsem);
|
||||
}
|
||||
|
||||
static inline int inode_is_locked(struct inode *inode)
|
||||
{
|
||||
return mutex_is_locked(&inode->i_mutex);
|
||||
return rwsem_is_locked(&inode->i_rwsem);
|
||||
}
|
||||
|
||||
static inline void inode_lock_nested(struct inode *inode, unsigned subclass)
|
||||
{
|
||||
mutex_lock_nested(&inode->i_mutex, subclass);
|
||||
down_write_nested(&inode->i_rwsem, subclass);
|
||||
}
|
||||
|
||||
void lock_two_nondirectories(struct inode *, struct inode*);
|
||||
|
||||
Reference in New Issue
Block a user