Add an argument to vfs_add_vnodeops() to specify VVF_* flags for the vop_ops
authorMatthew Dillon <dillon@dragonflybsd.org>
Sat, 17 Sep 2005 07:43:12 +0000 (07:43 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Sat, 17 Sep 2005 07:43:12 +0000 (07:43 +0000)
structure.  Add a new flag called VVF_SUPPORTS_FSMID to indicate filesystems
which support persistent storage of FSMIDs.  Rework the FSMID code a bit
to reduce overhead.

Use the spare field in the UFS inode structure to implement a persistent
FSMID.  The FSMID is recursively marked in the namecache but not adjusted
until the next getattr() call on the related inode(s), or when the vnode
is reclaimed.

42 files changed:
sys/emulation/linux/i386/linprocfs/linprocfs_vfsops.c
sys/kern/vfs_cache.c
sys/kern/vfs_default.c
sys/kern/vfs_init.c
sys/kern/vfs_jops.c
sys/kern/vfs_journal.c
sys/kern/vfs_subr.c
sys/kern/vfs_sync.c
sys/kern/vfs_syscalls.c
sys/kern/vfs_vnops.c
sys/kern/vfs_vopops.c
sys/sys/namecache.h
sys/sys/vfscache.h
sys/sys/vfsops.h
sys/sys/vnode.h
sys/vfs/deadfs/dead_vnops.c
sys/vfs/fdesc/fdesc_vfsops.c
sys/vfs/fifofs/fifo_vnops.c
sys/vfs/gnu/ext2fs/ext2_vfsops.c
sys/vfs/hpfs/hpfs_vfsops.c
sys/vfs/isofs/cd9660/cd9660_vfsops.c
sys/vfs/mfs/mfs_vnops.c
sys/vfs/msdosfs/msdosfs_vfsops.c
sys/vfs/nfs/nfs_nqlease.c
sys/vfs/nfs/nfs_socket.c
sys/vfs/nfs/nfs_vfsops.c
sys/vfs/ntfs/ntfs_vfsops.c
sys/vfs/nullfs/null_vfsops.c
sys/vfs/nwfs/nwfs_vfsops.c
sys/vfs/portal/portal_vfsops.c
sys/vfs/procfs/procfs_vfsops.c
sys/vfs/smbfs/smbfs_vfsops.c
sys/vfs/specfs/spec_vnops.c
sys/vfs/udf/udf_vfsops.c
sys/vfs/ufs/dinode.h
sys/vfs/ufs/ffs_vfsops.c
sys/vfs/ufs/inode.h
sys/vfs/ufs/ufs_inode.c
sys/vfs/ufs/ufs_vnops.c
sys/vfs/umapfs/umap_vfsops.c
sys/vfs/union/union_vfsops.c
sys/vm/vm_swap.c

index c19c203..a1ddd73 100644 (file)
@@ -39,7 +39,7 @@
  *     @(#)procfs_vfsops.c     8.7 (Berkeley) 5/10/95
  *
  * $FreeBSD: src/sys/i386/linux/linprocfs/linprocfs_vfsops.c,v 1.2.2.3 2001/10/15 20:42:01 des Exp $
- * $DragonFly: src/sys/emulation/linux/i386/linprocfs/linprocfs_vfsops.c,v 1.9 2005/02/02 21:34:18 joerg Exp $
+ * $DragonFly: src/sys/emulation/linux/i386/linprocfs/linprocfs_vfsops.c,v 1.10 2005/09/17 07:42:58 dillon Exp $
  */
 
 /*
@@ -92,7 +92,8 @@ linprocfs_mount(mp, path, data, td)
        mp->mnt_data = 0;
        vfs_getnewfsid(mp);
 
-       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, linprocfs_vnodeop_entries);
+       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, 
+                        linprocfs_vnodeop_entries, 0);
 
        size = sizeof("linprocfs") - 1;
        bcopy("linprocfs", mp->mnt_stat.f_mntfromname, size);
index a64a912..b65ba20 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.57 2005/08/27 20:23:05 joerg Exp $
+ * $DragonFly: src/sys/kern/vfs_cache.c,v 1.58 2005/09/17 07:42:59 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -112,7 +112,6 @@ MALLOC_DEFINE(M_VFSCACHE, "vfscache", "VFS name cache entries");
 
 static LIST_HEAD(nchashhead, namecache) *nchashtbl;    /* Hash Table */
 static struct namecache_list   ncneglist;              /* instead of vnode */
-static int64_t last_fsmid;                             /* node change id */
 
 /*
  * ncvp_debug - debug cache_fromvp().  This is used by the NFS server
@@ -295,7 +294,7 @@ cache_alloc(int nlen)
        ncp->nc_flag = NCF_UNRESOLVED;
        ncp->nc_error = ENOTCONN;       /* needs to be resolved */
        ncp->nc_refs = 1;
-       ncp->nc_fsmid = ++last_fsmid;
+       ncp->nc_fsmid = 1;
        TAILQ_INIT(&ncp->nc_list);
        cache_lock(ncp);
        return(ncp);
@@ -666,7 +665,7 @@ cache_inval(struct namecache *ncp, int flags)
  * any time if not locked, even if held.
  */
 int
-cache_inval_vp(struct vnode *vp, int flags)
+cache_inval_vp(struct vnode *vp, int flags, int *retflags)
 {
        struct namecache *ncp;
        struct namecache *next;
@@ -688,6 +687,7 @@ restart:
                                cache_drop(next);
                        goto restart;
                }
+               *retflags |= ncp->nc_flag & NCF_FSMID;
                cache_inval(ncp, flags);
                cache_put(ncp);         /* also releases reference */
                ncp = next;
@@ -824,21 +824,24 @@ again:
        return(error);
 }
 
+/*
+ * Recursively set the FSMID update flag for namecache nodes leading
+ * to root.  This will cause the next getattr to increment the fsmid.
+ */
 void
 cache_update_fsmid(struct namecache *ncp)
 {
        struct vnode *vp;
        struct namecache *scan;
-       int64_t fsmid = ++last_fsmid;
 
        if ((vp = ncp->nc_vp) != NULL) {
                TAILQ_FOREACH(ncp, &vp->v_namecache, nc_vnode) {
                        for (scan = ncp; scan; scan = scan->nc_parent)
-                               scan->nc_fsmid = fsmid;
+                               scan->nc_flag |= NCF_FSMID;
                }
        } else {
                while (ncp) {
-                       ncp->nc_fsmid = fsmid;
+                       ncp->nc_flag |= NCF_FSMID;
                        ncp = ncp->nc_parent;
                }
        }
@@ -849,15 +852,41 @@ cache_update_fsmid_vp(struct vnode *vp)
 {
        struct namecache *ncp;
        struct namecache *scan;
-       int64_t fsmid = ++last_fsmid;
 
        TAILQ_FOREACH(ncp, &vp->v_namecache, nc_vnode) {
                for (scan = ncp; scan; scan = scan->nc_parent)
-                       scan->nc_fsmid = fsmid;
+                       scan->nc_flag |= NCF_FSMID;
        }
 }
 
 /*
+ * If getattr is called on a vnode (e.g. a stat call), the filesystem
+ * may call this routine to determine if the namecache has the hierarchical
+ * change flag set, requiring the fsmid to be updated.
+ *
+ * Since 0 indicates no support, make sure the filesystem fsmid is at least
+ * 1.
+ */
+int
+cache_check_fsmid_vp(struct vnode *vp, int64_t *fsmid)
+{
+       struct namecache *ncp;
+       int changed = 0;
+
+       TAILQ_FOREACH(ncp, &vp->v_namecache, nc_vnode) {
+               if (ncp->nc_flag & NCF_FSMID) {
+                       ncp->nc_flag &= ~NCF_FSMID;
+                       changed = 1;
+               }
+       }
+       if (*fsmid == 0)
+               ++*fsmid;
+       if (changed)
+               ++*fsmid;
+       return(changed);
+}
+
+/*
  * Convert a directory vnode to a namecache record without any other 
  * knowledge of the topology.  This ONLY works with directory vnodes and
  * is ONLY used by the NFS server.  dvp must be refd but unlocked, and the
@@ -1666,13 +1695,17 @@ vfs_cache_setroot(struct vnode *nvp, struct namecache *ncp)
  * XXX: v_id wraparound.  The period of resistance can be extended
  * XXX: by incrementing each vnodes v_id individually instead of
  * XXX: using the global v_id.
+ *
+ * Does not support NCP_FSMID accumulation on invalidation (retflags is
+ * not used).
  */
 void
 cache_purge(struct vnode *vp)
 {
        static u_long nextid;
+       int retflags = 0;
 
-       cache_inval_vp(vp, CINV_DESTROY | CINV_CHILDREN);
+       cache_inval_vp(vp, CINV_DESTROY | CINV_CHILDREN, &retflags);
 
        /*
         * Calculate a new unique id for ".." handling
index 83b46e7..5cd84f8 100644 (file)
@@ -37,7 +37,7 @@
  *
  *
  * $FreeBSD: src/sys/kern/vfs_default.c,v 1.28.2.7 2003/01/10 18:23:26 bde Exp $
- * $DragonFly: src/sys/kern/vfs_default.c,v 1.27 2005/09/14 01:13:20 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_default.c,v 1.28 2005/09/17 07:43:00 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -117,7 +117,7 @@ static struct vnodeopv_entry_desc default_vnodeop_entries[] = {
 };
 
 static struct vnodeopv_desc default_vnodeop_opv_desc =
-        { &default_vnode_vops, default_vnodeop_entries };
+        { &default_vnode_vops, default_vnodeop_entries, 0 };
 
 VNODEOP_SET(default_vnodeop_opv_desc);
 
index cae297b..903212d 100644 (file)
@@ -70,7 +70,7 @@
  *
  *     @(#)vfs_init.c  8.3 (Berkeley) 1/4/94
  * $FreeBSD: src/sys/kern/vfs_init.c,v 1.59 2002/04/30 18:44:32 dillon Exp $
- * $DragonFly: src/sys/kern/vfs_init.c,v 1.9 2005/07/26 15:43:35 hmp Exp $
+ * $DragonFly: src/sys/kern/vfs_init.c,v 1.10 2005/09/17 07:43:00 dillon Exp $
  */
 /*
  * Manage vnode VOP operations vectors
@@ -109,7 +109,8 @@ vfs_add_vnodeops_sysinit(const void *data)
 {
        const struct vnodeopv_desc *vdesc = data;
 
-       vfs_add_vnodeops(NULL, vdesc->opv_desc_vector, vdesc->opv_desc_ops);
+       vfs_add_vnodeops(NULL, vdesc->opv_desc_vector, 
+                        vdesc->opv_desc_ops, vdesc->opv_flags);
 }
 
 /*
@@ -125,7 +126,7 @@ vfs_rm_vnodeops_sysinit(const void *data)
 
 void
 vfs_add_vnodeops(struct mount *mp, struct vop_ops **vops_pp,
-               struct vnodeopv_entry_desc *descs)
+               struct vnodeopv_entry_desc *descs, int flags)
 {
        struct vnodeopv_node *node;
        struct vop_ops *ops;
@@ -139,9 +140,21 @@ vfs_add_vnodeops(struct mount *mp, struct vop_ops **vops_pp,
        node->ops = ops;
        node->descs = descs;
        ops->vv_mount = mp;
+       ops->vv_flags |= flags;
+
+       /*
+        * Journal and coherency ops inherit normal ops flags
+        */
+       if (vops_pp == &mp->mnt_vn_coherency_ops && mp->mnt_vn_norm_ops)
+           ops->vv_flags |= mp->mnt_vn_norm_ops->vv_flags;
+       if (vops_pp == &mp->mnt_vn_journal_ops && mp->mnt_vn_norm_ops)
+           ops->vv_flags |= mp->mnt_vn_norm_ops->vv_flags;
+
        ++ops->vv_refs;
        TAILQ_INSERT_TAIL(&vnodeopv_list, node, entry);
+
        vfs_recalc_vnodeops();
+
        if (mp) {
                if (mp->mnt_vn_coherency_ops)
                        mp->mnt_vn_use_ops = mp->mnt_vn_coherency_ops;
index 06618d9..9efc346 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_jops.c,v 1.22 2005/09/07 19:04:18 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_jops.c,v 1.23 2005/09/17 07:43:00 dillon Exp $
  */
 /*
  * Each mount point may have zero or more independantly configured journals
@@ -294,7 +294,8 @@ journal_mountctl(struct vop_mountctl_args *ap)
 static int
 journal_attach(struct mount *mp)
 {
-    vfs_add_vnodeops(mp, &mp->mnt_vn_journal_ops, journal_vnodeop_entries);
+    vfs_add_vnodeops(mp, &mp->mnt_vn_journal_ops, 
+                    journal_vnodeop_entries, 0);
     return(0);
 }
 
index 8e52913..5d63c84 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_journal.c,v 1.22 2005/09/07 19:04:18 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_journal.c,v 1.23 2005/09/17 07:43:00 dillon Exp $
  */
 /*
  * Each mount point may have zero or more independantly configured journals
@@ -294,7 +294,8 @@ journal_mountctl(struct vop_mountctl_args *ap)
 static int
 journal_attach(struct mount *mp)
 {
-    vfs_add_vnodeops(mp, &mp->mnt_vn_journal_ops, journal_vnodeop_entries);
+    vfs_add_vnodeops(mp, &mp->mnt_vn_journal_ops, 
+                    journal_vnodeop_entries, 0);
     return(0);
 }
 
index 8cba78b..6624e25 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)vfs_subr.c  8.31 (Berkeley) 5/26/95
  * $FreeBSD: src/sys/kern/vfs_subr.c,v 1.249.2.30 2003/04/04 20:35:57 tegge Exp $
- * $DragonFly: src/sys/kern/vfs_subr.c,v 1.63 2005/08/27 20:23:05 joerg Exp $
+ * $DragonFly: src/sys/kern/vfs_subr.c,v 1.64 2005/09/17 07:43:00 dillon Exp $
  */
 
 /*
@@ -256,6 +256,7 @@ vattr_null(struct vattr *vap)
        vap->va_flags = VNOVAL;
        vap->va_gen = VNOVAL;
        vap->va_vaflags = 0;
+       vap->va_fsmid = VNOVAL;
 }
 
 /*
@@ -1063,6 +1064,7 @@ void
 vclean(struct vnode *vp, int flags, struct thread *td)
 {
        int active;
+       int retflags = 0;
 
        /*
         * If the vnode has already been reclaimed we have nothing to do.
@@ -1074,7 +1076,7 @@ vclean(struct vnode *vp, int flags, struct thread *td)
        /*
         * Scrap the vfs cache
         */
-       while (cache_inval_vp(vp, 0) != 0) {
+       while (cache_inval_vp(vp, 0, &retflags) != 0) {
                printf("Warning: vnode %p clean/cache_resolution race detected\n", vp);
                tsleep(vp, 0, "vclninv", 2);
        }
@@ -1115,7 +1117,7 @@ vclean(struct vnode *vp, int flags, struct thread *td)
        /*
         * Reclaim the vnode.
         */
-       if (VOP_RECLAIM(vp, td))
+       if (VOP_RECLAIM(vp, retflags, td))
                panic("vclean: cannot reclaim");
 
        /*
index 244efb8..05bb7ca 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)vfs_subr.c  8.31 (Berkeley) 5/26/95
  * $FreeBSD: src/sys/kern/vfs_subr.c,v 1.249.2.30 2003/04/04 20:35:57 tegge Exp $
- * $DragonFly: src/sys/kern/vfs_sync.c,v 1.6 2005/06/06 15:02:28 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_sync.c,v 1.7 2005/09/17 07:43:00 dillon Exp $
  */
 
 /*
@@ -321,7 +321,7 @@ static struct vnodeopv_entry_desc sync_vnodeop_entries[] = {
 };
 
 static struct vnodeopv_desc sync_vnodeop_opv_desc =
-       { &sync_vnode_vops, sync_vnodeop_entries };
+       { &sync_vnode_vops, sync_vnodeop_entries, 0 };
 
 VNODEOP_SET(sync_vnodeop_opv_desc);
 
index e595050..a3d367f 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.71 2005/09/02 07:16:58 hsu Exp $
+ * $DragonFly: src/sys/kern/vfs_syscalls.c,v 1.72 2005/09/17 07:43:00 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -1891,17 +1891,6 @@ again:
                        goto again;
                }
        }
-
-       /*
-        * The fsmid can be used to detect that something has changed
-        * at or below the specified file/dir in the filesystem.  At
-        * a minimum the fsmid is synthesized by the kernel via the 
-        * namecache and requires an open descriptor for deterministic
-        * operation.  Filesystems supporting fsmid may store it in the
-        * inode, but this is not a requirement.
-        */
-       st->st_fsmid = nd->nl_ncp->nc_fsmid;
-
        vput(vp);
        return (error);
 }
index 7bc6de2..d0807e0 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)vfs_vnops.c 8.2 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/kern/vfs_vnops.c,v 1.87.2.13 2002/12/29 18:19:53 dillon Exp $
- * $DragonFly: src/sys/kern/vfs_vnops.c,v 1.32 2005/09/02 07:16:58 hsu Exp $
+ * $DragonFly: src/sys/kern/vfs_vnops.c,v 1.33 2005/09/17 07:43:00 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -846,16 +846,7 @@ vn_stat(struct vnode *vp, struct stat *sb, struct thread *td)
 #else
        sb->st_blocks = vap->va_bytes / S_BLKSIZE;
 #endif
-
-       /*
-        * Set the fsmid from the namecache.  Use the first available
-        * namecache record.
-        */
-       if ((ncp = TAILQ_FIRST(&vp->v_namecache)) != NULL)
-               sb->st_fsmid = ncp->nc_fsmid;
-       else
-               sb->st_fsmid = 0;
-
+       sb->st_fsmid = vap->va_fsmid;
        return (0);
 }
 
index 8f26be1..df81850 100644 (file)
@@ -32,7 +32,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/kern/vfs_vopops.c,v 1.15 2005/09/14 01:13:20 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_vopops.c,v 1.16 2005/09/17 07:43:00 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -451,6 +451,7 @@ vop_getattr(struct vop_ops *ops, struct vnode *vp, struct vattr *vap,
        struct thread *td)
 {
        struct vop_getattr_args ap;
+       struct namecache *ncp;
        int error;
 
        ap.a_head.a_desc = &vop_getattr_desc;
@@ -460,6 +461,15 @@ vop_getattr(struct vop_ops *ops, struct vnode *vp, struct vattr *vap,
        ap.a_td = td;
 
        DO_OPS(ops, error, &ap, vop_getattr);
+       if ((ops->vv_flags & VVF_SUPPORTS_FSMID) == 0) {
+               if ((ncp = TAILQ_FIRST(&vp->v_namecache)) != NULL) {
+                       if (ncp->nc_flag & NCF_FSMID) {
+                               ncp->nc_flag &= ~NCF_FSMID;
+                               ++ncp->nc_fsmid;
+                       }
+                       vap->va_fsmid = ncp->nc_fsmid;
+               }
+       }
        return(error);
 }
 
@@ -805,7 +815,7 @@ vop_inactive(struct vop_ops *ops, struct vnode *vp, struct thread *td)
 }
 
 int
-vop_reclaim(struct vop_ops *ops, struct vnode *vp, struct thread *td)
+vop_reclaim(struct vop_ops *ops, struct vnode *vp, int retflags, struct thread *td)
 {
        struct vop_reclaim_args ap;
        int error;
@@ -814,6 +824,7 @@ vop_reclaim(struct vop_ops *ops, struct vnode *vp, struct thread *td)
        ap.a_head.a_ops = ops;
        ap.a_vp = vp;
        ap.a_td = td;
+       ap.a_retflags = retflags;       /* return to filesystem inode */
 
        DO_OPS(ops, error, &ap, vop_reclaim);
        return(error);
index f57a295..14343c2 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.21 2005/09/14 01:13:22 dillon Exp $
+ * $DragonFly: src/sys/sys/namecache.h,v 1.22 2005/09/17 07:43:01 dillon Exp $
  */
 
 #ifndef _SYS_NAMECACHE_H_
@@ -132,6 +132,7 @@ typedef struct namecache *namecache_t;
 #define NCF_ISSYMLINK  0x0100  /* represents a symlink */
 #define NCF_ISDIR      0x0200  /* represents a directory */
 #define NCF_DESTROYED  0x0400  /* name association is considered destroyed */
+#define NCF_FSMID      0x0800  /* FSMID updated */
 
 /*
  * cache_inval[_vp]() flags
@@ -155,7 +156,7 @@ void        cache_setunresolved(struct namecache *ncp);
 struct namecache *cache_nlookup(struct namecache *par, struct nlcomponent *nlc);
 struct namecache *cache_allocroot(struct mount *mp, struct vnode *vp);
 int    cache_inval(struct namecache *ncp, int flags);
-int    cache_inval_vp(struct vnode *vp, int flags);
+int    cache_inval_vp(struct vnode *vp, int flags, int *retflags);
 void   vfs_cache_setroot(struct vnode *vp, struct namecache *ncp);
 
 int    cache_resolve(struct namecache *ncp, struct ucred *cred);
@@ -174,7 +175,7 @@ struct namecache *cache_fromdvp(struct vnode *, struct ucred *, int);
 int    cache_fullpath(struct proc *, struct namecache *, char **, char **);
 void   cache_update_fsmid(struct namecache *);
 void   cache_update_fsmid_vp(struct vnode *);
-
+int    cache_check_fsmid_vp(struct vnode *, int64_t *);
 
 #endif
 
index b1e3a53..a46ebc4 100644 (file)
@@ -63,7 +63,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/sys/sys/vfscache.h,v 1.2 2005/08/02 13:03:55 joerg Exp $
+ * $DragonFly: src/sys/sys/vfscache.h,v 1.3 2005/09/17 07:43:01 dillon Exp $
  */
 /*
  * This module serves as a focal point for virtually all filesystem and
@@ -129,6 +129,7 @@ struct vattr {
        u_quad_t        va_filerev;     /* file modification number */
        u_int           va_vaflags;     /* operations flags, see below */
        long            va_spare;       /* remain quad aligned */
+       int64_t         va_fsmid;       /* filesystem modification id */
 };
 
 /*
index 27d4b76..f4dd817 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/sys/sys/vfsops.h,v 1.13 2005/09/14 01:13:22 dillon Exp $
+ * $DragonFly: src/sys/sys/vfsops.h,v 1.14 2005/09/17 07:43:01 dillon Exp $
  */
 
 /*
@@ -307,6 +307,7 @@ struct vop_reclaim_args {
        struct vop_generic_args a_head;
        struct vnode *a_vp;
        struct thread *a_td;
+       int a_retflags;
 };
 
 struct vop_lock_args {
@@ -655,7 +656,7 @@ struct vop_ops {
 
 #define VVF_JOURNAL_LAYER      0x0001
 #define VVF_COHERENCY_LAYER    0x0002
-#define VVF_UNUSED_04          0x0004
+#define VVF_SUPPORTS_FSMID     0x0004
 #define VVF_UNUSED_08          0x0008
 #define VVF_NOATIME            0x0010          /* FUTURE */
 #define VVF_RDONLY             0x0020          /* FUTURE */
@@ -811,7 +812,8 @@ int vop_readdir(struct vop_ops *ops, struct vnode *vp, struct uio *uio,
 int vop_readlink(struct vop_ops *ops, struct vnode *vp, struct uio *uio,
                struct ucred *cred);
 int vop_inactive(struct vop_ops *ops, struct vnode *vp, struct thread *td);
-int vop_reclaim(struct vop_ops *ops, struct vnode *vp, struct thread *td);
+int vop_reclaim(struct vop_ops *ops, struct vnode *vp, int retflags,
+               struct thread *td);
 int vop_lock(struct vop_ops *ops, struct vnode *vp,
                int flags, struct thread *td);
 int vop_unlock(struct vop_ops *ops, struct vnode *vp,
@@ -1065,8 +1067,8 @@ extern struct vnodeop_desc vop_nrename_desc;
        vop_readlink(*(vp)->v_ops, vp, uio, cred)
 #define VOP_INACTIVE(vp, td)                           \
        vop_inactive(*(vp)->v_ops, vp, td)
-#define VOP_RECLAIM(vp, td)                            \
-       vop_reclaim(*(vp)->v_ops, vp, td)
+#define VOP_RECLAIM(vp, retflags, td)                  \
+       vop_reclaim(*(vp)->v_ops, vp, retflags, td)
 #define VOP_LOCK(vp, flags, td)                                \
        vop_lock(*(vp)->v_ops, vp, flags, td)
 #define VOP_UNLOCK(vp, flags, td)                      \
index 2bcc436..c839615 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.38 2005/08/10 14:28:34 joerg Exp $
+ * $DragonFly: src/sys/sys/vnode.h,v 1.39 2005/09/17 07:43:01 dillon Exp $
  */
 
 #ifndef _SYS_VNODE_H_
@@ -459,6 +459,7 @@ struct vnodeopv_entry_desc {
 struct vnodeopv_desc {
        struct vop_ops **opv_desc_vector;           /* vect to allocate/fill*/
        struct vnodeopv_entry_desc *opv_desc_ops;   /* null terminated list */
+       int opv_flags;
 };
 
 struct vnodeopv_node {
@@ -601,7 +602,7 @@ int vfinddev (dev_t dev, enum vtype type, struct vnode **vpp);
 void   vfs_add_vnodeops_sysinit (const void *);
 void   vfs_rm_vnodeops_sysinit (const void *);
 void   vfs_add_vnodeops(struct mount *, struct vop_ops **,
-                       struct vnodeopv_entry_desc *);
+                       struct vnodeopv_entry_desc *, int);
 void   vfs_rm_vnodeops(struct vop_ops **);
 int    vflush (struct mount *mp, int rootrefs, int flags);
 int    vmntvnodescan(struct mount *mp, int flags,
index 4069ec1..00e9fa6 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)dead_vnops.c        8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/miscfs/deadfs/dead_vnops.c,v 1.26 1999/08/28 00:46:42 peter Exp $
- * $DragonFly: src/sys/vfs/deadfs/dead_vnops.c,v 1.13 2005/09/14 01:13:24 dillon Exp $
+ * $DragonFly: src/sys/vfs/deadfs/dead_vnops.c,v 1.14 2005/09/17 07:43:02 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -90,7 +90,7 @@ static struct vnodeopv_entry_desc dead_vnodeop_entries[] = {
        { NULL, NULL }
 };
 static struct vnodeopv_desc dead_vnodeop_opv_desc =
-       { &dead_vnode_vops, dead_vnodeop_entries };
+       { &dead_vnode_vops, dead_vnodeop_entries, 0 };
 
 VNODEOP_SET(dead_vnodeop_opv_desc);
 
index 2fd562f..6f9ae60 100644 (file)
@@ -36,7 +36,7 @@
  *     @(#)fdesc_vfsops.c      8.4 (Berkeley) 1/21/94
  *
  * $FreeBSD: src/sys/miscfs/fdesc/fdesc_vfsops.c,v 1.22.2.3 2002/08/23 17:42:39 njl Exp $
- * $DragonFly: src/sys/vfs/fdesc/fdesc_vfsops.c,v 1.15 2005/07/26 15:43:35 hmp Exp $
+ * $DragonFly: src/sys/vfs/fdesc/fdesc_vfsops.c,v 1.16 2005/09/17 07:43:03 dillon Exp $
  */
 
 /*
@@ -87,7 +87,8 @@ fdesc_mount(struct mount *mp, char *path, caddr_t data, struct thread *td)
        if (mp->mnt_flag & MNT_UPDATE)
                return (EOPNOTSUPP);
 
-       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, fdesc_vnodeop_entries);
+       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, 
+                        fdesc_vnodeop_entries, 0);
 
        error = fdesc_allocvp(Froot, FD_ROOT, mp, &rvp, td);
        if (error)
index 2bd7103..e1f4dd4 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)fifo_vnops.c        8.10 (Berkeley) 5/27/95
  * $FreeBSD: src/sys/miscfs/fifofs/fifo_vnops.c,v 1.45.2.4 2003/04/22 10:11:24 bde Exp $
- * $DragonFly: src/sys/vfs/fifofs/fifo_vnops.c,v 1.20 2005/09/14 01:13:34 dillon Exp $
+ * $DragonFly: src/sys/vfs/fifofs/fifo_vnops.c,v 1.21 2005/09/17 07:43:04 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -123,7 +123,7 @@ static struct vnodeopv_entry_desc fifo_vnodeop_entries[] = {
        { NULL, NULL }
 };
 static struct vnodeopv_desc fifo_vnodeop_opv_desc =
-       { &fifo_vnode_vops, fifo_vnodeop_entries };
+       { &fifo_vnode_vops, fifo_vnodeop_entries, 0 };
 
 VNODEOP_SET(fifo_vnodeop_opv_desc);
 
index 32c1d10..817ffa6 100644 (file)
@@ -38,7 +38,7 @@
  *
  *     @(#)ffs_vfsops.c        8.8 (Berkeley) 4/18/94
  *     $FreeBSD: src/sys/gnu/ext2fs/ext2_vfsops.c,v 1.63.2.7 2002/07/01 00:18:51 iedowse Exp $
- *     $DragonFly: src/sys/vfs/gnu/ext2fs/ext2_vfsops.c,v 1.30 2005/07/26 15:43:35 hmp Exp $
+ *     $DragonFly: src/sys/vfs/gnu/ext2fs/ext2_vfsops.c,v 1.31 2005/09/17 07:43:06 dillon Exp $
  */
 
 #include "opt_quota.h"
@@ -691,9 +691,12 @@ ext2_mountfs(struct vnode *devvp, struct mount *mp, struct thread *td)
                ump->um_quotas[i] = NULLVP; 
        dev->si_mountpoint = mp;
 
-       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, ext2_vnodeop_entries);
-       vfs_add_vnodeops(mp, &mp->mnt_vn_spec_ops, ext2_specop_entries);
-       vfs_add_vnodeops(mp, &mp->mnt_vn_fifo_ops, ext2_fifoop_entries);
+       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, 
+                        ext2_vnodeop_entries, 0);
+       vfs_add_vnodeops(mp, &mp->mnt_vn_spec_ops,
+                        ext2_specop_entries, 0);
+       vfs_add_vnodeops(mp, &mp->mnt_vn_fifo_ops,
+                        ext2_fifoop_entries, 0);
 
        if (ronly == 0) 
                ext2_sbupdate(ump, MNT_WAIT);
index 42e777d..07a06d4 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/fs/hpfs/hpfs_vfsops.c,v 1.3.2.2 2001/12/25 01:44:45 dillon Exp $
- * $DragonFly: src/sys/vfs/hpfs/hpfs_vfsops.c,v 1.29 2005/08/02 13:03:55 joerg Exp $
+ * $DragonFly: src/sys/vfs/hpfs/hpfs_vfsops.c,v 1.30 2005/09/17 07:43:07 dillon Exp $
  */
 
 
@@ -314,7 +314,8 @@ hpfs_mountfs(struct vnode *devvp, struct mount *mp, struct hpfs_args *argsp,
                hpfs_bmdeinit(hpmp);
                goto failed;
        }
-       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, hpfs_vnodeop_entries);
+       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, 
+                        hpfs_vnodeop_entries, 0);
 
        error = hpfs_root(mp, &vp);
        if (error) {
index 7ef1487..0ea374d 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)cd9660_vfsops.c     8.18 (Berkeley) 5/22/95
  * $FreeBSD: src/sys/isofs/cd9660/cd9660_vfsops.c,v 1.74.2.7 2002/04/08 09:39:29 bde Exp $
- * $DragonFly: src/sys/vfs/isofs/cd9660/cd9660_vfsops.c,v 1.27 2005/07/26 15:43:35 hmp Exp $
+ * $DragonFly: src/sys/vfs/isofs/cd9660/cd9660_vfsops.c,v 1.28 2005/09/17 07:43:08 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -508,9 +508,12 @@ iso_mountfs(struct vnode *devvp, struct mount *mp, struct thread *td,
                supbp = NULL;
        }
 
-       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, cd9660_vnodeop_entries);
-       vfs_add_vnodeops(mp, &mp->mnt_vn_spec_ops, cd9660_specop_entries);
-       vfs_add_vnodeops(mp, &mp->mnt_vn_fifo_ops, cd9660_fifoop_entries);
+       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, 
+                        cd9660_vnodeop_entries, 0);
+       vfs_add_vnodeops(mp, &mp->mnt_vn_spec_ops, 
+                        cd9660_specop_entries, 0);
+       vfs_add_vnodeops(mp, &mp->mnt_vn_fifo_ops,
+                        cd9660_fifoop_entries, 0);
 
        return 0;
 out:
