Author: rmacklem
Date: Mon Apr 27 16:46:16 2009
New Revision: 191564
URL: http://svn.freebsd.org/changeset/base/191564

Log:
        Change the semantics of i_modrev/va_filerev to what is required for
        the nfsv4 Change attribute. There are 2 changes:
        1 - The value now changes on metadata changes as well as data
            modifications (incremented for IN_CHANGE instead of IN_UPDATE).
        2 - It is now saved in spare space in the on-disk i-node so that it
            survives a crash.
        Since va_filerev is not passed out into user space, the only current
        use of va_filerev is in the nfs server, which uses it as the directory
        cookie verifier. Since this verifier is only passed back to the server
        by a client verbatim and then the server doesn't check it, changing the
        semantics should not break anything currently in FreeBSD.
  
  Reviewed by:  bde
  Approved by:  kib (mentor)

Modified:
  head/sys/ufs/ufs/dinode.h
  head/sys/ufs/ufs/inode.h
  head/sys/ufs/ufs/ufs_vnops.c

Modified: head/sys/ufs/ufs/dinode.h
==============================================================================
--- head/sys/ufs/ufs/dinode.h   Mon Apr 27 15:58:38 2009        (r191563)
+++ head/sys/ufs/ufs/dinode.h   Mon Apr 27 16:46:16 2009        (r191564)
@@ -145,7 +145,8 @@ struct ufs2_dinode {
        ufs2_daddr_t    di_extb[NXADDR];/*  96: External attributes block. */
        ufs2_daddr_t    di_db[NDADDR];  /* 112: Direct disk blocks. */
        ufs2_daddr_t    di_ib[NIADDR];  /* 208: Indirect disk blocks. */
-       int64_t         di_spare[3];    /* 232: Reserved; currently unused */
+       u_int64_t       di_modrev;      /* 232: i_modrev for NFSv4 */
+       int64_t         di_spare[2];    /* 240: Reserved; currently unused */
 };
 
 /*
@@ -183,7 +184,7 @@ struct ufs1_dinode {
        int32_t         di_gen;         /* 108: Generation number. */
        u_int32_t       di_uid;         /* 112: File owner. */
        u_int32_t       di_gid;         /* 116: File group. */
-       int32_t         di_spare[2];    /* 120: Reserved; currently unused */
+       u_int64_t       di_modrev;      /* 120: i_modrev for NFSv4 */
 };
 #define        di_ogid         di_u.oldids[1]
 #define        di_ouid         di_u.oldids[0]

Modified: head/sys/ufs/ufs/inode.h
==============================================================================
--- head/sys/ufs/ufs/inode.h    Mon Apr 27 15:58:38 2009        (r191563)
+++ head/sys/ufs/ufs/inode.h    Mon Apr 27 16:46:16 2009        (r191564)
@@ -74,7 +74,6 @@ struct inode {
 
        struct   fs *i_fs;      /* Associated filesystem superblock. */
        struct   dquot *i_dquot[MAXQUOTAS]; /* Dquot structures. */
-       u_quad_t i_modrev;      /* Revision level for NFS lease. */
        /*
         * Side effects; used during directory lookup.
         */

Modified: head/sys/ufs/ufs/ufs_vnops.c
==============================================================================
--- head/sys/ufs/ufs/ufs_vnops.c        Mon Apr 27 15:58:38 2009        
(r191563)
+++ head/sys/ufs/ufs/ufs_vnops.c        Mon Apr 27 16:46:16 2009        
(r191564)
@@ -157,11 +157,11 @@ ufs_itimes_locked(struct vnode *vp)
        if (ip->i_flag & IN_UPDATE) {
                DIP_SET(ip, i_mtime, ts.tv_sec);
                DIP_SET(ip, i_mtimensec, ts.tv_nsec);
-               ip->i_modrev++;
        }
        if (ip->i_flag & IN_CHANGE) {
                DIP_SET(ip, i_ctime, ts.tv_sec);
                DIP_SET(ip, i_ctimensec, ts.tv_nsec);
+               DIP_SET(ip, i_modrev, DIP(ip, i_modrev) + 1);
        }
 
  out:
@@ -446,6 +446,7 @@ ufs_getattr(ap)
                vap->va_ctime.tv_sec = ip->i_din1->di_ctime;
                vap->va_ctime.tv_nsec = ip->i_din1->di_ctimensec;
                vap->va_bytes = dbtob((u_quad_t)ip->i_din1->di_blocks);
+               vap->va_filerev = ip->i_din1->di_modrev;
        } else {
                vap->va_rdev = ip->i_din2->di_rdev;
                vap->va_size = ip->i_din2->di_size;
@@ -456,12 +457,12 @@ ufs_getattr(ap)
                vap->va_birthtime.tv_sec = ip->i_din2->di_birthtime;
                vap->va_birthtime.tv_nsec = ip->i_din2->di_birthnsec;
                vap->va_bytes = dbtob((u_quad_t)ip->i_din2->di_blocks);
+               vap->va_filerev = ip->i_din2->di_modrev;
        }
        vap->va_flags = ip->i_flags;
        vap->va_gen = ip->i_gen;
        vap->va_blocksize = vp->v_mount->mnt_stat.f_iosize;
        vap->va_type = IFTOVT(ip->i_mode);
-       vap->va_filerev = ip->i_modrev;
        return (0);
 }
 
@@ -2225,7 +2226,6 @@ ufs_vinit(mntp, fifoops, vpp)
        ASSERT_VOP_LOCKED(vp, "ufs_vinit");
        if (ip->i_number == ROOTINO)
                vp->v_vflag |= VV_ROOT;
-       ip->i_modrev = init_va_filerev();
        *vpp = vp;
        return (0);
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to