diff options
Diffstat (limited to 'fs/btrfs/dir-item.c')
-rw-r--r-- | fs/btrfs/dir-item.c | 19 |
1 files changed, 7 insertions, 12 deletions
diff --git a/fs/btrfs/dir-item.c b/fs/btrfs/dir-item.c index f3a6075519cc..e9103b3baa49 100644 --- a/fs/btrfs/dir-item.c +++ b/fs/btrfs/dir-item.c | |||
@@ -68,12 +68,12 @@ static struct btrfs_dir_item *insert_with_overflow(struct btrfs_trans_handle | |||
68 | * into the tree | 68 | * into the tree |
69 | */ | 69 | */ |
70 | int btrfs_insert_xattr_item(struct btrfs_trans_handle *trans, | 70 | int btrfs_insert_xattr_item(struct btrfs_trans_handle *trans, |
71 | struct btrfs_root *root, const char *name, | 71 | struct btrfs_root *root, |
72 | u16 name_len, const void *data, u16 data_len, | 72 | struct btrfs_path *path, u64 objectid, |
73 | u64 dir) | 73 | const char *name, u16 name_len, |
74 | const void *data, u16 data_len) | ||
74 | { | 75 | { |
75 | int ret = 0; | 76 | int ret = 0; |
76 | struct btrfs_path *path; | ||
77 | struct btrfs_dir_item *dir_item; | 77 | struct btrfs_dir_item *dir_item; |
78 | unsigned long name_ptr, data_ptr; | 78 | unsigned long name_ptr, data_ptr; |
79 | struct btrfs_key key, location; | 79 | struct btrfs_key key, location; |
@@ -81,15 +81,11 @@ int btrfs_insert_xattr_item(struct btrfs_trans_handle *trans, | |||
81 | struct extent_buffer *leaf; | 81 | struct extent_buffer *leaf; |
82 | u32 data_size; | 82 | u32 data_size; |
83 | 83 | ||
84 | key.objectid = dir; | 84 | BUG_ON(name_len + data_len > BTRFS_MAX_XATTR_SIZE(root)); |
85 | |||
86 | key.objectid = objectid; | ||
85 | btrfs_set_key_type(&key, BTRFS_XATTR_ITEM_KEY); | 87 | btrfs_set_key_type(&key, BTRFS_XATTR_ITEM_KEY); |
86 | key.offset = btrfs_name_hash(name, name_len); | 88 | key.offset = btrfs_name_hash(name, name_len); |
87 | path = btrfs_alloc_path(); | ||
88 | if (!path) | ||
89 | return -ENOMEM; | ||
90 | if (name_len + data_len + sizeof(struct btrfs_dir_item) > | ||
91 | BTRFS_LEAF_DATA_SIZE(root) - sizeof(struct btrfs_item)) | ||
92 | return -ENOSPC; | ||
93 | 89 | ||
94 | data_size = sizeof(*dir_item) + name_len + data_len; | 90 | data_size = sizeof(*dir_item) + name_len + data_len; |
95 | dir_item = insert_with_overflow(trans, root, path, &key, data_size, | 91 | dir_item = insert_with_overflow(trans, root, path, &key, data_size, |
@@ -117,7 +113,6 @@ int btrfs_insert_xattr_item(struct btrfs_trans_handle *trans, | |||
117 | write_extent_buffer(leaf, data, data_ptr, data_len); | 113 | write_extent_buffer(leaf, data, data_ptr, data_len); |
118 | btrfs_mark_buffer_dirty(path->nodes[0]); | 114 | btrfs_mark_buffer_dirty(path->nodes[0]); |
119 | 115 | ||
120 | btrfs_free_path(path); | ||
121 | return ret; | 116 | return ret; |
122 | } | 117 | } |
123 | 118 | ||