svn commit: r318997 - in head/sys: cddl/contrib/opensolaris/uts/common/fs/zfs fs/nfsclient kern sys

Konstantin Belousov kib at FreeBSD.org
Sat May 27 17:00:32 UTC 2017


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_ */


More information about the svn-src-all mailing list