index 1b32fd7..9d32981 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)mfs_vnops.c 8.11 (Berkeley) 5/22/95
  * $FreeBSD: src/sys/ufs/mfs/mfs_vnops.c,v 1.47.2.1 2001/05/22 02:06:43 bp Exp $
- * $DragonFly: src/sys/vfs/mfs/mfs_vnops.c,v 1.18 2005/06/06 15:09:38 drhodus Exp $
+ * $DragonFly: src/sys/vfs/mfs/mfs_vnops.c,v 1.19 2005/09/17 07:43:09 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -92,7 +92,7 @@ static struct vnodeopv_entry_desc mfs_vnodeop_entries[] = {
        { NULL, NULL }
 };
 static struct vnodeopv_desc mfs_vnodeop_opv_desc =
-       { &mfs_vnode_vops, mfs_vnodeop_entries };
+       { &mfs_vnode_vops, mfs_vnodeop_entries, 0 };
 
 VNODEOP_SET(mfs_vnodeop_opv_desc);
 
index 21acb3a..d58e683 100644 (file)
@@ -1,5 +1,5 @@
 /* $FreeBSD: /usr/local/www/cvsroot/FreeBSD/src/sys/msdosfs/Attic/msdosfs_vfsops.c,v 1.60.2.8 2004/03/02 09:43:04 tjr Exp $ */
