mdeg
if ((mdeg.md_curr = md_get_handle()) == NULL) {
mdeg.maxclnts = MDEG_MAX_CLNTS_INIT;
tblsz = mdeg.maxclnts * sizeof (mdeg_clnt_t);
mdeg.tbl = kmem_zalloc(tblsz, KM_SLEEP);
rw_init(&mdeg.rwlock, NULL, RW_DRIVER, NULL);
mdeg.nclnts = 0;
mutex_init(&mdeg.lock, NULL, MUTEX_DRIVER, NULL);
mdeg.taskq = taskq_create("mdeg_taskq", 1, minclsyspri, 1,
mdeg.enabled = B_TRUE;
mdeg.enabled = B_FALSE;
taskq_destroy(mdeg.taskq);
kmem_free(mdeg.tbl, mdeg.maxclnts * sizeof (mdeg_clnt_t));
rw_destroy(&mdeg.rwlock);
if (mdeg.md_curr)
(void) md_fini_handle(mdeg.md_curr);
if (mdeg.md_prev)
(void) md_fini_handle(mdeg.md_prev);
mutex_destroy(&mdeg.lock);
ASSERT(RW_WRITE_HELD(&mdeg.rwlock));
for (idx = 0; idx < mdeg.maxclnts; idx++) {
clnt = &mdeg.tbl[idx];
if (idx != mdeg.maxclnts) {
newmaxclnts = mdeg.maxclnts * 2;
oldtblsz = mdeg.maxclnts * sizeof (mdeg_clnt_t);
bcopy(mdeg.tbl, newtbl, oldtblsz);
clnt = &newtbl[mdeg.maxclnts];
kmem_free(mdeg.tbl, oldtblsz);
mdeg.tbl = newtbl;
mdeg.maxclnts = newmaxclnts;
if ((idx < 0) || (idx >= mdeg.maxclnts)) {
clnt = &mdeg.tbl[idx];
mutex_enter(&mdeg.lock);
mutex_exit(&mdeg.lock);
ASSERT(!taskq_member(mdeg.taskq, curthread));
rw_enter(&mdeg.rwlock, RW_WRITER);
mdeg.nclnts++;
rw_exit(&mdeg.rwlock);
rw_exit(&mdeg.rwlock);
ASSERT(!taskq_member(mdeg.taskq, curthread));
rw_enter(&mdeg.rwlock, RW_WRITER);
rw_exit(&mdeg.rwlock);
mdeg.nclnts--;
rw_exit(&mdeg.rwlock);
rw_enter(&mdeg.rwlock, RW_READER);
mutex_enter(&mdeg.lock);
if (mdeg.md_prev) {
(void) md_fini_handle(mdeg.md_prev);
mdeg.md_prev = mdeg.md_curr;
mdeg.md_curr = md_new;
if (mdeg.nclnts == 0) {
for (idx = 0, nclnt = 0; idx < mdeg.maxclnts; idx++) {
clnt = &mdeg.tbl[idx];
++nclnt, mdeg.nclnts);
(void) taskq_dispatch(mdeg.taskq, mdeg_notify_client,
taskq_wait(mdeg.taskq);
mutex_exit(&mdeg.lock);
rw_exit(&mdeg.rwlock);
ASSERT(RW_READ_HELD(&mdeg.rwlock));
if (!mdeg.enabled) {
md_prev_start = mdeg_find_start_node(mdeg.md_prev, clnt->pspec);
md_curr_start = mdeg_find_start_node(mdeg.md_curr, clnt->pspec);
mdd = md_diff_init(mdeg.md_prev, md_prev_start, mdeg.md_curr,
res->added.mdp = mdeg.md_curr;
res->removed.mdp = mdeg.md_prev;
res->match_curr.mdp = mdeg.md_curr;
res->match_prev.mdp = mdeg.md_prev;
} mdeg;
for (idx = 0; idx < mdeg.maxclnts; idx++) {
clnt = &(mdeg.tbl[idx]);
mdeg_handle_t mdeg; /* handle for MDEG operations */
(void) mdeg_unregister(vds->mdeg);
vds->mdeg = 0;
&vds->mdeg) != MDEG_SUCCESS) {