362 * it exists) remains the effective value.
363 */
364 err = zap_lookup(mos, zapobj, propname, 8, 1, newvalp);
365 if (err == ENOENT)
366 *newvalp = 0;
367 break;
368 default:
369 panic("unexpected property source: %d", source);
370 }
371
372 strfree(recvdstr);
373
374 if (err == ENOENT)
375 return (0);
376
377 return (err);
378 }
379
380 /*
381 * Unregister this callback. Return 0 on success, ENOENT if ddname is
382 * invalid, ENOMSG if no matching callback registered.
383 */
384 int
385 dsl_prop_unregister(dsl_dataset_t *ds, const char *propname,
386 dsl_prop_changed_cb_t *callback, void *cbarg)
387 {
388 dsl_dir_t *dd = ds->ds_dir;
389 dsl_prop_cb_record_t *cbr;
390
391 mutex_enter(&dd->dd_lock);
392 for (cbr = list_head(&dd->dd_prop_cbs);
393 cbr; cbr = list_next(&dd->dd_prop_cbs, cbr)) {
394 if (cbr->cbr_ds == ds &&
395 cbr->cbr_func == callback &&
396 cbr->cbr_arg == cbarg &&
397 strcmp(cbr->cbr_propname, propname) == 0)
398 break;
399 }
400
401 if (cbr == NULL) {
402 mutex_exit(&dd->dd_lock);
|
362 * it exists) remains the effective value.
363 */
364 err = zap_lookup(mos, zapobj, propname, 8, 1, newvalp);
365 if (err == ENOENT)
366 *newvalp = 0;
367 break;
368 default:
369 panic("unexpected property source: %d", source);
370 }
371
372 strfree(recvdstr);
373
374 if (err == ENOENT)
375 return (0);
376
377 return (err);
378 }
379
380 /*
381 * Unregister this callback. Return 0 on success, ENOENT if ddname is
382 * invalid, or ENOMSG if no matching callback registered.
383 */
384 int
385 dsl_prop_unregister(dsl_dataset_t *ds, const char *propname,
386 dsl_prop_changed_cb_t *callback, void *cbarg)
387 {
388 dsl_dir_t *dd = ds->ds_dir;
389 dsl_prop_cb_record_t *cbr;
390
391 mutex_enter(&dd->dd_lock);
392 for (cbr = list_head(&dd->dd_prop_cbs);
393 cbr; cbr = list_next(&dd->dd_prop_cbs, cbr)) {
394 if (cbr->cbr_ds == ds &&
395 cbr->cbr_func == callback &&
396 cbr->cbr_arg == cbarg &&
397 strcmp(cbr->cbr_propname, propname) == 0)
398 break;
399 }
400
401 if (cbr == NULL) {
402 mutex_exit(&dd->dd_lock);
|