aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/xattr.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/xattr.c')
-rw-r--r--fs/btrfs/xattr.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/fs/btrfs/xattr.c b/fs/btrfs/xattr.c
index 193b58f7d3f3..a5776531dc2b 100644
--- a/fs/btrfs/xattr.c
+++ b/fs/btrfs/xattr.c
@@ -154,15 +154,10 @@ int __btrfs_setxattr(struct btrfs_trans_handle *trans,
154 if (trans) 154 if (trans)
155 return do_setxattr(trans, inode, name, value, size, flags); 155 return do_setxattr(trans, inode, name, value, size, flags);
156 156
157 ret = btrfs_reserve_metadata_space(root, 2); 157 trans = btrfs_start_transaction(root, 2);
158 if (ret) 158 if (IS_ERR(trans))
159 return ret; 159 return PTR_ERR(trans);
160 160
161 trans = btrfs_start_transaction(root, 1);
162 if (!trans) {
163 ret = -ENOMEM;
164 goto out;
165 }
166 btrfs_set_trans_block_group(trans, inode); 161 btrfs_set_trans_block_group(trans, inode);
167 162
168 ret = do_setxattr(trans, inode, name, value, size, flags); 163 ret = do_setxattr(trans, inode, name, value, size, flags);
@@ -174,7 +169,6 @@ int __btrfs_setxattr(struct btrfs_trans_handle *trans,
174 BUG_ON(ret); 169 BUG_ON(ret);
175out: 170out:
176 btrfs_end_transaction_throttle(trans, root); 171 btrfs_end_transaction_throttle(trans, root);
177 btrfs_unreserve_metadata_space(root, 2);
178 return ret; 172 return ret;
179} 173}
180 174
@@ -184,7 +178,6 @@ ssize_t btrfs_listxattr(struct dentry *dentry, char *buffer, size_t size)
184 struct inode *inode = dentry->d_inode; 178 struct inode *inode = dentry->d_inode;
185 struct btrfs_root *root = BTRFS_I(inode)->root; 179 struct btrfs_root *root = BTRFS_I(inode)->root;
186 struct btrfs_path *path; 180 struct btrfs_path *path;
187 struct btrfs_item *item;
188 struct extent_buffer *leaf; 181 struct extent_buffer *leaf;
189 struct btrfs_dir_item *di; 182 struct btrfs_dir_item *di;
190 int ret = 0, slot, advance; 183 int ret = 0, slot, advance;
@@ -240,7 +233,6 @@ ssize_t btrfs_listxattr(struct dentry *dentry, char *buffer, size_t size)
240 } 233 }
241 advance = 1; 234 advance = 1;
242 235
243 item = btrfs_item_nr(leaf, slot);
244 btrfs_item_key_to_cpu(leaf, &found_key, slot); 236 btrfs_item_key_to_cpu(leaf, &found_key, slot);
245 237
246 /* check to make sure this item is what we want */ 238 /* check to make sure this item is what we want */
@@ -282,7 +274,7 @@ err:
282 * List of handlers for synthetic system.* attributes. All real ondisk 274 * List of handlers for synthetic system.* attributes. All real ondisk
283 * attributes are handled directly. 275 * attributes are handled directly.
284 */ 276 */
285struct xattr_handler *btrfs_xattr_handlers[] = { 277const struct xattr_handler *btrfs_xattr_handlers[] = {
286#ifdef CONFIG_BTRFS_FS_POSIX_ACL 278#ifdef CONFIG_BTRFS_FS_POSIX_ACL
287 &btrfs_xattr_acl_access_handler, 279 &btrfs_xattr_acl_access_handler,
288 &btrfs_xattr_acl_default_handler, 280 &btrfs_xattr_acl_default_handler,
@@ -324,6 +316,15 @@ ssize_t btrfs_getxattr(struct dentry *dentry, const char *name,
324int btrfs_setxattr(struct dentry *dentry, const char *name, const void *value, 316int btrfs_setxattr(struct dentry *dentry, const char *name, const void *value,
325 size_t size, int flags) 317 size_t size, int flags)
326{ 318{
319 struct btrfs_root *root = BTRFS_I(dentry->d_inode)->root;
320
321 /*
322 * The permission on security.* and system.* is not checked
323 * in permission().
324 */
325 if (btrfs_root_readonly(root))
326 return -EROFS;
327
327 /* 328 /*
328 * If this is a request for a synthetic attribute in the system.* 329 * If this is a request for a synthetic attribute in the system.*
329 * namespace use the generic infrastructure to resolve a handler 330 * namespace use the generic infrastructure to resolve a handler
@@ -344,6 +345,15 @@ int btrfs_setxattr(struct dentry *dentry, const char *name, const void *value,
344 345
345int btrfs_removexattr(struct dentry *dentry, const char *name) 346int btrfs_removexattr(struct dentry *dentry, const char *name)
346{ 347{
348 struct btrfs_root *root = BTRFS_I(dentry->d_inode)->root;
349
350 /*
351 * The permission on security.* and system.* is not checked
352 * in permission().
353 */
354 if (btrfs_root_readonly(root))
355 return -EROFS;
356
347 /* 357 /*
348 * If this is a request for a synthetic attribute in the system.* 358 * If this is a request for a synthetic attribute in the system.*
349 * namespace use the generic infrastructure to resolve a handler 359 * namespace use the generic infrastructure to resolve a handler