|
@@ -452,7 +452,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);
|
|
|
}
|
|
|
|
|
@@ -486,17 +488,21 @@ 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);
|
|
|
return PTR_ERR(dentry);
|
|
|
}
|
|
|
|
|
|
- down_read(&REISERFS_I(inode)->i_xattr_sem);
|
|
|
+ down_write(&REISERFS_I(inode)->i_xattr_sem);
|
|
|
|
|
|
reiserfs_write_lock(inode->i_sb);
|
|
|
|
|
@@ -554,8 +560,12 @@ reiserfs_xattr_set_handle(struct reiserfs_transaction_handle *th,
|
|
|
.ia_size = buffer_size,
|
|
|
.ia_valid = ATTR_SIZE | ATTR_CTIME,
|
|
|
};
|
|
|
+
|
|
|
+ reiserfs_write_unlock(inode->i_sb);
|
|
|
mutex_lock_nested(&dentry->d_inode->i_mutex, I_MUTEX_XATTR);
|
|
|
down_write(&dentry->d_inode->i_alloc_sem);
|
|
|
+ reiserfs_write_lock(inode->i_sb);
|
|
|
+
|
|
|
err = reiserfs_setattr(dentry, &newattrs);
|
|
|
up_write(&dentry->d_inode->i_alloc_sem);
|
|
|
mutex_unlock(&dentry->d_inode->i_mutex);
|