-/* $DragonFly: src/sys/vfs/msdosfs/msdosfs_vfsops.c,v 1.27 2005/09/01 00:18:24 swildner Exp $ */
+/* $DragonFly: src/sys/vfs/msdosfs/msdosfs_vfsops.c,v 1.28 2005/09/17 07:43:10 dillon Exp $ */
 /*     $NetBSD: msdosfs_vfsops.c,v 1.51 1997/11/17 15:36:58 ws Exp $   */
 
 /*-
@@ -661,7 +661,8 @@ mountmsdosfs(struct vnode *devvp, struct mount *mp, struct thread *td,
        mp->mnt_stat.f_fsid.val[0] = dev2udev(dev);
        mp->mnt_stat.f_fsid.val[1] = mp->mnt_vfc->vfc_typenum;
        mp->mnt_flag |= MNT_LOCAL;
-       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, msdosfs_vnodeop_entries);
+       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, 
+                        msdosfs_vnodeop_entries, 0);
        dev->si_mountpoint = mp;
 
        return 0;
index 9689e2f..d283526 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     @(#)nfs_nqlease.c       8.9 (Berkeley) 5/20/95
  * $FreeBSD: src/sys/nfs/nfs_nqlease.c,v 1.50 2000/02/13 03:32:05 peter Exp $
- * $DragonFly: src/sys/vfs/nfs/Attic/nfs_nqlease.c,v 1.26 2005/06/06 15:09:38 drhodus Exp $
+ * $DragonFly: src/sys/vfs/nfs/Attic/nfs_nqlease.c,v 1.27 2005/09/17 07:43:12 dillon Exp $
  */
 
 
