]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/nfs/nfs_vnops.c
xnu-4570.1.46.tar.gz
[apple/xnu.git] / bsd / nfs / nfs_vnops.c
index 38653ed5a583265443bffbdf204287effaaf5e04..4c492ac659fc40d98458c7af42de55c8544ca2ea 100644 (file)
@@ -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);