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);
|