@@ -994,6 +994,7 @@ nqnfs_clientd(struct nfsmount *nmp, struct ucred *cred, struct nfsd_cargs *ncd,
        struct nfsreq myrep;
        struct nfsuid *nuidp, *nnuidp;
        int error = 0, vpid;
+       int retdummy;
 
        /*
         * First initialize some variables
@@ -1063,7 +1064,8 @@ nqnfs_clientd(struct nfsmount *nmp, struct ucred *cred, struct nfsd_cargs *ncd,
                                        if (np->n_flag & NQNFSEVICTED) {
                                                if (vp->v_type == VDIR)
                                                        nfs_invaldir(vp);
-                                               cache_inval_vp(vp, 0);
+                                               retdummy = 0;
+                                               cache_inval_vp(vp, 0, &retdummy);
                                                (void) nfs_vinvalbuf(vp,
                                                       V_SAVE, td, 0);
                                                np->n_flag &= ~NQNFSEVICTED;
index 96094e6..fc15cd3 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     @(#)nfs_socket.c        8.5 (Berkeley) 3/30/95
  * $FreeBSD: src/sys/nfs/nfs_socket.c,v 1.60.2.6 2003/03/26 01:44:46 alfred Exp $
- * $DragonFly: src/sys/vfs/nfs/nfs_socket.c,v 1.29 2005/06/09 18:39:05 hsu Exp $
+ * $DragonFly: src/sys/vfs/nfs/nfs_socket.c,v 1.30 2005/09/17 07:43:12 dillon Exp $
  */
 
 /*
@@ -938,6 +938,7 @@ nfs_request(struct vnode *vp, struct mbuf *mrest, int procnum,
        int t1, nqlflag, cachable, error = 0, mrest_len, auth_len, auth_type;
        int trylater_delay = NQ_TRYLATERDEL, trylater_cnt = 0, failed_auth = 0;
        int verf_len, verf_type;
+       int retdummy;
        u_int32_t xid;
        u_quad_t frev;
        char *auth_str, *verf_str;
@@ -1163,8 +1164,10 @@ tryagain:
                         * If the File Handle was stale, invalidate the
                         * lookup cache, just in case.
                         */
-                       if (error == ESTALE)
-                               cache_inval_vp(vp, CINV_CHILDREN);
+                       if (error == ESTALE) {
+                               retdummy = 0;
+                               cache_inval_vp(vp, CINV_CHILDREN, &retdummy);
+                       }
                        if (nmp->nm_flag & NFSMNT_NFSV3) {
                                *mrp = mrep;
                                *mdp = md;
index cbe6bad..943a440 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.32 2005/09/04 04:06:28 dillon Exp $
+ * $DragonFly: src/sys/vfs/nfs/nfs_vfsops.c,v 1.33 2005/09/17 07:43:12 dillon Exp $
  */
 
 #include "opt_bootp.h"
@@ -983,9 +983,12 @@ mountnfs(struct nfs_args *argp, struct mount *mp, struct sockaddr *nam,
        /*
         * Install vop_ops for our vnops
         */
-       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, nfsv2_vnodeop_entries);
-       vfs_add_vnodeops(mp, &mp->mnt_vn_spec_ops, nfsv2_specop_entries);
-       vfs_add_vnodeops(mp, &mp->mnt_vn_fifo_ops, nfsv2_fifoop_entries);
+       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, 
+                        nfsv2_vnodeop_entries, 0);
+       vfs_add_vnodeops(mp, &mp->mnt_vn_spec_ops,
+                        nfsv2_specop_entries, 0);
+       vfs_add_vnodeops(mp, &mp->mnt_vn_fifo_ops, 
+                        nfsv2_fifoop_entries, 0);
 
        /*
         * A reference count is needed on the nfsnode representing the
index f8d42ee..0849d17 100644 (file)
@@ -26,7 +26,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/ntfs/ntfs_vfsops.c,v 1.20.2.5 2001/12/25 01:44:45 dillon Exp $
- * $DragonFly: src/sys/vfs/ntfs/ntfs_vfsops.c,v 1.29 2005/08/02 13:03:55 joerg Exp $
+ * $DragonFly: src/sys/vfs/ntfs/ntfs_vfsops.c,v 1.30 2005/09/17 07:43:12 dillon Exp $
  */
 
 
@@ -498,7 +498,8 @@ ntfs_mountfs(struct vnode *devvp, struct mount *mp, struct ntfs_args *argsp,
                (ntmp->ntm_flag & NTFS_MFLAG_ALLNAMES)?" allnames,":"",
                ntmp->ntm_uid, ntmp->ntm_gid, ntmp->ntm_mode));
 
