Author: kib
Date: Sat May 27 17:00:30 2017
New Revision: 318997
URL: https://svnweb.freebsd.org/changeset/base/318997

Log:
  Use whole mnt_stat.f_fsid bits for st_dev.
  
  Since ino64 expanded dev_t to 64bit, make VOP_GETATTR(9) provide all
  bits of mnt_stat.f_fsid as va_fsid for vnodes on filesystems which use
  f_fsid.  In particular, NFSv3 and sometimes NFSv4, and ZFS use this
  method or reporting st_dev by stat(2).
  
  Provide a new helper vn_fsid() to avoid duplicating code to copy
  f_fsid to va_fsid.
  
  Note that the change is mostly cosmetic.  Its motivation is to avoid
  sign-extension of f_fsid[0] into 64bit dev_t value which happens after
  dev_t becomes 64bit..
  
  Reviewed by:  avg(zfs), rmacklem (nfs) (both for previous version)
  Sponsored by: The FreeBSD Foundation

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
  head/sys/fs/nfsclient/nfs_clport.c
  head/sys/kern/vfs_vnops.c
  head/sys/sys/vnode.h

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c    Sat May 
27 16:53:39 2017        (r318996)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c    Sat May 
27 17:00:30 2017        (r318997)
@@ -497,7 +497,7 @@ zfsctl_common_getattr(vnode_t *vp, vattr
        vap->va_blksize = 0;
        vap->va_nblocks = 0;
        vap->va_seq = 0;
-       vap->va_fsid = vp->v_mount->mnt_stat.f_fsid.val[0];
+       vn_fsid(vp, vap);
        vap->va_mode = S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP |
            S_IROTH | S_IXOTH;
        vap->va_type = VDIR;

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c     Sat May 
27 16:53:39 2017        (r318996)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c     Sat May 
27 17:00:30 2017        (r318997)
@@ -2708,7 +2708,7 @@ zfs_getattr(vnode_t *vp, vattr_t *vap, i
 #ifdef illumos
        vap->va_fsid = zp->z_zfsvfs->z_vfs->vfs_dev;
 #else
-       vap->va_fsid = vp->v_mount->mnt_stat.f_fsid.val[0];
+       vn_fsid(vp, vap);
 #endif
        vap->va_nodeid = zp->z_id;
        if ((vp->v_flag & VROOT) && zfs_show_ctldir(zp))

Modified: head/sys/fs/nfsclient/nfs_clport.c
==============================================================================
--- head/sys/fs/nfsclient/nfs_clport.c  Sat May 27 16:53:39 2017        
(r318996)
+++ head/sys/fs/nfsclient/nfs_clport.c  Sat May 27 17:00:30 2017        
(r318997)
@@ -490,14 +490,13 @@ nfscl_loadattrcache(struct vnode **vpp, 
                 * from the value used for the top level server volume
                 * in the mounted subtree.
                 */
-               if (vp->v_mount->mnt_stat.f_fsid.val[0] !=
-                   (uint32_t)np->n_vattr.na_filesid[0])
-                       vap->va_fsid = (uint32_t)np->n_vattr.na_filesid[0];
-               else
-                       vap->va_fsid = (uint32_t)hash32_buf(
+               vn_fsid(vp, vap);
+               vap->va_fsid = np->n_vattr.na_filesid[0];
+               if (vap->va_fsid == np->n_vattr.na_filesid[0])
+                       vap->va_fsid = hash32_buf(
                            np->n_vattr.na_filesid, 2 * sizeof(uint64_t), 0);
        } else
-               vap->va_fsid = vp->v_mount->mnt_stat.f_fsid.val[0];
+               vn_fsid(vp, vap);
        np->n_attrstamp = time_second;
        if (vap->va_size != np->n_size) {
                if (vap->va_type == VREG) {

Modified: head/sys/kern/vfs_vnops.c
==============================================================================
--- head/sys/kern/vfs_vnops.c   Sat May 27 16:53:39 2017        (r318996)
+++ head/sys/kern/vfs_vnops.c   Sat May 27 17:00:30 2017        (r318997)
@@ -2493,3 +2493,14 @@ vn_mmap(struct file *fp, vm_map_t map, v
 #endif
        return (error);
 }
+
+void
+vn_fsid(struct vnode *vp, struct vattr *va)
+{
+       fsid_t *f;
+
+       f = &vp->v_mount->mnt_stat.f_fsid;
+       va->va_fsid = (uint32_t)f->val[1];
+       va->va_fsid <<= sizeof(f->val[1]) * NBBY;
+       va->va_fsid += (uint32_t)f->val[0];
+}

Modified: head/sys/sys/vnode.h
==============================================================================
--- head/sys/sys/vnode.h        Sat May 27 16:53:39 2017        (r318996)
+++ head/sys/sys/vnode.h        Sat May 27 17:00:30 2017        (r318997)
@@ -885,6 +885,8 @@ int vn_chmod(struct file *fp, mode_t mod
 int vn_chown(struct file *fp, uid_t uid, gid_t gid, struct ucred *active_cred,
     struct thread *td);
 
+void vn_fsid(struct vnode *vp, struct vattr *va);
+
 #endif /* _KERNEL */
 
 #endif /* !_SYS_VNODE_H_ */
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to