Lines Matching +full:set +full:- +full:aces

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
63 * The order of the attributes doesn't matter, this is simply the one hard-coded
124 * layout and just hard-codes attribute offsets.
178 return (strcmp(cur->name, ".") == 0); in fsnode_isroot()
184 return (cur->type == S_IFREG || cur->type == S_IFDIR || in fsnode_valid()
185 cur->type == S_IFLNK); in fsnode_valid()
189 * Visit each node in a directory hierarchy, in pre-order depth-first order.
194 assert(root->type == S_IFDIR); in fsnode_foreach()
196 for (fsnode *cur = root; cur != NULL; cur = cur->next) { in fsnode_foreach()
199 inode_type(cur->type), cur->path, cur->name); in fsnode_foreach()
204 if (cur->type == S_IFDIR && cur->child != NULL) in fsnode_foreach()
205 fsnode_foreach(cur->child, cb, arg); in fsnode_foreach()
215 switch (cur->type) { in fs_populate_dirent()
229 dir = SLIST_FIRST(&arg->dirs); in fs_populate_dirent()
230 zap_add_uint64(dir->zap, cur->name, ZFS_DIRENT_MAKE(type, dnid)); in fs_populate_dirent()
237 assert(ind < fs->sacnt); in fs_populate_attr()
238 assert(fs->saoffs[ind] != 0xffff); in fs_populate_attr()
240 memcpy(attrbuf + fs->saoffs[ind], val, fs->satab[ind].size); in fs_populate_attr()
241 *szp += fs->satab[ind].size; in fs_populate_attr()
248 assert(ind < fs->sacnt); in fs_populate_varszattr()
249 assert(fs->saoffs[ind] != 0xffff); in fs_populate_varszattr()
250 assert(fs->satab[ind].size == 0); in fs_populate_varszattr()
252 memcpy(attrbuf + fs->saoffs[ind] + varoff, val, valsz); in fs_populate_varszattr()
268 if (cur->contents != NULL) { in fs_populate_path()
272 n = strlcpy(path, cur->contents, sz); in fs_populate_path()
274 } else if (cur->root == NULL) { in fs_populate_path()
277 *dirfdp = SLIST_FIRST(&arg->dirs)->dirfd; in fs_populate_path()
278 n = strlcpy(path, cur->name, sz); in fs_populate_path()
285 cur->root, cur->path, cur->name); in fs_populate_path()
323 if (cur->symlink != NULL) { in fs_readlink()
326 n = strlcpy(buf, cur->symlink, bufsz); in fs_readlink()
333 n = readlinkat(fd, path, buf, bufsz - 1); in fs_readlink()
334 if (n == -1) in fs_readlink()
335 err(1, "readlinkat(%s)", cur->name); in fs_readlink()
346 assert(ind < fs->sacnt); in fs_populate_time()
347 assert(fs->saoffs[ind] != 0xffff); in fs_populate_time()
348 assert(fs->satab[ind].size == sizeof(timebuf)); in fs_populate_time()
350 timebuf[0] = ts->tv_sec; in fs_populate_time()
351 timebuf[1] = ts->tv_nsec; in fs_populate_time()
361 zfs_ace_hdr_t aces[3]; in fs_populate_sattrs() local
369 assert(dnode->dn_bonustype == DMU_OT_SA); in fs_populate_sattrs()
370 assert(dnode->dn_nblkptr == 1); in fs_populate_sattrs()
372 fs = arg->fs; in fs_populate_sattrs()
373 sb = &cur->inode->st; in fs_populate_sattrs()
375 switch (cur->type) { in fs_populate_sattrs()
378 links = cur->inode->nlink; in fs_populate_sattrs()
379 objsize = sb->st_size; in fs_populate_sattrs()
380 parent = SLIST_FIRST(&arg->dirs)->objid; in fs_populate_sattrs()
387 if ((cur->inode->flags & FI_ROOT) == 0 ) { in fs_populate_sattrs()
395 fsnode_isroot(cur) ? cur->next : cur->child; in fs_populate_sattrs()
396 c != NULL; c = c->next) { in fs_populate_sattrs()
397 switch (c->type) { in fs_populate_sattrs()
418 parent = SLIST_EMPTY(&arg->dirs) ? in fs_populate_sattrs()
419 arg->rootdirid : SLIST_FIRST(&arg->dirs)->objid; in fs_populate_sattrs()
427 parent = SLIST_FIRST(&arg->dirs)->objid; in fs_populate_sattrs()
433 daclcount = nitems(aces); in fs_populate_sattrs()
437 gid = sb->st_gid; in fs_populate_sattrs()
438 mode = sb->st_mode; in fs_populate_sattrs()
439 uid = sb->st_uid; in fs_populate_sattrs()
441 memset(aces, 0, sizeof(aces)); in fs_populate_sattrs()
442 aces[0].z_flags = ACE_OWNER; in fs_populate_sattrs()
443 aces[0].z_type = ACE_ACCESS_ALLOWED_ACE_TYPE; in fs_populate_sattrs()
444 aces[0].z_access_mask = ACE_WRITE_ATTRIBUTES | ACE_WRITE_OWNER | in fs_populate_sattrs()
448 aces[0].z_access_mask |= ACE_READ_DATA; in fs_populate_sattrs()
450 aces[0].z_access_mask |= ACE_WRITE_DATA | ACE_APPEND_DATA; in fs_populate_sattrs()
452 aces[0].z_access_mask |= ACE_EXECUTE; in fs_populate_sattrs()
454 aces[1].z_flags = ACE_GROUP | ACE_IDENTIFIER_GROUP; in fs_populate_sattrs()
455 aces[1].z_type = ACE_ACCESS_ALLOWED_ACE_TYPE; in fs_populate_sattrs()
456 aces[1].z_access_mask = ACE_READ_ACL | ACE_READ_ATTRIBUTES | in fs_populate_sattrs()
459 aces[1].z_access_mask |= ACE_READ_DATA; in fs_populate_sattrs()
461 aces[1].z_access_mask |= ACE_WRITE_DATA | ACE_APPEND_DATA; in fs_populate_sattrs()
463 aces[1].z_access_mask |= ACE_EXECUTE; in fs_populate_sattrs()
465 aces[2].z_flags = ACE_EVERYONE; in fs_populate_sattrs()
466 aces[2].z_type = ACE_ACCESS_ALLOWED_ACE_TYPE; in fs_populate_sattrs()
467 aces[2].z_access_mask = ACE_READ_ACL | ACE_READ_ATTRIBUTES | in fs_populate_sattrs()
470 aces[2].z_access_mask |= ACE_READ_DATA; in fs_populate_sattrs()
472 aces[2].z_access_mask |= ACE_WRITE_DATA | ACE_APPEND_DATA; in fs_populate_sattrs()
474 aces[2].z_access_mask |= ACE_EXECUTE; in fs_populate_sattrs()
478 /* At most one variable-length attribute. */ in fs_populate_sattrs()
482 /* At most five variable-length attributes. */ in fs_populate_sattrs()
490 sahdr->sa_magic = SA_MAGIC; in fs_populate_sattrs()
491 SA_HDR_LAYOUT_INFO_ENCODE(sahdr->sa_layout_info, layout, hdrsz); in fs_populate_sattrs()
507 * We deliberately set atime = mtime here to ensure that images are in fs_populate_sattrs()
510 fs_populate_time(fs, attrbuf, &sb->st_mtim, ZPL_ATIME, &bonussz); in fs_populate_sattrs()
511 fs_populate_time(fs, attrbuf, &sb->st_ctim, ZPL_CTIME, &bonussz); in fs_populate_sattrs()
512 fs_populate_time(fs, attrbuf, &sb->st_mtim, ZPL_MTIME, &bonussz); in fs_populate_sattrs()
515 fs_populate_time(fs, attrbuf, &sb->st_ctim, ZPL_CRTIME, &bonussz); in fs_populate_sattrs()
517 fs_populate_time(fs, attrbuf, &sb->st_birthtim, ZPL_CRTIME, &bonussz); in fs_populate_sattrs()
520 fs_populate_varszattr(fs, attrbuf, aces, sizeof(aces), 0, in fs_populate_sattrs()
522 sahdr->sa_lengths[0] = sizeof(aces); in fs_populate_sattrs()
524 if (cur->type == S_IFLNK) { in fs_populate_sattrs()
529 sahdr->sa_lengths[0], ZPL_SYMLINK, &bonussz); in fs_populate_sattrs()
530 sahdr->sa_lengths[1] = (uint16_t)objsize; in fs_populate_sattrs()
533 dnode->dn_bonuslen = bonussz; in fs_populate_sattrs()
549 assert(cur->type == S_IFREG); in fs_populate_file()
550 assert((cur->inode->flags & FI_ROOT) == 0); in fs_populate_file()
552 zfs = arg->zfs; in fs_populate_file()
554 assert(cur->inode->ino != 0); in fs_populate_file()
555 if ((cur->inode->flags & FI_ALLOCATED) != 0) { in fs_populate_file()
559 * XXX-MJ need to check whether it crosses datasets, add a test in fs_populate_file()
562 fs_populate_dirent(arg, cur, cur->inode->ino); in fs_populate_file()
566 dnode = objset_dnode_bonus_alloc(arg->fs->os, in fs_populate_file()
568 cur->inode->ino = dnid; in fs_populate_file()
569 cur->inode->flags |= FI_ALLOCATED; in fs_populate_file()
573 buf = zfs->filebuf; in fs_populate_file()
574 bufsz = sizeof(zfs->filebuf); in fs_populate_file()
575 size = cur->inode->st.st_size; in fs_populate_file()
576 c = dnode_cursor_init(zfs, arg->fs->os, dnode, size, 0); in fs_populate_file()
584 nbytes = MIN(size - foff, (off_t)bufsz); in fs_populate_file()
588 err(1, "reading from '%s'", cur->name); in fs_populate_file()
591 cur->name); in fs_populate_file()
596 memset(buf + nbytes, 0, bufsz - nbytes); in fs_populate_file()
599 loc = objset_space_alloc(zfs, arg->fs->os, &reqbytes); in fs_populate_file()
618 assert(cur->type == S_IFDIR); in fs_populate_dir()
619 assert((cur->inode->flags & FI_ALLOCATED) == 0); in fs_populate_dir()
621 os = arg->fs->os; in fs_populate_dir()
629 if (!SLIST_EMPTY(&arg->dirs)) { in fs_populate_dir()
638 arg->rootdirid = dnid; in fs_populate_dir()
639 dirfd = arg->rootdirfd; in fs_populate_dir()
640 arg->rootdirfd = -1; in fs_populate_dir()
644 * Set ZPL attributes. in fs_populate_dir()
652 if ((cur->inode->flags & FI_ROOT) == 0) { in fs_populate_dir()
656 dir->dirfd = dirfd; in fs_populate_dir()
657 dir->objid = dnid; in fs_populate_dir()
658 dir->zap = zap_alloc(os, dnode); in fs_populate_dir()
659 SLIST_INSERT_HEAD(&arg->dirs, dir, next); in fs_populate_dir()
661 zap_write(arg->zfs, zap_alloc(os, dnode)); in fs_populate_dir()
662 fs_build_one(arg->zfs, cur->inode->param, cur->child, dirfd); in fs_populate_dir()
672 assert(cur->type == S_IFLNK); in fs_populate_symlink()
673 assert((cur->inode->flags & (FI_ALLOCATED | FI_ROOT)) == 0); in fs_populate_symlink()
675 dnode = objset_dnode_bonus_alloc(arg->fs->os, in fs_populate_symlink()
686 for (cur = cur->next; cur != NULL; cur = cur->next) { in fsnode_next()
701 switch (cur->type) { in fs_foreach_populate()
717 ret = (cur->inode->flags & FI_ROOT) != 0 ? 0 : 1; in fs_foreach_populate()
720 (cur->child == NULL || (cur->inode->flags & FI_ROOT) != 0)) { in fs_foreach_populate()
728 dir = SLIST_FIRST(&arg->dirs); in fs_foreach_populate()
729 SLIST_REMOVE_HEAD(&arg->dirs, next); in fs_foreach_populate()
730 zap_write(arg->zfs, dir->zap); in fs_foreach_populate()
731 if (dir->dirfd != -1) in fs_foreach_populate()
732 eclose(dir->dirfd); in fs_foreach_populate()
734 cur = cur->parent; in fs_foreach_populate()
736 (cur->inode->flags & FI_ROOT) == 0); in fs_foreach_populate()
760 * allows us to set file attributes quickly.
771 os = fs->os; in fs_set_zpl_attrs()
774 * The on-disk tables are stored in two ZAP objects, the registry object in fs_set_zpl_attrs()
793 SA_ATTR_ENCODE(attr, (uint64_t)i, sa->size, sa->bs); in fs_set_zpl_attrs()
794 zap_add_uint64(sarzap, sa->name, attr); in fs_set_zpl_attrs()
800 * layouts for use by the ZPL, one for non-symlinks and one for in fs_set_zpl_attrs()
805 assert(zpl_attr_layout[nitems(zpl_attr_layout) - 1] == ZPL_SYMLINK); in fs_set_zpl_attrs()
807 zpl_attr_layout, nitems(zpl_attr_layout) - 1); in fs_set_zpl_attrs()
827 fs->sacnt = nitems(zpl_attrs); in fs_set_zpl_attrs()
828 fs->saoffs = ecalloc(fs->sacnt, sizeof(*fs->saoffs)); in fs_set_zpl_attrs()
829 for (size_t i = 0; i < fs->sacnt; i++) in fs_set_zpl_attrs()
830 fs->saoffs[i] = 0xffff; in fs_set_zpl_attrs()
835 assert(zpl_attr_layout[i] < fs->sacnt); in fs_set_zpl_attrs()
837 fs->saoffs[zpl_attr_layout[i]] = offset; in fs_set_zpl_attrs()
841 fs->satab = zpl_attrs; in fs_set_zpl_attrs()
863 * If we were asked to specify a bootfs, set it here. in fs_layout_one()
865 if (zfs->bootfs != NULL && strcmp(zfs->bootfs, in fs_layout_one()
867 zap_add_uint64(zfs->poolprops, "bootfs", in fs_layout_one()
878 if (strcmp(mountpoint, zfs->rootpath) != 0) { in fs_layout_one()
879 mountpoint += strlen(zfs->rootpath); in fs_layout_one()
894 for (; cur != NULL && strcmp(cur->name, name) != 0; in fs_layout_one()
895 cur = cur->next) in fs_layout_one()
903 if (cur->type != S_IFDIR) { in fs_layout_one()
909 cur = cur->child; in fs_layout_one()
914 assert(cur->type == S_IFDIR); in fs_layout_one()
921 assert((cur->inode->flags & FI_ROOT) == 0); in fs_layout_one()
923 cur->inode->flags |= FI_ROOT; in fs_layout_one()
924 assert(cur->inode->param == NULL); in fs_layout_one()
925 cur->inode->param = dsldir; in fs_layout_one()
937 if (cur->type == S_IFDIR && fsnode_isroot(cur)) in fs_foreach_mark()
940 if (cur->inode->ino == 0) { in fs_foreach_mark()
941 cur->inode->ino = ++(*countp); in fs_foreach_mark()
942 cur->inode->nlink = 1; in fs_foreach_mark()
944 cur->inode->nlink++; in fs_foreach_mark()
947 return ((cur->inode->flags & FI_ROOT) != 0 ? 0 : 1); in fs_foreach_mark()
952 * - create an object set for the dataset,
953 * - add required metadata (SA tables, property definitions, etc.) to that
954 * object set,
955 * - optionally populate the object set with file objects, using "root" as the
981 assert(dirfd == -1); in fs_build_one()
984 root->inode = ecalloc(1, sizeof(*root->inode)); in fs_build_one()
985 root->name = estrdup("."); in fs_build_one()
986 root->type = S_IFDIR; in fs_build_one()
988 stp = &root->inode->st; in fs_build_one()
989 stp->st_uid = 0; in fs_build_one()
990 stp->st_gid = 0; in fs_build_one()
991 stp->st_mode = S_IFDIR | 0755; in fs_build_one()
993 assert(root->type == S_IFDIR); in fs_build_one()
997 * Initialize the object set for this dataset. in fs_build_one()
1057 * All finished with this object set, we may as well write it now. in fs_build_one()
1059 * information stored in the object set, so it can't be freed just yet. in fs_build_one()
1064 free(root->inode); in fs_build_one()
1065 free(root->name); in fs_build_one()
1072 * Create an object set for each DSL directory which has a dataset and doesn't
1073 * already have an object set.
1079 fs_build_one(zfs, dsldir, NULL, -1); in fs_build_unmounted()
1093 dsl_dir_foreach(zfs, zfs->rootdsldir, fs_layout_one, root); in fs_build()
1098 if (zfs->bootfs != NULL && !zap_entry_exists(zfs->poolprops, "bootfs")) in fs_build()
1100 zfs->bootfs); in fs_build()
1112 fs_build_one(zfs, root->inode->param, root, dirfd); in fs_build()
1119 dsl_dir_foreach(zfs, zfs->rootdsldir, fs_build_unmounted, NULL); in fs_build()