]>
Commit | Line | Data |
---|---|---|
34dc7c2f BB |
1 | /* |
2 | * CDDL HEADER START | |
3 | * | |
4 | * The contents of this file are subject to the terms of the | |
5 | * Common Development and Distribution License (the "License"). | |
6 | * You may not use this file except in compliance with the License. | |
7 | * | |
8 | * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE | |
9 | * or http://www.opensolaris.org/os/licensing. | |
10 | * See the License for the specific language governing permissions | |
11 | * and limitations under the License. | |
12 | * | |
13 | * When distributing Covered Code, include this CDDL HEADER in each | |
14 | * file and include the License file at usr/src/OPENSOLARIS.LICENSE. | |
15 | * If applicable, add the following below this CDDL HEADER, with the | |
16 | * fields enclosed by brackets "[]" replaced with your own identifying | |
17 | * information: Portions Copyright [yyyy] [name of copyright owner] | |
18 | * | |
19 | * CDDL HEADER END | |
20 | */ | |
21 | /* | |
428870ff | 22 | * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. |
13fe0198 | 23 | * Copyright (c) 2012 by Delphix. All rights reserved. |
34dc7c2f BB |
24 | */ |
25 | ||
34dc7c2f BB |
26 | #include <sys/bplist.h> |
27 | #include <sys/zfs_context.h> | |
28 | ||
34dc7c2f BB |
29 | |
30 | void | |
428870ff | 31 | bplist_create(bplist_t *bpl) |
34dc7c2f | 32 | { |
428870ff BB |
33 | mutex_init(&bpl->bpl_lock, NULL, MUTEX_DEFAULT, NULL); |
34 | list_create(&bpl->bpl_list, sizeof (bplist_entry_t), | |
35 | offsetof(bplist_entry_t, bpe_node)); | |
34dc7c2f BB |
36 | } |
37 | ||
38 | void | |
428870ff | 39 | bplist_destroy(bplist_t *bpl) |
34dc7c2f | 40 | { |
428870ff BB |
41 | list_destroy(&bpl->bpl_list); |
42 | mutex_destroy(&bpl->bpl_lock); | |
34dc7c2f BB |
43 | } |
44 | ||
34dc7c2f | 45 | void |
428870ff | 46 | bplist_append(bplist_t *bpl, const blkptr_t *bp) |
34dc7c2f | 47 | { |
79c76d5b | 48 | bplist_entry_t *bpe = kmem_alloc(sizeof (*bpe), KM_SLEEP); |
34dc7c2f | 49 | |
34dc7c2f | 50 | mutex_enter(&bpl->bpl_lock); |
428870ff BB |
51 | bpe->bpe_blk = *bp; |
52 | list_insert_tail(&bpl->bpl_list, bpe); | |
34dc7c2f BB |
53 | mutex_exit(&bpl->bpl_lock); |
54 | } | |
55 | ||
13fe0198 MA |
56 | /* |
57 | * To aid debugging, we keep the most recently removed entry. This way if | |
58 | * we are in the callback, we can easily locate the entry. | |
59 | */ | |
60 | static bplist_entry_t *bplist_iterate_last_removed; | |
61 | ||
34dc7c2f | 62 | void |
428870ff | 63 | bplist_iterate(bplist_t *bpl, bplist_itor_t *func, void *arg, dmu_tx_t *tx) |
34dc7c2f | 64 | { |
428870ff | 65 | bplist_entry_t *bpe; |
34dc7c2f BB |
66 | |
67 | mutex_enter(&bpl->bpl_lock); | |
c65aa5b2 | 68 | while ((bpe = list_head(&bpl->bpl_list))) { |
13fe0198 | 69 | bplist_iterate_last_removed = bpe; |
428870ff | 70 | list_remove(&bpl->bpl_list, bpe); |
34dc7c2f | 71 | mutex_exit(&bpl->bpl_lock); |
428870ff BB |
72 | func(arg, &bpe->bpe_blk, tx); |
73 | kmem_free(bpe, sizeof (*bpe)); | |
34dc7c2f BB |
74 | mutex_enter(&bpl->bpl_lock); |
75 | } | |
76 | mutex_exit(&bpl->bpl_lock); | |
77 | } |