X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/4d15aeb193b2c68f1d38666c317f8d3734f5f083..5ba3f43ea354af8ad55bea84372a2bc834d8757c:/bsd/nfs/nfs_vnops.c diff --git a/bsd/nfs/nfs_vnops.c b/bsd/nfs/nfs_vnops.c index 38653ed5a..4c492ac65 100644 --- a/bsd/nfs/nfs_vnops.c +++ b/bsd/nfs/nfs_vnops.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2015 Apple Inc. All rights reserved. + * Copyright (c) 2000-2017 Apple Inc. All rights reserved. * * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ * @@ -1731,6 +1731,7 @@ nfs3_vnop_getattr( int error; struct nfs_vattr nva; struct vnode_attr *vap = ap->a_vap; + struct nfsmount *nmp; dev_t rdev; /* @@ -1751,6 +1752,8 @@ nfs3_vnop_getattr( return (error); /* copy nva to *a_vap */ + nmp = VTONMP(ap->a_vp); + vap->va_flags |= nmp ? (nmp->nm_vers > 2 ? VA_64BITOBJIDS : 0) : 0; VATTR_RETURN(vap, va_type, nva.nva_type); VATTR_RETURN(vap, va_mode, nva.nva_mode); rdev = makedev(nva.nva_rawdev.specdata1, nva.nva_rawdev.specdata2); @@ -6696,7 +6699,7 @@ nfsspec_vnop_read( } */ *ap) { nfsnode_t np = VTONFS(ap->a_vp); - struct timeval now; + struct timespec now; int error; /* @@ -6705,9 +6708,9 @@ nfsspec_vnop_read( if ((error = nfs_node_lock(np))) return (error); np->n_flag |= NACC; - microtime(&now); + nanotime(&now); np->n_atim.tv_sec = now.tv_sec; - np->n_atim.tv_nsec = now.tv_usec * 1000; + np->n_atim.tv_nsec = now.tv_nsec; nfs_node_unlock(np); return (VOCALL(spec_vnodeop_p, VOFFSET(vnop_read), ap)); } @@ -6726,7 +6729,7 @@ nfsspec_vnop_write( } */ *ap) { nfsnode_t np = VTONFS(ap->a_vp); - struct timeval now; + struct timespec now; int error; /* @@ -6735,9 +6738,9 @@ nfsspec_vnop_write( if ((error = nfs_node_lock(np))) return (error); np->n_flag |= NUPD; - microtime(&now); + nanotime(&now); np->n_mtim.tv_sec = now.tv_sec; - np->n_mtim.tv_nsec = now.tv_usec * 1000; + np->n_mtim.tv_nsec = now.tv_nsec; nfs_node_unlock(np); return (VOCALL(spec_vnodeop_p, VOFFSET(vnop_write), ap)); } @@ -6804,7 +6807,7 @@ nfsfifo_vnop_read( } */ *ap) { nfsnode_t np = VTONFS(ap->a_vp); - struct timeval now; + struct timespec now; int error; /* @@ -6813,9 +6816,9 @@ nfsfifo_vnop_read( if ((error = nfs_node_lock(np))) return (error); np->n_flag |= NACC; - microtime(&now); + nanotime(&now); np->n_atim.tv_sec = now.tv_sec; - np->n_atim.tv_nsec = now.tv_usec * 1000; + np->n_atim.tv_nsec = now.tv_nsec; nfs_node_unlock(np); return (VOCALL(fifo_vnodeop_p, VOFFSET(vnop_read), ap)); } @@ -6834,7 +6837,7 @@ nfsfifo_vnop_write( } */ *ap) { nfsnode_t np = VTONFS(ap->a_vp); - struct timeval now; + struct timespec now; int error; /* @@ -6843,9 +6846,9 @@ nfsfifo_vnop_write( if ((error = nfs_node_lock(np))) return (error); np->n_flag |= NUPD; - microtime(&now); + nanotime(&now); np->n_mtim.tv_sec = now.tv_sec; - np->n_mtim.tv_nsec = now.tv_usec * 1000; + np->n_mtim.tv_nsec = now.tv_nsec; nfs_node_unlock(np); return (VOCALL(fifo_vnodeop_p, VOFFSET(vnop_write), ap)); } @@ -6867,21 +6870,21 @@ nfsfifo_vnop_close( vnode_t vp = ap->a_vp; nfsnode_t np = VTONFS(vp); struct vnode_attr vattr; - struct timeval now; + struct timespec now; mount_t mp; int error; if ((error = nfs_node_lock(np))) return (error); if (np->n_flag & (NACC | NUPD)) { - microtime(&now); + nanotime(&now); if (np->n_flag & NACC) { np->n_atim.tv_sec = now.tv_sec; - np->n_atim.tv_nsec = now.tv_usec * 1000; + np->n_atim.tv_nsec = now.tv_nsec; } if (np->n_flag & NUPD) { np->n_mtim.tv_sec = now.tv_sec; - np->n_mtim.tv_nsec = now.tv_usec * 1000; + np->n_mtim.tv_nsec = now.tv_nsec; } np->n_flag |= NCHG; if (!vnode_isinuse(vp, 1) && (mp = vnode_mount(vp)) && !vfs_isrdonly(mp)) { @@ -6935,14 +6938,18 @@ nfs_vnop_ioctl( return (EROFS); error = nfs_flush(VTONFS(vp), MNT_WAIT, vfs_context_thread(ctx), 0); break; - case NFS_FSCTL_DESTROY_CRED: + case NFS_IOC_DESTROY_CRED: if (!auth_is_kerberized(mp->nm_auth)) return (ENOTSUP); error = nfs_gss_clnt_ctx_remove(mp, vfs_context_ucred(ctx)); break; - case NFS_FSCTL_SET_CRED: + case NFS_IOC_SET_CRED: + case NFS_IOC_SET_CRED64: if (!auth_is_kerberized(mp->nm_auth)) return (ENOTSUP); + if ((ap->a_command == NFS_IOC_SET_CRED && vfs_context_is64bit(ctx)) || + (ap->a_command == NFS_IOC_SET_CRED64 && !vfs_context_is64bit(ctx))) + return (EINVAL); if (vfs_context_is64bit(ctx)) { gprinc = *(struct user_nfs_gss_principal *)ap->a_data; } else { @@ -6971,9 +6978,13 @@ nfs_vnop_ioctl( NFS_DBG(NFS_FAC_GSS, 7, "Seting credential to principal %s returned %d\n", p, error); FREE(p, M_TEMP); break; - case NFS_FSCTL_GET_CRED: + case NFS_IOC_GET_CRED: + case NFS_IOC_GET_CRED64: if (!auth_is_kerberized(mp->nm_auth)) return (ENOTSUP); + if ((ap->a_command == NFS_IOC_GET_CRED && vfs_context_is64bit(ctx)) || + (ap->a_command == NFS_IOC_GET_CRED64 && !vfs_context_is64bit(ctx))) + return (EINVAL); error = nfs_gss_clnt_ctx_get_principal(mp, ctx, &gprinc); if (error) break; @@ -7906,6 +7917,8 @@ nfs_vnode_notify(nfsnode_t np, uint32_t events) if (!nfs_getattrcache(np, &nvattr, 0)) { vap = &vattr; VATTR_INIT(vap); + + vap->va_flags |= nmp->nm_vers > 2 ? VA_64BITOBJIDS : 0; VATTR_RETURN(vap, va_fsid, vfs_statfs(nmp->nm_mountp)->f_fsid.val[0]); VATTR_RETURN(vap, va_fileid, nvattr.nva_fileid); VATTR_RETURN(vap, va_mode, nvattr.nva_mode);