diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
commit | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch) | |
tree | a8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /fs/btrfs/dir-item.c | |
parent | 406089d01562f1e2bf9f089fd7637009ebaad589 (diff) |
Patched in Tegra support.
Diffstat (limited to 'fs/btrfs/dir-item.c')
-rw-r--r-- | fs/btrfs/dir-item.c | 69 |
1 files changed, 5 insertions, 64 deletions
diff --git a/fs/btrfs/dir-item.c b/fs/btrfs/dir-item.c index 502c2158167..31d84e78129 100644 --- a/fs/btrfs/dir-item.c +++ b/fs/btrfs/dir-item.c | |||
@@ -49,8 +49,9 @@ static struct btrfs_dir_item *insert_with_overflow(struct btrfs_trans_handle | |||
49 | di = btrfs_match_dir_item_name(root, path, name, name_len); | 49 | di = btrfs_match_dir_item_name(root, path, name, name_len); |
50 | if (di) | 50 | if (di) |
51 | return ERR_PTR(-EEXIST); | 51 | return ERR_PTR(-EEXIST); |
52 | btrfs_extend_item(trans, root, path, data_size); | 52 | ret = btrfs_extend_item(trans, root, path, data_size); |
53 | } else if (ret < 0) | 53 | } |
54 | if (ret < 0) | ||
54 | return ERR_PTR(ret); | 55 | return ERR_PTR(ret); |
55 | WARN_ON(ret > 0); | 56 | WARN_ON(ret > 0); |
56 | leaf = path->nodes[0]; | 57 | leaf = path->nodes[0]; |
@@ -115,7 +116,6 @@ int btrfs_insert_xattr_item(struct btrfs_trans_handle *trans, | |||
115 | * 'location' is the key to stuff into the directory item, 'type' is the | 116 | * 'location' is the key to stuff into the directory item, 'type' is the |
116 | * type of the inode we're pointing to, and 'index' is the sequence number | 117 | * type of the inode we're pointing to, and 'index' is the sequence number |
117 | * to use for the second index (if one is created). | 118 | * to use for the second index (if one is created). |
118 | * Will return 0 or -ENOMEM | ||
119 | */ | 119 | */ |
120 | int btrfs_insert_dir_item(struct btrfs_trans_handle *trans, struct btrfs_root | 120 | int btrfs_insert_dir_item(struct btrfs_trans_handle *trans, struct btrfs_root |
121 | *root, const char *name, int name_len, | 121 | *root, const char *name, int name_len, |
@@ -213,65 +213,6 @@ struct btrfs_dir_item *btrfs_lookup_dir_item(struct btrfs_trans_handle *trans, | |||
213 | return btrfs_match_dir_item_name(root, path, name, name_len); | 213 | return btrfs_match_dir_item_name(root, path, name, name_len); |
214 | } | 214 | } |
215 | 215 | ||
216 | int btrfs_check_dir_item_collision(struct btrfs_root *root, u64 dir, | ||
217 | const char *name, int name_len) | ||
218 | { | ||
219 | int ret; | ||
220 | struct btrfs_key key; | ||
221 | struct btrfs_dir_item *di; | ||
222 | int data_size; | ||
223 | struct extent_buffer *leaf; | ||
224 | int slot; | ||
225 | struct btrfs_path *path; | ||
226 | |||
227 | |||
228 | path = btrfs_alloc_path(); | ||
229 | if (!path) | ||
230 | return -ENOMEM; | ||
231 | |||
232 | key.objectid = dir; | ||
233 | btrfs_set_key_type(&key, BTRFS_DIR_ITEM_KEY); | ||
234 | key.offset = btrfs_name_hash(name, name_len); | ||
235 | |||
236 | ret = btrfs_search_slot(NULL, root, &key, path, 0, 0); | ||
237 | |||
238 | /* return back any errors */ | ||
239 | if (ret < 0) | ||
240 | goto out; | ||
241 | |||
242 | /* nothing found, we're safe */ | ||
243 | if (ret > 0) { | ||
244 | ret = 0; | ||
245 | goto out; | ||
246 | } | ||
247 | |||
248 | /* we found an item, look for our name in the item */ | ||
249 | di = btrfs_match_dir_item_name(root, path, name, name_len); | ||
250 | if (di) { | ||
251 | /* our exact name was found */ | ||
252 | ret = -EEXIST; | ||
253 | goto out; | ||
254 | } | ||
255 | |||
256 | /* | ||
257 | * see if there is room in the item to insert this | ||
258 | * name | ||
259 | */ | ||
260 | data_size = sizeof(*di) + name_len + sizeof(struct btrfs_item); | ||
261 | leaf = path->nodes[0]; | ||
262 | slot = path->slots[0]; | ||
263 | if (data_size + btrfs_item_size_nr(leaf, slot) + | ||
264 | sizeof(struct btrfs_item) > BTRFS_LEAF_DATA_SIZE(root)) { | ||
265 | ret = -EOVERFLOW; | ||
266 | } else { | ||
267 | /* plenty of insertion room */ | ||
268 | ret = 0; | ||
269 | } | ||
270 | out: | ||
271 | btrfs_free_path(path); | ||
272 | return ret; | ||
273 | } | ||
274 | |||
275 | /* | 216 | /* |
276 | * lookup a directory item based on index. 'dir' is the objectid | 217 | * lookup a directory item based on index. 'dir' is the objectid |
277 | * we're searching in, and 'mod' tells us if you plan on deleting the | 218 | * we're searching in, and 'mod' tells us if you plan on deleting the |
@@ -442,8 +383,8 @@ int btrfs_delete_one_dir_name(struct btrfs_trans_handle *trans, | |||
442 | start = btrfs_item_ptr_offset(leaf, path->slots[0]); | 383 | start = btrfs_item_ptr_offset(leaf, path->slots[0]); |
443 | memmove_extent_buffer(leaf, ptr, ptr + sub_item_len, | 384 | memmove_extent_buffer(leaf, ptr, ptr + sub_item_len, |
444 | item_len - (ptr + sub_item_len - start)); | 385 | item_len - (ptr + sub_item_len - start)); |
445 | btrfs_truncate_item(trans, root, path, | 386 | ret = btrfs_truncate_item(trans, root, path, |
446 | item_len - sub_item_len, 1); | 387 | item_len - sub_item_len, 1); |
447 | } | 388 | } |
448 | return ret; | 389 | return ret; |
449 | } | 390 | } |