svn commit: r202750 - in stable/7/sys:
cddl/contrib/opensolaris/uts/common/fs/zfs
dev/md fs/cd9660 fs/udf kern sys ufs/ffs
jhell
jhell at DataIX.net
Thu Jan 21 20:17:15 UTC 2010
Builds for stable/7 are broke by this commit with the folling error.
cc -O2 -fno-strict-aliasing -pipe -DFREEBSD_NAMECACHE -DBUILDING_ZFS
-D_KERNEL -DKLD_MODULE -std=c99 -nostdinc
-I/usr/src/sys/modules/zfs/../../cddl/compat/opensolaris
-I/usr/src/sys/modules/zfs/../../cddl/contrib/opensolaris/uts/common/fs/zfs
-I/usr/src/sys/modules/zfs/../../cddl/contrib/opensolaris/uts/common/zmod
-I/usr/src/sys/modules/zfs/../../cddl/contrib/opensolaris/uts/common
-I/usr/src/sys/modules/zfs/../..
-I/usr/src/sys/modules/zfs/../../cddl/contrib/opensolaris/common/zfs
-I/usr/src/sys/modules/zfs/../../cddl/contrib/opensolaris/common
-I/usr/src/sys/modules/zfs/../../../include -DHAVE_KERNEL_OPTION_HEADERS
-include /usr/obj/usr/src/sys/SH4500/opt_global.h -I. -I@ -I@/contrib/altq
-finline-limit=8000 --param inline-unit-growth=100 --param
large-function-growth=1000 -fno-common -g -I/usr/obj/usr/src/sys/SH4500
-mno-align-long-strings -mpreferred-stack-boundary=2 -mno-mmx -mno-3dnow
-mno-sse -mno-sse2 -mno-sse3 -ffreestanding -Wall -Wredundant-decls
-Wnested-externs -Wstrict-prototypes -Wmissing-prototypes -Wpointer-arith
-Winline -Wcast-qual -Wundef -Wno-pointer-sign -fformat-extensions
-Wno-unknown-pragmas -Wno-missing-prototypes -Wno-undef
-Wno-strict-prototypes -Wno-cast-qual -Wno-parentheses
-Wno-redundant-decls -Wno-missing-braces -Wno-uninitialized -Wno-unused
-Wno-inline -Wno-switch -Wno-pointer-arith -c
/usr/src/sys/modules/zfs/../../cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
/usr/src/sys/modules/zfs/../../cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c:
In function 'zfs_create_fs':
/usr/src/sys/modules/zfs/../../cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c:1523:
error: 'vp' undeclared (first use in this function)
/usr/src/sys/modules/zfs/../../cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c:1523:
error: (Each undeclared identifier is reported only once
/usr/src/sys/modules/zfs/../../cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c:1523:
error: for each function it appears in.) *** Error code 1
Stop in /usr/src/sys/modules/zfs.
*** Error code 1
Stop in /usr/src/sys/modules.
*** Error code 1
On Thu, 21 Jan 2010 09:33, jhb@ wrote: > Author: jhb > Date: Thu Jan 21 14:33:18 2010
> New Revision: 202750
> URL: http://svn.freebsd.org/changeset/base/202750
>
> Log:
> MFC 189696,189697:
> Add a new internal mount flag (MNTK_EXTENDED_SHARED) to indicate that a
> filesystem supports additional operations using shared vnode locks.
> Currently this is used to enable shared locks for open() and close() of
> read-only file descriptors.
> - When an ISOPEN namei() request is performed with LOCKSHARED, use a
> shared vnode lock for the leaf vnode only if the mount point has the
> extended shared flag set.
> - Set LOCKSHARED in vn_open_cred() for requests that specify O_RDONLY but
> not O_CREAT.
> - Use a shared vnode lock around VOP_CLOSE() if the file was opened with
> O_RDONLY and the mountpoint has the extended shared flag set.
> - Adjust md(4) to upgrade the vnode lock on the vnode it gets back from
> vn_open() since it now may only have a shared vnode lock.
> - Don't enable shared vnode locks on FIFO vnodes in ZFS and UFS since
> FIFO's require exclusive vnode locks for their open() and close()
> routines. (My recent MPSAFE patches for UDF and cd9660 already included
> this change.)
> - Enable extended shared operations on UFS, cd9660, and UDF.
>
> Modified:
> stable/7/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
> stable/7/sys/dev/md/md.c
> stable/7/sys/fs/cd9660/cd9660_vfsops.c
> stable/7/sys/fs/udf/udf_vfsops.c
> stable/7/sys/kern/vfs_lookup.c
> stable/7/sys/kern/vfs_vnops.c
> stable/7/sys/kern/vnode_if.src
> stable/7/sys/sys/mount.h
> stable/7/sys/ufs/ffs/ffs_vfsops.c
> Directory Properties:
> stable/7/sys/ (props changed)
> stable/7/sys/cddl/contrib/opensolaris/ (props changed)
> stable/7/sys/contrib/dev/acpica/ (props changed)
> stable/7/sys/contrib/pf/ (props changed)
>
> Modified: stable/7/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
> ==============================================================================
> --- stable/7/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c Thu Jan 21 13:31:41 2010 (r202749)
> +++ stable/7/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c Thu Jan 21 14:33:18 2010 (r202750)
> @@ -1520,6 +1520,7 @@ zfs_create_fs(objset_t *os, cred_t *cr,
> vnode.v_type = VDIR;
> vnode.v_data = rootzp;
> rootzp->z_vnode = &vnode;
> + VN_LOCK_ASHARE(vp);
>
> bzero(&zfsvfs, sizeof (zfsvfs_t));
>
>
> Modified: stable/7/sys/dev/md/md.c
> ==============================================================================
> --- stable/7/sys/dev/md/md.c Thu Jan 21 13:31:41 2010 (r202749)
> +++ stable/7/sys/dev/md/md.c Thu Jan 21 14:33:18 2010 (r202750)
> @@ -918,12 +918,20 @@ mdcreate_vnode(struct md_s *sc, struct m
> return (error);
> vfslocked = NDHASGIANT(&nd);
> NDFREE(&nd, NDF_ONLY_PNBUF);
> - if (nd.ni_vp->v_type != VREG ||
> - (error = VOP_GETATTR(nd.ni_vp, &vattr, td->td_ucred, td))) {
> - VOP_UNLOCK(nd.ni_vp, 0, td);
> - (void)vn_close(nd.ni_vp, flags, td->td_ucred, td);
> - VFS_UNLOCK_GIANT(vfslocked);
> - return (error ? error : EINVAL);
> + if (nd.ni_vp->v_type != VREG) {
> + error = EINVAL;
> + goto bad;
> + }
> + error = VOP_GETATTR(nd.ni_vp, &vattr, td->td_ucred, td);
> + if (error != 0)
> + goto bad;
> + if (VOP_ISLOCKED(nd.ni_vp, td) != LK_EXCLUSIVE) {
> + vn_lock(nd.ni_vp, LK_UPGRADE | LK_RETRY, td);
> + if (nd.ni_vp->v_iflag & VI_DOOMED) {
> + /* Forced unmount. */
> + error = EBADF;
> + goto bad;
> + }
> }
> nd.ni_vp->v_vflag |= VV_MD;
> VOP_UNLOCK(nd.ni_vp, 0, td);
> @@ -942,13 +950,15 @@ mdcreate_vnode(struct md_s *sc, struct m
> sc->vnode = NULL;
> vn_lock(nd.ni_vp, LK_EXCLUSIVE | LK_RETRY, td);
> nd.ni_vp->v_vflag &= ~VV_MD;
> - VOP_UNLOCK(nd.ni_vp, 0, td);
> - (void)vn_close(nd.ni_vp, flags, td->td_ucred, td);
> - VFS_UNLOCK_GIANT(vfslocked);
> - return (error);
> + goto bad;
> }
> VFS_UNLOCK_GIANT(vfslocked);
> return (0);
> +bad:
> + VOP_UNLOCK(nd.ni_vp, 0, td);
> + (void)vn_close(nd.ni_vp, flags, td->td_ucred, td);
> + VFS_UNLOCK_GIANT(vfslocked);
> + return (error);
> }
>
> static int
>
> Modified: stable/7/sys/fs/cd9660/cd9660_vfsops.c
> ==============================================================================
> --- stable/7/sys/fs/cd9660/cd9660_vfsops.c Thu Jan 21 13:31:41 2010 (r202749)
> +++ stable/7/sys/fs/cd9660/cd9660_vfsops.c Thu Jan 21 14:33:18 2010 (r202750)
> @@ -373,7 +373,8 @@ iso_mountfs(devvp, mp, td)
> mp->mnt_maxsymlinklen = 0;
> MNT_ILOCK(mp);
> mp->mnt_flag |= MNT_LOCAL;
> - mp->mnt_kern_flag |= MNTK_MPSAFE | MNTK_LOOKUP_SHARED;
> + mp->mnt_kern_flag |= MNTK_MPSAFE | MNTK_LOOKUP_SHARED |
> + MNTK_EXTENDED_SHARED;
> MNT_IUNLOCK(mp);
> isomp->im_mountp = mp;
> isomp->im_dev = dev;
>
> Modified: stable/7/sys/fs/udf/udf_vfsops.c
> ==============================================================================
> --- stable/7/sys/fs/udf/udf_vfsops.c Thu Jan 21 13:31:41 2010 (r202749)
> +++ stable/7/sys/fs/udf/udf_vfsops.c Thu Jan 21 14:33:18 2010 (r202750)
> @@ -353,7 +353,8 @@ udf_mountfs(struct vnode *devvp, struct
> mp->mnt_stat.f_fsid.val[1] = mp->mnt_vfc->vfc_typenum;
> MNT_ILOCK(mp);
> mp->mnt_flag |= MNT_LOCAL;
> - mp->mnt_kern_flag |= MNTK_MPSAFE | MNTK_LOOKUP_SHARED;
> + mp->mnt_kern_flag |= MNTK_MPSAFE | MNTK_LOOKUP_SHARED |
> + MNTK_EXTENDED_SHARED;
> MNT_IUNLOCK(mp);
> udfmp->im_mountp = mp;
> udfmp->im_dev = dev;
>
> Modified: stable/7/sys/kern/vfs_lookup.c
> ==============================================================================
> --- stable/7/sys/kern/vfs_lookup.c Thu Jan 21 13:31:41 2010 (r202749)
> +++ stable/7/sys/kern/vfs_lookup.c Thu Jan 21 14:33:18 2010 (r202750)
> @@ -322,6 +322,41 @@ compute_cn_lkflags(struct mount *mp, int
> return lkflags;
> }
>
> +static __inline int
> +needs_exclusive_leaf(struct mount *mp, int flags)
> +{
> +
> + /*
> + * Intermediate nodes can use shared locks, we only need to
> + * force an exclusive lock for leaf nodes.
> + */
> + if ((flags & (ISLASTCN | LOCKLEAF)) != (ISLASTCN | LOCKLEAF))
> + return (0);
> +
> + /* Always use exclusive locks if LOCKSHARED isn't set. */
> + if (!(flags & LOCKSHARED))
> + return (1);
> +
> + /*
> + * For lookups during open(), if the mount point supports
> + * extended shared operations, then use a shared lock for the
> + * leaf node, otherwise use an exclusive lock.
> + */
> + if (flags & ISOPEN) {
> + if (mp != NULL &&
> + (mp->mnt_kern_flag & MNTK_EXTENDED_SHARED))
> + return (0);
> + else
> + return (1);
> + }
> +
> + /*
> + * Lookup requests outside of open() that specify LOCKSHARED
> + * only need a shared lock on the leaf vnode.
> + */
> + return (0);
> +}
> +
> /*
> * Search a pathname.
> * This is a very central and rather complicated routine.
> @@ -580,8 +615,7 @@ unionlookup:
> * If we're looking up the last component and we need an exclusive
> * lock, adjust our lkflags.
> */
> - if ((cnp->cn_flags & (ISLASTCN|LOCKSHARED|LOCKLEAF)) ==
> - (ISLASTCN|LOCKLEAF))
> + if (needs_exclusive_leaf(dp->v_mount, cnp->cn_flags))
> cnp->cn_lkflags = LK_EXCLUSIVE;
> #ifdef NAMEI_DIAGNOSTIC
> vprint("lookup in", dp);
> @@ -778,8 +812,8 @@ success:
> * Because of lookup_shared we may have the vnode shared locked, but
> * the caller may want it to be exclusively locked.
> */
> - if ((cnp->cn_flags & (ISLASTCN | LOCKSHARED | LOCKLEAF)) ==
> - (ISLASTCN | LOCKLEAF) && VOP_ISLOCKED(dp, td) != LK_EXCLUSIVE) {
> + if (needs_exclusive_leaf(dp->v_mount, cnp->cn_flags) &&
> + VOP_ISLOCKED(dp, td) != LK_EXCLUSIVE) {
> vn_lock(dp, LK_UPGRADE | LK_RETRY, td);
> if (dp->v_iflag & VI_DOOMED) {
> error = ENOENT;
>
> Modified: stable/7/sys/kern/vfs_vnops.c
> ==============================================================================
> --- stable/7/sys/kern/vfs_vnops.c Thu Jan 21 13:31:41 2010 (r202749)
> +++ stable/7/sys/kern/vfs_vnops.c Thu Jan 21 14:33:18 2010 (r202750)
> @@ -185,6 +185,8 @@ restart:
> ndp->ni_cnd.cn_flags = ISOPEN |
> ((fmode & O_NOFOLLOW) ? NOFOLLOW : FOLLOW) |
> LOCKLEAF | MPSAFE | AUDITVNODE1;
> + if (!(fmode & FWRITE))
> + ndp->ni_cnd.cn_flags |= LOCKSHARED;
> if ((error = namei(ndp)) != 0)
> return (error);
> if (!mpsafe)
> @@ -235,7 +237,7 @@ restart:
> if (fmode & FWRITE)
> vp->v_writecount++;
> *flagp = fmode;
> - ASSERT_VOP_ELOCKED(vp, "vn_open_cred");
> + ASSERT_VOP_LOCKED(vp, "vn_open_cred");
> if (!mpsafe)
> VFS_UNLOCK_GIANT(vfslocked);
> return (0);
> @@ -280,12 +282,18 @@ vn_close(vp, flags, file_cred, td)
> struct thread *td;
> {
> struct mount *mp;
> - int error;
> + int error, lock_flags;
> +
> + if (!(flags & FWRITE) && vp->v_mount != NULL &&
> + vp->v_mount->mnt_kern_flag & MNTK_EXTENDED_SHARED)
> + lock_flags = LK_SHARED;
> + else
> + lock_flags = LK_EXCLUSIVE;
>
> VFS_ASSERT_GIANT(vp->v_mount);
>
> vn_start_write(vp, &mp, V_WAIT);
> - vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
> + vn_lock(vp, lock_flags | LK_RETRY, td);
> if (flags & FWRITE) {
> VNASSERT(vp->v_writecount > 0, vp,
> ("vn_close: negative writecount"));
>
> Modified: stable/7/sys/kern/vnode_if.src
> ==============================================================================
> --- stable/7/sys/kern/vnode_if.src Thu Jan 21 13:31:41 2010 (r202749)
> +++ stable/7/sys/kern/vnode_if.src Thu Jan 21 14:33:18 2010 (r202750)
> @@ -134,7 +134,7 @@ vop_open {
> };
>
>
> -%% close vp E E E
> +%% close vp L L L
>
> vop_close {
> IN struct vnode *vp;
>
> Modified: stable/7/sys/sys/mount.h
> ==============================================================================
> --- stable/7/sys/sys/mount.h Thu Jan 21 13:31:41 2010 (r202749)
> +++ stable/7/sys/sys/mount.h Thu Jan 21 14:33:18 2010 (r202750)
> @@ -328,6 +328,7 @@ void __mnt_vnode_markerfree(str
> #define MNTK_SOFTDEP 0x00000004 /* async disabled by softdep */
> #define MNTK_NOINSMNTQ 0x00000008 /* insmntque is not allowed */
> #define MNTK_REFEXPIRE 0x00000020 /* refcount expiring is happening */
> +#define MNTK_EXTENDED_SHARED 0x00000040 /* Allow shared locking for more ops */
> #define MNTK_SHARED_WRITES 0x00000080 /* Allow shared locking for writes */
> #define MNTK_UNMOUNT 0x01000000 /* unmount in progress */
> #define MNTK_MWAIT 0x02000000 /* waiting for unmount to finish */
> @@ -335,8 +336,8 @@ void __mnt_vnode_markerfree(str
> #define MNTK_SUSPEND2 0x04000000 /* block secondary writes */
> #define MNTK_SUSPENDED 0x10000000 /* write operations are suspended */
> #define MNTK_MPSAFE 0x20000000 /* Filesystem is MPSAFE. */
> -#define MNTK_NOKNOTE 0x80000000 /* Don't send KNOTEs from VOP hooks */
> #define MNTK_LOOKUP_SHARED 0x40000000 /* FS supports shared lock lookups */
> +#define MNTK_NOKNOTE 0x80000000 /* Don't send KNOTEs from VOP hooks */
>
> /*
> * Sysctl CTL_VFS definitions.
>
> Modified: stable/7/sys/ufs/ffs/ffs_vfsops.c
> ==============================================================================
> --- stable/7/sys/ufs/ffs/ffs_vfsops.c Thu Jan 21 13:31:41 2010 (r202749)
> +++ stable/7/sys/ufs/ffs/ffs_vfsops.c Thu Jan 21 14:33:18 2010 (r202750)
> @@ -883,7 +883,8 @@ ffs_mountfs(devvp, mp, td)
> * Initialize filesystem stat information in mount struct.
> */
> MNT_ILOCK(mp);
> - mp->mnt_kern_flag |= MNTK_MPSAFE | MNTK_LOOKUP_SHARED;
> + mp->mnt_kern_flag |= MNTK_MPSAFE | MNTK_LOOKUP_SHARED |
> + MNTK_EXTENDED_SHARED;
> MNT_IUNLOCK(mp);
> #ifdef UFS_EXTATTR
> #ifdef UFS_EXTATTR_AUTOSTART
> @@ -1440,10 +1441,9 @@ ffs_vgetf(mp, ino, flags, vpp, ffs_flags
> return (error);
> }
> /*
> - * FFS supports recursive and shared locking.
> + * FFS supports recursive locking.
> */
> - vp->v_vnlock->lk_flags |= LK_CANRECURSE;
> - vp->v_vnlock->lk_flags &= ~LK_NOSHARE;
> + VN_LOCK_AREC(vp);
> vp->v_data = ip;
> vp->v_bufobj.bo_bsize = fs->fs_bsize;
> ip->i_vnode = vp;
> @@ -1518,6 +1518,10 @@ ffs_vgetf(mp, ino, flags, vpp, ffs_flags
> /*
> * Finish inode initialization.
> */
> + if (vp->v_type != VFIFO) {
> + /* FFS supports shared locking for all files except fifos. */
> + VN_LOCK_ASHARE(vp);
> + }
>
> /*
> * Set up a generation number for this inode if it does not
> _______________________________________________
> svn-src-stable-7 at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/svn-src-stable-7
> To unsubscribe, send any mail to "svn-src-stable-7-unsubscribe at freebsd.org"
>
--
jhell
More information about the svn-src-all
mailing list