From dc1be39cdb26fb1f08501b2d0400fe731592e6e0 Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Sat, 17 Sep 2005 07:43:12 +0000 Subject: [PATCH] Add an argument to vfs_add_vnodeops() to specify VVF_* flags for the vop_ops 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. --- .../linux/i386/linprocfs/linprocfs_vfsops.c | 5 +- sys/kern/vfs_cache.c | 53 +++++++++++++++---- sys/kern/vfs_default.c | 4 +- sys/kern/vfs_init.c | 19 +++++-- sys/kern/vfs_jops.c | 5 +- sys/kern/vfs_journal.c | 5 +- sys/kern/vfs_subr.c | 8 +-- sys/kern/vfs_sync.c | 4 +- sys/kern/vfs_syscalls.c | 13 +---- sys/kern/vfs_vnops.c | 13 +---- sys/kern/vfs_vopops.c | 15 +++++- sys/sys/namecache.h | 7 +-- sys/sys/vfscache.h | 3 +- sys/sys/vfsops.h | 12 +++-- sys/sys/vnode.h | 5 +- sys/vfs/deadfs/dead_vnops.c | 4 +- sys/vfs/fdesc/fdesc_vfsops.c | 5 +- sys/vfs/fifofs/fifo_vnops.c | 4 +- sys/vfs/gnu/ext2fs/ext2_vfsops.c | 11 ++-- sys/vfs/hpfs/hpfs_vfsops.c | 5 +- sys/vfs/isofs/cd9660/cd9660_vfsops.c | 11 ++-- sys/vfs/mfs/mfs_vnops.c | 4 +- sys/vfs/msdosfs/msdosfs_vfsops.c | 5 +- sys/vfs/nfs/nfs_nqlease.c | 6 ++- sys/vfs/nfs/nfs_socket.c | 9 ++-- sys/vfs/nfs/nfs_vfsops.c | 11 ++-- sys/vfs/ntfs/ntfs_vfsops.c | 5 +- sys/vfs/nullfs/null_vfsops.c | 5 +- sys/vfs/nwfs/nwfs_vfsops.c | 5 +- sys/vfs/portal/portal_vfsops.c | 5 +- sys/vfs/procfs/procfs_vfsops.c | 5 +- sys/vfs/smbfs/smbfs_vfsops.c | 5 +- sys/vfs/specfs/spec_vnops.c | 4 +- sys/vfs/udf/udf_vfsops.c | 5 +- sys/vfs/ufs/dinode.h | 9 +++- sys/vfs/ufs/ffs_vfsops.c | 8 +-- sys/vfs/ufs/inode.h | 3 +- sys/vfs/ufs/ufs_inode.c | 18 +++++-- sys/vfs/ufs/ufs_vnops.c | 20 +++++-- sys/vfs/umapfs/umap_vfsops.c | 5 +- sys/vfs/union/union_vfsops.c | 5 +- sys/vm/vm_swap.c | 4 +- 42 files changed, 229 insertions(+), 128 deletions(-) diff --git a/sys/emulation/linux/i386/linprocfs/linprocfs_vfsops.c b/sys/emulation/linux/i386/linprocfs/linprocfs_vfsops.c index c19c203a1b..a1ddd73175 100644 --- a/sys/emulation/linux/i386/linprocfs/linprocfs_vfsops.c +++ b/sys/emulation/linux/i386/linprocfs/linprocfs_vfsops.c @@ -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); diff --git a/sys/kern/vfs_cache.c b/sys/kern/vfs_cache.c index a64a912cc8..b65ba20782 100644 --- a/sys/kern/vfs_cache.c +++ b/sys/kern/vfs_cache.c @@ -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 @@ -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,14 +852,40 @@ 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 @@ -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 diff --git a/sys/kern/vfs_default.c b/sys/kern/vfs_default.c index 83b46e7e2a..5cd84f83ca 100644 --- a/sys/kern/vfs_default.c +++ b/sys/kern/vfs_default.c @@ -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 @@ -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); diff --git a/sys/kern/vfs_init.c b/sys/kern/vfs_init.c index cae297b887..903212dd63 100644 --- a/sys/kern/vfs_init.c +++ b/sys/kern/vfs_init.c @@ -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; diff --git a/sys/kern/vfs_jops.c b/sys/kern/vfs_jops.c index 06618d95fd..9efc3466a9 100644 --- a/sys/kern/vfs_jops.c +++ b/sys/kern/vfs_jops.c @@ -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); } diff --git a/sys/kern/vfs_journal.c b/sys/kern/vfs_journal.c index 8e52913287..5d63c8402e 100644 --- a/sys/kern/vfs_journal.c +++ b/sys/kern/vfs_journal.c @@ -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); } diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c index 8cba78b644..6624e25e1f 100644 --- a/sys/kern/vfs_subr.c +++ b/sys/kern/vfs_subr.c @@ -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"); /* diff --git a/sys/kern/vfs_sync.c b/sys/kern/vfs_sync.c index 244efb8dd3..05bb7cab76 100644 --- a/sys/kern/vfs_sync.c +++ b/sys/kern/vfs_sync.c @@ -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); diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c index e5950501ee..a3d367f995 100644 --- a/sys/kern/vfs_syscalls.c +++ b/sys/kern/vfs_syscalls.c @@ -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 @@ -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); } diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index 7bc6de2b60..d0807e0672 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -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 @@ -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); } diff --git a/sys/kern/vfs_vopops.c b/sys/kern/vfs_vopops.c index 8f26be196b..df81850c65 100644 --- a/sys/kern/vfs_vopops.c +++ b/sys/kern/vfs_vopops.c @@ -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 @@ -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); diff --git a/sys/sys/namecache.h b/sys/sys/namecache.h index f57a295d67..14343c2a7b 100644 --- a/sys/sys/namecache.h +++ b/sys/sys/namecache.h @@ -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 diff --git a/sys/sys/vfscache.h b/sys/sys/vfscache.h index b1e3a53bf2..a46ebc42ee 100644 --- a/sys/sys/vfscache.h +++ b/sys/sys/vfscache.h @@ -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 */ }; /* diff --git a/sys/sys/vfsops.h b/sys/sys/vfsops.h index 27d4b76233..f4dd817523 100644 --- a/sys/sys/vfsops.h +++ b/sys/sys/vfsops.h @@ -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) \ diff --git a/sys/sys/vnode.h b/sys/sys/vnode.h index 2bcc436707..c839615644 100644 --- a/sys/sys/vnode.h +++ b/sys/sys/vnode.h @@ -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, diff --git a/sys/vfs/deadfs/dead_vnops.c b/sys/vfs/deadfs/dead_vnops.c index 4069ec1903..00e9fa6ea4 100644 --- a/sys/vfs/deadfs/dead_vnops.c +++ b/sys/vfs/deadfs/dead_vnops.c @@ -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 @@ -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); diff --git a/sys/vfs/fdesc/fdesc_vfsops.c b/sys/vfs/fdesc/fdesc_vfsops.c index 2fd562f35e..6f9ae60d75 100644 --- a/sys/vfs/fdesc/fdesc_vfsops.c +++ b/sys/vfs/fdesc/fdesc_vfsops.c @@ -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) diff --git a/sys/vfs/fifofs/fifo_vnops.c b/sys/vfs/fifofs/fifo_vnops.c index 2bd7103e2e..e1f4dd4b1f 100644 --- a/sys/vfs/fifofs/fifo_vnops.c +++ b/sys/vfs/fifofs/fifo_vnops.c @@ -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 @@ -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); diff --git a/sys/vfs/gnu/ext2fs/ext2_vfsops.c b/sys/vfs/gnu/ext2fs/ext2_vfsops.c index 32c1d10998..817ffa605a 100644 --- a/sys/vfs/gnu/ext2fs/ext2_vfsops.c +++ b/sys/vfs/gnu/ext2fs/ext2_vfsops.c @@ -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); diff --git a/sys/vfs/hpfs/hpfs_vfsops.c b/sys/vfs/hpfs/hpfs_vfsops.c index 42e777dd67..07a06d4496 100644 --- a/sys/vfs/hpfs/hpfs_vfsops.c +++ b/sys/vfs/hpfs/hpfs_vfsops.c @@ -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) { diff --git a/sys/vfs/isofs/cd9660/cd9660_vfsops.c b/sys/vfs/isofs/cd9660/cd9660_vfsops.c index 7ef1487aa3..0ea374d1f0 100644 --- a/sys/vfs/isofs/cd9660/cd9660_vfsops.c +++ b/sys/vfs/isofs/cd9660/cd9660_vfsops.c @@ -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 @@ -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: diff --git a/sys/vfs/mfs/mfs_vnops.c b/sys/vfs/mfs/mfs_vnops.c index 1b32fd7256..9d32981ff4 100644 --- a/sys/vfs/mfs/mfs_vnops.c +++ b/sys/vfs/mfs/mfs_vnops.c @@ -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 @@ -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); diff --git a/sys/vfs/msdosfs/msdosfs_vfsops.c b/sys/vfs/msdosfs/msdosfs_vfsops.c index 21acb3a558..d58e683e33 100644 --- a/sys/vfs/msdosfs/msdosfs_vfsops.c +++ b/sys/vfs/msdosfs/msdosfs_vfsops.c @@ -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; diff --git a/sys/vfs/nfs/nfs_nqlease.c b/sys/vfs/nfs/nfs_nqlease.c index 9689e2fd4a..d283526c92 100644 --- a/sys/vfs/nfs/nfs_nqlease.c +++ b/sys/vfs/nfs/nfs_nqlease.c @@ -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; diff --git a/sys/vfs/nfs/nfs_socket.c b/sys/vfs/nfs/nfs_socket.c index 96094e6e52..fc15cd3da8 100644 --- a/sys/vfs/nfs/nfs_socket.c +++ b/sys/vfs/nfs/nfs_socket.c @@ -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; diff --git a/sys/vfs/nfs/nfs_vfsops.c b/sys/vfs/nfs/nfs_vfsops.c index cbe6badf1a..943a4404c6 100644 --- a/sys/vfs/nfs/nfs_vfsops.c +++ b/sys/vfs/nfs/nfs_vfsops.c @@ -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 diff --git a/sys/vfs/ntfs/ntfs_vfsops.c b/sys/vfs/ntfs/ntfs_vfsops.c index f8d42ee211..0849d17f9a 100644 --- a/sys/vfs/ntfs/ntfs_vfsops.c +++ b/sys/vfs/ntfs/ntfs_vfsops.c @@ -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 diff --git a/sys/vfs/nullfs/null_vfsops.c b/sys/vfs/nullfs/null_vfsops.c index b53e62d8c6..6e76155689 100644 --- a/sys/vfs/nullfs/null_vfsops.c +++ b/sys/vfs/nullfs/null_vfsops.c @@ -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 diff --git a/sys/vfs/nwfs/nwfs_vfsops.c b/sys/vfs/nwfs/nwfs_vfsops.c index 684f23e17f..dbffce5dcd 100644 --- a/sys/vfs/nwfs/nwfs_vfsops.c +++ b/sys/vfs/nwfs/nwfs_vfsops.c @@ -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); diff --git a/sys/vfs/portal/portal_vfsops.c b/sys/vfs/portal/portal_vfsops.c index b96ef0fbd7..54a0412847 100644 --- a/sys/vfs/portal/portal_vfsops.c +++ b/sys/vfs/portal/portal_vfsops.c @@ -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) { diff --git a/sys/vfs/procfs/procfs_vfsops.c b/sys/vfs/procfs/procfs_vfsops.c index 8e07358a06..7f7a4bad4a 100644 --- a/sys/vfs/procfs/procfs_vfsops.c +++ b/sys/vfs/procfs/procfs_vfsops.c @@ -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); } diff --git a/sys/vfs/smbfs/smbfs_vfsops.c b/sys/vfs/smbfs/smbfs_vfsops.c index 26446398dd..c62e7a413e 100644 --- a/sys/vfs/smbfs/smbfs_vfsops.c +++ b/sys/vfs/smbfs/smbfs_vfsops.c @@ -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) diff --git a/sys/vfs/specfs/spec_vnops.c b/sys/vfs/specfs/spec_vnops.c index 76aa5d1da7..dbdd1312fb 100644 --- a/sys/vfs/specfs/spec_vnops.c +++ b/sys/vfs/specfs/spec_vnops.c @@ -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 @@ -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; diff --git a/sys/vfs/udf/udf_vfsops.c b/sys/vfs/udf/udf_vfsops.c index ba54ed4115..044d0b6ada 100644 --- a/sys/vfs/udf/udf_vfsops.c +++ b/sys/vfs/udf/udf_vfsops.c @@ -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. diff --git a/sys/vfs/ufs/dinode.h b/sys/vfs/ufs/dinode.h index c8b19303e1..1b40092d4c 100644 --- a/sys/vfs/ufs/dinode.h +++ b/sys/vfs/ufs/dinode.h @@ -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. */ diff --git a/sys/vfs/ufs/ffs_vfsops.c b/sys/vfs/ufs/ffs_vfsops.c index b273bbf286..7d3057ce3d 100644 --- a/sys/vfs/ufs/ffs_vfsops.c +++ b/sys/vfs/ufs/ffs_vfsops.c @@ -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: diff --git a/sys/vfs/ufs/inode.h b/sys/vfs/ufs/inode.h index d6f7c74381..4f80890876 100644 --- a/sys/vfs/ufs/inode.h +++ b/sys/vfs/ufs/inode.h @@ -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 diff --git a/sys/vfs/ufs/ufs_inode.c b/sys/vfs/ufs/ufs_inode.c index bef910e45e..277183240c 100644 --- a/sys/vfs/ufs/ufs_inode.c +++ b/sys/vfs/ufs/ufs_inode.c @@ -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))) { diff --git a/sys/vfs/ufs/ufs_vnops.c b/sys/vfs/ufs/ufs_vnops.c index e5508b6b50..edcbd76e20 100644 --- a/sys/vfs/ufs/ufs_vnops.c +++ b/sys/vfs/ufs/ufs_vnops.c @@ -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); diff --git a/sys/vfs/umapfs/umap_vfsops.c b/sys/vfs/umapfs/umap_vfsops.c index f10e6621bf..f741e6e187 100644 --- a/sys/vfs/umapfs/umap_vfsops.c +++ b/sys/vfs/umapfs/umap_vfsops.c @@ -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 diff --git a/sys/vfs/union/union_vfsops.c b/sys/vfs/union/union_vfsops.c index 76ff818c71..fa448bc61f 100644 --- a/sys/vfs/union/union_vfsops.c +++ b/sys/vfs/union/union_vfsops.c @@ -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); diff --git a/sys/vm/vm_swap.c b/sys/vm/vm_swap.c index 0411acb9dc..57a449b7a8 100644 --- a/sys/vm/vm_swap.c +++ b/sys/vm/vm_swap.c @@ -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); -- 2.41.0