reiserfs: Relax lock on xattr removing
When we remove an xattr, we call lookup_and_delete_xattr() that takes some private xattr inodes mutexes. But we hold the reiserfs lock at this time, which leads to dependency inversions. We can safely call lookup_and_delete_xattr() without the reiserfs lock, where xattr inodes lookups only need the xattr inodes mutexes. Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Christian Kujau <lists@nerdbynature.de> Cc: Alexander Beregalov <a.beregalov@gmail.com> Cc: Chris Mason <chris.mason@oracle.com> Cc: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Родитель
108d3943c0
Коммит
4f3be1b5a9
|
@ -451,7 +451,9 @@ static int lookup_and_delete_xattr(struct inode *inode, const char *name)
|
|||
}
|
||||
|
||||
if (dentry->d_inode) {
|
||||
reiserfs_write_lock(inode->i_sb);
|
||||
err = xattr_unlink(xadir->d_inode, dentry);
|
||||
reiserfs_write_unlock(inode->i_sb);
|
||||
update_ctime(inode);
|
||||
}
|
||||
|
||||
|
@ -485,10 +487,14 @@ reiserfs_xattr_set_handle(struct reiserfs_transaction_handle *th,
|
|||
if (get_inode_sd_version(inode) == STAT_DATA_V1)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (!buffer)
|
||||
return lookup_and_delete_xattr(inode, name);
|
||||
|
||||
reiserfs_write_unlock(inode->i_sb);
|
||||
|
||||
if (!buffer) {
|
||||
err = lookup_and_delete_xattr(inode, name);
|
||||
reiserfs_write_lock(inode->i_sb);
|
||||
return err;
|
||||
}
|
||||
|
||||
dentry = xattr_lookup(inode, name, flags);
|
||||
if (IS_ERR(dentry)) {
|
||||
reiserfs_write_lock(inode->i_sb);
|
||||
|
|
Загрузка…
Ссылка в новой задаче