| 1222 | } |
| 1223 | |
| 1224 | static int |
| 1225 | zap_add_impl(zap_t *zap, const char *key, |
| 1226 | int integer_size, uint64_t num_integers, |
| 1227 | const void *val, dmu_tx_t *tx, void *tag) |
| 1228 | { |
| 1229 | const uint64_t *intval = val; |
| 1230 | int err = 0; |
| 1231 | |
| 1232 | zap_name_t *zn = zap_name_alloc(zap, key, 0); |
| 1233 | if (zn == NULL) { |
| 1234 | zap_unlockdir(zap, tag); |
| 1235 | return (SET_ERROR(ENOTSUP)); |
| 1236 | } |
| 1237 | if (!zap->zap_ismicro) { |
| 1238 | err = fzap_add(zn, integer_size, num_integers, val, tag, tx); |
| 1239 | zap = zn->zn_zap; /* fzap_add() may change zap */ |
| 1240 | } else if (integer_size != 8 || num_integers != 1 || |
| 1241 | strlen(key) >= MZAP_NAME_LEN || |
| 1242 | !mze_canfit_fzap_leaf(zn, zn->zn_hash)) { |
| 1243 | err = mzap_upgrade(&zn->zn_zap, tag, tx, 0); |
| 1244 | if (err == 0) { |
| 1245 | err = fzap_add(zn, integer_size, num_integers, val, |
| 1246 | tag, tx); |
| 1247 | } |
| 1248 | zap = zn->zn_zap; /* fzap_add() may change zap */ |
| 1249 | } else { |
| 1250 | if (mze_find(zn) != NULL) { |
| 1251 | err = SET_ERROR(EEXIST); |
| 1252 | } else { |
| 1253 | mzap_addent(zn, *intval); |
| 1254 | } |
| 1255 | } |
| 1256 | ASSERT(zap == zn->zn_zap); |
| 1257 | zap_name_free(zn); |
| 1258 | if (zap != NULL) /* may be NULL if fzap_add() failed */ |
| 1259 | zap_unlockdir(zap, tag); |
| 1260 | return (err); |
| 1261 | } |
| 1262 | |
| 1263 | int |
| 1264 | zap_add(objset_t *os, uint64_t zapobj, const char *key, |
no test coverage detected