335         nvlist_t *ddura_chkholds;
 336 } dsl_dataset_user_release_arg_t;
 337 
 338 /* Place a dataset hold on the snapshot identified by passed dsobj string */
 339 static int
 340 dsl_dataset_hold_obj_string(dsl_pool_t *dp, const char *dsobj, void *tag,
 341     dsl_dataset_t **dsp)
 342 {
 343         return (dsl_dataset_hold_obj(dp, strtonum(dsobj, NULL), tag, dsp));
 344 }
 345 
 346 static int
 347 dsl_dataset_user_release_check_one(dsl_dataset_user_release_arg_t *ddura,
 348     dsl_dataset_t *ds, nvlist_t *holds, const char *snapname)
 349 {
 350         uint64_t zapobj;
 351         nvlist_t *holds_found;
 352         objset_t *mos;
 353         int numholds;
 354 
 355         if (!dsl_dataset_is_snapshot(ds))
 356                 return (SET_ERROR(EINVAL));
 357 
 358         if (nvlist_empty(holds))
 359                 return (0);
 360 
 361         numholds = 0;
 362         mos = ds->ds_dir->dd_pool->dp_meta_objset;
 363         zapobj = dsl_dataset_phys(ds)->ds_userrefs_obj;
 364         holds_found = fnvlist_alloc();
 365 
 366         for (nvpair_t *pair = nvlist_next_nvpair(holds, NULL); pair != NULL;
 367             pair = nvlist_next_nvpair(holds, pair)) {
 368                 uint64_t tmp;
 369                 int error;
 370                 const char *holdname = nvpair_name(pair);
 371 
 372                 if (zapobj != 0)
 373                         error = zap_lookup(mos, zapobj, holdname, 8, 1, &tmp);
 374                 else
 375                         error = SET_ERROR(ENOENT);
 
 | 
 
 
 335         nvlist_t *ddura_chkholds;
 336 } dsl_dataset_user_release_arg_t;
 337 
 338 /* Place a dataset hold on the snapshot identified by passed dsobj string */
 339 static int
 340 dsl_dataset_hold_obj_string(dsl_pool_t *dp, const char *dsobj, void *tag,
 341     dsl_dataset_t **dsp)
 342 {
 343         return (dsl_dataset_hold_obj(dp, strtonum(dsobj, NULL), tag, dsp));
 344 }
 345 
 346 static int
 347 dsl_dataset_user_release_check_one(dsl_dataset_user_release_arg_t *ddura,
 348     dsl_dataset_t *ds, nvlist_t *holds, const char *snapname)
 349 {
 350         uint64_t zapobj;
 351         nvlist_t *holds_found;
 352         objset_t *mos;
 353         int numholds;
 354 
 355         if (!ds->ds_is_snapshot)
 356                 return (SET_ERROR(EINVAL));
 357 
 358         if (nvlist_empty(holds))
 359                 return (0);
 360 
 361         numholds = 0;
 362         mos = ds->ds_dir->dd_pool->dp_meta_objset;
 363         zapobj = dsl_dataset_phys(ds)->ds_userrefs_obj;
 364         holds_found = fnvlist_alloc();
 365 
 366         for (nvpair_t *pair = nvlist_next_nvpair(holds, NULL); pair != NULL;
 367             pair = nvlist_next_nvpair(holds, pair)) {
 368                 uint64_t tmp;
 369                 int error;
 370                 const char *holdname = nvpair_name(pair);
 371 
 372                 if (zapobj != 0)
 373                         error = zap_lookup(mos, zapobj, holdname, 8, 1, &tmp);
 374                 else
 375                         error = SET_ERROR(ENOENT);
 
 |