Remove the last bits of code that stored mount point linkages in vnodes.
authorMatthew Dillon <dillon@dragonflybsd.org>
Tue, 19 Sep 2006 16:06:17 +0000 (16:06 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Tue, 19 Sep 2006 16:06:17 +0000 (16:06 +0000)
Mount point linkages are now ENTIRELY a function of the namecache topology,
made possible by DragonFly's advanced namecache.

This fixes a number of problems with NULLFS and adds two major features to
our NULLFS mounting capabilities.

NULLFS mounting paths NO LONGER NEED TO BE DISTINCT.  For example, you
can now safely do things like 'mount_null -o ro / /fubar/jail1' without
creating a recursion and you can now create SUB-MOUNTS within nullfs
mounts, such as 'mount_null -o ro /usr /fubar/jail1/usr', without creating
problems in the original master partitions.

The result is that NULLFS can now be used to glue arbitrary pieces of
filesystems together using a mixture of read-only and read-write NULLFS
mounts for situations where localhost NFS mounts had to be used before.
Jail or chroot construction is now utterly trivial.

With-input-from: Joerg Sonnenberger <joerg@britannica.bec.de>

13 files changed:
sbin/mount_null/mount_null.c
sys/kern/vfs_bio.c
sys/kern/vfs_cache.c
sys/kern/vfs_mount.c
sys/kern/vfs_nlookup.c
sys/kern/vfs_syscalls.c
sys/sys/mount.h
sys/sys/namecache.h
sys/sys/vnode.h
sys/vfs/nfs/nfs_serv.c
sys/vfs/nfs/nfs_vfsops.c
sys/vfs/ufs/ufs_vnops.c
sys/vfs/union/union_vfsops.c

index e381273..d52723c 100644 (file)
@@ -36,7 +36,7 @@
  * @(#) Copyright (c) 1992, 1993, 1994 The Regents of the University of California.  All rights reserved.
  * @(#)mount_null.c    8.6 (Berkeley) 4/26/95
  * $FreeBSD: src/sbin/mount_null/mount_null.c,v 1.13 1999/10/09 11:54:11 phk Exp $
- * $DragonFly: src/sbin/mount_null/mount_null.c,v 1.7 2005/04/02 22:00:18 dillon Exp $
+ * $DragonFly: src/sbin/mount_null/mount_null.c,v 1.8 2006/09/19 16:06:08 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -90,10 +90,13 @@ main(int argc, char **argv)
        checkpath(argv[0], target);
        checkpath(argv[1], source);
 
-       if (subdir(target, source) || subdir(source, target))
-               errx(EX_USAGE, "%s (%s) and %s are not distinct paths",
-                   argv[0], target, argv[1]);
-
+       /*
+        * Mount points that did not use distinct paths (e.g. / on /mnt)
+        * used to be disallowed because mount linkages were stored in
+        * vnodes and would lead to endlessly recursive trees.  DragonFly
+        * stores mount linkages in the namecache topology and does not
+        * have this problem, so paths no longer need to be distinct.
+        */
        args.target = target;
 
        error = getvfsbyname("null", &vfc);
index 3915263..711b620 100644 (file)
@@ -12,7 +12,7 @@
  *             John S. Dyson.
  *
  * $FreeBSD: src/sys/kern/vfs_bio.c,v 1.242.2.20 2003/05/28 18:38:10 alc Exp $
- * $DragonFly: src/sys/kern/vfs_bio.c,v 1.80 2006/09/11 20:25:01 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_bio.c,v 1.81 2006/09/19 16:06:11 dillon Exp $
  */
 
 /*
@@ -2315,8 +2315,8 @@ loop:
                 * will use block numbers with the proper multiple).  Beware
                 * of using any v_* fields which are part of unions.  In
                 * particular, in DragonFly the mount point overloading 
-                * mechanism is such that the underlying directory (with a
-                * non-NULL v_mountedhere) is not a special case.
+                * mechanism uses the namecache only and the underlying
+                * directory vnode is not a special case.
                 */
                int bsize, maxsize;
 
index 8fa6ae1..773641c 100644 (file)
@@ -67,7 +67,7 @@
  *
  *     @(#)vfs_cache.c 8.5 (Berkeley) 3/22/95
  * $FreeBSD: src/sys/kern/vfs_cache.c,v 1.42.2.6 2001/10/05 20:07:03 dillon Exp $
- * $DragonFly: src/sys/kern/vfs_cache.c,v 1.76 2006/09/05 00:55:45 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_cache.c,v 1.77 2006/09/19 16:06:11 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -608,6 +608,33 @@ cache_setunresolved(struct namecache *ncp)
        }
 }
 
+/*
+ * Mark the namecache node as containing a mount point.
+ *
+ * XXX called with a ref'd but unlocked ncp.
+ */
+void
+cache_setmountpt(struct namecache *ncp, struct mount *mp)
+{
+       ncp->nc_mount = mp;
+       ncp->nc_flag |= NCF_MOUNTPT;
+       ncp->nc_parent->nc_flag |= NCF_MOUNTEDHERE;
+}
+
+/*
+ * Clean up a mount point in the namecache topology after an unmount.
+ *
+ * XXX we probably need to traverse the entire topology and clear
+ * the nc_mount pointer.
+ */
+void
+cache_clrmountpt(struct namecache *ncp)
+{
+       if (ncp->nc_parent)
+               ncp->nc_parent->nc_flag &= ~NCF_MOUNTEDHERE;
+       ncp->nc_mount = NULL;
+}
+
 /*
  * Invalidate portions of the namecache topology given a starting entry.
  * The passed ncp is set to an unresolved state and:
@@ -1569,6 +1596,25 @@ found:
        return(ncp);
 }
 
+/*
+ * Locate the mount point under a namecache entry.  We locate a special
+ * child ncp with a 0-length name and retrieve the mount point from it.
+ */
+struct mount *
+cache_findmount(struct namecache *par)
+{
+       struct namecache *ncp;
+       u_int32_t hash;
+
+       hash = FNV1_32_INIT;    /* special 0-length name */
+       hash = fnv_32_buf(&par, sizeof(par), hash);
+       LIST_FOREACH(ncp, (NCHHASH(hash)), nc_hash) {
+               if (ncp->nc_nlen == 0 && (ncp->nc_flag & NCF_MOUNTPT))
+                       return(ncp->nc_mount);
+       }
+       return(NULL);
+}
+
 /*
  * Given a locked ncp, validate that the vnode, if present, is actually
  * usable.  If it is not usable set the ncp to an unresolved state.
index c3f521d..762d373 100644 (file)
@@ -67,7 +67,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/sys/kern/vfs_mount.c,v 1.22 2006/09/05 00:55:45 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_mount.c,v 1.23 2006/09/19 16:06:11 dillon Exp $
  */
 
 /*
@@ -306,7 +306,6 @@ vfs_rootmountalloc(char *fstypename, char *devname, struct mount **mpp)
        mp->mnt_vfc = vfsp;
        mp->mnt_op = vfsp->vfc_vfsops;
        mp->mnt_flag = MNT_RDONLY;
-       mp->mnt_vnodecovered = NULLVP;
        vfsp->vfc_refcount++;
        mp->mnt_iosize_max = DFLTPHYS;
        mp->mnt_stat.f_type = vfsp->vfc_typenum;
index 345492c..9855f19 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/kern/vfs_nlookup.c,v 1.18 2006/08/12 00:26:20 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_nlookup.c,v 1.19 2006/09/19 16:06:11 dillon Exp $
  */
 /*
  * nlookup() is the 'new' namei interface.  Rather then return directory and
@@ -509,13 +509,17 @@ nlookup(struct nlookupdata *nd)
         *
         * XXX NOCROSSMOUNT
         */
-       while ((ncp->nc_flag & NCF_ISDIR) && ncp->nc_vp->v_mountedhere &&
-               (nd->nl_flags & NLC_NOCROSSMOUNT) == 0
+       while ((ncp->nc_flag & NCF_ISDIR) && (ncp->nc_flag & NCF_MOUNTEDHERE)
+              && (nd->nl_flags & NLC_NOCROSSMOUNT) == 0
        ) {
            struct mount *mp;
            struct vnode *tdp;
 
-           mp = ncp->nc_vp->v_mountedhere;
+           if ((mp = cache_findmount(ncp)) == NULL) {
+               printf("warning: nlookup(): ncp marked as a mount point which isn't one at %p %s\n", ncp, ncp->nc_name);
+               ncp->nc_flag &= ~NCF_MOUNTEDHERE;
+               break;
+           }
            cache_put(ncp);
            ncp = cache_get(mp->mnt_ncp);
 
index 45e57cf..2a36008 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)vfs_syscalls.c      8.13 (Berkeley) 4/15/94
  * $FreeBSD: src/sys/kern/vfs_syscalls.c,v 1.151.2.18 2003/04/04 20:35:58 tegge Exp $
- * $DragonFly: src/sys/kern/vfs_syscalls.c,v 1.104 2006/09/18 18:19:33 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_syscalls.c,v 1.105 2006/09/19 16:06:11 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -112,6 +112,7 @@ sys_mount(struct mount_args *uap)
        struct mount *mp;
        struct vfsconf *vfsp;
        int error, flag = 0, flag2 = 0;
+       int hasmount;
        struct vattr va;
        struct nlookupdata nd;
        char fstypename[MFSNAMELEN];
@@ -159,6 +160,12 @@ sys_mount(struct mount_args *uap)
        nd.nl_ncp = NULL;
        nlookup_done(&nd);
 
+       if ((ncp->nc_flag & NCF_MOUNTEDHERE) && cache_findmount(ncp))
+               hasmount = 1;
+       else
+               hasmount = 0;
+
+
        /*
         * now we have the locked ref'd ncp and unreferenced vnode.
         */
@@ -206,8 +213,7 @@ sys_mount(struct mount_args *uap)
                        vput(vp);
                        return (EBUSY);
                }
-               if ((vp->v_flag & VMOUNT) != 0 ||
-                   vp->v_mountedhere != NULL) {
+               if ((vp->v_flag & VMOUNT) != 0 || hasmount) {
                        cache_drop(ncp);
                        vfs_unbusy(mp);
                        vput(vp);
@@ -279,8 +285,7 @@ sys_mount(struct mount_args *uap)
                        return (ENODEV);
                }
        }
-       if ((vp->v_flag & VMOUNT) != 0 ||
-           vp->v_mountedhere != NULL) {
+       if ((vp->v_flag & VMOUNT) != 0 || hasmount) {
                cache_drop(ncp);
                vput(vp);
                return (EBUSY);
@@ -303,7 +308,6 @@ sys_mount(struct mount_args *uap)
        mp->mnt_stat.f_type = vfsp->vfc_typenum;
        mp->mnt_flag |= vfsp->vfc_flags & MNT_VISFLAGMASK;
        strncpy(mp->mnt_stat.f_fstypename, vfsp->vfc_name, MFSNAMELEN);
-       mp->mnt_vnodecovered = vp;
        mp->mnt_stat.f_owner = cred->cr_uid;
        mp->mnt_iosize_max = DFLTPHYS;
        vn_unlock(vp);
@@ -361,20 +365,18 @@ update:
                nlc.nlc_namelen = 0;
                mp->mnt_ncp = cache_nlookup(ncp, &nlc);
                cache_setunresolved(mp->mnt_ncp);
-               mp->mnt_ncp->nc_flag |= NCF_MOUNTPT;
-               mp->mnt_ncp->nc_mount = mp;
+               cache_setmountpt(mp->mnt_ncp, mp);
                cache_drop(ncp);
                /* XXX get the root of the fs and cache_setvp(mnt_ncp...) */
                vp->v_flag &= ~VMOUNT;
-               vp->v_mountedhere = mp;
                mountlist_insert(mp, MNTINS_LAST);
                checkdirs(vp, mp->mnt_ncp);
                cache_unlock(mp->mnt_ncp);      /* leave ref intact */
                vn_unlock(vp);
                error = vfs_allocate_syncvnode(mp);
                vfs_unbusy(mp);
-               if ((error = VFS_START(mp, 0)) != 0)
-                       vrele(vp);
+               error = VFS_START(mp, 0);
+               vrele(vp);
        } else {
                vfs_rm_vnodeops(mp, NULL, &mp->mnt_vn_coherency_ops);
                vfs_rm_vnodeops(mp, NULL, &mp->mnt_vn_journal_ops);
@@ -417,7 +419,7 @@ checkdirs(struct vnode *olddp, struct namecache *ncp)
 
        if (olddp->v_usecount == 1)
                return;
-       mp = olddp->v_mountedhere;
+       mp = ncp->nc_mount;
        if (VFS_ROOT(mp, &newdp))
                panic("mount: lost mount");
        cache_setvp(ncp, newdp);
@@ -541,7 +543,7 @@ sys_unmount(struct unmount_args *uap)
        /*
         * Must be the root of the filesystem
         */
-       if (! (nd.nl_ncp->nc_flag & NCF_MOUNTPT)) {
+       if (!(nd.nl_ncp->nc_flag & NCF_MOUNTPT)) {
                error = EINVAL;
                goto out;
        }
@@ -568,7 +570,6 @@ dounmount_interlock(struct mount *mp)
 int
 dounmount(struct mount *mp, int flags)
 {
-       struct vnode *coveredvp;
        int error;
        int async_flag;
        int lflags;
@@ -635,12 +636,12 @@ dounmount(struct mount *mp, int flags)
        vfs_rm_vnodeops(mp, NULL, &mp->mnt_vn_spec_ops);
        vfs_rm_vnodeops(mp, NULL, &mp->mnt_vn_fifo_ops);
 
-       if ((coveredvp = mp->mnt_vnodecovered) != NULLVP) {
-               coveredvp->v_mountedhere = NULL;
-               vrele(coveredvp);
+       if (mp->mnt_ncp) {
+               cache_clrmountpt(mp->mnt_ncp);
                cache_drop(mp->mnt_ncp);
                mp->mnt_ncp = NULL;
        }
+
        mp->mnt_vfc->vfc_refcount--;
        if (!TAILQ_EMPTY(&mp->mnt_nvnodelist))
                panic("unmount: dangling vnode");
@@ -1099,7 +1100,15 @@ sys_fchdir(struct fchdir_args *uap)
                return (error);
        }
        ncp = cache_hold(fp->f_ncp);
-       while (!error && (mp = vp->v_mountedhere) != NULL) {
+
+       /*
+        * If the ncp has become a mount point, traverse through
+        * the mount point.
+        */
+
+       while (!error && (ncp->nc_flag & NCF_MOUNTEDHERE) &&
+              (mp = cache_findmount(ncp)) != NULL
+       ) {
                error = nlookup_mp(mp, &nct);
                if (error == 0) {
                        cache_unlock(nct);      /* leave ref intact */
@@ -2752,6 +2761,17 @@ kern_rename(struct nlookupdata *fromnd, struct nlookupdata *tond)
                return (0);
        }
 
+       /*
+        * Mount points cannot be renamed or overwritten
+        */
+       if ((fromnd->nl_ncp->nc_flag | tond->nl_ncp->nc_flag) &
+           (NCF_MOUNTPT|NCF_MOUNTEDHERE)
+       ) {
+               cache_drop(fncpd);
+               cache_drop(tncpd);
+               return (EINVAL);
+       }
+
        /*
         * relock the source ncp.  NOTE AFTER RELOCKING: the source ncp
         * may have become invalid while it was unlocked, nc_vp and nc_mount
@@ -2941,6 +2961,14 @@ kern_rmdir(struct nlookupdata *nd)
        nd->nl_flags |= NLC_DELETE;
        if ((error = nlookup(nd)) != 0)
                return (error);
+
+       /*
+        * Do not allow directories representing mount points to be
+        * deleted, even if empty.  Check write perms on mount point
+        * in case the vnode is aliased (aka nullfs).
+        */
+       if (nd->nl_ncp->nc_flag & (NCF_MOUNTEDHERE|NCF_MOUNTPT))
+               return (EINVAL);
        if ((error = ncp_writechk(nd->nl_ncp)) != 0)
                return (error);
 
@@ -3014,6 +3042,7 @@ unionread:
                        if (error)
                                goto done;
                }
+#if 0
                if ((vp->v_flag & VROOT) &&
                    (vp->v_mount->mnt_flag & MNT_UNION)) {
                        struct vnode *tvp = vp;
@@ -3024,6 +3053,7 @@ unionread:
                        vrele(tvp);
                        goto unionread;
                }
+#endif
        }
        if (basep) {
                *basep = loff;
index 5dbf514..13dd6a3 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)mount.h     8.21 (Berkeley) 5/20/95
  * $FreeBSD: src/sys/sys/mount.h,v 1.89.2.7 2003/04/04 20:35:57 tegge Exp $
- * $DragonFly: src/sys/sys/mount.h,v 1.28 2006/09/10 01:26:40 dillon Exp $
+ * $DragonFly: src/sys/sys/mount.h,v 1.29 2006/09/19 16:06:12 dillon Exp $
  */
 
 #ifndef _SYS_MOUNT_H_
@@ -130,7 +130,7 @@ struct mount {
        TAILQ_ENTRY(mount) mnt_list;            /* mount list */
        struct vfsops   *mnt_op;                /* operations on fs */
        struct vfsconf  *mnt_vfc;               /* configuration info */
-       struct vnode    *mnt_vnodecovered;      /* vnode we mounted on */
+       void            *mnt_unused01;
        struct vnode    *mnt_syncer;            /* syncer vnode */
        struct vnodelst mnt_nvnodelist;         /* list of vnodes this mount */
        struct lock     mnt_lock;               /* mount structure lock */
index 543ce62..fe033b4 100644 (file)
@@ -62,7 +62,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/sys/sys/namecache.h,v 1.26 2006/06/04 17:33:36 dillon Exp $
+ * $DragonFly: src/sys/sys/namecache.h,v 1.27 2006/09/19 16:06:12 dillon Exp $
  */
 
 #ifndef _SYS_NAMECACHE_H_
@@ -137,7 +137,7 @@ typedef struct namecache *namecache_t;
 #define NCF_ROOT       0x0010  /* namecache root (static) */
 #define NCF_HASHED     0x0020  /* namecache entry in hash table */
 #define NCF_LOCKREQ    0x0040
-#define NCF_UNUSED080  0x0080
+#define NCF_MOUNTEDHERE        0x0080  /* has child marked NCF_MOUNTPT */
 #define NCF_ISSYMLINK  0x0100  /* represents a symlink */
 #define NCF_ISDIR      0x0200  /* represents a directory */
 #define NCF_DESTROYED  0x0400  /* name association is considered destroyed */
@@ -162,12 +162,16 @@ void      cache_unlock(struct namecache *ncp);
 void   cache_setvp(struct namecache *ncp, struct vnode *vp);
 void   cache_settimeout(struct namecache *ncp, int nticks);
 void   cache_setunresolved(struct namecache *ncp);
+void   cache_setmountpt(struct namecache *ncp, struct mount *mp);
+void   cache_clrmountpt(struct namecache *ncp);
 struct namecache *cache_nlookup(struct namecache *par, struct nlcomponent *nlc);
 struct namecache *cache_allocroot(struct mount *mp, struct vnode *vp);
+struct mount *cache_findmount(struct namecache *par);
 int    cache_inval(struct namecache *ncp, int flags);
 int    cache_inval_vp(struct vnode *vp, int flags);
 void   vfs_cache_setroot(struct vnode *vp, struct namecache *ncp);
 
+
 int    cache_resolve(struct namecache *ncp, struct ucred *cred);
 void   cache_purge(struct vnode *vp);
 void   cache_purgevfs (struct mount *mp);
index b1ff581..74e2688 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)vnode.h     8.7 (Berkeley) 2/4/94
  * $FreeBSD: src/sys/sys/vnode.h,v 1.111.2.19 2002/12/29 18:19:53 dillon Exp $
- * $DragonFly: src/sys/sys/vnode.h,v 1.70 2006/09/18 18:19:35 dillon Exp $
+ * $DragonFly: src/sys/sys/vnode.h,v 1.71 2006/09/19 16:06:12 dillon Exp $
  */
 
 #ifndef _SYS_VNODE_H_
@@ -204,7 +204,6 @@ struct vnode {
        LIST_ENTRY(vnode) v_synclist;           /* vnodes with dirty buffers */
        enum    vtype v_type;                   /* vnode type */
        union {
-               struct mount    *vu_mountedhere;/* ptr to mounted vfs (VDIR) */
                struct socket   *vu_socket;     /* unix ipc (VSOCK) */
                struct {
                        udev_t  vu_udev;        /* device number for attach */
@@ -239,7 +238,6 @@ struct vnode {
 #endif
        void    *v_xaddr;
 };
-#define        v_mountedhere   v_un.vu_mountedhere
 #define        v_socket        v_un.vu_socket
 #define v_udev         v_un.vu_cdev.vu_udev
 #define        v_rdev          v_un.vu_cdev.vu_cdevinfo
@@ -278,7 +276,7 @@ struct vnode {
 #define        VFREE           0x80000 /* This vnode is on the freelist */
 /* open for business    0x100000 */
 #define        VONWORKLST      0x200000 /* On syncer work-list */
-#define        VMOUNT          0x400000 /* Mount in progress */
+#define VMOUNT         0x400000 /* Mount in progress */
 #define        VOBJDIRTY       0x800000 /* object might be dirty */
 
 /*
index 0542d8d..c74bbbb 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     @(#)nfs_serv.c  8.8 (Berkeley) 7/31/95
  * $FreeBSD: src/sys/nfs/nfs_serv.c,v 1.93.2.6 2002/12/29 18:19:53 dillon Exp $
- * $DragonFly: src/sys/vfs/nfs/nfs_serv.c,v 1.39 2006/09/05 00:55:50 dillon Exp $
+ * $DragonFly: src/sys/vfs/nfs/nfs_serv.c,v 1.40 2006/09/19 16:06:14 dillon Exp $
  */
 
 /*
@@ -2182,7 +2182,7 @@ nfsrv_rename(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
                                error = ENOTDIR;
                        goto out;
                }
-               if (tvp->v_type == VDIR && tvp->v_mountedhere) {
+               if (tvp->v_type == VDIR && (tond.nl_ncp->nc_flag & NCF_MOUNTPT)) {
                        if (v3)
                                error = EXDEV;
                        else
@@ -2190,7 +2190,7 @@ nfsrv_rename(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
                        goto out;
                }
        }
-       if (fvp->v_type == VDIR && fvp->v_mountedhere) {
+       if (fvp->v_type == VDIR && (fromnd.nl_ncp->nc_flag & NCF_MOUNTPT)) {
                if (v3)
                        error = EXDEV;
                else
index d117d29..c6712e0 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     @(#)nfs_vfsops.c        8.12 (Berkeley) 5/20/95
  * $FreeBSD: src/sys/nfs/nfs_vfsops.c,v 1.91.2.7 2003/01/27 20:04:08 dillon Exp $
- * $DragonFly: src/sys/vfs/nfs/nfs_vfsops.c,v 1.46 2006/09/05 00:55:50 dillon Exp $
+ * $DragonFly: src/sys/vfs/nfs/nfs_vfsops.c,v 1.47 2006/09/19 16:06:14 dillon Exp $
  */
 
 #include "opt_bootp.h"
@@ -580,7 +580,6 @@ nfs_mountroot(struct mount *mp)
        }
 
        mp->mnt_flag |= MNT_ROOTFS;
-       mp->mnt_vnodecovered = NULLVP;
        vfs_unbusy(mp);
 
        /*
index b9cae6d..51ec396 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)ufs_vnops.c 8.27 (Berkeley) 5/27/95
  * $FreeBSD: src/sys/ufs/ufs/ufs_vnops.c,v 1.131.2.8 2003/01/02 17:26:19 bde Exp $
- * $DragonFly: src/sys/vfs/ufs/ufs_vnops.c,v 1.56 2006/09/05 00:55:51 dillon Exp $
+ * $DragonFly: src/sys/vfs/ufs/ufs_vnops.c,v 1.57 2006/09/19 16:06:16 dillon Exp $
  */
 
 #include "opt_quota.h"
@@ -1539,10 +1539,6 @@ ufs_rmdir(struct vop_old_rmdir_args *ap)
                error = EPERM;
                goto out;
        }
-       if (vp->v_mountedhere != 0) {
-               error = EINVAL;
-               goto out;
-       }
        /*
         * Delete reference to directory before purging
         * inode.  If we crash in between, the directory
index 5d264b4..0571164 100644 (file)
@@ -36,7 +36,7 @@
  *
  *     @(#)union_vfsops.c      8.20 (Berkeley) 5/20/95
  * $FreeBSD: src/sys/miscfs/union/union_vfsops.c,v 1.39.2.2 2001/10/25 19:18:53 dillon Exp $
- * $DragonFly: src/sys/vfs/union/union_vfsops.c,v 1.26 2006/09/05 00:55:51 dillon Exp $
+ * $DragonFly: src/sys/vfs/union/union_vfsops.c,v 1.27 2006/09/19 16:06:17 dillon Exp $
  */
 
 /*
@@ -113,8 +113,7 @@ union_mount(struct mount *mp, char *path, caddr_t data, struct ucred *cred)
                goto bad;
 
        /*
-        * Obtain lower vnode.  Vnode is stored in mp->mnt_vnodecovered.
-        * We need to reference it but not lock it.
+        * Obtain lower vnode. 
         */
 
        lowerrootvp = mp->mnt_vnodecovered;