Lines Matching full:zfs

38 #include "zfs.h"
68 static zfs_dsl_dir_t *dsl_dir_alloc(zfs_opt_t *zfs, const char *name);
69 static zfs_dsl_dataset_t *dsl_dataset_alloc(zfs_opt_t *zfs, zfs_dsl_dir_t *dir);
96 * to follow ZFS' inheritance rules.
99 dsl_dir_get_mountpoint(zfs_opt_t *zfs, zfs_dsl_dir_t *dir) in dsl_dir_get_mountpoint() argument
136 assert(strstr(mountpoint, zfs->rootpath) == mountpoint); in dsl_dir_get_mountpoint()
155 dsl_dir_set_prop(zfs_opt_t *zfs, zfs_dsl_dir_t *dir, const char *key, in dsl_dir_set_prop() argument
170 if (strcmp(val, zfs->rootpath) != 0 && in dsl_dir_set_prop()
171 strcmp(zfs->rootpath, "/") != 0 && in dsl_dir_set_prop()
172 (strstr(val, zfs->rootpath) != val || in dsl_dir_set_prop()
173 val[strlen(zfs->rootpath)] != '/')) { in dsl_dir_set_prop()
175 "the root path `%s'", val, zfs->rootpath); in dsl_dir_set_prop()
202 dsl_metadir_alloc(zfs_opt_t *zfs, const char *name) in dsl_metadir_alloc() argument
207 easprintf(&path, "%s/%s", zfs->poolname, name); in dsl_metadir_alloc()
208 dir = dsl_dir_alloc(zfs, path); in dsl_metadir_alloc()
214 dsl_origindir_init(zfs_opt_t *zfs) in dsl_origindir_init() argument
219 zfs->origindsldir = dsl_metadir_alloc(zfs, "$ORIGIN"); in dsl_origindir_init()
220 zfs->originds = dsl_dataset_alloc(zfs, zfs->origindsldir); in dsl_origindir_init()
221 zfs->snapds = dsl_dataset_alloc(zfs, zfs->origindsldir); in dsl_origindir_init()
223 clones = objset_dnode_alloc(zfs->mos, DMU_OT_DSL_CLONES, &clonesid); in dsl_origindir_init()
224 zfs->cloneszap = zap_alloc(zfs->mos, clones); in dsl_origindir_init()
225 zfs->origindsldir->phys->dd_clones = clonesid; in dsl_origindir_init()
229 dsl_init(zfs_opt_t *zfs) in dsl_init() argument
237 zfs->rootdsldir = dsl_dir_alloc(zfs, NULL); in dsl_init()
239 nvlist_add_uint64(zfs->rootdsldir->propsnv, "compression", in dsl_init()
242 zfs->rootds = dsl_dataset_alloc(zfs, zfs->rootdsldir); in dsl_init()
243 zfs->rootdsldir->headds = zfs->rootds; in dsl_init()
245 zfs->mosdsldir = dsl_metadir_alloc(zfs, "$MOS"); in dsl_init()
246 zfs->freedsldir = dsl_metadir_alloc(zfs, "$FREE"); in dsl_init()
247 dsl_origindir_init(zfs); in dsl_init()
253 STAILQ_FOREACH(d, &zfs->datasetdescs, next) { in dsl_init()
259 if (strcmp(dsname, zfs->poolname) == 0) { in dsl_init()
264 dir = zfs->rootdsldir; in dsl_init()
269 if (strstr(dsname, zfs->poolname) != dsname || in dsl_init()
271 (size_t)(next - dsname) != strlen(zfs->poolname)) { in dsl_init()
273 dsname, zfs->poolname); in dsl_init()
275 dir = dsl_dir_alloc(zfs, dsname); in dsl_init()
276 dir->headds = dsl_dataset_alloc(zfs, dir); in dsl_init()
286 dsl_dir_set_prop(zfs, dir, key, val); in dsl_init()
294 if (nvpair_find(zfs->rootdsldir->propsnv, "mountpoint") == NULL) { in dsl_init()
295 nvlist_add_string(zfs->rootdsldir->propsnv, "mountpoint", in dsl_init()
296 zfs->rootpath); in dsl_init()
313 dsl_dir_foreach_post(zfs_opt_t *zfs, zfs_dsl_dir_t *dsldir, in dsl_dir_foreach_post() argument
319 dsl_dir_foreach_post(zfs, cdsldir, cb, arg); in dsl_dir_foreach_post()
321 cb(zfs, dsldir, arg); in dsl_dir_foreach_post()
328 dsl_dir_foreach(zfs_opt_t *zfs, zfs_dsl_dir_t *dsldir, in dsl_dir_foreach() argument
331 dsl_dir_foreach_post(zfs, dsldir, cb, arg); in dsl_dir_foreach()
341 * Create a DSL directory, which is effectively an entry in the ZFS namespace.
351 dsl_dir_alloc(zfs_opt_t *zfs, const char *name) in dsl_dir_alloc() argument
361 dnode = objset_dnode_bonus_alloc(zfs->mos, DMU_OT_DSL_DIR, in dsl_dir_alloc()
365 dnode = objset_dnode_alloc(zfs->mos, DMU_OT_DSL_PROPS, &propsid); in dsl_dir_alloc()
366 dir->propszap = zap_alloc(zfs->mos, dnode); in dsl_dir_alloc()
368 dnode = objset_dnode_alloc(zfs->mos, DMU_OT_DSL_DIR_CHILD_MAP, in dsl_dir_alloc()
370 dir->childzap = zap_alloc(zfs->mos, dnode); in dsl_dir_alloc()
382 dir->name = estrdup(zfs->poolname); in dsl_dir_alloc()
383 dir->fullname = estrdup(zfs->poolname); in dsl_dir_alloc()
387 assert(zfs->rootdsldir == NULL); in dsl_dir_alloc()
388 zfs->rootdsldir = dir; in dsl_dir_alloc()
398 STAILQ_INSERT_HEAD(&l, zfs->rootdsldir, next); in dsl_dir_alloc()
438 dsl_dir_root_finalize(zfs_opt_t *zfs, uint64_t bytes) in dsl_dir_root_finalize() argument
440 dsl_dir_size_add(zfs->mosdsldir, bytes); in dsl_dir_root_finalize()
441 zfs->mosdsldir->phys->dd_used_breakdown[DD_USED_HEAD] += bytes; in dsl_dir_root_finalize()
443 dsl_dir_size_add(zfs->rootdsldir, bytes); in dsl_dir_root_finalize()
444 zfs->rootdsldir->phys->dd_used_breakdown[DD_USED_CHILD] += bytes; in dsl_dir_root_finalize()
491 dsl_dir_finalize(zfs_opt_t *zfs, zfs_dsl_dir_t *dir, void *arg __unused) in dsl_dir_finalize() argument
500 zap_write(zfs, dir->propszap); in dsl_dir_finalize()
501 zap_write(zfs, dir->childzap); in dsl_dir_finalize()
510 snapnames = objset_dnode_alloc(zfs->mos, DMU_OT_DSL_DS_SNAP_MAP, in dsl_dir_finalize()
512 zap_write(zfs, zap_alloc(zfs->mos, snapnames)); in dsl_dir_finalize()
515 dir->phys->dd_clone_parent_obj = zfs->snapds->dsid; in dsl_dir_finalize()
516 headds->phys->ds_prev_snap_obj = zfs->snapds->dsid; in dsl_dir_finalize()
520 zfs->snapds->phys->ds_num_children++; in dsl_dir_finalize()
521 zap_add_uint64_self(zfs->cloneszap, headds->dsid); in dsl_dir_finalize()
537 if (dir == zfs->rootdsldir && cdir == zfs->mosdsldir) in dsl_dir_finalize()
549 dsl_write(zfs_opt_t *zfs) in dsl_write() argument
560 dsl_dir_foreach_post(zfs, zfs->rootdsldir, dsl_dir_finalize, NULL); in dsl_write()
562 snapnames = objset_dnode_alloc(zfs->mos, DMU_OT_DSL_DS_SNAP_MAP, in dsl_write()
564 snapnameszap = zap_alloc(zfs->mos, snapnames); in dsl_write()
565 zap_add_uint64(snapnameszap, "$ORIGIN", zfs->snapds->dsid); in dsl_write()
566 zap_write(zfs, snapnameszap); in dsl_write()
568 zfs->origindsldir->phys->dd_head_dataset_obj = zfs->originds->dsid; in dsl_write()
569 zfs->originds->phys->ds_prev_snap_obj = zfs->snapds->dsid; in dsl_write()
570 zfs->originds->phys->ds_snapnames_zapobj = snapmapid; in dsl_write()
572 zfs->snapds->phys->ds_next_snap_obj = zfs->originds->dsid; in dsl_write()
573 assert(zfs->snapds->phys->ds_num_children > 0); in dsl_write()
574 zfs->snapds->phys->ds_num_children++; in dsl_write()
576 zap_write(zfs, zfs->cloneszap); in dsl_write()
582 dsl_dir_dataset_write(zfs_opt_t *zfs, zfs_objset_t *os, zfs_dsl_dir_t *dir) in dsl_dir_dataset_write() argument
585 objset_write(zfs, os); in dsl_dir_dataset_write()
601 dsl_dataset_alloc(zfs_opt_t *zfs, zfs_dsl_dir_t *dir) in dsl_dataset_alloc() argument
609 dnode = objset_dnode_bonus_alloc(zfs->mos, DMU_OT_DSL_DATASET, in dsl_dataset_alloc()
613 dnode = objset_dnode_bonus_alloc(zfs->mos, DMU_OT_DEADLIST, in dsl_dataset_alloc()
615 zap_write(zfs, zap_alloc(zfs->mos, dnode)); in dsl_dataset_alloc()
620 if (ds != zfs->snapds) in dsl_dataset_alloc()