Date: Thu, 31 Dec 2009 22:12:40 +0000 From: "Philip M. Gollucci" <pgollucci@p6m7g8.com> To: Xin LI <delphij@freebsd.org> Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org Subject: Re: 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... Message-ID: <4B3D21D8.5030301@p6m7g8.com> In-Reply-To: <200912282215.nBSMFCw3002728@svn.freebsd.org> References: <200912282215.nBSMFCw3002728@svn.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
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@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/svn-src-all > To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org" -- ------------------------------------------------------------------------ 1024D/DB9B8C1C B90B FBC3 A3A1 C71A 8E70 3F8C 75B8 8FFB DB9B 8C1C Philip M. Gollucci (pgollucci@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.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4B3D21D8.5030301>