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