-       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, ntfs_vnodeop_entries);
+       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, 
+                        ntfs_vnodeop_entries, 0);
 
        /*
         * We read in some system nodes to do not allow 
index b53e62d..6e76155 100644 (file)
@@ -37,7 +37,7 @@
  *
  * @(#)lofs_vfsops.c   1.2 (Berkeley) 6/18/92
  * $FreeBSD: src/sys/miscfs/nullfs/null_vfsops.c,v 1.35.2.3 2001/07/26 20:37:11 iedowse Exp $
- * $DragonFly: src/sys/vfs/nullfs/null_vfsops.c,v 1.17 2005/07/26 15:43:36 hmp Exp $
+ * $DragonFly: src/sys/vfs/nullfs/null_vfsops.c,v 1.18 2005/09/17 07:43:12 dillon Exp $
  */
 
 /*
@@ -156,7 +156,8 @@ nullfs_mount(struct mount *mp, char *path, caddr_t data, struct thread *td)
         */
        xmp->nullm_vfs = lowerrootvp->v_mount;
 
-       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, null_vnodeop_entries);
+       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, 
+                        null_vnodeop_entries, 0);
 
        /*
         * Save reference.  Each mount also holds
index 684f23e..dbffce5 100644 (file)
@@ -30,7 +30,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/nwfs/nwfs_vfsops.c,v 1.6.2.6 2001/10/25 19:18:54 dillon Exp $
- * $DragonFly: src/sys/vfs/nwfs/nwfs_vfsops.c,v 1.19 2005/07/26 15:43:36 hmp Exp $
+ * $DragonFly: src/sys/vfs/nwfs/nwfs_vfsops.c,v 1.20 2005/09/17 07:43:12 dillon Exp $
  */
 #include "opt_ncp.h"
 #ifndef NCP
