diff options
| author | Janice Chang <Janice.Chang@Sun.COM> | 2008-09-30 02:00:40 -0400 |
|---|---|---|
| committer | Janice Chang <Janice.Chang@Sun.COM> | 2008-09-30 02:00:40 -0400 |
| commit | 9660e5cb810c5efc22db0f1459461c1f1eec15b9 (patch) | |
| tree | f1299f0a4c0a801ed25271d7633e916802e68f40 /usr/src | |
| parent | 7eea693d6b672899726e75993fddc4e95b52647f (diff) | |
| download | illumos-joyent-9660e5cb810c5efc22db0f1459461c1f1eec15b9.tar.gz | |
PSARC/2008/588 VFSFT_SYSATTR_VIEWS
6739967 New VFSFT needed for sysattr "view" interface (VFSFT_XVATTR currently overloaded)
Diffstat (limited to 'usr/src')
| -rw-r--r-- | usr/src/uts/common/fs/nfs/nfs4_srv.c | 19 | ||||
| -rw-r--r-- | usr/src/uts/common/fs/nfs/nfs4_vnops.c | 2 | ||||
| -rw-r--r-- | usr/src/uts/common/fs/smbclnt/smbfs/smbfs_vnops.c | 9 | ||||
| -rw-r--r-- | usr/src/uts/common/fs/smbsrv/smb_fsops.c | 22 | ||||
| -rw-r--r-- | usr/src/uts/common/fs/smbsrv/smb_tree.c | 3 | ||||
| -rw-r--r-- | usr/src/uts/common/fs/smbsrv/smb_vops.c | 5 | ||||
| -rw-r--r-- | usr/src/uts/common/fs/tmpfs/tmp_vfsops.c | 6 | ||||
| -rw-r--r-- | usr/src/uts/common/fs/tmpfs/tmp_vnops.c | 4 | ||||
| -rw-r--r-- | usr/src/uts/common/fs/ufs/ufs_vfsops.c | 4 | ||||
| -rw-r--r-- | usr/src/uts/common/fs/ufs/ufs_vnops.c | 2 | ||||
| -rw-r--r-- | usr/src/uts/common/fs/vfs.c | 8 | ||||
| -rw-r--r-- | usr/src/uts/common/fs/xattr.c | 5 | ||||
| -rw-r--r-- | usr/src/uts/common/fs/zfs/zfs_vfsops.c | 1 | ||||
| -rw-r--r-- | usr/src/uts/common/fs/zfs/zfs_vnops.c | 12 | ||||
| -rw-r--r-- | usr/src/uts/common/smbsrv/smb_ktypes.h | 10 | ||||
| -rw-r--r-- | usr/src/uts/common/smbsrv/smb_vops.h | 3 | ||||
| -rw-r--r-- | usr/src/uts/common/sys/vfs.h | 3 | ||||
| -rw-r--r-- | usr/src/uts/common/syscall/open.c | 4 |
18 files changed, 31 insertions, 91 deletions
diff --git a/usr/src/uts/common/fs/nfs/nfs4_srv.c b/usr/src/uts/common/fs/nfs/nfs4_srv.c index 1185f05abf..15fb7d1fb1 100644 --- a/usr/src/uts/common/fs/nfs/nfs4_srv.c +++ b/usr/src/uts/common/fs/nfs/nfs4_srv.c @@ -2884,25 +2884,8 @@ rfs4_op_openattr(nfs_argop4 *argop, nfs_resop4 *resop, struct svc_req *req, goto out; } - /* - * Make a couple of checks made by copen() - * - * Check to make sure underlying fs supports xattrs. This - * is required because solaris filesystem implementations - * (UFS/TMPFS) don't enforce the noxattr mount option - * in VOP_LOOKUP(LOOKUP_XATTR). If fs doesn't support this - * pathconf cmd or if fs supports cmd but doesn't claim - * support for xattr, return NOTSUPP. It would be better - * to use VOP_PATHCONF( _PC_XATTR_ENABLED) for this; however, - * that cmd is not available to VOP_PATHCONF interface - * (it's only implemented inside pathconf syscall)... - * - * Verify permission to put attributes on files (access - * checks from copen). - */ - if ((cs->vp->v_vfsp->vfs_flag & VFS_XATTR) == 0 && - !vfs_has_feature(cs->vp->v_vfsp, VFSFT_XVATTR)) { + !vfs_has_feature(cs->vp->v_vfsp, VFSFT_SYSATTR_VIEWS)) { *cs->statusp = resp->status = puterrno4(ENOTSUP); goto out; } diff --git a/usr/src/uts/common/fs/nfs/nfs4_vnops.c b/usr/src/uts/common/fs/nfs/nfs4_vnops.c index 4caafc6049..3b0f8c4ba1 100644 --- a/usr/src/uts/common/fs/nfs/nfs4_vnops.c +++ b/usr/src/uts/common/fs/nfs/nfs4_vnops.c @@ -4968,7 +4968,7 @@ nfs4lookup_xattr(vnode_t *dvp, char *nm, vnode_t **vpp, int flags, cred_t *cr) mi = VTOMI4(dvp); if (!(mi->mi_vfsp->vfs_flag & VFS_XATTR) && - !vfs_has_feature(mi->mi_vfsp, VFSFT_XVATTR)) + !vfs_has_feature(mi->mi_vfsp, VFSFT_SYSATTR_VIEWS)) return (EINVAL); drp = VTOR4(dvp); diff --git a/usr/src/uts/common/fs/smbclnt/smbfs/smbfs_vnops.c b/usr/src/uts/common/fs/smbclnt/smbfs/smbfs_vnops.c index 4a56133b4a..1713538614 100644 --- a/usr/src/uts/common/fs/smbclnt/smbfs/smbfs_vnops.c +++ b/usr/src/uts/common/fs/smbclnt/smbfs/smbfs_vnops.c @@ -222,14 +222,7 @@ const fs_operation_def_t smbfs_vnodeops_template[] = { * XXX * When new and relevant functionality is enabled, we should be * calling vfs_set_feature() to inform callers that pieces of - * functionality are available, per PSARC 2007/227, e.g. - * - * VFSFT_XVATTR Supports xvattr for attrs - * VFSFT_CASEINSENSITIVE Supports case-insensitive - * VFSFT_NOCASESENSITIVE NOT case-sensitive - * VFSFT_DIRENTFLAGS Supports dirent flags - * VFSFT_ACLONCREATE Supports ACL on create - * VFSFT_ACEMASKONACCESS Can use ACEMASK for access + * functionality are available, per PSARC 2007/227. */ /* ARGSUSED */ static int diff --git a/usr/src/uts/common/fs/smbsrv/smb_fsops.c b/usr/src/uts/common/fs/smbsrv/smb_fsops.c index c501ec67bf..e8b9ad5d1f 100644 --- a/usr/src/uts/common/fs/smbsrv/smb_fsops.c +++ b/usr/src/uts/common/fs/smbsrv/smb_fsops.c @@ -161,7 +161,6 @@ smb_fsop_create_with_sd( int flags = 0; int rc; boolean_t is_dir; - boolean_t no_xvattr = B_FALSE; ASSERT(fs_sd); @@ -230,12 +229,8 @@ smb_fsop_create_with_sd( set_attr.sa_mask |= SMB_AT_GID; } - if (set_attr.sa_mask) { - if (smb_tree_has_feature(sr->tid_tree, SMB_TREE_UFS)) - no_xvattr = B_TRUE; - rc = smb_vop_setattr(vp, NULL, &set_attr, 0, kcred, - no_xvattr); - } + if (set_attr.sa_mask) + rc = smb_vop_setattr(vp, NULL, &set_attr, 0, kcred); if (rc == 0) { *ret_snode = smb_node_lookup(sr, &sr->arg.open, cr, vp, @@ -316,7 +311,6 @@ smb_fsop_create( smb_attr_t *ret_attr) { struct open_param *op = &sr->arg.open; - boolean_t no_xvattr = B_FALSE; smb_node_t *fnode; smb_attr_t file_attr; vnode_t *xattrdirvp; @@ -423,9 +417,6 @@ smb_fsop_create( return (rc); } - if (smb_tree_has_feature(sr->tid_tree, SMB_TREE_UFS)) - no_xvattr = B_TRUE; - attr->sa_vattr.va_uid = file_attr.sa_vattr.va_uid; attr->sa_vattr.va_gid = file_attr.sa_vattr.va_gid; attr->sa_mask = SMB_AT_UID | SMB_AT_GID; @@ -438,7 +429,7 @@ smb_fsop_create( * stream) file (see comments for smb_vop_setattr()). */ - rc = smb_vop_setattr(vp, NULL, attr, 0, kcred, no_xvattr); + rc = smb_vop_setattr(vp, NULL, attr, 0, kcred); if (rc != 0) { smb_node_release(fnode); @@ -1270,7 +1261,6 @@ smb_fsop_setattr( int rc = 0; int flags = 0; uint_t sa_mask; - boolean_t no_xvattr = B_FALSE; ASSERT(cr); ASSERT(snode); @@ -1327,12 +1317,8 @@ smb_fsop_setattr( ASSERT(unnamed_node->n_state != SMB_NODE_STATE_DESTROYING); unnamed_vp = unnamed_node->vp; } - if (sr && sr->tid_tree) - if (smb_tree_has_feature(sr->tid_tree, SMB_TREE_UFS)) - no_xvattr = B_TRUE; - rc = smb_vop_setattr(snode->vp, unnamed_vp, set_attr, flags, cr, - no_xvattr); + rc = smb_vop_setattr(snode->vp, unnamed_vp, set_attr, flags, cr); if ((rc == 0) && ret_attr) { /* diff --git a/usr/src/uts/common/fs/smbsrv/smb_tree.c b/usr/src/uts/common/fs/smbsrv/smb_tree.c index e8ef9e87d1..872fc5b924 100644 --- a/usr/src/uts/common/fs/smbsrv/smb_tree.c +++ b/usr/src/uts/common/fs/smbsrv/smb_tree.c @@ -764,9 +764,6 @@ smb_tree_get_flags(vfs_t *vfsp, smb_tree_t *tree) if (strncasecmp(name, NFS, sizeof (NFS)) == 0) flags |= SMB_TREE_NFS_MOUNTED; - if (strncasecmp(name, "UFS", sizeof ("UFS")) == 0) - flags |= SMB_TREE_UFS; - (void) strlcpy(tree->t_typename, name, SMB_TYPENAMELEN); (void) utf8_strupr((char *)tree->t_typename); diff --git a/usr/src/uts/common/fs/smbsrv/smb_vops.c b/usr/src/uts/common/fs/smbsrv/smb_vops.c index fad386c5c6..62e642b282 100644 --- a/usr/src/uts/common/fs/smbsrv/smb_vops.c +++ b/usr/src/uts/common/fs/smbsrv/smb_vops.c @@ -403,7 +403,7 @@ smb_vop_getattr(vnode_t *vp, vnode_t *unnamed_vp, smb_attr_t *ret_attr, int smb_vop_setattr(vnode_t *vp, vnode_t *unnamed_vp, smb_attr_t *set_attr, - int flags, cred_t *cr, boolean_t no_xvattr) + int flags, cred_t *cr) { int error = 0; int at_size = 0; @@ -428,8 +428,7 @@ smb_vop_setattr(vnode_t *vp, vnode_t *unnamed_vp, smb_attr_t *set_attr, set_attr->sa_vattr.va_mask = 0; - if ((no_xvattr == B_FALSE) && - vfs_has_feature(use_vp->v_vfsp, VFSFT_XVATTR)) { + if (vfs_has_feature(use_vp->v_vfsp, VFSFT_XVATTR)) { smb_vop_setup_xvattr(set_attr, &xvattr); vap = &xvattr.xva_vattr; } else { diff --git a/usr/src/uts/common/fs/tmpfs/tmp_vfsops.c b/usr/src/uts/common/fs/tmpfs/tmp_vfsops.c index 4ee833094f..44d7302779 100644 --- a/usr/src/uts/common/fs/tmpfs/tmp_vfsops.c +++ b/usr/src/uts/common/fs/tmpfs/tmp_vfsops.c @@ -19,12 +19,10 @@ * CDDL HEADER END */ /* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include <sys/types.h> #include <sys/param.h> #include <sys/sysmacros.h> @@ -372,7 +370,7 @@ tmp_mount( out: if (error == 0) - vfs_set_feature(vfsp, VFSFT_XVATTR); + vfs_set_feature(vfsp, VFSFT_SYSATTR_VIEWS); return (error); } diff --git a/usr/src/uts/common/fs/tmpfs/tmp_vnops.c b/usr/src/uts/common/fs/tmpfs/tmp_vnops.c index 3248df1b26..c036d27fec 100644 --- a/usr/src/uts/common/fs/tmpfs/tmp_vnops.c +++ b/usr/src/uts/common/fs/tmpfs/tmp_vnops.c @@ -23,8 +23,6 @@ * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include <sys/types.h> #include <sys/param.h> #include <sys/t_lock.h> @@ -2381,7 +2379,7 @@ tmp_pathconf( break; case _PC_SATTR_ENABLED: case _PC_SATTR_EXISTS: - *valp = vfs_has_feature(vp->v_vfsp, VFSFT_XVATTR) && + *valp = vfs_has_feature(vp->v_vfsp, VFSFT_SYSATTR_VIEWS) && (vp->v_type == VREG || vp->v_type == VDIR); error = 0; break; diff --git a/usr/src/uts/common/fs/ufs/ufs_vfsops.c b/usr/src/uts/common/fs/ufs/ufs_vfsops.c index d2783fede8..b443a6850c 100644 --- a/usr/src/uts/common/fs/ufs/ufs_vfsops.c +++ b/usr/src/uts/common/fs/ufs/ufs_vfsops.c @@ -37,8 +37,6 @@ */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include <sys/types.h> #include <sys/t_lock.h> #include <sys/param.h> @@ -427,7 +425,7 @@ ufs_mount(struct vfs *vfsp, struct vnode *mvp, struct mounta *uap, dpn.pn_path, cr, 0, &args, datalen); if (error == 0) { - vfs_set_feature(vfsp, VFSFT_XVATTR); + vfs_set_feature(vfsp, VFSFT_SYSATTR_VIEWS); /* * If lofi, drop our reference to the original file. diff --git a/usr/src/uts/common/fs/ufs/ufs_vnops.c b/usr/src/uts/common/fs/ufs/ufs_vnops.c index b4fd67b528..7e45078774 100644 --- a/usr/src/uts/common/fs/ufs/ufs_vnops.c +++ b/usr/src/uts/common/fs/ufs/ufs_vnops.c @@ -5879,7 +5879,7 @@ ufs_l_pathconf(struct vnode *vp, int cmd, ulong_t *valp, struct cred *cr, case _PC_SATTR_ENABLED: case _PC_SATTR_EXISTS: - *valp = vfs_has_feature(vp->v_vfsp, VFSFT_XVATTR) && + *valp = vfs_has_feature(vp->v_vfsp, VFSFT_SYSATTR_VIEWS) && (vp->v_type == VREG || vp->v_type == VDIR); break; diff --git a/usr/src/uts/common/fs/vfs.c b/usr/src/uts/common/fs/vfs.c index a9026650db..c104b6fe71 100644 --- a/usr/src/uts/common/fs/vfs.c +++ b/usr/src/uts/common/fs/vfs.c @@ -267,11 +267,11 @@ fsop_vget(vfs_t *vfsp, vnode_t **vpp, fid_t *fidp) * some extra bytes that only the sysattr layer knows about. * * This guarantees that sysattr fids are larger than other fids - * for this vfs. If the vfs supports sysattrs (implied - * by VFSFT_XVATTR support), we cannot have a size collision - * with XATTR_FIDSZ. + * for this vfs. If the vfs supports the sysattr view interface + * (as indicated by VFSFT_SYSATTR_VIEWS), we cannot have a size + * collision with XATTR_FIDSZ. */ - if (vfs_has_feature(vfsp, VFSFT_XVATTR) && + if (vfs_has_feature(vfsp, VFSFT_SYSATTR_VIEWS) && fidp->fid_len == XATTR_FIDSZ) return (xattr_dir_vget(vfsp, vpp, fidp)); diff --git a/usr/src/uts/common/fs/xattr.c b/usr/src/uts/common/fs/xattr.c index 0c0eda87ab..2926a82483 100644 --- a/usr/src/uts/common/fs/xattr.c +++ b/usr/src/uts/common/fs/xattr.c @@ -23,8 +23,6 @@ * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include <sys/param.h> #include <sys/isa_defs.h> #include <sys/types.h> @@ -465,6 +463,9 @@ xattr_file_write(vnode_t *vp, uio_t *uiop, int ioflag, cred_t *cr, xvattr_t xvattr; xoptattr_t *xoap = NULL; /* Pointer to optional attributes */ + if (vfs_has_feature(vp->v_vfsp, VFSFT_XVATTR) == 0) + return (EINVAL); + /* * Validate file offset and size. */ diff --git a/usr/src/uts/common/fs/zfs/zfs_vfsops.c b/usr/src/uts/common/fs/zfs/zfs_vfsops.c index eaf2c2f890..06b4dee462 100644 --- a/usr/src/uts/common/fs/zfs/zfs_vfsops.c +++ b/usr/src/uts/common/fs/zfs/zfs_vfsops.c @@ -695,6 +695,7 @@ zfs_domount(vfs_t *vfsp, char *osname) zfsvfs->z_use_fuids = USE_FUIDS(zfsvfs->z_version, zfsvfs->z_os); if (zfsvfs->z_use_fuids) { vfs_set_feature(vfsp, VFSFT_XVATTR); + vfs_set_feature(vfsp, VFSFT_SYSATTR_VIEWS); vfs_set_feature(vfsp, VFSFT_ACEMASKONACCESS); vfs_set_feature(vfsp, VFSFT_ACLONCREATE); } diff --git a/usr/src/uts/common/fs/zfs/zfs_vnops.c b/usr/src/uts/common/fs/zfs/zfs_vnops.c index 509b896cff..b351616cc2 100644 --- a/usr/src/uts/common/fs/zfs/zfs_vnops.c +++ b/usr/src/uts/common/fs/zfs/zfs_vnops.c @@ -1969,12 +1969,12 @@ zfs_readdir(vnode_t *vp, uio_t *uio, cred_t *cr, int *eofp, eodp = (struct edirent *)odp; /* - * If this VFS supports system attributes; and we're looking at an - * extended attribute directory; and we care about normalization - * conflicts on this vfs; then we must check for normalization - * conflicts with the sysattr name space. + * If this VFS supports the system attribute view interface; and + * we're looking at an extended attribute directory; and we care + * about normalization conflicts on this vfs; then we must check + * for normalization conflicts with the sysattr name space. */ - check_sysattrs = vfs_has_feature(vp->v_vfsp, VFSFT_XVATTR) && + check_sysattrs = vfs_has_feature(vp->v_vfsp, VFSFT_SYSATTR_VIEWS) && (vp->v_flag & V_XATTRDIR) && zfsvfs->z_norm && (flags & V_RDDIR_ENTFLAGS); @@ -4387,7 +4387,7 @@ zfs_pathconf(vnode_t *vp, int cmd, ulong_t *valp, cred_t *cr, case _PC_SATTR_ENABLED: case _PC_SATTR_EXISTS: - *valp = vfs_has_feature(vp->v_vfsp, VFSFT_XVATTR) && + *valp = vfs_has_feature(vp->v_vfsp, VFSFT_SYSATTR_VIEWS) && (vp->v_type == VREG || vp->v_type == VDIR); return (0); diff --git a/usr/src/uts/common/smbsrv/smb_ktypes.h b/usr/src/uts/common/smbsrv/smb_ktypes.h index 8dc737b705..b1203ceaab 100644 --- a/usr/src/uts/common/smbsrv/smb_ktypes.h +++ b/usr/src/uts/common/smbsrv/smb_ktypes.h @@ -777,16 +777,6 @@ typedef struct smb_user { #define SMB_TREE_ACEMASKONACCESS 0x00000800 #define SMB_TREE_NFS_MOUNTED 0x00001000 -/* - * Currently, the VFSFT_XVATTR feature is defined for file systems - * which understand the xvattr_t interface as well as for file systems - * which do not, but which understand the system attribute "view" interface. - * Since we need to be able to differentiate between these two for UFS, - * for now we use SMB_TREE_UFS so that we do the right thing. - */ - -#define SMB_TREE_UFS 0x00002000 - typedef enum { SMB_TREE_STATE_CONNECTED = 0, SMB_TREE_STATE_DISCONNECTING, diff --git a/usr/src/uts/common/smbsrv/smb_vops.h b/usr/src/uts/common/smbsrv/smb_vops.h index 2c82704c7b..3de3605083 100644 --- a/usr/src/uts/common/smbsrv/smb_vops.h +++ b/usr/src/uts/common/smbsrv/smb_vops.h @@ -188,8 +188,7 @@ void smb_vop_close(vnode_t *, int, cred_t *); int smb_vop_read(vnode_t *, uio_t *, cred_t *); int smb_vop_write(vnode_t *, uio_t *, int, uint32_t *, cred_t *); int smb_vop_getattr(vnode_t *, vnode_t *, smb_attr_t *, int, cred_t *); -int smb_vop_setattr(vnode_t *, vnode_t *, smb_attr_t *, int, cred_t *, - boolean_t); +int smb_vop_setattr(vnode_t *, vnode_t *, smb_attr_t *, int, cred_t *); int smb_vop_access(vnode_t *, int, int, vnode_t *, cred_t *); void smb_vop_eaccess(vnode_t *, int *, int, vnode_t *, cred_t *); int smb_vop_lookup(vnode_t *, char *, vnode_t **, char *, int, vnode_t *, diff --git a/usr/src/uts/common/sys/vfs.h b/usr/src/uts/common/sys/vfs.h index d253e8857c..5d2d43e804 100644 --- a/usr/src/uts/common/sys/vfs.h +++ b/usr/src/uts/common/sys/vfs.h @@ -34,8 +34,6 @@ #ifndef _SYS_VFS_H #define _SYS_VFS_H -#pragma ident "%Z%%M% %I% %E% SMI" - #include <sys/types.h> #include <sys/t_lock.h> #include <sys/cred.h> @@ -297,6 +295,7 @@ typedef uint64_t vfs_feature_t; #define VFSFT_DIRENTFLAGS 0x100000008 /* Supports dirent flags */ #define VFSFT_ACLONCREATE 0x100000010 /* Supports ACL on create */ #define VFSFT_ACEMASKONACCESS 0x100000020 /* Can use ACEMASK for access */ +#define VFSFT_SYSATTR_VIEWS 0x100000040 /* Supports sysattr view i/f */ /* * Argument structure for mount(2). diff --git a/usr/src/uts/common/syscall/open.c b/usr/src/uts/common/syscall/open.c index 1f3d15c88b..a2504bc1c4 100644 --- a/usr/src/uts/common/syscall/open.c +++ b/usr/src/uts/common/syscall/open.c @@ -31,8 +31,6 @@ * under license from the Regents of the University of California. */ -#pragma ident "%Z%%M% %I% %E% SMI" - #include <sys/param.h> #include <sys/isa_defs.h> #include <sys/types.h> @@ -155,7 +153,7 @@ copen(int startfd, char *fname, int filemode, int createmode) } if ((startvp->v_vfsp->vfs_flag & VFS_XATTR) != 0 || - vfs_has_feature(startvp->v_vfsp, VFSFT_XVATTR)) { + vfs_has_feature(startvp->v_vfsp, VFSFT_SYSATTR_VIEWS)) { error = VOP_LOOKUP(startvp, "", &sdvp, &pn, (filemode & FXATTRDIROPEN) ? LOOKUP_XATTR : LOOKUP_XATTR|CREATE_XATTR_DIR, rootvp, CRED(), |
