reiserfs: Fix reiserfs lock <-> i_mutex dependency inversion on xattr
[platform/adaptation/renesas_rcar/renesas_kernel.git] / fs / reiserfs / xattr.c
index 8891cd8..c320c77 100644 (file)
@@ -234,17 +234,22 @@ static int reiserfs_for_each_xattr(struct inode *inode,
        if (IS_PRIVATE(inode) || get_inode_sd_version(inode) == STAT_DATA_V1)
                return 0;
 
+       reiserfs_write_unlock(inode->i_sb);
        dir = open_xa_dir(inode, XATTR_REPLACE);
        if (IS_ERR(dir)) {
                err = PTR_ERR(dir);
+               reiserfs_write_lock(inode->i_sb);
                goto out;
        } else if (!dir->d_inode) {
                err = 0;
+               reiserfs_write_lock(inode->i_sb);
                goto out_dir;
        }
 
-       reiserfs_mutex_lock_nested_safe(&dir->d_inode->i_mutex, I_MUTEX_XATTR,
-                                       inode->i_sb);
+       mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_XATTR);
+
+       reiserfs_write_lock(inode->i_sb);
+
        buf.xadir = dir;
        err = reiserfs_readdir_dentry(dir, &buf, fill_with_dentries, &pos);
        while ((err == 0 || err == -ENOSPC) && buf.count) {
@@ -484,7 +489,7 @@ reiserfs_xattr_set_handle(struct reiserfs_transaction_handle *th,
        if (IS_ERR(dentry))
                return PTR_ERR(dentry);
 
-       down_write(&REISERFS_I(inode)->i_xattr_sem);
+       reiserfs_down_read_safe(&REISERFS_I(inode)->i_xattr_sem, inode->i_sb);
 
        xahash = xattr_hash(buffer, buffer_size);
        while (buffer_pos < buffer_size || buffer_pos == 0) {