@@ -207,7 +207,8 @@ nwfs_mount(struct mount *mp, char *path, caddr_t data, struct thread *td)
        /* protect against invalid mount points */
        nmp->m.mount_point[sizeof(nmp->m.mount_point)-1] = '\0';
 
-       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, nwfs_vnodeop_entries);
+       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, 
+                        nwfs_vnodeop_entries, 0);
 
        vfs_getnewfsid(mp);
        error = nwfs_root(mp, &vp);
index b96ef0f..54a0412 100644 (file)
@@ -36,7 +36,7 @@
  *     @(#)portal_vfsops.c     8.11 (Berkeley) 5/14/95
  *
  * $FreeBSD: src/sys/miscfs/portal/portal_vfsops.c,v 1.26.2.2 2001/07/26 20:37:16 iedowse Exp $
- * $DragonFly: src/sys/vfs/portal/portal_vfsops.c,v 1.16 2005/07/26 15:43:36 hmp Exp $
+ * $DragonFly: src/sys/vfs/portal/portal_vfsops.c,v 1.17 2005/09/17 07:43:12 dillon Exp $
  */
 
 /*
@@ -112,7 +112,8 @@ portal_mount(struct mount *mp, char *path, caddr_t data, struct thread *td)
                M_PORTALFSMNT, M_WAITOK);       /* XXX */
 
         
-       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, portal_vnodeop_entries);
+       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops,
+                        portal_vnodeop_entries, 0);
 
        error = getnewvnode(VT_PORTAL, mp, &rvp, 0, 0);
        if (error) {
index 8e07358..7f7a4ba 100644 (file)
@@ -37,7 +37,7 @@
  *     @(#)procfs_vfsops.c     8.7 (Berkeley) 5/10/95
  *
  * $FreeBSD: src/sys/miscfs/procfs/procfs_vfsops.c,v 1.32.2.1 2001/10/15 20:42:01 des Exp $
- * $DragonFly: src/sys/vfs/procfs/procfs_vfsops.c,v 1.12 2005/07/26 15:43:36 hmp Exp $
+ * $DragonFly: src/sys/vfs/procfs/procfs_vfsops.c,v 1.13 2005/09/17 07:43:12 dillon Exp $
  */
 
 /*
@@ -89,7 +89,8 @@ procfs_mount(struct mount *mp, char *path, caddr_t data, struct thread *td)
        bcopy("procfs", mp->mnt_stat.f_mntfromname, size);
        bzero(mp->mnt_stat.f_mntfromname + size, MNAMELEN - size);
        procfs_statfs(mp, &mp->mnt_stat, td);
-       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, procfs_vnodeop_entries);
+       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops,
+                        procfs_vnodeop_entries, 0);
 
        return (0);
 }
index 2644639..c62e7a4 100644 (file)
@@ -30,7 +30,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/fs/smbfs/smbfs_vfsops.c,v 1.2.2.5 2003/01/17 08:20:26 tjr Exp $
- * $DragonFly: src/sys/vfs/smbfs/smbfs_vfsops.c,v 1.22 2005/07/26 15:43:36 hmp Exp $
+ * $DragonFly: src/sys/vfs/smbfs/smbfs_vfsops.c,v 1.23 2005/09/17 07:43:12 dillon Exp $
  */
 #include "opt_netsmb.h"
 #ifndef NETSMB
@@ -204,7 +204,8 @@ smbfs_mount(struct mount *mp, char *path, caddr_t data, struct thread *td)
        smp->sm_args.mount_point[sizeof(smp->sm_args.mount_point) - 1] = '\0';
        vfs_getnewfsid(mp);
 
-       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, smbfs_vnodeop_entries);
+       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, 
+                        smbfs_vnodeop_entries, 0);
 
        error = smbfs_root(mp, &vp);
        if (error)
