* ZFS_IOC_CREATE callback handles dmu zvol and zap object creation. */
| 189 | * ZFS_IOC_CREATE callback handles dmu zvol and zap object creation. |
| 190 | */ |
| 191 | void |
| 192 | zvol_create_cb(objset_t *os, void *arg, cred_t *cr, dmu_tx_t *tx) |
| 193 | { |
| 194 | zfs_creat_t *zct = arg; |
| 195 | nvlist_t *nvprops = zct->zct_props; |
| 196 | int error; |
| 197 | uint64_t volblocksize, volsize; |
| 198 | |
| 199 | VERIFY(nvlist_lookup_uint64(nvprops, |
| 200 | zfs_prop_to_name(ZFS_PROP_VOLSIZE), &volsize) == 0); |
| 201 | if (nvlist_lookup_uint64(nvprops, |
| 202 | zfs_prop_to_name(ZFS_PROP_VOLBLOCKSIZE), &volblocksize) != 0) |
| 203 | volblocksize = zfs_prop_default_numeric(ZFS_PROP_VOLBLOCKSIZE); |
| 204 | |
| 205 | /* |
| 206 | * These properties must be removed from the list so the generic |
| 207 | * property setting step won't apply to them. |
| 208 | */ |
| 209 | VERIFY(nvlist_remove_all(nvprops, |
| 210 | zfs_prop_to_name(ZFS_PROP_VOLSIZE)) == 0); |
| 211 | (void) nvlist_remove_all(nvprops, |
| 212 | zfs_prop_to_name(ZFS_PROP_VOLBLOCKSIZE)); |
| 213 | |
| 214 | error = dmu_object_claim(os, ZVOL_OBJ, DMU_OT_ZVOL, volblocksize, |
| 215 | DMU_OT_NONE, 0, tx); |
| 216 | ASSERT(error == 0); |
| 217 | |
| 218 | error = zap_create_claim(os, ZVOL_ZAP_OBJ, DMU_OT_ZVOL_PROP, |
| 219 | DMU_OT_NONE, 0, tx); |
| 220 | ASSERT(error == 0); |
| 221 | |
| 222 | error = zap_update(os, ZVOL_ZAP_OBJ, "size", 8, 1, &volsize, tx); |
| 223 | ASSERT(error == 0); |
| 224 | } |
| 225 | |
| 226 | /* |
| 227 | * ZFS_IOC_OBJSET_STATS entry point. |
nothing calls this directly
no test coverage detected