aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/dir-item.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/dir-item.c')
-rw-r--r--fs/btrfs/dir-item.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/fs/btrfs/dir-item.c b/fs/btrfs/dir-item.c
index e4f30090d640..5040b71f1900 100644
--- a/fs/btrfs/dir-item.c
+++ b/fs/btrfs/dir-item.c
@@ -21,6 +21,14 @@
21#include "hash.h" 21#include "hash.h"
22#include "transaction.h" 22#include "transaction.h"
23 23
24/*
25 * insert a name into a directory, doing overflow properly if there is a hash
26 * collision. data_size indicates how big the item inserted should be. On
27 * success a struct btrfs_dir_item pointer is returned, otherwise it is
28 * an ERR_PTR.
29 *
30 * The name is not copied into the dir item, you have to do that yourself.
31 */
24static struct btrfs_dir_item *insert_with_overflow(struct btrfs_trans_handle 32static struct btrfs_dir_item *insert_with_overflow(struct btrfs_trans_handle
25 *trans, 33 *trans,
26 struct btrfs_root *root, 34 struct btrfs_root *root,
@@ -55,6 +63,10 @@ static struct btrfs_dir_item *insert_with_overflow(struct btrfs_trans_handle
55 return (struct btrfs_dir_item *)ptr; 63 return (struct btrfs_dir_item *)ptr;
56} 64}
57 65
66/*
67 * xattrs work a lot like directories, this inserts an xattr item
68 * into the tree
69 */
58int btrfs_insert_xattr_item(struct btrfs_trans_handle *trans, 70int btrfs_insert_xattr_item(struct btrfs_trans_handle *trans,
59 struct btrfs_root *root, const char *name, 71 struct btrfs_root *root, const char *name,
60 u16 name_len, const void *data, u16 data_len, 72 u16 name_len, const void *data, u16 data_len,
@@ -109,6 +121,13 @@ int btrfs_insert_xattr_item(struct btrfs_trans_handle *trans,
109 return ret; 121 return ret;
110} 122}
111 123
124/*
125 * insert a directory item in the tree, doing all the magic for
126 * both indexes. 'dir' indicates which objectid to insert it into,
127 * 'location' is the key to stuff into the directory item, 'type' is the
128 * type of the inode we're pointing to, and 'index' is the sequence number
129 * to use for the second index (if one is created).
130 */
112int btrfs_insert_dir_item(struct btrfs_trans_handle *trans, struct btrfs_root 131int btrfs_insert_dir_item(struct btrfs_trans_handle *trans, struct btrfs_root
113 *root, const char *name, int name_len, u64 dir, 132 *root, const char *name, int name_len, u64 dir,
114 struct btrfs_key *location, u8 type, u64 index) 133 struct btrfs_key *location, u8 type, u64 index)
@@ -184,6 +203,11 @@ out:
184 return 0; 203 return 0;
185} 204}
186 205
206/*
207 * lookup a directory item based on name. 'dir' is the objectid
208 * we're searching in, and 'mod' tells us if you plan on deleting the
209 * item (use mod < 0) or changing the options (use mod > 0)
210 */
187struct btrfs_dir_item *btrfs_lookup_dir_item(struct btrfs_trans_handle *trans, 211struct btrfs_dir_item *btrfs_lookup_dir_item(struct btrfs_trans_handle *trans,
188 struct btrfs_root *root, 212 struct btrfs_root *root,
189 struct btrfs_path *path, u64 dir, 213 struct btrfs_path *path, u64 dir,
@@ -222,6 +246,14 @@ struct btrfs_dir_item *btrfs_lookup_dir_item(struct btrfs_trans_handle *trans,
222 return btrfs_match_dir_item_name(root, path, name, name_len); 246 return btrfs_match_dir_item_name(root, path, name, name_len);
223} 247}
224 248
249/*
250 * lookup a directory item based on index. 'dir' is the objectid
251 * we're searching in, and 'mod' tells us if you plan on deleting the
252 * item (use mod < 0) or changing the options (use mod > 0)
253 *
254 * The name is used to make sure the index really points to the name you were
255 * looking for.
256 */
225struct btrfs_dir_item * 257struct btrfs_dir_item *
226btrfs_lookup_dir_index_item(struct btrfs_trans_handle *trans, 258btrfs_lookup_dir_index_item(struct btrfs_trans_handle *trans,
227 struct btrfs_root *root, 259 struct btrfs_root *root,
@@ -282,6 +314,11 @@ struct btrfs_dir_item *btrfs_lookup_xattr(struct btrfs_trans_handle *trans,
282 return btrfs_match_dir_item_name(root, path, name, name_len); 314 return btrfs_match_dir_item_name(root, path, name, name_len);
283} 315}
284 316
317/*
318 * helper function to look at the directory item pointed to by 'path'
319 * this walks through all the entries in a dir item and finds one
320 * for a specific name.
321 */
285struct btrfs_dir_item *btrfs_match_dir_item_name(struct btrfs_root *root, 322struct btrfs_dir_item *btrfs_match_dir_item_name(struct btrfs_root *root,
286 struct btrfs_path *path, 323 struct btrfs_path *path,
287 const char *name, int name_len) 324 const char *name, int name_len)
@@ -313,6 +350,10 @@ struct btrfs_dir_item *btrfs_match_dir_item_name(struct btrfs_root *root,
313 return NULL; 350 return NULL;
314} 351}
315 352
353/*
354 * given a pointer into a directory item, delete it. This
355 * handles items that have more than one entry in them.
356 */
316int btrfs_delete_one_dir_name(struct btrfs_trans_handle *trans, 357int btrfs_delete_one_dir_name(struct btrfs_trans_handle *trans,
317 struct btrfs_root *root, 358 struct btrfs_root *root,
318 struct btrfs_path *path, 359 struct btrfs_path *path,