index 76aa5d1..dbdd131 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)spec_vnops.c        8.14 (Berkeley) 5/21/95
  * $FreeBSD: src/sys/miscfs/specfs/spec_vnops.c,v 1.131.2.4 2001/02/26 04:23:20 jlemon Exp $
- * $DragonFly: src/sys/vfs/specfs/spec_vnops.c,v 1.28 2005/09/14 01:13:46 dillon Exp $
+ * $DragonFly: src/sys/vfs/specfs/spec_vnops.c,v 1.29 2005/09/17 07:43:12 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -111,7 +111,7 @@ struct vnodeopv_entry_desc spec_vnodeop_entries[] = {
        { NULL, NULL }
 };
 static struct vnodeopv_desc spec_vnodeop_opv_desc =
-       { &spec_vnode_vops, spec_vnodeop_entries };
+       { &spec_vnode_vops, spec_vnodeop_entries, 0 };
 VNODEOP_SET(spec_vnodeop_opv_desc);
 
 extern int dev_ref_debug;
index ba54ed4..044d0b6 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/fs/udf/udf_vfsops.c,v 1.16 2003/11/05 06:56:08 scottl Exp $
- * $DragonFly: src/sys/vfs/udf/udf_vfsops.c,v 1.14 2005/08/04 16:44:12 joerg Exp $
+ * $DragonFly: src/sys/vfs/udf/udf_vfsops.c,v 1.15 2005/09/17 07:43:12 dillon Exp $
  */
 
 /* udf_vfsops.c */
@@ -361,7 +361,8 @@ udf_mountfs(struct vnode *devvp, struct mount *mp, struct thread *td)
                goto bail;
        } 
 
-       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, udf_vnodeop_entries);
+       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, 
+                        udf_vnodeop_entries, 0);
 
        /*
         * Find the file entry for the root directory.
index c8b1930..1b40092 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)dinode.h    8.3 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/ufs/ufs/dinode.h,v 1.7 1999/08/28 00:52:27 peter Exp $
- * $DragonFly: src/sys/vfs/ufs/dinode.h,v 1.4 2005/08/28 04:34:44 dillon Exp $
+ * $DragonFly: src/sys/vfs/ufs/dinode.h,v 1.5 2005/09/17 07:43:12 dillon Exp $
  */
 
 #ifndef _UFS_UFS_DINODE_H_
@@ -93,7 +93,10 @@ struct dinode {
        int32_t         di_gen;         /* 108: Generation number. */
        uint32_t        di_uid;         /* 112: File owner. */
        uint32_t        di_gid;         /* 116: File group. */
-       int32_t         di_spare[2];    /* 120: Reserved; currently unused */
+       union {                         /* 120: File hierarchy modified */
+           int32_t     spare[2];       /*      (used by ext2fs) */
+           int64_t     fsmid;          /*      (used by dragonfly) */
+       } di_v;
 };
 
 /*
@@ -108,6 +111,8 @@ struct dinode {
 #define        di_ouid         di_u.oldids[0]
 #define        di_rdev         di_db[0]
 #define        di_shortlink    di_db
+#define di_spare       di_v.spare      /* ext2fs */
+#define di_fsmid       di_v.fsmid
 #define        MAXSYMLINKLEN   ((NDADDR + NIADDR) * sizeof(ufs_daddr_t))
 
 /* File permissions. */
index b273bbf..7d3057c 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)ffs_vfsops.c        8.31 (Berkeley) 5/20/95
  * $FreeBSD: src/sys/ufs/ffs/ffs_vfsops.c,v 1.117.2.10 2002/06/23 22:34:52 iedowse Exp $
- * $DragonFly: src/sys/vfs/ufs/ffs_vfsops.c,v 1.33 2005/07/26 15:43:36 hmp Exp $
+ * $DragonFly: src/sys/vfs/ufs/ffs_vfsops.c,v 1.34 2005/09/17 07:43:12 dillon Exp $
  */
 
 #include "opt_quota.h"
@@ -764,9 +764,9 @@ ffs_mountfs(struct vnode *devvp, struct mount *mp, struct thread *td,
                fs->fs_clean = 0;
                (void) ffs_sbupdate(ump, MNT_WAIT);
        }
-       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, ffs_vnodeop_entries);
-       vfs_add_vnodeops(mp, &mp->mnt_vn_spec_ops, ffs_specop_entries);
-       vfs_add_vnodeops(mp, &mp->mnt_vn_fifo_ops, ffs_fifoop_entries); 
+       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, ffs_vnodeop_entries, VVF_SUPPORTS_FSMID);
+       vfs_add_vnodeops(mp, &mp->mnt_vn_spec_ops, ffs_specop_entries, VVF_SUPPORTS_FSMID);
+       vfs_add_vnodeops(mp, &mp->mnt_vn_fifo_ops, ffs_fifoop_entries, VVF_SUPPORTS_FSMID); 
 
        return (0);
 out:
index d6f7c74..4f80890 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)inode.h     8.9 (Berkeley) 5/14/95
  * $FreeBSD: src/sys/ufs/ufs/inode.h,v 1.28.2.2 2001/09/29 12:52:52 iedowse Exp $
- * $DragonFly: src/sys/vfs/ufs/inode.h,v 1.9 2004/12/30 07:01:52 cpressey Exp $
+ * $DragonFly: src/sys/vfs/ufs/inode.h,v 1.10 2005/09/17 07:43:12 dillon Exp $
  */
 
 #ifndef _UFS_UFS_INODE_H_
