103 }
104 dsl_dataset_rele(ds, FTAG);
105 return (error);
106 }
107
108 typedef struct dsl_bookmark_create_arg {
109 nvlist_t *dbca_bmarks;
110 nvlist_t *dbca_errors;
111 } dsl_bookmark_create_arg_t;
112
113 static int
114 dsl_bookmark_create_check_impl(dsl_dataset_t *snapds, const char *bookmark_name,
115 dmu_tx_t *tx)
116 {
117 dsl_pool_t *dp = dmu_tx_pool(tx);
118 dsl_dataset_t *bmark_fs;
119 char *shortname;
120 int error;
121 zfs_bookmark_phys_t bmark_phys;
122
123 if (!dsl_dataset_is_snapshot(snapds))
124 return (SET_ERROR(EINVAL));
125
126 error = dsl_bookmark_hold_ds(dp, bookmark_name,
127 &bmark_fs, FTAG, &shortname);
128 if (error != 0)
129 return (error);
130
131 if (!dsl_dataset_is_before(bmark_fs, snapds, 0)) {
132 dsl_dataset_rele(bmark_fs, FTAG);
133 return (SET_ERROR(EINVAL));
134 }
135
136 error = dsl_dataset_bmark_lookup(bmark_fs, shortname,
137 &bmark_phys);
138 dsl_dataset_rele(bmark_fs, FTAG);
139 if (error == 0)
140 return (SET_ERROR(EEXIST));
141 if (error == ESRCH)
142 return (0);
143 return (error);
|
103 }
104 dsl_dataset_rele(ds, FTAG);
105 return (error);
106 }
107
108 typedef struct dsl_bookmark_create_arg {
109 nvlist_t *dbca_bmarks;
110 nvlist_t *dbca_errors;
111 } dsl_bookmark_create_arg_t;
112
113 static int
114 dsl_bookmark_create_check_impl(dsl_dataset_t *snapds, const char *bookmark_name,
115 dmu_tx_t *tx)
116 {
117 dsl_pool_t *dp = dmu_tx_pool(tx);
118 dsl_dataset_t *bmark_fs;
119 char *shortname;
120 int error;
121 zfs_bookmark_phys_t bmark_phys;
122
123 if (!snapds->ds_is_snapshot)
124 return (SET_ERROR(EINVAL));
125
126 error = dsl_bookmark_hold_ds(dp, bookmark_name,
127 &bmark_fs, FTAG, &shortname);
128 if (error != 0)
129 return (error);
130
131 if (!dsl_dataset_is_before(bmark_fs, snapds, 0)) {
132 dsl_dataset_rele(bmark_fs, FTAG);
133 return (SET_ERROR(EINVAL));
134 }
135
136 error = dsl_dataset_bmark_lookup(bmark_fs, shortname,
137 &bmark_phys);
138 dsl_dataset_rele(bmark_fs, FTAG);
139 if (error == 0)
140 return (SET_ERROR(EEXIST));
141 if (error == ESRCH)
142 return (0);
143 return (error);
|