svn commit: r201143 - in head:
cddl/contrib/opensolaris/cmd/zpool sys/cddl/boot/zfs
sys/cddl/contrib/opensolaris/common/zfs sys/cddl/contrib/opensolaris/uts/common/fs/zfs
sys/cddl/contrib/opensolar...
Philip M. Gollucci
pgollucci at p6m7g8.com
Thu Dec 31 22:12:44 UTC 2009
Question,
So this is not like when we went from v6 to v13 and you had to do both
installkernel + installworld for zfs to re-initialize correctly on the
next reboot ?
If it is its a pretty big issue for people with ZFSROOT or zfs only
systems as it forces them to get the kernel right on the 1st go b/c our
loader can't boot off of snapshots (like sun).
In that case, I (non src/ person) object to any mfc, it its not the
case, excellent!
Xin LI wrote:
> Author: delphij
> Date: Mon Dec 28 22:15:11 2009
> New Revision: 201143
> URL: http://svn.freebsd.org/changeset/base/201143
>
> Log:
> Apply OpenSolaris revision 8012 which brings our zpool to version 14,
> making it possible for zpools created on OpenSolaris 2009.06 be used
> on FreeBSD.
>
> PR: kern/141800
> Submitted by: mm
> Reviewed by: pjd, trasz
> Obtained from: OpenSolaris
> MFC after: 2 weeks
>
> Modified:
> head/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c
> head/sys/cddl/boot/zfs/zfsimpl.h
> head/sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c
> head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_acl.h
> head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c
> head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c
> head/sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h
>
> Modified: head/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c
> ==============================================================================
> --- head/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c Mon Dec 28 22:14:49 2009 (r201142)
> +++ head/cddl/contrib/opensolaris/cmd/zpool/zpool_main.c Mon Dec 28 22:15:11 2009 (r201143)
> @@ -3488,6 +3488,8 @@ zpool_do_upgrade(int argc, char **argv)
> (void) printf(gettext(" 11 Improved scrub performance\n"));
> (void) printf(gettext(" 12 Snapshot properties\n"));
> (void) printf(gettext(" 13 snapused property\n"));
> + (void) printf(gettext(" 14 passthrough-x aclinherit "
> + "support\n"));
> (void) printf(gettext("For more information on a particular "
> "version, including supported releases, see:\n\n"));
> (void) printf("http://www.opensolaris.org/os/community/zfs/"
>
> Modified: head/sys/cddl/boot/zfs/zfsimpl.h
> ==============================================================================
> --- head/sys/cddl/boot/zfs/zfsimpl.h Mon Dec 28 22:14:49 2009 (r201142)
> +++ head/sys/cddl/boot/zfs/zfsimpl.h Mon Dec 28 22:15:11 2009 (r201143)
> @@ -479,13 +479,14 @@ typedef enum {
> #define SPA_VERSION_11 11ULL
> #define SPA_VERSION_12 12ULL
> #define SPA_VERSION_13 13ULL
> +#define SPA_VERSION_14 14ULL
> /*
> * When bumping up SPA_VERSION, make sure GRUB ZFS understand the on-disk
> * format change. Go to usr/src/grub/grub-0.95/stage2/{zfs-include/, fsys_zfs*},
> * and do the appropriate changes.
> */
> -#define SPA_VERSION SPA_VERSION_13
> -#define SPA_VERSION_STRING "13"
> +#define SPA_VERSION SPA_VERSION_14
> +#define SPA_VERSION_STRING "14"
>
> /*
> * Symbolic names for the changes that caused a SPA_VERSION switch.
> @@ -520,6 +521,7 @@ typedef enum {
> #define SPA_VERSION_DSL_SCRUB SPA_VERSION_11
> #define SPA_VERSION_SNAP_PROPS SPA_VERSION_12
> #define SPA_VERSION_USED_BREAKDOWN SPA_VERSION_13
> +#define SPA_VERSION_PASSTHROUGH_X SPA_VERSION_14
>
> /*
> * The following are configuration names used in the nvlist describing a pool's
>
> Modified: head/sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c
> ==============================================================================
> --- head/sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c Mon Dec 28 22:14:49 2009 (r201142)
> +++ head/sys/cddl/contrib/opensolaris/common/zfs/zfs_prop.c Mon Dec 28 22:15:11 2009 (r201143)
> @@ -97,6 +97,7 @@ zfs_prop_init(void)
> { "restricted", ZFS_ACL_RESTRICTED },
> { "passthrough", ZFS_ACL_PASSTHROUGH },
> { "secure", ZFS_ACL_RESTRICTED }, /* bkwrd compatability */
> + { "passthrough-x", ZFS_ACL_PASSTHROUGH_X },
> { NULL }
> };
>
> @@ -173,7 +174,7 @@ zfs_prop_init(void)
> "discard | groupmask | passthrough", "ACLMODE", acl_mode_table);
> register_index(ZFS_PROP_ACLINHERIT, "aclinherit", ZFS_ACL_RESTRICTED,
> PROP_INHERIT, ZFS_TYPE_FILESYSTEM,
> - "discard | noallow | restricted | passthrough",
> + "discard | noallow | restricted | passthrough | passthrough-x",
> "ACLINHERIT", acl_inherit_table);
> register_index(ZFS_PROP_COPIES, "copies", 1,
> PROP_INHERIT, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME,
>
> Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_acl.h
> ==============================================================================
> --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_acl.h Mon Dec 28 22:14:49 2009 (r201142)
> +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_acl.h Mon Dec 28 22:15:11 2009 (r201143)
> @@ -26,8 +26,6 @@
> #ifndef _SYS_FS_ZFS_ACL_H
> #define _SYS_FS_ZFS_ACL_H
>
> -#pragma ident "%Z%%M% %I% %E% SMI"
> -
> #ifdef _KERNEL
> #include <sys/cred.h>
> #endif
> @@ -180,6 +178,7 @@ typedef struct zfs_acl {
> #define ZFS_ACL_GROUPMASK 2
> #define ZFS_ACL_PASSTHROUGH 3
> #define ZFS_ACL_RESTRICTED 4
> +#define ZFS_ACL_PASSTHROUGH_X 5
>
> struct znode;
> struct zfsvfs;
>
> Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c
> ==============================================================================
> --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c Mon Dec 28 22:14:49 2009 (r201142)
> +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c Mon Dec 28 22:15:11 2009 (r201143)
> @@ -1663,7 +1663,8 @@ zfs_ace_can_use(znode_t *zp, uint16_t ac
> * inherit inheritable ACEs from parent
> */
> static zfs_acl_t *
> -zfs_acl_inherit(znode_t *zp, zfs_acl_t *paclp, boolean_t *need_chmod)
> +zfs_acl_inherit(znode_t *zp, zfs_acl_t *paclp, uint64_t mode,
> + boolean_t *need_chmod)
> {
> zfsvfs_t *zfsvfs = zp->z_zfsvfs;
> void *pacep;
> @@ -1676,112 +1677,123 @@ zfs_acl_inherit(znode_t *zp, zfs_acl_t *
> size_t ace_size;
> void *data1, *data2;
> size_t data1sz, data2sz;
> - enum vtype vntype = ZTOV(zp)->v_type;
> + boolean_t vdir = ZTOV(zp)->v_type == VDIR;
> + boolean_t vreg = ZTOV(zp)->v_type == VREG;
> + boolean_t passthrough, passthrough_x, noallow;
> +
> + passthrough_x =
> + zfsvfs->z_acl_inherit == ZFS_ACL_PASSTHROUGH_X;
> + passthrough = passthrough_x ||
> + zfsvfs->z_acl_inherit == ZFS_ACL_PASSTHROUGH;
> + noallow =
> + zfsvfs->z_acl_inherit == ZFS_ACL_NOALLOW;
>
> *need_chmod = B_TRUE;
> pacep = NULL;
> aclp = zfs_acl_alloc(paclp->z_version);
> - if (zfsvfs->z_acl_inherit != ZFS_ACL_DISCARD) {
> - while (pacep = zfs_acl_next_ace(paclp, pacep, &who,
> - &access_mask, &iflags, &type)) {
> + if (zfsvfs->z_acl_inherit == ZFS_ACL_DISCARD)
> + return (aclp);
> + while (pacep = zfs_acl_next_ace(paclp, pacep, &who,
> + &access_mask, &iflags, &type)) {
>
> - /*
> - * don't inherit bogus ACEs
> - */
> - if (!zfs_acl_valid_ace_type(type, iflags))
> - continue;
> + /*
> + * don't inherit bogus ACEs
> + */
> + if (!zfs_acl_valid_ace_type(type, iflags))
> + continue;
>
> - if (zfsvfs->z_acl_inherit == ZFS_ACL_NOALLOW &&
> - type == ALLOW)
> - continue;
> + if (noallow && type == ALLOW)
> + continue;
>
> - ace_size = aclp->z_ops.ace_size(pacep);
> + ace_size = aclp->z_ops.ace_size(pacep);
>
> - if (!zfs_ace_can_use(zp, iflags))
> - continue;
> + if (!zfs_ace_can_use(zp, iflags))
> + continue;
>
> - /*
> - * If owner@, group@, or everyone@ inheritable
> - * then zfs_acl_chmod() isn't needed.
> - */
> - if (zfsvfs->z_acl_inherit ==
> - ZFS_ACL_PASSTHROUGH &&
> - ((iflags & (ACE_OWNER|ACE_EVERYONE)) ||
> - ((iflags & OWNING_GROUP) ==
> - OWNING_GROUP)) && (vntype == VREG ||
> - (vntype == VDIR &&
> - (iflags & ACE_DIRECTORY_INHERIT_ACE))))
> - *need_chmod = B_FALSE;
> -
> - aclnode = zfs_acl_node_alloc(ace_size);
> - list_insert_tail(&aclp->z_acl, aclnode);
> - acep = aclnode->z_acldata;
> - zfs_set_ace(aclp, acep, access_mask, type,
> - who, iflags|ACE_INHERITED_ACE);
> + /*
> + * If owner@, group@, or everyone@ inheritable
> + * then zfs_acl_chmod() isn't needed.
> + */
> + if (passthrough &&
> + ((iflags & (ACE_OWNER|ACE_EVERYONE)) ||
> + ((iflags & OWNING_GROUP) ==
> + OWNING_GROUP)) && (vreg || (vdir && (iflags &
> + ACE_DIRECTORY_INHERIT_ACE)))) {
> + *need_chmod = B_FALSE;
> +
> + if (!vdir && passthrough_x &&
> + ((mode & (S_IXUSR | S_IXGRP | S_IXOTH)) == 0)) {
> + access_mask &= ~ACE_EXECUTE;
> + }
> + }
> +
> + aclnode = zfs_acl_node_alloc(ace_size);
> + list_insert_tail(&aclp->z_acl, aclnode);
> + acep = aclnode->z_acldata;
> +
> + zfs_set_ace(aclp, acep, access_mask, type,
> + who, iflags|ACE_INHERITED_ACE);
> +
> + /*
> + * Copy special opaque data if any
> + */
> + if ((data1sz = paclp->z_ops.ace_data(pacep, &data1)) != 0) {
> + VERIFY((data2sz = aclp->z_ops.ace_data(acep,
> + &data2)) == data1sz);
> + bcopy(data1, data2, data2sz);
> + }
> + aclp->z_acl_count++;
> + aclnode->z_ace_count++;
> + aclp->z_acl_bytes += aclnode->z_size;
> + newflags = aclp->z_ops.ace_flags_get(acep);
> +
> + if (vdir)
> + aclp->z_hints |= ZFS_INHERIT_ACE;
> +
> + if ((iflags & ACE_NO_PROPAGATE_INHERIT_ACE) || !vdir) {
> + newflags &= ~ALL_INHERIT;
> + aclp->z_ops.ace_flags_set(acep,
> + newflags|ACE_INHERITED_ACE);
> + zfs_restricted_update(zfsvfs, aclp, acep);
> + continue;
> + }
> +
> + ASSERT(vdir);
> +
> + newflags = aclp->z_ops.ace_flags_get(acep);
> + if ((iflags & (ACE_FILE_INHERIT_ACE |
> + ACE_DIRECTORY_INHERIT_ACE)) !=
> + ACE_FILE_INHERIT_ACE) {
> + aclnode2 = zfs_acl_node_alloc(ace_size);
> + list_insert_tail(&aclp->z_acl, aclnode2);
> + acep2 = aclnode2->z_acldata;
> + zfs_set_ace(aclp, acep2,
> + access_mask, type, who,
> + iflags|ACE_INHERITED_ACE);
> + newflags |= ACE_INHERIT_ONLY_ACE;
> + aclp->z_ops.ace_flags_set(acep, newflags);
> + newflags &= ~ALL_INHERIT;
> + aclp->z_ops.ace_flags_set(acep2,
> + newflags|ACE_INHERITED_ACE);
>
> /*
> * Copy special opaque data if any
> */
> - if ((data1sz = paclp->z_ops.ace_data(pacep,
> + if ((data1sz = aclp->z_ops.ace_data(acep,
> &data1)) != 0) {
> - VERIFY((data2sz = aclp->z_ops.ace_data(acep,
> + VERIFY((data2sz =
> + aclp->z_ops.ace_data(acep2,
> &data2)) == data1sz);
> - bcopy(data1, data2, data2sz);
> + bcopy(data1, data2, data1sz);
> }
> aclp->z_acl_count++;
> - aclnode->z_ace_count++;
> + aclnode2->z_ace_count++;
> aclp->z_acl_bytes += aclnode->z_size;
> - newflags = aclp->z_ops.ace_flags_get(acep);
> -
> - if (vntype == VDIR)
> - aclp->z_hints |= ZFS_INHERIT_ACE;
> -
> - if ((iflags & ACE_NO_PROPAGATE_INHERIT_ACE) ||
> - (vntype != VDIR)) {
> - newflags &= ~ALL_INHERIT;
> - aclp->z_ops.ace_flags_set(acep,
> - newflags|ACE_INHERITED_ACE);
> - zfs_restricted_update(zfsvfs, aclp, acep);
> - continue;
> - }
> -
> - ASSERT(vntype == VDIR);
> -
> - newflags = aclp->z_ops.ace_flags_get(acep);
> - if ((iflags & (ACE_FILE_INHERIT_ACE |
> - ACE_DIRECTORY_INHERIT_ACE)) !=
> - ACE_FILE_INHERIT_ACE) {
> - aclnode2 = zfs_acl_node_alloc(ace_size);
> - list_insert_tail(&aclp->z_acl, aclnode2);
> - acep2 = aclnode2->z_acldata;
> - zfs_set_ace(aclp, acep2,
> - access_mask, type, who,
> - iflags|ACE_INHERITED_ACE);
> - newflags |= ACE_INHERIT_ONLY_ACE;
> - aclp->z_ops.ace_flags_set(acep, newflags);
> - newflags &= ~ALL_INHERIT;
> - aclp->z_ops.ace_flags_set(acep2,
> - newflags|ACE_INHERITED_ACE);
> -
> - /*
> - * Copy special opaque data if any
> - */
> - if ((data1sz = aclp->z_ops.ace_data(acep,
> - &data1)) != 0) {
> - VERIFY((data2sz =
> - aclp->z_ops.ace_data(acep2,
> - &data2)) == data1sz);
> - bcopy(data1, data2, data1sz);
> - }
> - aclp->z_acl_count++;
> - aclnode2->z_ace_count++;
> - aclp->z_acl_bytes += aclnode->z_size;
> - zfs_restricted_update(zfsvfs, aclp, acep2);
> - } else {
> - newflags |= ACE_INHERIT_ONLY_ACE;
> - aclp->z_ops.ace_flags_set(acep,
> - newflags|ACE_INHERITED_ACE);
> - }
> + zfs_restricted_update(zfsvfs, aclp, acep2);
> + } else {
> + newflags |= ACE_INHERIT_ONLY_ACE;
> + aclp->z_ops.ace_flags_set(acep,
> + newflags|ACE_INHERITED_ACE);
> }
> }
> return (aclp);
> @@ -1876,7 +1888,7 @@ zfs_perm_init(znode_t *zp, znode_t *pare
> mutex_enter(&parent->z_acl_lock);
> VERIFY(0 == zfs_acl_node_read(parent, &paclp, B_FALSE));
> mutex_exit(&parent->z_acl_lock);
> - aclp = zfs_acl_inherit(zp, paclp, &need_chmod);
> + aclp = zfs_acl_inherit(zp, paclp, mode, &need_chmod);
> zfs_acl_free(paclp);
> } else {
> aclp = zfs_acl_alloc(zfs_acl_version_zp(zp));
>
> Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c
> ==============================================================================
> --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c Mon Dec 28 22:14:49 2009 (r201142)
> +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c Mon Dec 28 22:15:11 2009 (r201143)
> @@ -1491,6 +1491,14 @@ zfs_set_prop_nvlist(const char *name, nv
> if (zpl_earlier_version(name, ZPL_VERSION_FUID))
> return (ENOTSUP);
> break;
> +
> + case ZFS_PROP_ACLINHERIT:
> + if (nvpair_type(elem) == DATA_TYPE_UINT64 &&
> + nvpair_value_uint64(elem, &intval) == 0)
> + if (intval == ZFS_ACL_PASSTHROUGH_X &&
> + zfs_earlier_version(name,
> + SPA_VERSION_PASSTHROUGH_X))
> + return (ENOTSUP);
> }
> }
>
>
> Modified: head/sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h
> ==============================================================================
> --- head/sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h Mon Dec 28 22:14:49 2009 (r201142)
> +++ head/sys/cddl/contrib/opensolaris/uts/common/sys/fs/zfs.h Mon Dec 28 22:15:11 2009 (r201143)
> @@ -253,13 +253,14 @@ typedef enum zfs_cache_type {
> #define SPA_VERSION_11 11ULL
> #define SPA_VERSION_12 12ULL
> #define SPA_VERSION_13 13ULL
> +#define SPA_VERSION_14 14ULL
> /*
> * When bumping up SPA_VERSION, make sure GRUB ZFS understands the on-disk
> * format change. Go to usr/src/grub/grub-0.95/stage2/{zfs-include/, fsys_zfs*},
> * and do the appropriate changes.
> */
> -#define SPA_VERSION SPA_VERSION_13
> -#define SPA_VERSION_STRING "13"
> +#define SPA_VERSION SPA_VERSION_14
> +#define SPA_VERSION_STRING "14"
>
> /*
> * Symbolic names for the changes that caused a SPA_VERSION switch.
> @@ -294,6 +295,7 @@ typedef enum zfs_cache_type {
> #define SPA_VERSION_DSL_SCRUB SPA_VERSION_11
> #define SPA_VERSION_SNAP_PROPS SPA_VERSION_12
> #define SPA_VERSION_USED_BREAKDOWN SPA_VERSION_13
> +#define SPA_VERSION_PASSTHROUGH_X SPA_VERSION_14
>
> /*
> * ZPL version - rev'd whenever an incompatible on-disk format change
> _______________________________________________
> svn-src-all at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/svn-src-all
> To unsubscribe, send any mail to "svn-src-all-unsubscribe at freebsd.org"
--
------------------------------------------------------------------------
1024D/DB9B8C1C B90B FBC3 A3A1 C71A 8E70 3F8C 75B8 8FFB DB9B 8C1C
Philip M. Gollucci (pgollucci at p6m7g8.com) c: 703.336.9354
VP Apache Infrastructure; Member, Apache Software Foundation
Committer, FreeBSD Foundation
Consultant, P6M7G8 Inc.
Sr. System Admin, Ridecharge Inc.
Work like you don't need the money,
love like you'll never get hurt,
and dance like nobody's watching.
More information about the svn-src-all
mailing list