FreeBSD kernel kern code
vfs_default.c
Go to the documentation of this file.
1 /*-
2  * Copyright (c) 1989, 1993
3  * The Regents of the University of California. All rights reserved.
4  *
5  * This code is derived from software contributed
6  * to Berkeley by John Heidemann of the UCLA Ficus project.
7  *
8  * Source: * @(#)i405_init.c 2.10 92/04/27 UCLA Ficus project
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  * notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  * notice, this list of conditions and the following disclaimer in the
17  * documentation and/or other materials provided with the distribution.
18  * 4. Neither the name of the University nor the names of its contributors
19  * may be used to endorse or promote products derived from this software
20  * without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25  * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  */
34 
35 #include <sys/cdefs.h>
36 __FBSDID("$BSDSUniX$");
37 
38 #include <sys/param.h>
39 #include <sys/systm.h>
40 #include <sys/bio.h>
41 #include <sys/buf.h>
42 #include <sys/conf.h>
43 #include <sys/event.h>
44 #include <sys/kernel.h>
45 #include <sys/limits.h>
46 #include <sys/lock.h>
47 #include <sys/lockf.h>
48 #include <sys/malloc.h>
49 #include <sys/mount.h>
50 #include <sys/mutex.h>
51 #include <sys/namei.h>
52 #include <sys/fcntl.h>
53 #include <sys/unistd.h>
54 #include <sys/vnode.h>
55 #include <sys/dirent.h>
56 #include <sys/poll.h>
57 
58 #include <security/mac/mac_framework.h>
59 
60 #include <vm/vm.h>
61 #include <vm/vm_object.h>
62 #include <vm/vm_extern.h>
63 #include <vm/pmap.h>
64 #include <vm/vm_map.h>
65 #include <vm/vm_page.h>
66 #include <vm/vm_pager.h>
67 #include <vm/vnode_pager.h>
68 
69 static int vop_nolookup(struct vop_lookup_args *);
70 static int vop_norename(struct vop_rename_args *);
71 static int vop_nostrategy(struct vop_strategy_args *);
72 static int get_next_dirent(struct vnode *vp, struct dirent **dpp,
73  char *dirbuf, int dirbuflen, off_t *off,
74  char **cpos, int *len, int *eofflag,
75  struct thread *td);
76 static int dirent_exists(struct vnode *vp, const char *dirname,
77  struct thread *td);
78 
79 #define DIRENT_MINSIZE (sizeof(struct dirent) - (MAXNAMLEN+1) + 4)
80 
81 static int vop_stdis_text(struct vop_is_text_args *ap);
82 static int vop_stdset_text(struct vop_set_text_args *ap);
83 static int vop_stdunset_text(struct vop_unset_text_args *ap);
84 static int vop_stdget_writecount(struct vop_get_writecount_args *ap);
85 static int vop_stdadd_writecount(struct vop_add_writecount_args *ap);
86 
87 /*
88  * This vnode table stores what we want to do if the filesystem doesn't
89  * implement a particular VOP.
90  *
91  * If there is no specific entry here, we will return EOPNOTSUPP.
92  *
93  * Note that every filesystem has to implement either vop_access
94  * or vop_accessx; failing to do so will result in immediate crash
95  * due to stack overflow, as vop_stdaccess() calls vop_stdaccessx(),
96  * which calls vop_stdaccess() etc.
97  */
98 
99 struct vop_vector default_vnodeops = {
100  .vop_default = NULL,
101  .vop_bypass = VOP_EOPNOTSUPP,
102 
103  .vop_access = vop_stdaccess,
104  .vop_accessx = vop_stdaccessx,
105  .vop_advise = vop_stdadvise,
106  .vop_advlock = vop_stdadvlock,
107  .vop_advlockasync = vop_stdadvlockasync,
108  .vop_advlockpurge = vop_stdadvlockpurge,
109  .vop_allocate = vop_stdallocate,
110  .vop_bmap = vop_stdbmap,
111  .vop_close = VOP_NULL,
112  .vop_fsync = VOP_NULL,
113  .vop_getpages = vop_stdgetpages,
114  .vop_getwritemount = vop_stdgetwritemount,
115  .vop_inactive = VOP_NULL,
116  .vop_ioctl = VOP_ENOTTY,
117  .vop_kqfilter = vop_stdkqfilter,
118  .vop_islocked = vop_stdislocked,
119  .vop_lock1 = vop_stdlock,
120  .vop_lookup = vop_nolookup,
121  .vop_open = VOP_NULL,
122  .vop_pathconf = VOP_EINVAL,
123  .vop_poll = vop_nopoll,
124  .vop_putpages = vop_stdputpages,
125  .vop_readlink = VOP_EINVAL,
126  .vop_rename = vop_norename,
127  .vop_revoke = VOP_PANIC,
128  .vop_strategy = vop_nostrategy,
129  .vop_unlock = vop_stdunlock,
130  .vop_vptocnp = vop_stdvptocnp,
131  .vop_vptofh = vop_stdvptofh,
132  .vop_unp_bind = vop_stdunp_bind,
133  .vop_unp_connect = vop_stdunp_connect,
134  .vop_unp_detach = vop_stdunp_detach,
135  .vop_is_text = vop_stdis_text,
136  .vop_set_text = vop_stdset_text,
137  .vop_unset_text = vop_stdunset_text,
138  .vop_get_writecount = vop_stdget_writecount,
139  .vop_add_writecount = vop_stdadd_writecount,
140 };
141 
142 /*
143  * Series of placeholder functions for various error returns for
144  * VOPs.
145  */
146 
147 int
148 vop_eopnotsupp(struct vop_generic_args *ap)
149 {
150  /*
151  printf("vop_notsupp[%s]\n", ap->a_desc->vdesc_name);
152  */
153 
154  return (EOPNOTSUPP);
155 }
156 
157 int
158 vop_ebadf(struct vop_generic_args *ap)
159 {
160 
161  return (EBADF);
162 }
163 
164 int
165 vop_enotty(struct vop_generic_args *ap)
166 {
167 
168  return (ENOTTY);
169 }
170 
171 int
172 vop_einval(struct vop_generic_args *ap)
173 {
174 
175  return (EINVAL);
176 }
177 
178 int
179 vop_enoent(struct vop_generic_args *ap)
180 {
181 
182  return (ENOENT);
183 }
184 
185 int
186 vop_null(struct vop_generic_args *ap)
187 {
188 
189  return (0);
190 }
191 
192 /*
193  * Helper function to panic on some bad VOPs in some filesystems.
194  */
195 int
196 vop_panic(struct vop_generic_args *ap)
197 {
198 
199  panic("filesystem goof: vop_panic[%s]", ap->a_desc->vdesc_name);
200 }
201 
202 /*
203  * vop_std<something> and vop_no<something> are default functions for use by
204  * filesystems that need the "default reasonable" implementation for a
205  * particular operation.
206  *
207  * The documentation for the operations they implement exists (if it exists)
208  * in the VOP_<SOMETHING>(9) manpage (all uppercase).
209  */
210 
211 /*
212  * Default vop for filesystems that do not support name lookup
213  */
214 static int
216  struct vop_lookup_args /* {
217  struct vnode *a_dvp;
218  struct vnode **a_vpp;
219  struct componentname *a_cnp;
220  } */ *ap;
221 {
222 
223  *ap->a_vpp = NULL;
224  return (ENOTDIR);
225 }
226 
227 /*
228  * vop_norename:
229  *
230  * Handle unlock and reference counting for arguments of vop_rename
231  * for filesystems that do not implement rename operation.
232  */
233 static int
234 vop_norename(struct vop_rename_args *ap)
235 {
236 
237  vop_rename_fail(ap);
238  return (EOPNOTSUPP);
239 }
240 
241 /*
242  * vop_nostrategy:
243  *
244  * Strategy routine for VFS devices that have none.
245  *
246  * BIO_ERROR and B_INVAL must be cleared prior to calling any strategy
247  * routine. Typically this is done for a BIO_READ strategy call.
248  * Typically B_INVAL is assumed to already be clear prior to a write
249  * and should not be cleared manually unless you just made the buffer
250  * invalid. BIO_ERROR should be cleared either way.
251  */
252 
253 static int
254 vop_nostrategy (struct vop_strategy_args *ap)
255 {
256  printf("No strategy for buffer at %p\n", ap->a_bp);
257  vprint("vnode", ap->a_vp);
258  ap->a_bp->b_ioflags |= BIO_ERROR;
259  ap->a_bp->b_error = EOPNOTSUPP;
260  bufdone(ap->a_bp);
261  return (EOPNOTSUPP);
262 }
263 
264 static int
265 get_next_dirent(struct vnode *vp, struct dirent **dpp, char *dirbuf,
266  int dirbuflen, off_t *off, char **cpos, int *len,
267  int *eofflag, struct thread *td)
268 {
269  int error, reclen;
270  struct uio uio;
271  struct iovec iov;
272  struct dirent *dp;
273 
274  KASSERT(VOP_ISLOCKED(vp), ("vp %p is not locked", vp));
275  KASSERT(vp->v_type == VDIR, ("vp %p is not a directory", vp));
276 
277  if (*len == 0) {
278  iov.iov_base = dirbuf;
279  iov.iov_len = dirbuflen;
280 
281  uio.uio_iov = &iov;
282  uio.uio_iovcnt = 1;
283  uio.uio_offset = *off;
284  uio.uio_resid = dirbuflen;
285  uio.uio_segflg = UIO_SYSSPACE;
286  uio.uio_rw = UIO_READ;
287  uio.uio_td = td;
288 
289  *eofflag = 0;
290 
291 #ifdef MAC
292  error = mac_vnode_check_readdir(td->td_ucred, vp);
293  if (error == 0)
294 #endif
295  error = VOP_READDIR(vp, &uio, td->td_ucred, eofflag,
296  NULL, NULL);
297  if (error)
298  return (error);
299 
300  *off = uio.uio_offset;
301 
302  *cpos = dirbuf;
303  *len = (dirbuflen - uio.uio_resid);
304 
305  if (*len == 0)
306  return (ENOENT);
307  }
308 
309  dp = (struct dirent *)(*cpos);
310  reclen = dp->d_reclen;
311  *dpp = dp;
312 
313  /* check for malformed directory.. */
314  if (reclen < DIRENT_MINSIZE)
315  return (EINVAL);
316 
317  *cpos += reclen;
318  *len -= reclen;
319 
320  return (0);
321 }
322 
323 /*
324  * Check if a named file exists in a given directory vnode.
325  */
326 static int
327 dirent_exists(struct vnode *vp, const char *dirname, struct thread *td)
328 {
329  char *dirbuf, *cpos;
330  int error, eofflag, dirbuflen, len, found;
331  off_t off;
332  struct dirent *dp;
333  struct vattr va;
334 
335  KASSERT(VOP_ISLOCKED(vp), ("vp %p is not locked", vp));
336  KASSERT(vp->v_type == VDIR, ("vp %p is not a directory", vp));
337 
338  found = 0;
339 
340  error = VOP_GETATTR(vp, &va, td->td_ucred);
341  if (error)
342  return (found);
343 
344  dirbuflen = DEV_BSIZE;
345  if (dirbuflen < va.va_blocksize)
346  dirbuflen = va.va_blocksize;
347  dirbuf = (char *)malloc(dirbuflen, M_TEMP, M_WAITOK);
348 
349  off = 0;
350  len = 0;
351  do {
352  error = get_next_dirent(vp, &dp, dirbuf, dirbuflen, &off,
353  &cpos, &len, &eofflag, td);
354  if (error)
355  goto out;
356 
357  if ((dp->d_type != DT_WHT) &&
358  !strcmp(dp->d_name, dirname)) {
359  found = 1;
360  goto out;
361  }
362  } while (len > 0 || !eofflag);
363 
364 out:
365  free(dirbuf, M_TEMP);
366  return (found);
367 }
368 
369 int
370 vop_stdaccess(struct vop_access_args *ap)
371 {
372 
373  KASSERT((ap->a_accmode & ~(VEXEC | VWRITE | VREAD | VADMIN |
374  VAPPEND)) == 0, ("invalid bit in accmode"));
375 
376  return (VOP_ACCESSX(ap->a_vp, ap->a_accmode, ap->a_cred, ap->a_td));
377 }
378 
379 int
380 vop_stdaccessx(struct vop_accessx_args *ap)
381 {
382  int error;
383  accmode_t accmode = ap->a_accmode;
384 
385  error = vfs_unixify_accmode(&accmode);
386  if (error != 0)
387  return (error);
388 
389  if (accmode == 0)
390  return (0);
391 
392  return (VOP_ACCESS(ap->a_vp, accmode, ap->a_cred, ap->a_td));
393 }
394 
395 /*
396  * Advisory record locking support
397  */
398 int
399 vop_stdadvlock(struct vop_advlock_args *ap)
400 {
401  struct vnode *vp;
402  struct vattr vattr;
403  int error;
404 
405  vp = ap->a_vp;
406  if (ap->a_fl->l_whence == SEEK_END) {
407  /*
408  * The NFSv4 server must avoid doing a vn_lock() here, since it
409  * can deadlock the nfsd threads, due to a LOR. Fortunately
410  * the NFSv4 server always uses SEEK_SET and this code is
411  * only required for the SEEK_END case.
412  */
413  vn_lock(vp, LK_SHARED | LK_RETRY);
414  error = VOP_GETATTR(vp, &vattr, curthread->td_ucred);
415  VOP_UNLOCK(vp, 0);
416  if (error)
417  return (error);
418  } else
419  vattr.va_size = 0;
420 
421  return (lf_advlock(ap, &(vp->v_lockf), vattr.va_size));
422 }
423 
424 int
425 vop_stdadvlockasync(struct vop_advlockasync_args *ap)
426 {
427  struct vnode *vp;
428  struct vattr vattr;
429  int error;
430 
431  vp = ap->a_vp;
432  if (ap->a_fl->l_whence == SEEK_END) {
433  /* The size argument is only needed for SEEK_END. */
434  vn_lock(vp, LK_SHARED | LK_RETRY);
435  error = VOP_GETATTR(vp, &vattr, curthread->td_ucred);
436  VOP_UNLOCK(vp, 0);
437  if (error)
438  return (error);
439  } else
440  vattr.va_size = 0;
441 
442  return (lf_advlockasync(ap, &(vp->v_lockf), vattr.va_size));
443 }
444 
445 int
446 vop_stdadvlockpurge(struct vop_advlockpurge_args *ap)
447 {
448  struct vnode *vp;
449 
450  vp = ap->a_vp;
451  lf_purgelocks(vp, &vp->v_lockf);
452  return (0);
453 }
454 
455 /*
456  * vop_stdpathconf:
457  *
458  * Standard implementation of POSIX pathconf, to get information about limits
459  * for a filesystem.
460  * Override per filesystem for the case where the filesystem has smaller
461  * limits.
462  */
463 int
465  struct vop_pathconf_args /* {
466  struct vnode *a_vp;
467  int a_name;
468  int *a_retval;
469  } */ *ap;
470 {
471 
472  switch (ap->a_name) {
473  case _PC_NAME_MAX:
474  *ap->a_retval = NAME_MAX;
475  return (0);
476  case _PC_PATH_MAX:
477  *ap->a_retval = PATH_MAX;
478  return (0);
479  case _PC_LINK_MAX:
480  *ap->a_retval = LINK_MAX;
481  return (0);
482  case _PC_MAX_CANON:
483  *ap->a_retval = MAX_CANON;
484  return (0);
485  case _PC_MAX_INPUT:
486  *ap->a_retval = MAX_INPUT;
487  return (0);
488  case _PC_PIPE_BUF:
489  *ap->a_retval = PIPE_BUF;
490  return (0);
491  case _PC_CHOWN_RESTRICTED:
492  *ap->a_retval = 1;
493  return (0);
494  case _PC_VDISABLE:
495  *ap->a_retval = _POSIX_VDISABLE;
496  return (0);
497  default:
498  return (EINVAL);
499  }
500  /* NOTREACHED */
501 }
502 
503 /*
504  * Standard lock, unlock and islocked functions.
505  */
506 int
508  struct vop_lock1_args /* {
509  struct vnode *a_vp;
510  int a_flags;
511  char *file;
512  int line;
513  } */ *ap;
514 {
515  struct vnode *vp = ap->a_vp;
516 
517  return (_lockmgr_args(vp->v_vnlock, ap->a_flags, VI_MTX(vp),
518  LK_WMESG_DEFAULT, LK_PRIO_DEFAULT, LK_TIMO_DEFAULT, ap->a_file,
519  ap->a_line));
520 }
521 
522 /* See above. */
523 int
525  struct vop_unlock_args /* {
526  struct vnode *a_vp;
527  int a_flags;
528  } */ *ap;
529 {
530  struct vnode *vp = ap->a_vp;
531 
532  return (lockmgr(vp->v_vnlock, ap->a_flags | LK_RELEASE, VI_MTX(vp)));
533 }
534 
535 /* See above. */
536 int
538  struct vop_islocked_args /* {
539  struct vnode *a_vp;
540  } */ *ap;
541 {
542 
543  return (lockstatus(ap->a_vp->v_vnlock));
544 }
545 
546 /*
547  * Return true for select/poll.
548  */
549 int
551  struct vop_poll_args /* {
552  struct vnode *a_vp;
553  int a_events;
554  struct ucred *a_cred;
555  struct thread *a_td;
556  } */ *ap;
557 {
558 
559  return (poll_no_poll(ap->a_events));
560 }
561 
562 /*
563  * Implement poll for local filesystems that support it.
564  */
565 int
567  struct vop_poll_args /* {
568  struct vnode *a_vp;
569  int a_events;
570  struct ucred *a_cred;
571  struct thread *a_td;
572  } */ *ap;
573 {
574  if (ap->a_events & ~POLLSTANDARD)
575  return (vn_pollrecord(ap->a_vp, ap->a_td, ap->a_events));
576  return (ap->a_events & (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM));
577 }
578 
579 /*
580  * Return our mount point, as we will take charge of the writes.
581  */
582 int
584  struct vop_getwritemount_args /* {
585  struct vnode *a_vp;
586  struct mount **a_mpp;
587  } */ *ap;
588 {
589  struct mount *mp;
590 
591  /*
592  * XXX Since this is called unlocked we may be recycled while
593  * attempting to ref the mount. If this is the case or mountpoint
594  * will be set to NULL. We only have to prevent this call from
595  * returning with a ref to an incorrect mountpoint. It is not
596  * harmful to return with a ref to our previous mountpoint.
597  */
598  mp = ap->a_vp->v_mount;
599  if (mp != NULL) {
600  vfs_ref(mp);
601  if (mp != ap->a_vp->v_mount) {
602  vfs_rel(mp);
603  mp = NULL;
604  }
605  }
606  *(ap->a_mpp) = mp;
607  return (0);
608 }
609 
610 /* XXX Needs good comment and VOP_BMAP(9) manpage */
611 int
613  struct vop_bmap_args /* {
614  struct vnode *a_vp;
615  daddr_t a_bn;
616  struct bufobj **a_bop;
617  daddr_t *a_bnp;
618  int *a_runp;
619  int *a_runb;
620  } */ *ap;
621 {
622 
623  if (ap->a_bop != NULL)
624  *ap->a_bop = &ap->a_vp->v_bufobj;
625  if (ap->a_bnp != NULL)
626  *ap->a_bnp = ap->a_bn * btodb(ap->a_vp->v_mount->mnt_stat.f_iosize);
627  if (ap->a_runp != NULL)
628  *ap->a_runp = 0;
629  if (ap->a_runb != NULL)
630  *ap->a_runb = 0;
631  return (0);
632 }
633 
634 int
636  struct vop_fsync_args /* {
637  struct vnode *a_vp;
638  struct ucred *a_cred;
639  int a_waitfor;
640  struct thread *a_td;
641  } */ *ap;
642 {
643  struct vnode *vp = ap->a_vp;
644  struct buf *bp;
645  struct bufobj *bo;
646  struct buf *nbp;
647  int error = 0;
648  int maxretry = 1000; /* large, arbitrarily chosen */
649 
650  bo = &vp->v_bufobj;
651  BO_LOCK(bo);
652 loop1:
653  /*
654  * MARK/SCAN initialization to avoid infinite loops.
655  */
656  TAILQ_FOREACH(bp, &bo->bo_dirty.bv_hd, b_bobufs) {
657  bp->b_vflags &= ~BV_SCANNED;
658  bp->b_error = 0;
659  }
660 
661  /*
662  * Flush all dirty buffers associated with a vnode.
663  */
664 loop2:
665  TAILQ_FOREACH_SAFE(bp, &bo->bo_dirty.bv_hd, b_bobufs, nbp) {
666  if ((bp->b_vflags & BV_SCANNED) != 0)
667  continue;
668  bp->b_vflags |= BV_SCANNED;
669  if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT, NULL)) {
670  if (ap->a_waitfor != MNT_WAIT)
671  continue;
672  if (BUF_LOCK(bp,
673  LK_EXCLUSIVE | LK_INTERLOCK | LK_SLEEPFAIL,
674  BO_MTX(bo)) != 0) {
675  BO_LOCK(bo);
676  goto loop1;
677  }
678  BO_LOCK(bo);
679  }
680  BO_UNLOCK(bo);
681  KASSERT(bp->b_bufobj == bo,
682  ("bp %p wrong b_bufobj %p should be %p",
683  bp, bp->b_bufobj, bo));
684  if ((bp->b_flags & B_DELWRI) == 0)
685  panic("fsync: not dirty");
686  if ((vp->v_object != NULL) && (bp->b_flags & B_CLUSTEROK)) {
687  vfs_bio_awrite(bp);
688  } else {
689  bremfree(bp);
690  bawrite(bp);
691  }
692  BO_LOCK(bo);
693  goto loop2;
694  }
695 
696  /*
697  * If synchronous the caller expects us to completely resolve all
698  * dirty buffers in the system. Wait for in-progress I/O to
699  * complete (which could include background bitmap writes), then
700  * retry if dirty blocks still exist.
701  */
702  if (ap->a_waitfor == MNT_WAIT) {
703  bufobj_wwait(bo, 0, 0);
704  if (bo->bo_dirty.bv_cnt > 0) {
705  /*
706  * If we are unable to write any of these buffers
707  * then we fail now rather than trying endlessly
708  * to write them out.
709  */
710  TAILQ_FOREACH(bp, &bo->bo_dirty.bv_hd, b_bobufs)
711  if ((error = bp->b_error) == 0)
712  continue;
713  if (error == 0 && --maxretry >= 0)
714  goto loop1;
715  error = EAGAIN;
716  }
717  }
718  BO_UNLOCK(bo);
719  if (error == EAGAIN)
720  vprint("fsync: giving up on dirty", vp);
721 
722  return (error);
723 }
724 
725 /* XXX Needs good comment and more info in the manpage (VOP_GETPAGES(9)). */
726 int
728  struct vop_getpages_args /* {
729  struct vnode *a_vp;
730  vm_page_t *a_m;
731  int a_count;
732  int a_reqpage;
733  vm_ooffset_t a_offset;
734  } */ *ap;
735 {
736 
737  return vnode_pager_generic_getpages(ap->a_vp, ap->a_m,
738  ap->a_count, ap->a_reqpage);
739 }
740 
741 int
742 vop_stdkqfilter(struct vop_kqfilter_args *ap)
743 {
744  return vfs_kqfilter(ap);
745 }
746 
747 /* XXX Needs good comment and more info in the manpage (VOP_PUTPAGES(9)). */
748 int
750  struct vop_putpages_args /* {
751  struct vnode *a_vp;
752  vm_page_t *a_m;
753  int a_count;
754  int a_sync;
755  int *a_rtvals;
756  vm_ooffset_t a_offset;
757  } */ *ap;
758 {
759 
760  return vnode_pager_generic_putpages(ap->a_vp, ap->a_m, ap->a_count,
761  ap->a_sync, ap->a_rtvals);
762 }
763 
764 int
765 vop_stdvptofh(struct vop_vptofh_args *ap)
766 {
767  return (EOPNOTSUPP);
768 }
769 
770 int
771 vop_stdvptocnp(struct vop_vptocnp_args *ap)
772 {
773  struct vnode *vp = ap->a_vp;
774  struct vnode **dvp = ap->a_vpp;
775  struct ucred *cred = ap->a_cred;
776  char *buf = ap->a_buf;
777  int *buflen = ap->a_buflen;
778  char *dirbuf, *cpos;
779  int i, error, eofflag, dirbuflen, flags, locked, len, covered;
780  off_t off;
781  ino_t fileno;
782  struct vattr va;
783  struct nameidata nd;
784  struct thread *td;
785  struct dirent *dp;
786  struct vnode *mvp;
787 
788  i = *buflen;
789  error = 0;
790  covered = 0;
791  td = curthread;
792 
793  if (vp->v_type != VDIR)
794  return (ENOENT);
795 
796  error = VOP_GETATTR(vp, &va, cred);
797  if (error)
798  return (error);
799 
800  VREF(vp);
801  locked = VOP_ISLOCKED(vp);
802  VOP_UNLOCK(vp, 0);
803  NDINIT_ATVP(&nd, LOOKUP, FOLLOW | LOCKLEAF, UIO_SYSSPACE,
804  "..", vp, td);
805  flags = FREAD;
806  error = vn_open_cred(&nd, &flags, 0, VN_OPEN_NOAUDIT, cred, NULL);
807  if (error) {
808  vn_lock(vp, locked | LK_RETRY);
809  return (error);
810  }
811  NDFREE(&nd, NDF_ONLY_PNBUF);
812 
813  mvp = *dvp = nd.ni_vp;
814 
815  if (vp->v_mount != (*dvp)->v_mount &&
816  ((*dvp)->v_vflag & VV_ROOT) &&
817  ((*dvp)->v_mount->mnt_flag & MNT_UNION)) {
818  *dvp = (*dvp)->v_mount->mnt_vnodecovered;
819  VREF(mvp);
820  VOP_UNLOCK(mvp, 0);
821  vn_close(mvp, FREAD, cred, td);
822  VREF(*dvp);
823  vn_lock(*dvp, LK_EXCLUSIVE | LK_RETRY);
824  covered = 1;
825  }
826 
827  fileno = va.va_fileid;
828 
829  dirbuflen = DEV_BSIZE;
830  if (dirbuflen < va.va_blocksize)
831  dirbuflen = va.va_blocksize;
832  dirbuf = (char *)malloc(dirbuflen, M_TEMP, M_WAITOK);
833 
834  if ((*dvp)->v_type != VDIR) {
835  error = ENOENT;
836  goto out;
837  }
838 
839  off = 0;
840  len = 0;
841  do {
842  /* call VOP_READDIR of parent */
843  error = get_next_dirent(*dvp, &dp, dirbuf, dirbuflen, &off,
844  &cpos, &len, &eofflag, td);
845  if (error)
846  goto out;
847 
848  if ((dp->d_type != DT_WHT) &&
849  (dp->d_fileno == fileno)) {
850  if (covered) {
851  VOP_UNLOCK(*dvp, 0);
852  vn_lock(mvp, LK_EXCLUSIVE | LK_RETRY);
853  if (dirent_exists(mvp, dp->d_name, td)) {
854  error = ENOENT;
855  VOP_UNLOCK(mvp, 0);
856  vn_lock(*dvp, LK_EXCLUSIVE | LK_RETRY);
857  goto out;
858  }
859  VOP_UNLOCK(mvp, 0);
860  vn_lock(*dvp, LK_EXCLUSIVE | LK_RETRY);
861  }
862  i -= dp->d_namlen;
863 
864  if (i < 0) {
865  error = ENOMEM;
866  goto out;
867  }
868  if (dp->d_namlen == 1 && dp->d_name[0] == '.') {
869  error = ENOENT;
870  } else {
871  bcopy(dp->d_name, buf + i, dp->d_namlen);
872  error = 0;
873  }
874  goto out;
875  }
876  } while (len > 0 || !eofflag);
877  error = ENOENT;
878 
879 out:
880  free(dirbuf, M_TEMP);
881  if (!error) {
882  *buflen = i;
883  vref(*dvp);
884  }
885  if (covered) {
886  vput(*dvp);
887  vrele(mvp);
888  } else {
889  VOP_UNLOCK(mvp, 0);
890  vn_close(mvp, FREAD, cred, td);
891  }
892  vn_lock(vp, locked | LK_RETRY);
893  return (error);
894 }
895 
896 int
897 vop_stdallocate(struct vop_allocate_args *ap)
898 {
899 #ifdef __notyet__
900  struct statfs sfs;
901 #endif
902  struct iovec aiov;
903  struct vattr vattr, *vap;
904  struct uio auio;
905  off_t fsize, len, cur, offset;
906  uint8_t *buf;
907  struct thread *td;
908  struct vnode *vp;
909  size_t iosize;
910  int error;
911 
912  buf = NULL;
913  error = 0;
914  td = curthread;
915  vap = &vattr;
916  vp = ap->a_vp;
917  len = *ap->a_len;
918  offset = *ap->a_offset;
919 
920  error = VOP_GETATTR(vp, vap, td->td_ucred);
921  if (error != 0)
922  goto out;
923  fsize = vap->va_size;
924  iosize = vap->va_blocksize;
925  if (iosize == 0)
926  iosize = BLKDEV_IOSIZE;
927  if (iosize > MAXPHYS)
928  iosize = MAXPHYS;
929  buf = malloc(iosize, M_TEMP, M_WAITOK);
930 
931 #ifdef __notyet__
932  /*
933  * Check if the filesystem sets f_maxfilesize; if not use
934  * VOP_SETATTR to perform the check.
935  */
936  error = VFS_STATFS(vp->v_mount, &sfs, td);
937  if (error != 0)
938  goto out;
939  if (sfs.f_maxfilesize) {
940  if (offset > sfs.f_maxfilesize || len > sfs.f_maxfilesize ||
941  offset + len > sfs.f_maxfilesize) {
942  error = EFBIG;
943  goto out;
944  }
945  } else
946 #endif
947  if (offset + len > vap->va_size) {
948  /*
949  * Test offset + len against the filesystem's maxfilesize.
950  */
951  VATTR_NULL(vap);
952  vap->va_size = offset + len;
953  error = VOP_SETATTR(vp, vap, td->td_ucred);
954  if (error != 0)
955  goto out;
956  VATTR_NULL(vap);
957  vap->va_size = fsize;
958  error = VOP_SETATTR(vp, vap, td->td_ucred);
959  if (error != 0)
960  goto out;
961  }
962 
963  for (;;) {
964  /*
965  * Read and write back anything below the nominal file
966  * size. There's currently no way outside the filesystem
967  * to know whether this area is sparse or not.
968  */
969  cur = iosize;
970  if ((offset % iosize) != 0)
971  cur -= (offset % iosize);
972  if (cur > len)
973  cur = len;
974  if (offset < fsize) {
975  aiov.iov_base = buf;
976  aiov.iov_len = cur;
977  auio.uio_iov = &aiov;
978  auio.uio_iovcnt = 1;
979  auio.uio_offset = offset;
980  auio.uio_resid = cur;
981  auio.uio_segflg = UIO_SYSSPACE;
982  auio.uio_rw = UIO_READ;
983  auio.uio_td = td;
984  error = VOP_READ(vp, &auio, 0, td->td_ucred);
985  if (error != 0)
986  break;
987  if (auio.uio_resid > 0) {
988  bzero(buf + cur - auio.uio_resid,
989  auio.uio_resid);
990  }
991  } else {
992  bzero(buf, cur);
993  }
994 
995  aiov.iov_base = buf;
996  aiov.iov_len = cur;
997  auio.uio_iov = &aiov;
998  auio.uio_iovcnt = 1;
999  auio.uio_offset = offset;
1000  auio.uio_resid = cur;
1001  auio.uio_segflg = UIO_SYSSPACE;
1002  auio.uio_rw = UIO_WRITE;
1003  auio.uio_td = td;
1004 
1005  error = VOP_WRITE(vp, &auio, 0, td->td_ucred);
1006  if (error != 0)
1007  break;
1008 
1009  len -= cur;
1010  offset += cur;
1011  if (len == 0)
1012  break;
1013  if (should_yield())
1014  break;
1015  }
1016 
1017  out:
1018  *ap->a_len = len;
1019  *ap->a_offset = offset;
1020  free(buf, M_TEMP);
1021  return (error);
1022 }
1023 
1024 int
1025 vop_stdadvise(struct vop_advise_args *ap)
1026 {
1027  struct vnode *vp;
1028  off_t start, end;
1029  int error, vfslocked;
1030 
1031  vp = ap->a_vp;
1032  switch (ap->a_advice) {
1033  case POSIX_FADV_WILLNEED:
1034  /*
1035  * Do nothing for now. Filesystems should provide a
1036  * custom method which starts an asynchronous read of
1037  * the requested region.
1038  */
1039  error = 0;
1040  break;
1041  case POSIX_FADV_DONTNEED:
1042  /*
1043  * Flush any open FS buffers and then remove pages
1044  * from the backing VM object. Using vinvalbuf() here
1045  * is a bit heavy-handed as it flushes all buffers for
1046  * the given vnode, not just the buffers covering the
1047  * requested range.
1048  */
1049  error = 0;
1050  vfslocked = VFS_LOCK_GIANT(vp->v_mount);
1051  vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
1052  if (vp->v_iflag & VI_DOOMED) {
1053  VOP_UNLOCK(vp, 0);
1054  VFS_UNLOCK_GIANT(vfslocked);
1055  break;
1056  }
1057  vinvalbuf(vp, V_CLEANONLY, 0, 0);
1058  if (vp->v_object != NULL) {
1059  start = trunc_page(ap->a_start);
1060  end = round_page(ap->a_end);
1061  VM_OBJECT_LOCK(vp->v_object);
1062  vm_object_page_cache(vp->v_object, OFF_TO_IDX(start),
1063  OFF_TO_IDX(end));
1064  VM_OBJECT_UNLOCK(vp->v_object);
1065  }
1066  VOP_UNLOCK(vp, 0);
1067  VFS_UNLOCK_GIANT(vfslocked);
1068  break;
1069  default:
1070  error = EINVAL;
1071  break;
1072  }
1073  return (error);
1074 }
1075 
1076 int
1077 vop_stdunp_bind(struct vop_unp_bind_args *ap)
1078 {
1079 
1080  ap->a_vp->v_socket = ap->a_socket;
1081  return (0);
1082 }
1083 
1084 int
1085 vop_stdunp_connect(struct vop_unp_connect_args *ap)
1086 {
1087 
1088  *ap->a_socket = ap->a_vp->v_socket;
1089  return (0);
1090 }
1091 
1092 int
1093 vop_stdunp_detach(struct vop_unp_detach_args *ap)
1094 {
1095 
1096  ap->a_vp->v_socket = NULL;
1097  return (0);
1098 }
1099 
1100 static int
1101 vop_stdis_text(struct vop_is_text_args *ap)
1102 {
1103 
1104  return ((ap->a_vp->v_vflag & VV_TEXT) != 0);
1105 }
1106 
1107 static int
1108 vop_stdset_text(struct vop_set_text_args *ap)
1109 {
1110 
1111  ap->a_vp->v_vflag |= VV_TEXT;
1112  return (0);
1113 }
1114 
1115 static int
1116 vop_stdunset_text(struct vop_unset_text_args *ap)
1117 {
1118 
1119  ap->a_vp->v_vflag &= ~VV_TEXT;
1120  return (0);
1121 }
1122 
1123 static int
1124 vop_stdget_writecount(struct vop_get_writecount_args *ap)
1125 {
1126 
1127  *ap->a_writecount = ap->a_vp->v_writecount;
1128  return (0);
1129 }
1130 
1131 static int
1132 vop_stdadd_writecount(struct vop_add_writecount_args *ap)
1133 {
1134 
1135  ap->a_vp->v_writecount += ap->a_inc;
1136  return (0);
1137 }
1138 
1139 /*
1140  * vfs default ops
1141  * used to fill the vfs function table to get reasonable default return values.
1142  */
1143 int
1144 vfs_stdroot (mp, flags, vpp)
1145  struct mount *mp;
1146  int flags;
1147  struct vnode **vpp;
1148 {
1149 
1150  return (EOPNOTSUPP);
1151 }
1152 
1153 int
1154 vfs_stdstatfs (mp, sbp)
1155  struct mount *mp;
1156  struct statfs *sbp;
1157 {
1158 
1159  return (EOPNOTSUPP);
1160 }
1161 
1162 int
1163 vfs_stdquotactl (mp, cmds, uid, arg)
1164  struct mount *mp;
1165  int cmds;
1166  uid_t uid;
1167  void *arg;
1168 {
1169 
1170  return (EOPNOTSUPP);
1171 }
1172 
1173 int
1174 vfs_stdsync(mp, waitfor)
1175  struct mount *mp;
1176  int waitfor;
1177 {
1178  struct vnode *vp, *mvp;
1179  struct thread *td;
1180  int error, lockreq, allerror = 0;
1181 
1182  td = curthread;
1183  lockreq = LK_EXCLUSIVE | LK_INTERLOCK;
1184  if (waitfor != MNT_WAIT)
1185  lockreq |= LK_NOWAIT;
1186  /*
1187  * Force stale buffer cache information to be flushed.
1188  */
1189 loop:
1190  MNT_VNODE_FOREACH_ALL(vp, mp, mvp) {
1191  if (vp->v_bufobj.bo_dirty.bv_cnt == 0) {
1192  VI_UNLOCK(vp);
1193  continue;
1194  }
1195  if ((error = vget(vp, lockreq, td)) != 0) {
1196  if (error == ENOENT) {
1197  MNT_VNODE_FOREACH_ALL_ABORT(mp, mvp);
1198  goto loop;
1199  }
1200  continue;
1201  }
1202  error = VOP_FSYNC(vp, waitfor, td);
1203  if (error)
1204  allerror = error;
1205  vput(vp);
1206  }
1207  return (allerror);
1208 }
1209 
1210 int
1211 vfs_stdnosync (mp, waitfor)
1212  struct mount *mp;
1213  int waitfor;
1214 {
1215 
1216  return (0);
1217 }
1218 
1219 int
1220 vfs_stdvget (mp, ino, flags, vpp)
1221  struct mount *mp;
1222  ino_t ino;
1223  int flags;
1224  struct vnode **vpp;
1225 {
1226 
1227  return (EOPNOTSUPP);
1228 }
1229 
1230 int
1231 vfs_stdfhtovp (mp, fhp, flags, vpp)
1232  struct mount *mp;
1233  struct fid *fhp;
1234  int flags;
1235  struct vnode **vpp;
1236 {
1237 
1238  return (EOPNOTSUPP);
1239 }
1240 
1241 int
1243  struct vfsconf *vfsp;
1244 {
1245 
1246  return (0);
1247 }
1248 
1249 int
1251  struct vfsconf *vfsp;
1252 {
1253 
1254  return(0);
1255 }
1256 
1257 int
1258 vfs_stdextattrctl(mp, cmd, filename_vp, attrnamespace, attrname)
1259  struct mount *mp;
1260  int cmd;
1261  struct vnode *filename_vp;
1262  int attrnamespace;
1263  const char *attrname;
1264 {
1265 
1266  if (filename_vp != NULL)
1267  VOP_UNLOCK(filename_vp, 0);
1268  return (EOPNOTSUPP);
1269 }
1270 
1271 int
1272 vfs_stdsysctl(mp, op, req)
1273  struct mount *mp;
1274  fsctlop_t op;
1275  struct sysctl_req *req;
1276 {
1277 
1278  return (EOPNOTSUPP);
1279 }
1280 
1281 /* end of vfs default ops */
int vop_stdfsync(struct vop_fsync_args *ap)
Definition: vfs_default.c:635
int lockstatus(struct lock *lk)
Definition: kern_lock.c:1325
int vop_panic(struct vop_generic_args *ap)
Definition: vfs_default.c:196
int lf_advlock(struct vop_advlock_args *ap, struct lockf **statep, u_quad_t size)
Definition: kern_lockf.c:759
int should_yield(void)
Definition: kern_synch.c:577
int vop_stdadvlock(struct vop_advlock_args *ap)
Definition: vfs_default.c:399
int vinvalbuf(struct vnode *vp, int flags, int slpflag, int slptimeo)
Definition: vfs_subr.c:1348
int lf_advlockasync(struct vop_advlockasync_args *ap, struct lockf **statep, u_quad_t size)
Definition: kern_lockf.c:408
struct buf * buf
Definition: vfs_bio.c:97
int bufobj_wwait(struct bufobj *bo, int slpflag, int timeo)
Definition: vfs_bio.c:4503
void NDFREE(struct nameidata *ndp, const u_int flags)
Definition: vfs_lookup.c:1091
__FBSDID("$BSDSUniX$")
void *** start
Definition: linker_if.m:86
int vop_stdunp_detach(struct vop_unp_detach_args *ap)
Definition: vfs_default.c:1093
void vfs_rel(struct mount *mp)
Definition: vfs_mount.c:439
void * malloc(unsigned long size, struct malloc_type *mtp, int flags)
Definition: kern_malloc.c:454
int vfs_bio_awrite(struct buf *bp)
Definition: vfs_bio.c:1964
int vfs_stdquotactl(struct mount *mp, int cmds, uid_t uid, void *arg)
Definition: vfs_default.c:1163
int vop_stdgetpages(struct vop_getpages_args *ap)
Definition: vfs_default.c:727
static int vop_nostrategy(struct vop_strategy_args *)
Definition: vfs_default.c:254
void panic(const char *fmt,...)
int vget(struct vnode *vp, int flags, struct thread *td)
Definition: vfs_subr.c:2258
void bufdone(struct buf *bp)
Definition: vfs_bio.c:3825
int vfs_stdroot(struct mount *mp, int flags, struct vnode **vpp)
Definition: vfs_default.c:1144
int vop_stdaccess(struct vop_access_args *ap)
Definition: vfs_default.c:370
int vfs_stdvget(struct mount *mp, ino_t ino, int flags, struct vnode **vpp)
Definition: vfs_default.c:1220
int vop_stdadvlockasync(struct vop_advlockasync_args *ap)
Definition: vfs_default.c:425
int vfs_kqfilter(struct vop_kqfilter_args *ap)
Definition: vfs_subr.c:4551
static int vop_stdget_writecount(struct vop_get_writecount_args *ap)
Definition: vfs_default.c:1124
int vop_stdislocked(struct vop_islocked_args *ap)
Definition: vfs_default.c:537
void vop_rename_fail(struct vop_rename_args *ap)
Definition: vfs_subr.c:4161
int vop_stdallocate(struct vop_allocate_args *ap)
Definition: vfs_default.c:897
int vfs_stdextattrctl(struct mount *mp, int cmd, struct vnode *filename_vp, int attrnamespace, const char *attrname)
Definition: vfs_default.c:1258
struct vfsconfhead vfsconf
Definition: vfs_init.c:66
accmode_t accmode
Definition: subr_acl_nfs4.c:66
int vop_null(struct vop_generic_args *ap)
Definition: vfs_default.c:186
struct vop_vector default_vnodeops
Definition: vfs_default.c:99
int vop_stdvptocnp(struct vop_vptocnp_args *ap)
Definition: vfs_default.c:771
int vop_stdaccessx(struct vop_accessx_args *ap)
Definition: vfs_default.c:380
void vref(struct vnode *vp)
Definition: vfs_subr.c:2302
#define DIRENT_MINSIZE
Definition: vfs_default.c:79
int vfs_stdnosync(struct mount *mp, int waitfor)
Definition: vfs_default.c:1211
int vop_stdpoll(struct vop_poll_args *ap)
Definition: vfs_default.c:566
void vput(struct vnode *vp)
Definition: vfs_subr.c:2428
int vop_stdgetwritemount(struct vop_getwritemount_args *ap)
Definition: vfs_default.c:583
static int vop_norename(struct vop_rename_args *)
Definition: vfs_default.c:234
int vn_open_cred(struct nameidata *ndp, int *flagp, int cmode, u_int vn_open_flags, struct ucred *cred, struct file *fp)
Definition: vfs_vnops.c:124
int vfs_stdinit(struct vfsconf *vfsp)
Definition: vfs_default.c:1242
void vfs_ref(struct mount *mp)
Definition: vfs_mount.c:429
static int vop_stdunset_text(struct vop_unset_text_args *ap)
Definition: vfs_default.c:1116
int vop_stdputpages(struct vop_putpages_args *ap)
Definition: vfs_default.c:749
int vfs_unixify_accmode(accmode_t *accmode)
Definition: vfs_subr.c:4725
int vop_stdpathconf(struct vop_pathconf_args *ap)
Definition: vfs_default.c:464
static int get_next_dirent(struct vnode *vp, struct dirent **dpp, char *dirbuf, int dirbuflen, off_t *off, char **cpos, int *len, int *eofflag, struct thread *td)
Definition: vfs_default.c:265
int vfs_stduninit(struct vfsconf *vfsp)
Definition: vfs_default.c:1250
int vop_enoent(struct vop_generic_args *ap)
Definition: vfs_default.c:179
int vop_stdadvlockpurge(struct vop_advlockpurge_args *ap)
Definition: vfs_default.c:446
int poll_no_poll(int events)
Definition: sys_generic.c:774
int vop_stdvptofh(struct vop_vptofh_args *ap)
Definition: vfs_default.c:765
static int vop_stdadd_writecount(struct vop_add_writecount_args *ap)
Definition: vfs_default.c:1132
int vfs_stdsync(struct mount *mp, int waitfor)
Definition: vfs_default.c:1174
static int vop_stdset_text(struct vop_set_text_args *ap)
Definition: vfs_default.c:1108
int vn_pollrecord(struct vnode *vp, struct thread *td, int events)
Definition: vfs_subr.c:3682
int vop_ebadf(struct vop_generic_args *ap)
Definition: vfs_default.c:158
int vop_stdlock(struct vop_lock1_args *ap)
Definition: vfs_default.c:507
void bawrite(struct buf *bp)
Definition: vfs_bio.c:1357
void free(void *addr, struct malloc_type *mtp)
Definition: kern_malloc.c:554
int vn_close(struct vnode *vp, int flags, struct ucred *file_cred, struct thread *td)
Definition: vfs_vnops.c:303
int printf(const char *fmt,...)
Definition: subr_prf.c:367
int vop_stdunlock(struct vop_unlock_args *ap)
Definition: vfs_default.c:524
int vop_enotty(struct vop_generic_args *ap)
Definition: vfs_default.c:165
static int vop_nolookup(struct vop_lookup_args *)
Definition: vfs_default.c:215
int vfs_stdfhtovp(struct mount *mp, struct fid *fhp, int flags, struct vnode **vpp)
Definition: vfs_default.c:1231
int vop_stdkqfilter(struct vop_kqfilter_args *ap)
Definition: vfs_default.c:742
int vfs_stdsysctl(struct mount *mp, fsctlop_t op, struct sysctl_req *req)
Definition: vfs_default.c:1272
void vrele(struct vnode *vp)
Definition: vfs_subr.c:2416
void lf_purgelocks(struct vnode *vp, struct lockf **statep)
Definition: kern_lockf.c:775
int vop_stdunp_connect(struct vop_unp_connect_args *ap)
Definition: vfs_default.c:1085
static int dirent_exists(struct vnode *vp, const char *dirname, struct thread *td)
Definition: vfs_default.c:327
static int vop_stdis_text(struct vop_is_text_args *ap)
Definition: vfs_default.c:1101
int vop_nopoll(struct vop_poll_args *ap)
Definition: vfs_default.c:550
void bremfree(struct buf *bp)
Definition: vfs_bio.c:846
int vop_eopnotsupp(struct vop_generic_args *ap)
Definition: vfs_default.c:148
int vfs_stdstatfs(struct mount *mp, struct statfs *sbp)
Definition: vfs_default.c:1154
int vop_stdunp_bind(struct vop_unp_bind_args *ap)
Definition: vfs_default.c:1077
int vop_stdbmap(struct vop_bmap_args *ap)
Definition: vfs_default.c:612
int vop_stdadvise(struct vop_advise_args *ap)
Definition: vfs_default.c:1025
int vop_einval(struct vop_generic_args *ap)
Definition: vfs_default.c:172