fix from Jeff Forys for tracking changing NFS file sizes
authorKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Mon, 2 Nov 1992 15:16:45 +0000 (07:16 -0800)
committerKirk McKusick <mckusick@ucbvax.Berkeley.EDU>
Mon, 2 Nov 1992 15:16:45 +0000 (07:16 -0800)
SCCS-vsn: sys/nfs/nfsnode.h 7.31
SCCS-vsn: sys/nfs/nfs_subs.c 7.67
SCCS-vsn: sys/nfs/nfs_vnops.c 7.99
SCCS-vsn: sys/nfs/nfs_bio.c 7.34
SCCS-vsn: sys/nfs/nfs_nqlease.c 7.15

usr/src/sys/nfs/nfs_bio.c
usr/src/sys/nfs/nfs_nqlease.c
usr/src/sys/nfs/nfs_subs.c
usr/src/sys/nfs/nfs_vnops.c
usr/src/sys/nfs/nfsnode.h

index ad5b1f7..349ddf0 100644 (file)
@@ -7,7 +7,7 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)nfs_bio.c   7.33 (Berkeley) %G%
+ *     @(#)nfs_bio.c   7.34 (Berkeley) %G%
  */
 
 #include <sys/param.h>
  */
 
 #include <sys/param.h>
@@ -86,10 +86,9 @@ nfs_bioread(vp, uio, ioflag, cred)
         */
        if ((nmp->nm_flag & NFSMNT_NQNFS) == 0 && vp->v_type != VLNK) {
                if (np->n_flag & NMODIFIED) {
         */
        if ((nmp->nm_flag & NFSMNT_NQNFS) == 0 && vp->v_type != VLNK) {
                if (np->n_flag & NMODIFIED) {
-                       np->n_flag &= ~NMODIFIED;
                        if ((nmp->nm_flag & NFSMNT_MYWRITE) == 0 ||
                             vp->v_type != VREG)
                        if ((nmp->nm_flag & NFSMNT_MYWRITE) == 0 ||
                             vp->v_type != VREG)
-                               vinvalbuf(vp, TRUE, cred, uio->uio_procp);
+                               NFS_VINVBUF(np, vp, TRUE, cred, uio->uio_procp);
                        np->n_attrstamp = 0;
                        np->n_direofoffset = 0;
                        if (error = VOP_GETATTR(vp, &vattr, cred, uio->uio_procp))
                        np->n_attrstamp = 0;
                        np->n_direofoffset = 0;
                        if (error = VOP_GETATTR(vp, &vattr, cred, uio->uio_procp))
@@ -100,7 +99,7 @@ nfs_bioread(vp, uio, ioflag, cred)
                                return (error);
                        if (np->n_mtime != vattr.va_mtime.ts_sec) {
                                np->n_direofoffset = 0;
                                return (error);
                        if (np->n_mtime != vattr.va_mtime.ts_sec) {
                                np->n_direofoffset = 0;
-                               vinvalbuf(vp, TRUE, cred, uio->uio_procp);
+                               NFS_VINVBUF(np, vp, TRUE, cred, uio->uio_procp);
                                np->n_mtime = vattr.va_mtime.ts_sec;
                        }
                }
                                np->n_mtime = vattr.va_mtime.ts_sec;
                        }
                }
@@ -123,8 +122,7 @@ nfs_bioread(vp, uio, ioflag, cred)
                                np->n_direofoffset = 0;
                                cache_purge(vp);
                        }
                                np->n_direofoffset = 0;
                                cache_purge(vp);
                        }
-                       np->n_flag &= ~NMODIFIED;
-                       vinvalbuf(vp, TRUE, cred, uio->uio_procp);
+                       NFS_VINVBUF(np, vp, TRUE, cred, uio->uio_procp);
                        np->n_brev = np->n_lrev;
                }
            }
                        np->n_brev = np->n_lrev;
                }
            }
@@ -230,8 +228,7 @@ again:
                                        cache_purge(vp);
                                }
                                brelse(bp);
                                        cache_purge(vp);
                                }
                                brelse(bp);
