/*
* Copyright (c) 2000-2005 Apple Computer, Inc. All rights reserved.
*
- * @APPLE_LICENSE_HEADER_START@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
- * The contents of this file constitute Original Code as defined in and
- * are subject to the Apple Public Source License Version 1.1 (the
- * "License"). You may not use this file except in compliance with the
- * License. Please obtain a copy of the License at
- * http://www.apple.com/publicsource and read it before using this file.
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. The rights granted to you under the License
+ * may not be used to create, or enable the creation or redistribution of,
+ * unlawful or unlicensed copies of an Apple operating system, or to
+ * circumvent, violate, or enable the circumvention or violation of, any
+ * terms of an Apple operating system software license agreement.
*
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this file.
+ *
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
- * License for the specific language governing rights and limitations
- * under the License.
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
*
- * @APPLE_LICENSE_HEADER_END@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
*/
/* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */
/*
SYSCTL_INT(_vfs_generic_nfs_client, NFS_TPRINTF_DELAY,
nextdowndelay, CTLFLAG_RW, &nfs_tprintf_delay, 0, "");
-static int nfs_iosize(struct nfsmount *nmp);
+static int nfs_biosize(struct nfsmount *);
static int mountnfs(struct user_nfs_args *,mount_t,mbuf_t,proc_t,vnode_t *);
static int nfs_mount(mount_t mp, vnode_t vp, user_addr_t data, vfs_context_t context);
static int nfs_start(mount_t mp, int flags, vfs_context_t context);
nfs_mount_diskless_private(struct nfs_dlmount *, const char *, int, vnode_t *, mount_t *);
#endif /* NO_MOUNT_PRIVATE */
-static int nfs_iosize(nmp)
- struct nfsmount* nmp;
+static int
+nfs_biosize(struct nfsmount *nmp)
{
int iosize;
nfs_fsinfo(nmp, vp, cred, p);
nfsm_reqhead(NFSX_FH(v3));
if (error) {
- kauth_cred_rele(cred);
+ kauth_cred_unref(&cred);
vnode_put(vp);
return (error);
}
nfsm_dissect(sfp, struct nfs_statfs *, NFSX_STATFS(v3));
sbp->f_flags = nmp->nm_flag;
- sbp->f_iosize = nfs_iosize(nmp);
+ sbp->f_iosize = NFS_IOSIZE;
if (v3) {
/*
* Adjust block size to get total block count to fit in a long.
sbp->f_ffree = 0;
}
nfsm_reqdone;
- kauth_cred_rele(cred);
+ kauth_cred_unref(&cred);
vnode_put(vp);
return (error);
}
struct vfs_context context; /* XXX get from caller? */
u_int64_t xid;
+ /* up front because of reference */
+ context.vc_ucred = kauth_cred_proc_ref(p);
+
/*
* Silently clear NFSMNT_NOCONN if it's a TCP mount, it makes
* no sense in that context.
nmp = VFSTONFS(mp);
/* update paths, file handles, etc, here XXX */
mbuf_freem(nam);
+ kauth_cred_unref(&context.vc_ucred);
return (0);
} else {
MALLOC_ZONE(nmp, struct nfsmount *,
sizeof (struct nfsmount), M_NFSMNT, M_WAITOK);
if (!nmp) {
mbuf_freem(nam);
+ kauth_cred_unref(&context.vc_ucred);
return (ENOMEM);
}
bzero((caddr_t)nmp, sizeof (struct nfsmount));
}
if (nmp->nm_wsize > maxio)
nmp->nm_wsize = maxio;
- if (nmp->nm_wsize > MAXBSIZE)
- nmp->nm_wsize = MAXBSIZE;
+ if (nmp->nm_wsize > NFS_MAXBSIZE)
+ nmp->nm_wsize = NFS_MAXBSIZE;
if ((argp->flags & NFSMNT_RSIZE) && argp->rsize > 0) {
nmp->nm_rsize = argp->rsize;
}
if (nmp->nm_rsize > maxio)
nmp->nm_rsize = maxio;
- if (nmp->nm_rsize > MAXBSIZE)
- nmp->nm_rsize = MAXBSIZE;
+ if (nmp->nm_rsize > NFS_MAXBSIZE)
+ nmp->nm_rsize = NFS_MAXBSIZE;
if ((argp->flags & NFSMNT_READDIRSIZE) && argp->readdirsize > 0) {
nmp->nm_readdirsize = argp->readdirsize;
*/
// LP64todo - fix CAST_DOWN of argp->fh
error = nfs_getattr_no_vnode(mp, CAST_DOWN(caddr_t, argp->fh), argp->fhsize,
- proc_ucred(p), p, &nvattrs, &xid);
+ context.vc_ucred, p, &nvattrs, &xid);
if (error) {
/*
* we got problems... we couldn't get the attributes
* the server about what its preferred I/O sizes are.
*/
if (nmp->nm_flag & NFSMNT_NFSV3)
- nfs_fsinfo(nmp, *vpp, proc_ucred(p), p);
- vfs_statfs(mp)->f_iosize = nfs_iosize(nmp);
+ nfs_fsinfo(nmp, *vpp, context.vc_ucred, p);
+ nmp->nm_biosize = nfs_biosize(nmp);
+ vfs_statfs(mp)->f_iosize = NFS_IOSIZE;
/*
* V3 mounts give us a (relatively) reliable remote access(2)
* Do statfs to ensure static info gets set to reasonable values.
*/
context.vc_proc = p;
- context.vc_ucred = proc_ucred(p);
nfs_statfs(mp, vfs_statfs(mp), &context);
if (nmp->nm_flag & NFSMNT_RESVPORT)
nfs_resv_mounts++;
nmp->nm_state |= NFSSTA_MOUNTED;
+ kauth_cred_unref(&context.vc_ucred);
return (0);
bad:
nfs_disconnect(nmp);
FREE_ZONE((caddr_t)nmp, sizeof (struct nfsmount), M_NFSMNT);
mbuf_freem(nam);
+ kauth_cred_unref(&context.vc_ucred);
return (error);
}