@@ -134,6 +134,7 @@ struct inode {
 #define        i_shortlink     i_din.di_shortlink
 #define        i_size          i_din.di_size
 #define        i_uid           i_din.di_uid
+#define i_fsmid                i_din.di_fsmid
 
 #endif
 
index bef910e..2771832 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)ufs_inode.c 8.9 (Berkeley) 5/14/95
  * $FreeBSD: src/sys/ufs/ufs/ufs_inode.c,v 1.25.2.3 2002/07/05 22:42:31 dillon Exp $
- * $DragonFly: src/sys/vfs/ufs/ufs_inode.c,v 1.13 2005/07/20 17:59:45 dillon Exp $
+ * $DragonFly: src/sys/vfs/ufs/ufs_inode.c,v 1.14 2005/09/17 07:43:12 dillon Exp $
  */
 
 #include "opt_quota.h"
@@ -122,9 +122,19 @@ ufs_reclaim(struct vop_reclaim_args *ap)
        if (prtactive && vp->v_usecount != 1)
                vprint("ufs_reclaim: pushing active", vp);
        ip = VTOI(vp);
-       if (ip && (ip->i_flag & IN_LAZYMOD)) {
-               ip->i_flag |= IN_MODIFIED;
-               UFS_UPDATE(vp, 0);
+
+       /*
+        * Lazy updates.
+        */
+       if (ip) {
+               if (ap->a_retflags & NCF_FSMID) {
+                       ++ip->i_fsmid;
+                       ip->i_flag |= IN_LAZYMOD;
+               }
+               if (ip->i_flag & IN_LAZYMOD) {
+                       ip->i_flag |= IN_MODIFIED;
+                       UFS_UPDATE(vp, 0);
+               }
        }
 #ifdef INVARIANTS
        if (ip && (ip->i_flag & (IN_ACCESS | IN_CHANGE | IN_MODIFIED | IN_UPDATE))) {
index e5508b6..edcbd76 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.31 2005/09/14 01:13:48 dillon Exp $
+ * $DragonFly: src/sys/vfs/ufs/ufs_vnops.c,v 1.32 2005/09/17 07:43:12 dillon Exp $
  */
 
 #include "opt_quota.h"
@@ -388,6 +388,17 @@ ufs_getattr(struct vop_getattr_args *ap)
        struct inode *ip = VTOI(vp);
        struct vattr *vap = ap->a_vap;
 
+       /*
+        * This may cause i_fsmid to be updated even if no change (0)
+        * is returned, but we should only write out the inode if non-zero
+        * is returned and if the mount is read-write.
+        */
+       if (cache_check_fsmid_vp(vp, &ip->i_fsmid) &&
+           (vp->v_mount->mnt_flag & MNT_RDONLY) == 0
+       ) {
+               ip->i_flag |= IN_LAZYMOD;
+       }
+
        ufs_itimes(vp);
        /*
         * Copy from inode table
@@ -413,6 +424,7 @@ ufs_getattr(struct vop_getattr_args *ap)
        vap->va_bytes = dbtob((u_quad_t)ip->i_blocks);
        vap->va_type = IFTOVT(ip->i_mode);
        vap->va_filerev = ip->i_modrev;
+       vap->va_fsmid = ip->i_fsmid;
        return (0);
 }
 
@@ -2308,7 +2320,7 @@ static struct vnodeopv_entry_desc ufs_vnodeop_entries[] = {
        { NULL, NULL }
 };
 static struct vnodeopv_desc ufs_vnodeop_opv_desc =
-       { &ufs_vnode_vops, ufs_vnodeop_entries };
+       { &ufs_vnode_vops, ufs_vnodeop_entries, VVF_SUPPORTS_FSMID };
 
 static struct vop_ops *ufs_spec_vops;
 static struct vnodeopv_entry_desc ufs_specop_entries[] = {
@@ -2329,7 +2341,7 @@ static struct vnodeopv_entry_desc ufs_specop_entries[] = {
        { NULL, NULL }
 };
 static struct vnodeopv_desc ufs_specop_opv_desc =
-       { &ufs_spec_vops, ufs_specop_entries };
+       { &ufs_spec_vops, ufs_specop_entries, VVF_SUPPORTS_FSMID };
 
 static struct vop_ops *ufs_fifo_vops;
 static struct vnodeopv_entry_desc ufs_fifoop_entries[] = {
@@ -2351,7 +2363,7 @@ static struct vnodeopv_entry_desc ufs_fifoop_entries[] = {
        { NULL, NULL }
 };
 static struct vnodeopv_desc ufs_fifoop_opv_desc =
-       { &ufs_fifo_vops, ufs_fifoop_entries };
+       { &ufs_fifo_vops, ufs_fifoop_entries, VVF_SUPPORTS_FSMID };
 
 VNODEOP_SET(ufs_vnodeop_opv_desc);
 VNODEOP_SET(ufs_specop_opv_desc);
index f10e662..f741e6e 100644 (file)
@@ -36,7 +36,7 @@
  *     @(#)umap_vfsops.c       8.8 (Berkeley) 5/14/95
  *
  * $FreeBSD: src/sys/miscfs/umapfs/umap_vfsops.c,v 1.31.2.2 2001/09/11 09:49:53 kris Exp $
- * $DragonFly: src/sys/vfs/umapfs/Attic/umap_vfsops.c,v 1.17 2005/07/26 15:43:36 hmp Exp $
+ * $DragonFly: src/sys/vfs/umapfs/Attic/umap_vfsops.c,v 1.18 2005/09/17 07:43:12 dillon Exp $
  */
 
 /*
@@ -194,7 +194,8 @@ umapfs_mount(struct mount *mp, char *path, caddr_t data, struct thread *td)
                    amp->info_gmapdata[i][1]);
 #endif
 
-       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, umap_vnodeop_entries);
+       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops,
+                        umap_vnodeop_entries, 0);
 
        /*
         * Save reference.  Each mount also holds
index 76ff818..fa448bc 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.20 2005/07/26 15:43:36 hmp Exp $
+ * $DragonFly: src/sys/vfs/union/union_vfsops.c,v 1.21 2005/09/17 07:43:12 dillon Exp $
  */
 
 /*
@@ -269,7 +269,8 @@ union_mount(struct mount *mp, char *path, caddr_t data, struct thread *td)
        (void) copyinstr(args.target, cp, len - 1, &size);
        bzero(cp + size, len - size);
 
-       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops, union_vnodeop_entries);
+       vfs_add_vnodeops(mp, &mp->mnt_vn_norm_ops,
+                        union_vnodeop_entries, 0);
 
        (void)union_statfs(mp, &mp->mnt_stat, td);
 
index 0411acb..57a449b 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)vm_swap.c   8.5 (Berkeley) 2/17/94
  * $FreeBSD: src/sys/vm/vm_swap.c,v 1.96.2.2 2001/10/14 18:46:47 iedowse Exp $
- * $DragonFly: src/sys/vm/vm_swap.c,v 1.18 2005/06/02 20:57:21 swildner Exp $
+ * $DragonFly: src/sys/vm/vm_swap.c,v 1.19 2005/09/17 07:43:12 dillon Exp $
  */
 
 #include "opt_swap.h"
@@ -166,7 +166,7 @@ static struct vnodeopv_entry_desc swapdev_vnodeop_entries[] = {
        { NULL, NULL }
 };
 static struct vnodeopv_desc swapdev_vnodeop_opv_desc =
-       { &swapdev_vnode_vops, swapdev_vnodeop_entries };
+       { &swapdev_vnode_vops, swapdev_vnodeop_entries, 0 };
 
 VNODEOP_SET(swapdev_vnodeop_opv_desc);