diff options
author | Jan Schmidt <list.btrfs@jan-o-sch.net> | 2012-05-30 18:05:21 +0200 |
---|---|---|
committer | Jan Schmidt <list.btrfs@jan-o-sch.net> | 2012-05-31 19:53:08 +0200 |
commit | 3301958b7c1dae8f0f5ded63aa881e0b71e78464 (patch) | |
tree | 11d1c098981a65bcbe11f4be594d6e9855f55448 /fs/btrfs/ulist.c | |
parent | 95a06077f7edbd00d32612562be4d857a5b7df54 (diff) | |
download | kernel_goldelico_gta04-3301958b7c1dae8f0f5ded63aa881e0b71e78464.zip kernel_goldelico_gta04-3301958b7c1dae8f0f5ded63aa881e0b71e78464.tar.gz kernel_goldelico_gta04-3301958b7c1dae8f0f5ded63aa881e0b71e78464.tar.bz2 |
Btrfs: add inodes before dropping the extent lock in find_all_leafs
We must build up the inode list with the extent lock held after following
indirect refs.
This also requires an extension to ulists, which allows to modify the stored
aux value in case a key already exists in the list.
Signed-off-by: Jan Schmidt <list.btrfs@jan-o-sch.net>
Diffstat (limited to 'fs/btrfs/ulist.c')
-rw-r--r-- | fs/btrfs/ulist.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/fs/btrfs/ulist.c b/fs/btrfs/ulist.c index 17e68bd..2ef5940 100644 --- a/fs/btrfs/ulist.c +++ b/fs/btrfs/ulist.c @@ -146,11 +146,20 @@ EXPORT_SYMBOL(ulist_free); int ulist_add(struct ulist *ulist, u64 val, unsigned long aux, unsigned long gfp_mask) { + return ulist_add_merge(ulist, val, aux, NULL, gfp_mask); +} + +int ulist_add_merge(struct ulist *ulist, u64 val, unsigned long aux, + unsigned long *old_aux, unsigned long gfp_mask) +{ int i; for (i = 0; i < ulist->nnodes; ++i) { - if (ulist->nodes[i].val == val) + if (ulist->nodes[i].val == val) { + if (old_aux) + *old_aux = ulist->nodes[i].aux; return 0; + } } if (ulist->nnodes >= ulist->nodes_alloced) { |