-                               np->n_flag &= ~NMODIFIED;
-                               vinvalbuf(vp, TRUE, cred, uio->uio_procp);
+                               NFS_VINVBUF(np, vp, TRUE, cred, uio->uio_procp);
                                np->n_brev = np->n_lrev;
                                continue;
                        }
                                np->n_brev = np->n_lrev;
                                continue;
                        }
@@ -239,8 +236,7 @@ again:
                    ((np->n_flag & NMODIFIED) && vp->v_type == VDIR)) {
                        np->n_direofoffset = 0;
                        brelse(bp);
                    ((np->n_flag & NMODIFIED) && vp->v_type == VDIR)) {
                        np->n_direofoffset = 0;
                        brelse(bp);
-                       np->n_flag &= ~NMODIFIED;
-                       vinvalbuf(vp, TRUE, cred, uio->uio_procp);
+                       NFS_VINVBUF(np, vp, TRUE, cred, uio->uio_procp);
                        np->n_brev = np->n_lrev;
                        continue;
                }
                        np->n_brev = np->n_lrev;
                        continue;
                }
@@ -302,9 +298,8 @@ nfs_write(ap)
        }
        if (ioflag & (IO_APPEND | IO_SYNC)) {
                if (np->n_flag & NMODIFIED) {
        }
        if (ioflag & (IO_APPEND | IO_SYNC)) {
                if (np->n_flag & NMODIFIED) {
-                       np->n_flag &= ~NMODIFIED;
                        np->n_attrstamp = 0;
                        np->n_attrstamp = 0;
-                       vinvalbuf(vp, TRUE, cred, p);
+                       NFS_VINVBUF(np, vp, TRUE, cred, p);
                }
                if (ioflag & IO_APPEND) {
                        np->n_attrstamp = 0;
                }
                if (ioflag & IO_APPEND) {
                        np->n_attrstamp = 0;
@@ -349,7 +344,7 @@ nfs_write(ap)
                                return (error);
                        if (np->n_lrev != np->n_brev ||
                            (np->n_flag & NQNFSNONCACHE)) {
                                return (error);
                        if (np->n_lrev != np->n_brev ||
                            (np->n_flag & NQNFSNONCACHE)) {
-                               vinvalbuf(vp, TRUE, cred, p);
+                               NFS_VINVBUF(np, vp, TRUE, cred, p);
                                np->n_brev = np->n_lrev;
                        }
                }
                                np->n_brev = np->n_lrev;
                        }
                }
@@ -400,7 +395,7 @@ again:
                        if (np->n_lrev != np->n_brev ||
                            (np->n_flag & NQNFSNONCACHE)) {
                                brelse(bp);
                        if (np->n_lrev != np->n_brev ||
                            (np->n_flag & NQNFSNONCACHE)) {
                                brelse(bp);
-                               vinvalbuf(vp, TRUE, cred, p);
+                               NFS_VINVBUF(np, vp, TRUE, cred, p);
                                np->n_brev = np->n_lrev;
                                goto again;
                        }
                                np->n_brev = np->n_lrev;
                                goto again;
                        }
index 786b807..a01f47d 100644 (file)
@@ -7,7 +7,7 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)nfs_nqlease.c       7.14 (Berkeley) %G%
+ *     @(#)nfs_nqlease.c       7.15 (Berkeley) %G%
  */
 
 /*
  */
 
 /*
@@ -300,7 +300,7 @@ lease_check(vp, p, cred, flag)
        struct ucred *cred;
        int flag;
 {
        struct ucred *cred;
        int flag;
 {
-       int duration, cache;
+       int duration = 0, cache;
        struct nfsd nfsd;
        u_quad_t frev;
 
        struct nfsd nfsd;
        u_quad_t frev;
 
@@ -1005,15 +1005,16 @@ if (vp->v_mount->mnt_stat.f_fsid.val[1] != MOUNT_NFS) panic("trash3");
                                np->n_tnext = (struct nfsnode *)0;
                                if ((np->n_flag & (NMODIFIED | NQNFSEVICTED))
                                    && vp->v_type == VREG) {
                                np->n_tnext = (struct nfsnode *)0;
                                if ((np->n_flag & (NMODIFIED | NQNFSEVICTED))
                                    && vp->v_type == VREG) {
-                                       np->n_flag &= ~NMODIFIED;
                                        if (np->n_flag & NQNFSEVICTED) {
                                        if (np->n_flag & NQNFSEVICTED) {
-                                               (void) vinvalbuf(vp, TRUE,
-                                                   cred, p);
+                                               NFS_VINVBUF(np, vp,
+                                                           TRUE, cred, p);
                                                np->n_flag &= ~NQNFSEVICTED;
                                                (void) nqnfs_vacated(vp, cred);
                                                np->n_flag &= ~NQNFSEVICTED;
                                                (void) nqnfs_vacated(vp, cred);
-                                       } else
+                                       } else {
+                                               np->n_flag &= ~NMODIFIED;
                                                (void) VOP_FSYNC(vp, cred,
                                                    MNT_WAIT, p);
                                                (void) VOP_FSYNC(vp, cred,
                                                    MNT_WAIT, p);
+                                       }
                                }
                              }
                              vrele(vp);
                                }
                              }
                              vrele(vp);
index 3fcdf0c..3c8284c 100644 (file)
@@ -7,7 +7,7 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)nfs_subs.c  7.66 (Berkeley) %G%
+ *     @(#)nfs_subs.c  7.67 (Berkeley) %G%
  */
 
 /*
  */
 
 /*
@@ -757,7 +757,7 @@ nfs_loadattrcache(vpp, mdp, dposp, vaper)
        *mdp = md;
        if (vaper != NULL) {
                bcopy((caddr_t)vap, (caddr_t)vaper, sizeof(*vap));
        *mdp = md;
        if (vaper != NULL) {
                bcopy((caddr_t)vap, (caddr_t)vaper, sizeof(*vap));
-               if (np->n_size > vap->va_size)
+               if ((np->n_flag & NMODIFIED) && np->n_size > vap->va_size)
                        vaper->va_size = np->n_size;
                if (np->n_flag & NCHG) {
                        if (np->n_flag & NACC) {
                        vaper->va_size = np->n_size;
                if (np->n_flag & NCHG) {
                        if (np->n_flag & NACC) {
@@ -798,7 +798,7 @@ nfs_getattrcache(vp, vap)
        }
        nfsstats.attrcache_hits++;
        bcopy((caddr_t)&np->n_vattr,(caddr_t)vap,sizeof(struct vattr));
        }
        nfsstats.attrcache_hits++;
        bcopy((caddr_t)&np->n_vattr,(caddr_t)vap,sizeof(struct vattr));
-       if (vap->va_size > np->n_size) {
+       if ((np->n_flag & NMODIFIED) == 0) {
                np->n_size = vap->va_size;
                vnode_pager_setsize(vp, (u_long)np->n_size);
        } else if (np->n_size > vap->va_size)
                np->n_size = vap->va_size;
                vnode_pager_setsize(vp, (u_long)np->n_size);
        } else if (np->n_size > vap->va_size)
index b8631e2..978727d 100644 (file)
@@ -7,7 +7,7 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)nfs_vnops.c 7.98 (Berkeley) %G%
+ *     @(#)nfs_vnops.c 7.99 (Berkeley) %G%
  */
 
 /*
  */
 
 /*
@@ -315,16 +315,14 @@ nfs_open(ap)
                    if (error)
                        return (error);
                    if (np->n_lrev != np->n_brev) {
                    if (error)
                        return (error);
                    if (np->n_lrev != np->n_brev) {
-                       np->n_flag &= ~NMODIFIED;
-                       vinvalbuf(vp, TRUE, ap->a_cred, ap->a_p);
+                       NFS_VINVBUF(np, vp, TRUE, ap->a_cred, ap->a_p);
                        (void) vnode_pager_uncache(vp);
                        np->n_brev = np->n_lrev;
                    }
                }
            } else {
                if (np->n_flag & NMODIFIED) {
                        (void) vnode_pager_uncache(vp);
                        np->n_brev = np->n_lrev;
                    }
                }
            } else {
                if (np->n_flag & NMODIFIED) {
-                       np->n_flag &= ~NMODIFIED;
-                       vinvalbuf(vp, TRUE, ap->a_cred, ap->a_p);
+                       NFS_VINVBUF(np, vp, TRUE, ap->a_cred, ap->a_p);
                        (void) vnode_pager_uncache(vp);
                        np->n_attrstamp = 0;
                        np->n_direofoffset = 0;
                        (void) vnode_pager_uncache(vp);
                        np->n_attrstamp = 0;
                        np->n_direofoffset = 0;
@@ -336,7 +334,7 @@ nfs_open(ap)
                                return (error);
                        if (np->n_mtime != vattr.va_mtime.ts_sec) {
                                np->n_direofoffset = 0;
                                return (error);
                        if (np->n_mtime != vattr.va_mtime.ts_sec) {
                                np->n_direofoffset = 0;
-                               vinvalbuf(vp, TRUE, ap->a_cred, ap->a_p);
+                               NFS_VINVBUF(np, vp, TRUE, ap->a_cred, ap->a_p);
                                (void) vnode_pager_uncache(vp);
                                np->n_mtime = vattr.va_mtime.ts_sec;
                        }
                                (void) vnode_pager_uncache(vp);
                                np->n_mtime = vattr.va_mtime.ts_sec;
                        }
@@ -369,8 +367,7 @@ nfs_close(ap)
        if (vp->v_type == VREG) {
            if ((VFSTONFS(vp->v_mount)->nm_flag & NFSMNT_NQNFS) == 0 &&
                (np->n_flag & NMODIFIED)) {
        if (vp->v_type == VREG) {
            if ((VFSTONFS(vp->v_mount)->nm_flag & NFSMNT_NQNFS) == 0 &&
                (np->n_flag & NMODIFIED)) {
-               error = vinvalbuf(vp, TRUE, ap->a_cred, ap->a_p);
-               np->n_flag &= ~NMODIFIED;
+               NFS_VINVBUFE(np, vp, TRUE, ap->a_cred, ap->a_p, error);
                np->n_attrstamp = 0;
            }
            if (np->n_flag & NWRITEERR) {
                np->n_attrstamp = 0;
            }
            if (np->n_flag & NWRITEERR) {
@@ -476,13 +473,8 @@ nfs_setattr(ap)
        if (vap->va_size != VNOVAL || vap->va_mtime.ts_sec != VNOVAL ||
            vap->va_atime.ts_sec != VNOVAL) {
                if (np->n_flag & NMODIFIED) {
        if (vap->va_size != VNOVAL || vap->va_mtime.ts_sec != VNOVAL ||
            vap->va_atime.ts_sec != VNOVAL) {
                if (np->n_flag & NMODIFIED) {
-                       if (vap->va_size == 0)
-                               error =
-                                   vinvalbuf(vp, FALSE, ap->a_cred, ap->a_p);
-                       else
-                               error =
-                                   vinvalbuf(vp, TRUE, ap->a_cred, ap->a_p);
-                       np->n_flag &= ~NMODIFIED;
+                       NFS_VINVBUFE(np, vp, vap->va_size? TRUE: FALSE,
+                                    ap->a_cred, ap->a_p, error);
                }
                if (vap->va_size != VNOVAL)
                        np->n_size = np->n_vattr.va_size = vap->va_size;
                }
                if (vap->va_size != VNOVAL)
                        np->n_size = np->n_vattr.va_size = vap->va_size;
@@ -571,9 +563,9 @@ nfs_lookup(ap)
                                            (np->n_flag & NMODIFIED)) {
                                                np->n_direofoffset = 0;
                                                cache_purge(dvp);
                                            (np->n_flag & NMODIFIED)) {
                                                np->n_direofoffset = 0;
                                                cache_purge(dvp);
-                                               error = vinvalbuf(dvp, FALSE,
-                                                   cnp->cn_cred, cnp->cn_proc);
-                                               np->n_flag &= ~NMODIFIED;
+                                               NFS_VINVBUFE(np, dvp, FALSE,
+                                                   cnp->cn_cred, cnp->cn_proc,
+                                                   error);
                                                np->n_brev = np->n_lrev;
                                        } else {
                                                nfsstats.lookupcache_hits++;
                                                np->n_brev = np->n_lrev;
                                        } else {
                                                nfsstats.lookupcache_hits++;
@@ -1057,7 +1049,7 @@ nfs_remove(ap)
                 * Throw away biocache buffers. Mainly to avoid
                 * unnecessary delayed writes.
                 */
                 * Throw away biocache buffers. Mainly to avoid
                 * unnecessary delayed writes.
                 */
-               error = vinvalbuf(vp, FALSE, cnp->cn_cred, cnp->cn_proc);
+               NFS_VINVBUFE(np, vp, FALSE, cnp->cn_cred, cnp->cn_proc, error);
                /* Do the rpc */
                nfsstats.rpccnt[NFSPROC_REMOVE]++;
                nfsm_reqhead(dvp, NFSPROC_REMOVE,
                /* Do the rpc */
                nfsstats.rpccnt[NFSPROC_REMOVE]++;
                nfsm_reqhead(dvp, NFSPROC_REMOVE,
index 553b3e1..a9e41bc 100644 (file)
@@ -7,7 +7,7 @@
  *
  * %sccs.include.redist.c%
  *
  *
  * %sccs.include.redist.c%
  *
- *     @(#)nfsnode.h   7.30 (Berkeley) %G%
+ *     @(#)nfsnode.h   7.31 (Berkeley) %G%
  */
 
 /*
  */
 
 /*
@@ -58,6 +58,7 @@ struct nfsnode {
 /*
  * Flags for n_flag
  */
 /*
  * Flags for n_flag
  */
+#define        NFLUSHINPROG    0x0002  /* Avoid multiple calls to vinvalbuf() */
 #define        NMODIFIED       0x0004  /* Might have a modified buffer in bio */
 #define        NWRITEERR       0x0008  /* Flag write errors so close will know */
 #define        NQNFSNONCACHE   0x0020  /* Non-cachable lease */
 #define        NMODIFIED       0x0004  /* Might have a modified buffer in bio */
 #define        NWRITEERR       0x0008  /* Flag write errors so close will know */
 #define        NQNFSNONCACHE   0x0020  /* Non-cachable lease */
@@ -67,6 +68,23 @@ struct nfsnode {
 #define        NUPD            0x0200  /* Special file updated */
 #define        NCHG            0x0400  /* Special file times changed */
 
 #define        NUPD            0x0200  /* Special file updated */
 #define        NCHG            0x0400  /* Special file times changed */
 
+#define        NFS_VINVBUF(np, vp, flags, cred, p) {           \
+       if ((np->n_flag & NFLUSHINPROG) == 0) {         \
+               np->n_flag |= NFLUSHINPROG;             \
+               (void) vinvalbuf(vp, flags, cred, p);   \
+               np->n_flag &= ~(NFLUSHINPROG|NMODIFIED);\
+       }                                               \
+}
+
+#define        NFS_VINVBUFE(np, vp, flags, cred, p, error) {   \
+       if ((np->n_flag & NFLUSHINPROG) == 0) {         \
+               np->n_flag |= NFLUSHINPROG;             \
+               error = vinvalbuf(vp, flags, cred, p);  \
+               np->n_flag &= ~(NFLUSHINPROG|NMODIFIED);\
+       } else                                          \
+               error = 0;                              \
+}
+
 /*
  * Convert between nfsnode pointers and vnode pointers
  */
 /*
  * Convert between nfsnode pointers and vnode pointers
  */