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-head
mailing list