2 * Copyright (c) 2000-2007 Apple Inc. All rights reserved.
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
28 /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */
30 * Copyright (c) 1992, 1993, 1995
31 * The Regents of the University of California. All rights reserved.
33 * This code is derived from software donated to Berkeley by
36 * Redistribution and use in source and binary forms, with or without
37 * modification, are permitted provided that the following conditions
39 * 1. Redistributions of source code must retain the above copyright
40 * notice, this list of conditions and the following disclaimer.
41 * 2. Redistributions in binary form must reproduce the above copyright
42 * notice, this list of conditions and the following disclaimer in the
43 * documentation and/or other materials provided with the distribution.
44 * 3. All advertising materials mentioning features or use of this software
45 * must display the following acknowledgement:
46 * This product includes software developed by the University of
47 * California, Berkeley and its contributors.
48 * 4. Neither the name of the University nor the names of its contributors
49 * may be used to endorse or promote products derived from this software
50 * without specific prior written permission.
52 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
53 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
54 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
55 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
56 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
57 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
58 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
59 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
60 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
61 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
64 * @(#)fdesc_vfsops.c 8.10 (Berkeley) 5/14/95
71 #include <sys/param.h>
72 #include <sys/systm.h>
74 #include <sys/types.h>
75 #include <sys/proc_internal.h>
76 #include <sys/resourcevar.h>
77 #include <sys/filedesc.h>
78 #include <sys/vnode.h>
79 #include <sys/mount_internal.h>
80 #include <sys/namei.h>
81 #include <sys/malloc.h>
82 #include <miscfs/fdesc/fdesc.h>
85 * Mount the per-process file descriptors (/dev/fd)
88 fdesc_mount(struct mount
*mp
, __unused vnode_t devvp
, __unused user_addr_t data
, __unused vfs_context_t context
)
91 struct fdescmount
*fmp
;
97 if (mp
->mnt_flag
& MNT_UPDATE
)
100 error
= fdesc_allocvp(Froot
, FD_ROOT
, mp
, &rvp
, VDIR
);
104 MALLOC(fmp
, struct fdescmount
*, sizeof(struct fdescmount
),
105 M_UFSMNT
, M_WAITOK
); /* XXX */
107 vnode_setnoflush(rvp
);
112 /* XXX -- don't mark as local to work around fts() problems */
113 /*mp->mnt_flag |= MNT_LOCAL;*/
114 mp
->mnt_data
= (qaddr_t
) fmp
;
117 bzero(mp
->mnt_vfsstat
.f_mntfromname
, MAXPATHLEN
);
118 bcopy("fdesc", mp
->mnt_vfsstat
.f_mntfromname
, sizeof("fdesc"));
123 fdesc_start(__unused
struct mount
*mp
, __unused
int flags
, __unused vfs_context_t context
)
129 fdesc_unmount(struct mount
*mp
, int mntflags
, __unused vfs_context_t context
)
134 struct vnode
*rvp
= VFSTOFDESC(mp
)->f_root
;
136 if (mntflags
& MNT_FORCE
) {
141 if ( vnode_isinuse(rvp
, 1) && !force
)
143 if ( (error
= vflush(mp
, rvp
, flags
|SKIPSYSTEM
)) && !force
)
147 * And mark for recycle after we drop its reference; it away for future re-use
151 * Release reference on underlying root vnode
155 * Finally, throw away the fdescmount structure
157 _FREE(mp
->mnt_data
, M_UFSMNT
); /* XXX */
164 fdesc_root(struct mount
*mp
, struct vnode
**vpp
, __unused vfs_context_t context
)
169 * Return locked reference to root.
171 vp
= VFSTOFDESC(mp
)->f_root
;
179 * XXX commented out in mount.h
182 fdesc_statfs(__unused
struct mount
*mp
, struct vfsstatfs
*sbp
, vfs_context_t context
)
184 proc_t p
= vfs_context_proc(context
);
185 struct filedesc
*fdp
;
192 * Compute number of free file descriptors.
193 * [ Strange results will ensue if the open file
194 * limit is ever reduced below the current number
197 lim
= p
->p_rlimit
[RLIMIT_NOFILE
].rlim_cur
;
199 last
= min(fdp
->fd_nfiles
, lim
);
201 for (i
= fdp
->fd_freefile
; i
< last
; i
++)
202 if (fdp
->fd_ofiles
[i
] == NULL
&&
203 !(fdp
->fd_ofileflags
[i
] & UF_RESERVED
))
207 * Adjust for the fact that the fdesc array may not
208 * have been fully allocated yet.
210 if (fdp
->fd_nfiles
< lim
)
211 freefd
+= (lim
- fdp
->fd_nfiles
);
214 sbp
->f_bsize
= DEV_BSIZE
;
215 sbp
->f_iosize
= DEV_BSIZE
;
216 sbp
->f_blocks
= (uint64_t)2; /* 1K to keep df happy */
219 sbp
->f_files
= (uint64_t)((unsigned long)(lim
+ 1)); /* Allow for "." */
220 sbp
->f_ffree
= (uint64_t)((unsigned long)freefd
); /* See comments above */
227 fdesc_vfs_getattr(__unused mount_t mp
, struct vfs_attr
*fsap
, vfs_context_t context
)
229 VFSATTR_RETURN(fsap
, f_bsize
, DEV_BSIZE
);
230 VFSATTR_RETURN(fsap
, f_iosize
, DEV_BSIZE
);
231 VFSATTR_RETURN(fsap
, f_blocks
, 2);
232 VFSATTR_RETURN(fsap
, f_bfree
, 0);
233 VFSATTR_RETURN(fsap
, f_bavail
, 0);
234 VFSATTR_RETURN(fsap
, f_fssubtype
, 0);
236 if (VFSATTR_IS_ACTIVE(fsap
, f_objcount
) ||
237 VFSATTR_IS_ACTIVE(fsap
, f_maxobjcount
) ||
238 VFSATTR_IS_ACTIVE(fsap
, f_files
) ||
239 VFSATTR_IS_ACTIVE(fsap
, f_ffree
))
241 proc_t p
= vfs_context_proc(context
);
242 struct filedesc
*fdp
;
249 * Compute number of free file descriptors.
250 * [ Strange results will ensue if the open file
251 * limit is ever reduced below the current number
254 lim
= p
->p_rlimit
[RLIMIT_NOFILE
].rlim_cur
;
256 last
= min(fdp
->fd_nfiles
, lim
);
258 for (i
= fdp
->fd_freefile
; i
< last
; i
++)
259 if (fdp
->fd_ofiles
[i
] == NULL
&&
260 !(fdp
->fd_ofileflags
[i
] & UF_RESERVED
))
264 * Adjust for the fact that the fdesc array may not
265 * have been fully allocated yet.
267 if (fdp
->fd_nfiles
< lim
)
268 freefd
+= (lim
- fdp
->fd_nfiles
);
270 VFSATTR_RETURN(fsap
, f_objcount
, lim
+1);
271 VFSATTR_RETURN(fsap
, f_maxobjcount
, lim
+1);
272 VFSATTR_RETURN(fsap
, f_files
, lim
+1);
273 VFSATTR_RETURN(fsap
, f_ffree
, freefd
);
280 fdesc_sync(__unused
struct mount
*mp
, __unused
int waitfor
, __unused vfs_context_t context
)
286 #define fdesc_fhtovp (int (*) (mount_t, int, unsigned char *, vnode_t *, vfs_context_t))eopnotsupp
287 #define fdesc_sysctl (int (*) (int *, u_int, user_addr_t, size_t *, user_addr_t, size_t, vfs_context_t))eopnotsupp
288 #define fdesc_vget (int (*) (mount_t, ino64_t, vnode_t *, vfs_context_t))eopnotsupp
289 #define fdesc_vptofh (int (*) (vnode_t, int *, unsigned char *, vfs_context_t))eopnotsupp
291 struct vfsops fdesc_vfsops
= {
298 /* fdesc_statfs, XXX commented out in mount.h */