diff options
Diffstat (limited to 'fs/btrfs/xattr.c')
-rw-r--r-- | fs/btrfs/xattr.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/fs/btrfs/xattr.c b/fs/btrfs/xattr.c index 3f4e2d69e83a..446a6848c554 100644 --- a/fs/btrfs/xattr.c +++ b/fs/btrfs/xattr.c | |||
@@ -122,6 +122,16 @@ static int do_setxattr(struct btrfs_trans_handle *trans, | |||
122 | */ | 122 | */ |
123 | if (!value) | 123 | if (!value) |
124 | goto out; | 124 | goto out; |
125 | } else { | ||
126 | di = btrfs_lookup_xattr(NULL, root, path, btrfs_ino(inode), | ||
127 | name, name_len, 0); | ||
128 | if (IS_ERR(di)) { | ||
129 | ret = PTR_ERR(di); | ||
130 | goto out; | ||
131 | } | ||
132 | if (!di && !value) | ||
133 | goto out; | ||
134 | btrfs_release_path(path); | ||
125 | } | 135 | } |
126 | 136 | ||
127 | again: | 137 | again: |
@@ -198,6 +208,7 @@ int __btrfs_setxattr(struct btrfs_trans_handle *trans, | |||
198 | 208 | ||
199 | inode_inc_iversion(inode); | 209 | inode_inc_iversion(inode); |
200 | inode->i_ctime = CURRENT_TIME; | 210 | inode->i_ctime = CURRENT_TIME; |
211 | set_bit(BTRFS_INODE_COPY_EVERYTHING, &BTRFS_I(inode)->runtime_flags); | ||
201 | ret = btrfs_update_inode(trans, root, inode); | 212 | ret = btrfs_update_inode(trans, root, inode); |
202 | BUG_ON(ret); | 213 | BUG_ON(ret); |
203 | out: | 214 | out: |
@@ -265,7 +276,7 @@ ssize_t btrfs_listxattr(struct dentry *dentry, char *buffer, size_t size) | |||
265 | 276 | ||
266 | di = btrfs_item_ptr(leaf, slot, struct btrfs_dir_item); | 277 | di = btrfs_item_ptr(leaf, slot, struct btrfs_dir_item); |
267 | if (verify_dir_item(root, leaf, di)) | 278 | if (verify_dir_item(root, leaf, di)) |
268 | continue; | 279 | goto next; |
269 | 280 | ||
270 | name_len = btrfs_dir_name_len(leaf, di); | 281 | name_len = btrfs_dir_name_len(leaf, di); |
271 | total_size += name_len + 1; | 282 | total_size += name_len + 1; |