]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/kern/vfs_default.c
kdb: Modify securelevel policy
[FreeBSD/FreeBSD.git] / sys / kern / vfs_default.c
1 /*-
2  * SPDX-License-Identifier: BSD-3-Clause
3  *
4  * Copyright (c) 1989, 1993
5  *      The Regents of the University of California.  All rights reserved.
6  *
7  * This code is derived from software contributed
8  * to Berkeley by John Heidemann of the UCLA Ficus project.
9  *
10  * Source: * @(#)i405_init.c 2.10 92/04/27 UCLA Ficus project
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions
14  * are met:
15  * 1. Redistributions of source code must retain the above copyright
16  *    notice, this list of conditions and the following disclaimer.
17  * 2. Redistributions in binary form must reproduce the above copyright
18  *    notice, this list of conditions and the following disclaimer in the
19  *    documentation and/or other materials provided with the distribution.
20  * 3. Neither the name of the University nor the names of its contributors
21  *    may be used to endorse or promote products derived from this software
22  *    without specific prior written permission.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34  * SUCH DAMAGE.
35  */
36
37 #include <sys/cdefs.h>
38 __FBSDID("$FreeBSD$");
39
40 #include <sys/param.h>
41 #include <sys/systm.h>
42 #include <sys/bio.h>
43 #include <sys/buf.h>
44 #include <sys/conf.h>
45 #include <sys/event.h>
46 #include <sys/filio.h>
47 #include <sys/kernel.h>
48 #include <sys/limits.h>
49 #include <sys/lock.h>
50 #include <sys/lockf.h>
51 #include <sys/malloc.h>
52 #include <sys/mount.h>
53 #include <sys/namei.h>
54 #include <sys/rwlock.h>
55 #include <sys/fcntl.h>
56 #include <sys/unistd.h>
57 #include <sys/vnode.h>
58 #include <sys/dirent.h>
59 #include <sys/poll.h>
60 #include <sys/stat.h>
61 #include <security/audit/audit.h>
62 #include <sys/priv.h>
63
64 #include <security/mac/mac_framework.h>
65
66 #include <vm/vm.h>
67 #include <vm/vm_object.h>
68 #include <vm/vm_extern.h>
69 #include <vm/pmap.h>
70 #include <vm/vm_map.h>
71 #include <vm/vm_page.h>
72 #include <vm/vm_pager.h>
73 #include <vm/vnode_pager.h>
74
75 static int      vop_nolookup(struct vop_lookup_args *);
76 static int      vop_norename(struct vop_rename_args *);
77 static int      vop_nostrategy(struct vop_strategy_args *);
78 static int      get_next_dirent(struct vnode *vp, struct dirent **dpp,
79                                 char *dirbuf, int dirbuflen, off_t *off,
80                                 char **cpos, int *len, int *eofflag,
81                                 struct thread *td);
82 static int      dirent_exists(struct vnode *vp, const char *dirname,
83                               struct thread *td);
84
85 #define DIRENT_MINSIZE (sizeof(struct dirent) - (MAXNAMLEN+1) + 4)
86
87 static int vop_stdis_text(struct vop_is_text_args *ap);
88 static int vop_stdunset_text(struct vop_unset_text_args *ap);
89 static int vop_stdadd_writecount(struct vop_add_writecount_args *ap);
90 static int vop_stdcopy_file_range(struct vop_copy_file_range_args *ap);
91 static int vop_stdfdatasync(struct vop_fdatasync_args *ap);
92 static int vop_stdgetpages_async(struct vop_getpages_async_args *ap);
93 static int vop_stdread_pgcache(struct vop_read_pgcache_args *ap);
94 static int vop_stdstat(struct vop_stat_args *ap);
95 static int vop_stdvput_pair(struct vop_vput_pair_args *ap);
96
97 /*
98  * This vnode table stores what we want to do if the filesystem doesn't
99  * implement a particular VOP.
100  *
101  * If there is no specific entry here, we will return EOPNOTSUPP.
102  *
103  * Note that every filesystem has to implement either vop_access
104  * or vop_accessx; failing to do so will result in immediate crash
105  * due to stack overflow, as vop_stdaccess() calls vop_stdaccessx(),
106  * which calls vop_stdaccess() etc.
107  */
108
109 struct vop_vector default_vnodeops = {
110         .vop_default =          NULL,
111         .vop_bypass =           VOP_EOPNOTSUPP,
112
113         .vop_access =           vop_stdaccess,
114         .vop_accessx =          vop_stdaccessx,
115         .vop_advise =           vop_stdadvise,
116         .vop_advlock =          vop_stdadvlock,
117         .vop_advlockasync =     vop_stdadvlockasync,
118         .vop_advlockpurge =     vop_stdadvlockpurge,
119         .vop_allocate =         vop_stdallocate,
120         .vop_deallocate =       vop_stddeallocate,
121         .vop_bmap =             vop_stdbmap,
122         .vop_close =            VOP_NULL,
123         .vop_fsync =            VOP_NULL,
124         .vop_stat =             vop_stdstat,
125         .vop_fdatasync =        vop_stdfdatasync,
126         .vop_getpages =         vop_stdgetpages,
127         .vop_getpages_async =   vop_stdgetpages_async,
128         .vop_getwritemount =    vop_stdgetwritemount,
129         .vop_inactive =         VOP_NULL,
130         .vop_need_inactive =    vop_stdneed_inactive,
131         .vop_ioctl =            vop_stdioctl,
132         .vop_kqfilter =         vop_stdkqfilter,
133         .vop_islocked =         vop_stdislocked,
134         .vop_lock1 =            vop_stdlock,
135         .vop_lookup =           vop_nolookup,
136         .vop_open =             VOP_NULL,
137         .vop_pathconf =         VOP_EINVAL,
138         .vop_poll =             vop_nopoll,
139         .vop_putpages =         vop_stdputpages,
140         .vop_readlink =         VOP_EINVAL,
141         .vop_read_pgcache =     vop_stdread_pgcache,
142         .vop_rename =           vop_norename,
143         .vop_revoke =           VOP_PANIC,
144         .vop_strategy =         vop_nostrategy,
145         .vop_unlock =           vop_stdunlock,
146         .vop_vptocnp =          vop_stdvptocnp,
147         .vop_vptofh =           vop_stdvptofh,
148         .vop_unp_bind =         vop_stdunp_bind,
149         .vop_unp_connect =      vop_stdunp_connect,
150         .vop_unp_detach =       vop_stdunp_detach,
151         .vop_is_text =          vop_stdis_text,
152         .vop_set_text =         vop_stdset_text,
153         .vop_unset_text =       vop_stdunset_text,
154         .vop_add_writecount =   vop_stdadd_writecount,
155         .vop_copy_file_range =  vop_stdcopy_file_range,
156         .vop_vput_pair =        vop_stdvput_pair,
157 };
158 VFS_VOP_VECTOR_REGISTER(default_vnodeops);
159
160 /*
161  * Series of placeholder functions for various error returns for
162  * VOPs.
163  */
164
165 int
166 vop_eopnotsupp(struct vop_generic_args *ap)
167 {
168         /*
169         printf("vop_notsupp[%s]\n", ap->a_desc->vdesc_name);
170         */
171
172         return (EOPNOTSUPP);
173 }
174
175 int
176 vop_ebadf(struct vop_generic_args *ap)
177 {
178
179         return (EBADF);
180 }
181
182 int
183 vop_enotty(struct vop_generic_args *ap)
184 {
185
186         return (ENOTTY);
187 }
188
189 int
190 vop_einval(struct vop_generic_args *ap)
191 {
192
193         return (EINVAL);
194 }
195
196 int
197 vop_enoent(struct vop_generic_args *ap)
198 {
199
200         return (ENOENT);
201 }
202
203 int
204 vop_eagain(struct vop_generic_args *ap)
205 {
206
207         return (EAGAIN);
208 }
209
210 int
211 vop_null(struct vop_generic_args *ap)
212 {
213
214         return (0);
215 }
216
217 /*
218  * Helper function to panic on some bad VOPs in some filesystems.
219  */
220 int
221 vop_panic(struct vop_generic_args *ap)
222 {
223
224         panic("filesystem goof: vop_panic[%s]", ap->a_desc->vdesc_name);
225 }
226
227 /*
228  * vop_std<something> and vop_no<something> are default functions for use by
229  * filesystems that need the "default reasonable" implementation for a
230  * particular operation.
231  *
232  * The documentation for the operations they implement exists (if it exists)
233  * in the VOP_<SOMETHING>(9) manpage (all uppercase).
234  */
235
236 /*
237  * Default vop for filesystems that do not support name lookup
238  */
239 static int
240 vop_nolookup(struct vop_lookup_args *ap)
241 {
242
243         *ap->a_vpp = NULL;
244         return (ENOTDIR);
245 }
246
247 /*
248  * vop_norename:
249  *
250  * Handle unlock and reference counting for arguments of vop_rename
251  * for filesystems that do not implement rename operation.
252  */
253 static int
254 vop_norename(struct vop_rename_args *ap)
255 {
256
257         vop_rename_fail(ap);
258         return (EOPNOTSUPP);
259 }
260
261 /*
262  *      vop_nostrategy:
263  *
264  *      Strategy routine for VFS devices that have none.
265  *
266  *      BIO_ERROR and B_INVAL must be cleared prior to calling any strategy
267  *      routine.  Typically this is done for a BIO_READ strategy call.
268  *      Typically B_INVAL is assumed to already be clear prior to a write
269  *      and should not be cleared manually unless you just made the buffer
270  *      invalid.  BIO_ERROR should be cleared either way.
271  */
272
273 static int
274 vop_nostrategy (struct vop_strategy_args *ap)
275 {
276         printf("No strategy for buffer at %p\n", ap->a_bp);
277         vn_printf(ap->a_vp, "vnode ");
278         ap->a_bp->b_ioflags |= BIO_ERROR;
279         ap->a_bp->b_error = EOPNOTSUPP;
280         bufdone(ap->a_bp);
281         return (EOPNOTSUPP);
282 }
283
284 static int
285 get_next_dirent(struct vnode *vp, struct dirent **dpp, char *dirbuf,
286                 int dirbuflen, off_t *off, char **cpos, int *len,
287                 int *eofflag, struct thread *td)
288 {
289         int error, reclen;
290         struct uio uio;
291         struct iovec iov;
292         struct dirent *dp;
293
294         KASSERT(VOP_ISLOCKED(vp), ("vp %p is not locked", vp));
295         KASSERT(vp->v_type == VDIR, ("vp %p is not a directory", vp));
296
297         if (*len == 0) {
298                 iov.iov_base = dirbuf;
299                 iov.iov_len = dirbuflen;
300
301                 uio.uio_iov = &iov;
302                 uio.uio_iovcnt = 1;
303                 uio.uio_offset = *off;
304                 uio.uio_resid = dirbuflen;
305                 uio.uio_segflg = UIO_SYSSPACE;
306                 uio.uio_rw = UIO_READ;
307                 uio.uio_td = td;
308
309                 *eofflag = 0;
310
311 #ifdef MAC
312                 error = mac_vnode_check_readdir(td->td_ucred, vp);
313                 if (error == 0)
314 #endif
315                         error = VOP_READDIR(vp, &uio, td->td_ucred, eofflag,
316                                 NULL, NULL);
317                 if (error)
318                         return (error);
319
320                 *off = uio.uio_offset;
321
322                 *cpos = dirbuf;
323                 *len = (dirbuflen - uio.uio_resid);
324
325                 if (*len == 0)
326                         return (ENOENT);
327         }
328
329         dp = (struct dirent *)(*cpos);
330         reclen = dp->d_reclen;
331         *dpp = dp;
332
333         /* check for malformed directory.. */
334         if (reclen < DIRENT_MINSIZE)
335                 return (EINVAL);
336
337         *cpos += reclen;
338         *len -= reclen;
339
340         return (0);
341 }
342
343 /*
344  * Check if a named file exists in a given directory vnode.
345  */
346 static int
347 dirent_exists(struct vnode *vp, const char *dirname, struct thread *td)
348 {
349         char *dirbuf, *cpos;
350         int error, eofflag, dirbuflen, len, found;
351         off_t off;
352         struct dirent *dp;
353         struct vattr va;
354
355         KASSERT(VOP_ISLOCKED(vp), ("vp %p is not locked", vp));
356         KASSERT(vp->v_type == VDIR, ("vp %p is not a directory", vp));
357
358         found = 0;
359
360         error = VOP_GETATTR(vp, &va, td->td_ucred);
361         if (error)
362                 return (found);
363
364         dirbuflen = DEV_BSIZE;
365         if (dirbuflen < va.va_blocksize)
366                 dirbuflen = va.va_blocksize;
367         dirbuf = (char *)malloc(dirbuflen, M_TEMP, M_WAITOK);
368
369         off = 0;
370         len = 0;
371         do {
372                 error = get_next_dirent(vp, &dp, dirbuf, dirbuflen, &off,
373                                         &cpos, &len, &eofflag, td);
374                 if (error)
375                         goto out;
376
377                 if (dp->d_type != DT_WHT && dp->d_fileno != 0 &&
378                     strcmp(dp->d_name, dirname) == 0) {
379                         found = 1;
380                         goto out;
381                 }
382         } while (len > 0 || !eofflag);
383
384 out:
385         free(dirbuf, M_TEMP);
386         return (found);
387 }
388
389 int
390 vop_stdaccess(struct vop_access_args *ap)
391 {
392
393         KASSERT((ap->a_accmode & ~(VEXEC | VWRITE | VREAD | VADMIN |
394             VAPPEND)) == 0, ("invalid bit in accmode"));
395
396         return (VOP_ACCESSX(ap->a_vp, ap->a_accmode, ap->a_cred, ap->a_td));
397 }
398
399 int
400 vop_stdaccessx(struct vop_accessx_args *ap)
401 {
402         int error;
403         accmode_t accmode = ap->a_accmode;
404
405         error = vfs_unixify_accmode(&accmode);
406         if (error != 0)
407                 return (error);
408
409         if (accmode == 0)
410                 return (0);
411
412         return (VOP_ACCESS(ap->a_vp, accmode, ap->a_cred, ap->a_td));
413 }
414
415 /*
416  * Advisory record locking support
417  */
418 int
419 vop_stdadvlock(struct vop_advlock_args *ap)
420 {
421         struct vnode *vp;
422         struct mount *mp;
423         struct vattr vattr;
424         int error;
425
426         vp = ap->a_vp;
427
428         /*
429          * Provide atomicity of open(O_CREAT | O_EXCL | O_EXLOCK) for
430          * local filesystems.  See vn_open_cred() for reciprocal part.
431          */
432         mp = vp->v_mount;
433         if (mp != NULL && (mp->mnt_flag & MNT_LOCAL) != 0 &&
434             ap->a_op == F_SETLK && (ap->a_flags & F_FIRSTOPEN) == 0) {
435                 VI_LOCK(vp);
436                 while ((vp->v_iflag & VI_FOPENING) != 0)
437                         msleep(vp, VI_MTX(vp), PLOCK, "lockfo", 0);
438                 VI_UNLOCK(vp);
439         }
440
441         if (ap->a_fl->l_whence == SEEK_END) {
442                 /*
443                  * The NFSv4 server must avoid doing a vn_lock() here, since it
444                  * can deadlock the nfsd threads, due to a LOR.  Fortunately
445                  * the NFSv4 server always uses SEEK_SET and this code is
446                  * only required for the SEEK_END case.
447                  */
448                 vn_lock(vp, LK_SHARED | LK_RETRY);
449                 error = VOP_GETATTR(vp, &vattr, curthread->td_ucred);
450                 VOP_UNLOCK(vp);
451                 if (error)
452                         return (error);
453         } else
454                 vattr.va_size = 0;
455
456         return (lf_advlock(ap, &(vp->v_lockf), vattr.va_size));
457 }
458
459 int
460 vop_stdadvlockasync(struct vop_advlockasync_args *ap)
461 {
462         struct vnode *vp;
463         struct vattr vattr;
464         int error;
465
466         vp = ap->a_vp;
467         if (ap->a_fl->l_whence == SEEK_END) {
468                 /* The size argument is only needed for SEEK_END. */
469                 vn_lock(vp, LK_SHARED | LK_RETRY);
470                 error = VOP_GETATTR(vp, &vattr, curthread->td_ucred);
471                 VOP_UNLOCK(vp);
472                 if (error)
473                         return (error);
474         } else
475                 vattr.va_size = 0;
476
477         return (lf_advlockasync(ap, &(vp->v_lockf), vattr.va_size));
478 }
479
480 int
481 vop_stdadvlockpurge(struct vop_advlockpurge_args *ap)
482 {
483         struct vnode *vp;
484
485         vp = ap->a_vp;
486         lf_purgelocks(vp, &vp->v_lockf);
487         return (0);
488 }
489
490 /*
491  * vop_stdpathconf:
492  *
493  * Standard implementation of POSIX pathconf, to get information about limits
494  * for a filesystem.
495  * Override per filesystem for the case where the filesystem has smaller
496  * limits.
497  */
498 int
499 vop_stdpathconf(struct vop_pathconf_args *ap)
500 {
501
502         switch (ap->a_name) {
503                 case _PC_ASYNC_IO:
504                         *ap->a_retval = _POSIX_ASYNCHRONOUS_IO;
505                         return (0);
506                 case _PC_PATH_MAX:
507                         *ap->a_retval = PATH_MAX;
508                         return (0);
509                 case _PC_ACL_EXTENDED:
510                 case _PC_ACL_NFS4:
511                 case _PC_CAP_PRESENT:
512                 case _PC_DEALLOC_PRESENT:
513                 case _PC_INF_PRESENT:
514                 case _PC_MAC_PRESENT:
515                         *ap->a_retval = 0;
516                         return (0);
517                 default:
518                         return (EINVAL);
519         }
520         /* NOTREACHED */
521 }
522
523 /*
524  * Standard lock, unlock and islocked functions.
525  */
526 int
527 vop_stdlock(struct vop_lock1_args *ap)
528 {
529         struct vnode *vp = ap->a_vp;
530         struct mtx *ilk;
531
532         ilk = VI_MTX(vp);
533         return (lockmgr_lock_flags(vp->v_vnlock, ap->a_flags,
534             &ilk->lock_object, ap->a_file, ap->a_line));
535 }
536
537 /* See above. */
538 int
539 vop_stdunlock(struct vop_unlock_args *ap)
540 {
541         struct vnode *vp = ap->a_vp;
542
543         return (lockmgr_unlock(vp->v_vnlock));
544 }
545
546 /* See above. */
547 int
548 vop_stdislocked(struct vop_islocked_args *ap)
549 {
550
551         return (lockstatus(ap->a_vp->v_vnlock));
552 }
553
554 /*
555  * Variants of the above set.
556  *
557  * Differences are:
558  * - shared locking disablement is not supported
559  * - v_vnlock pointer is not honored
560  */
561 int
562 vop_lock(struct vop_lock1_args *ap)
563 {
564         struct vnode *vp = ap->a_vp;
565         int flags = ap->a_flags;
566         struct mtx *ilk;
567
568         MPASS(vp->v_vnlock == &vp->v_lock);
569
570         if (__predict_false((flags & ~(LK_TYPE_MASK | LK_NODDLKTREAT | LK_RETRY)) != 0))
571                 goto other;
572
573         switch (flags & LK_TYPE_MASK) {
574         case LK_SHARED:
575                 return (lockmgr_slock(&vp->v_lock, flags, ap->a_file, ap->a_line));
576         case LK_EXCLUSIVE:
577                 return (lockmgr_xlock(&vp->v_lock, flags, ap->a_file, ap->a_line));
578         }
579 other:
580         ilk = VI_MTX(vp);
581         return (lockmgr_lock_flags(&vp->v_lock, flags,
582             &ilk->lock_object, ap->a_file, ap->a_line));
583 }
584
585 int
586 vop_unlock(struct vop_unlock_args *ap)
587 {
588         struct vnode *vp = ap->a_vp;
589
590         MPASS(vp->v_vnlock == &vp->v_lock);
591
592         return (lockmgr_unlock(&vp->v_lock));
593 }
594
595 int
596 vop_islocked(struct vop_islocked_args *ap)
597 {
598         struct vnode *vp = ap->a_vp;
599
600         MPASS(vp->v_vnlock == &vp->v_lock);
601
602         return (lockstatus(&vp->v_lock));
603 }
604
605 /*
606  * Return true for select/poll.
607  */
608 int
609 vop_nopoll(struct vop_poll_args *ap)
610 {
611
612         if (ap->a_events & ~POLLSTANDARD)
613                 return (POLLNVAL);
614         return (ap->a_events & (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM));
615 }
616
617 /*
618  * Implement poll for local filesystems that support it.
619  */
620 int
621 vop_stdpoll(struct vop_poll_args *ap)
622 {
623         if (ap->a_events & ~POLLSTANDARD)
624                 return (vn_pollrecord(ap->a_vp, ap->a_td, ap->a_events));
625         return (ap->a_events & (POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM));
626 }
627
628 /*
629  * Return our mount point, as we will take charge of the writes.
630  */
631 int
632 vop_stdgetwritemount(struct vop_getwritemount_args *ap)
633 {
634         struct mount *mp;
635         struct vnode *vp;
636
637         /*
638          * Note that having a reference does not prevent forced unmount from
639          * setting ->v_mount to NULL after the lock gets released. This is of
640          * no consequence for typical consumers (most notably vn_start_write)
641          * since in this case the vnode is VIRF_DOOMED. Unmount might have
642          * progressed far enough that its completion is only delayed by the
643          * reference obtained here. The consumer only needs to concern itself
644          * with releasing it.
645          */
646         vp = ap->a_vp;
647         mp = vfs_ref_from_vp(vp);
648         *(ap->a_mpp) = mp;
649         return (0);
650 }
651
652 /*
653  * If the file system doesn't implement VOP_BMAP, then return sensible defaults:
654  * - Return the vnode's bufobj instead of any underlying device's bufobj
655  * - Calculate the physical block number as if there were equal size
656  *   consecutive blocks, but
657  * - Report no contiguous runs of blocks.
658  */
659 int
660 vop_stdbmap(struct vop_bmap_args *ap)
661 {
662
663         if (ap->a_bop != NULL)
664                 *ap->a_bop = &ap->a_vp->v_bufobj;
665         if (ap->a_bnp != NULL)
666                 *ap->a_bnp = ap->a_bn * btodb(ap->a_vp->v_mount->mnt_stat.f_iosize);
667         if (ap->a_runp != NULL)
668                 *ap->a_runp = 0;
669         if (ap->a_runb != NULL)
670                 *ap->a_runb = 0;
671         return (0);
672 }
673
674 int
675 vop_stdfsync(struct vop_fsync_args *ap)
676 {
677
678         return (vn_fsync_buf(ap->a_vp, ap->a_waitfor));
679 }
680
681 static int
682 vop_stdfdatasync(struct vop_fdatasync_args *ap)
683 {
684
685         return (VOP_FSYNC(ap->a_vp, MNT_WAIT, ap->a_td));
686 }
687
688 int
689 vop_stdfdatasync_buf(struct vop_fdatasync_args *ap)
690 {
691
692         return (vn_fsync_buf(ap->a_vp, MNT_WAIT));
693 }
694
695 /* XXX Needs good comment and more info in the manpage (VOP_GETPAGES(9)). */
696 int
697 vop_stdgetpages(struct vop_getpages_args *ap)
698 {
699
700         return vnode_pager_generic_getpages(ap->a_vp, ap->a_m,
701             ap->a_count, ap->a_rbehind, ap->a_rahead, NULL, NULL);
702 }
703
704 static int
705 vop_stdgetpages_async(struct vop_getpages_async_args *ap)
706 {
707         int error;
708
709         error = VOP_GETPAGES(ap->a_vp, ap->a_m, ap->a_count, ap->a_rbehind,
710             ap->a_rahead);
711         if (ap->a_iodone != NULL)
712                 ap->a_iodone(ap->a_arg, ap->a_m, ap->a_count, error);
713         return (error);
714 }
715
716 int
717 vop_stdkqfilter(struct vop_kqfilter_args *ap)
718 {
719         return vfs_kqfilter(ap);
720 }
721
722 /* XXX Needs good comment and more info in the manpage (VOP_PUTPAGES(9)). */
723 int
724 vop_stdputpages(struct vop_putpages_args *ap)
725 {
726
727         return vnode_pager_generic_putpages(ap->a_vp, ap->a_m, ap->a_count,
728              ap->a_sync, ap->a_rtvals);
729 }
730
731 int
732 vop_stdvptofh(struct vop_vptofh_args *ap)
733 {
734         return (EOPNOTSUPP);
735 }
736
737 int
738 vop_stdvptocnp(struct vop_vptocnp_args *ap)
739 {
740         struct vnode *vp = ap->a_vp;
741         struct vnode **dvp = ap->a_vpp;
742         struct ucred *cred;
743         char *buf = ap->a_buf;
744         size_t *buflen = ap->a_buflen;
745         char *dirbuf, *cpos;
746         int i, error, eofflag, dirbuflen, flags, locked, len, covered;
747         off_t off;
748         ino_t fileno;
749         struct vattr va;
750         struct nameidata nd;
751         struct thread *td;
752         struct dirent *dp;
753         struct vnode *mvp;
754
755         i = *buflen;
756         error = 0;
757         covered = 0;
758         td = curthread;
759         cred = td->td_ucred;
760
761         if (vp->v_type != VDIR)
762                 return (ENOENT);
763
764         error = VOP_GETATTR(vp, &va, cred);
765         if (error)
766                 return (error);
767
768         VREF(vp);
769         locked = VOP_ISLOCKED(vp);
770         VOP_UNLOCK(vp);
771         NDINIT_ATVP(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF, UIO_SYSSPACE,
772             "..", vp);
773         flags = FREAD;
774         error = vn_open_cred(&nd, &flags, 0, VN_OPEN_NOAUDIT, cred, NULL);
775         if (error) {
776                 vn_lock(vp, locked | LK_RETRY);
777                 return (error);
778         }
779         NDFREE_PNBUF(&nd);
780
781         mvp = *dvp = nd.ni_vp;
782
783         if (vp->v_mount != (*dvp)->v_mount &&
784             ((*dvp)->v_vflag & VV_ROOT) &&
785             ((*dvp)->v_mount->mnt_flag & MNT_UNION)) {
786                 *dvp = (*dvp)->v_mount->mnt_vnodecovered;
787                 VREF(mvp);
788                 VOP_UNLOCK(mvp);
789                 vn_close(mvp, FREAD, cred, td);
790                 VREF(*dvp);
791                 vn_lock(*dvp, LK_SHARED | LK_RETRY);
792                 covered = 1;
793         }
794
795         fileno = va.va_fileid;
796
797         dirbuflen = DEV_BSIZE;
798         if (dirbuflen < va.va_blocksize)
799                 dirbuflen = va.va_blocksize;
800         dirbuf = (char *)malloc(dirbuflen, M_TEMP, M_WAITOK);
801
802         if ((*dvp)->v_type != VDIR) {
803                 error = ENOENT;
804                 goto out;
805         }
806
807         off = 0;
808         len = 0;
809         do {
810                 /* call VOP_READDIR of parent */
811                 error = get_next_dirent(*dvp, &dp, dirbuf, dirbuflen, &off,
812                                         &cpos, &len, &eofflag, td);
813                 if (error)
814                         goto out;
815
816                 if ((dp->d_type != DT_WHT) &&
817                     (dp->d_fileno == fileno)) {
818                         if (covered) {
819                                 VOP_UNLOCK(*dvp);
820                                 vn_lock(mvp, LK_SHARED | LK_RETRY);
821                                 if (dirent_exists(mvp, dp->d_name, td)) {
822                                         error = ENOENT;
823                                         VOP_UNLOCK(mvp);
824                                         vn_lock(*dvp, LK_SHARED | LK_RETRY);
825                                         goto out;
826                                 }
827                                 VOP_UNLOCK(mvp);
828                                 vn_lock(*dvp, LK_SHARED | LK_RETRY);
829                         }
830                         i -= dp->d_namlen;
831
832                         if (i < 0) {
833                                 error = ENOMEM;
834                                 goto out;
835                         }
836                         if (dp->d_namlen == 1 && dp->d_name[0] == '.') {
837                                 error = ENOENT;
838                         } else {
839                                 bcopy(dp->d_name, buf + i, dp->d_namlen);
840                                 error = 0;
841                         }
842                         goto out;
843                 }
844         } while (len > 0 || !eofflag);
845         error = ENOENT;
846
847 out:
848         free(dirbuf, M_TEMP);
849         if (!error) {
850                 *buflen = i;
851                 vref(*dvp);
852         }
853         if (covered) {
854                 vput(*dvp);
855                 vrele(mvp);
856         } else {
857                 VOP_UNLOCK(mvp);
858                 vn_close(mvp, FREAD, cred, td);
859         }
860         vn_lock(vp, locked | LK_RETRY);
861         return (error);
862 }
863
864 int
865 vop_stdallocate(struct vop_allocate_args *ap)
866 {
867 #ifdef __notyet__
868         struct statfs *sfs;
869         off_t maxfilesize = 0;
870 #endif
871         struct iovec aiov;
872         struct vattr vattr, *vap;
873         struct uio auio;
874         off_t fsize, len, cur, offset;
875         uint8_t *buf;
876         struct thread *td;
877         struct vnode *vp;
878         size_t iosize;
879         int error;
880
881         buf = NULL;
882         error = 0;
883         td = curthread;
884         vap = &vattr;
885         vp = ap->a_vp;
886         len = *ap->a_len;
887         offset = *ap->a_offset;
888
889         error = VOP_GETATTR(vp, vap, ap->a_cred);
890         if (error != 0)
891                 goto out;
892         fsize = vap->va_size;
893         iosize = vap->va_blocksize;
894         if (iosize == 0)
895                 iosize = BLKDEV_IOSIZE;
896         if (iosize > maxphys)
897                 iosize = maxphys;
898         buf = malloc(iosize, M_TEMP, M_WAITOK);
899
900 #ifdef __notyet__
901         /*
902          * Check if the filesystem sets f_maxfilesize; if not use
903          * VOP_SETATTR to perform the check.
904          */
905         sfs = malloc(sizeof(struct statfs), M_STATFS, M_WAITOK);
906         error = VFS_STATFS(vp->v_mount, sfs, td);
907         if (error == 0)
908                 maxfilesize = sfs->f_maxfilesize;
909         free(sfs, M_STATFS);
910         if (error != 0)
911                 goto out;
912         if (maxfilesize) {
913                 if (offset > maxfilesize || len > maxfilesize ||
914                     offset + len > maxfilesize) {
915                         error = EFBIG;
916                         goto out;
917                 }
918         } else
919 #endif
920         if (offset + len > vap->va_size) {
921                 /*
922                  * Test offset + len against the filesystem's maxfilesize.
923                  */
924                 VATTR_NULL(vap);
925                 vap->va_size = offset + len;
926                 error = VOP_SETATTR(vp, vap, ap->a_cred);
927                 if (error != 0)
928                         goto out;
929                 VATTR_NULL(vap);
930                 vap->va_size = fsize;
931                 error = VOP_SETATTR(vp, vap, ap->a_cred);
932                 if (error != 0)
933                         goto out;
934         }
935
936         for (;;) {
937                 /*
938                  * Read and write back anything below the nominal file
939                  * size.  There's currently no way outside the filesystem
940                  * to know whether this area is sparse or not.
941                  */
942                 cur = iosize;
943                 if ((offset % iosize) != 0)
944                         cur -= (offset % iosize);
945                 if (cur > len)
946                         cur = len;
947                 if (offset < fsize) {
948                         aiov.iov_base = buf;
949                         aiov.iov_len = cur;
950                         auio.uio_iov = &aiov;
951                         auio.uio_iovcnt = 1;
952                         auio.uio_offset = offset;
953                         auio.uio_resid = cur;
954                         auio.uio_segflg = UIO_SYSSPACE;
955                         auio.uio_rw = UIO_READ;
956                         auio.uio_td = td;
957                         error = VOP_READ(vp, &auio, ap->a_ioflag, ap->a_cred);
958                         if (error != 0)
959                                 break;
960                         if (auio.uio_resid > 0) {
961                                 bzero(buf + cur - auio.uio_resid,
962                                     auio.uio_resid);
963                         }
964                 } else {
965                         bzero(buf, cur);
966                 }
967
968                 aiov.iov_base = buf;
969                 aiov.iov_len = cur;
970                 auio.uio_iov = &aiov;
971                 auio.uio_iovcnt = 1;
972                 auio.uio_offset = offset;
973                 auio.uio_resid = cur;
974                 auio.uio_segflg = UIO_SYSSPACE;
975                 auio.uio_rw = UIO_WRITE;
976                 auio.uio_td = td;
977
978                 error = VOP_WRITE(vp, &auio, ap->a_ioflag, ap->a_cred);
979                 if (error != 0)
980                         break;
981
982                 len -= cur;
983                 offset += cur;
984                 if (len == 0)
985                         break;
986                 if (should_yield())
987                         break;
988         }
989
990  out:
991         *ap->a_len = len;
992         *ap->a_offset = offset;
993         free(buf, M_TEMP);
994         return (error);
995 }
996
997 static int
998 vp_zerofill(struct vnode *vp, struct vattr *vap, off_t *offsetp, off_t *lenp,
999     int ioflag, struct ucred *cred)
1000 {
1001         int iosize;
1002         int error = 0;
1003         struct iovec aiov;
1004         struct uio auio;
1005         struct thread *td;
1006         off_t offset, len;
1007
1008         iosize = vap->va_blocksize;
1009         td = curthread;
1010         offset = *offsetp;
1011         len = *lenp;
1012
1013         if (iosize == 0)
1014                 iosize = BLKDEV_IOSIZE;
1015         /* If va_blocksize is 512 bytes, iosize will be 4 kilobytes */
1016         iosize = min(iosize * 8, ZERO_REGION_SIZE);
1017
1018         while (len > 0) {
1019                 int xfersize = iosize;
1020                 if (offset % iosize != 0)
1021                         xfersize -= offset % iosize;
1022                 if (xfersize > len)
1023                         xfersize = len;
1024
1025                 aiov.iov_base = __DECONST(void *, zero_region);
1026                 aiov.iov_len = xfersize;
1027                 auio.uio_iov = &aiov;
1028                 auio.uio_iovcnt = 1;
1029                 auio.uio_offset = offset;
1030                 auio.uio_resid = xfersize;
1031                 auio.uio_segflg = UIO_SYSSPACE;
1032                 auio.uio_rw = UIO_WRITE;
1033                 auio.uio_td = td;
1034
1035                 error = VOP_WRITE(vp, &auio, ioflag, cred);
1036                 if (error != 0) {
1037                         len -= xfersize - auio.uio_resid;
1038                         offset += xfersize - auio.uio_resid;
1039                         break;
1040                 }
1041
1042                 len -= xfersize;
1043                 offset += xfersize;
1044         }
1045
1046         *offsetp = offset;
1047         *lenp = len;
1048         return (error);
1049 }
1050
1051 int
1052 vop_stddeallocate(struct vop_deallocate_args *ap)
1053 {
1054         struct vnode *vp;
1055         off_t offset, len;
1056         struct ucred *cred;
1057         int error;
1058         struct vattr va;
1059         off_t noff, xfersize, rem;
1060
1061         vp = ap->a_vp;
1062         offset = *ap->a_offset;
1063         cred = ap->a_cred;
1064
1065         error = VOP_GETATTR(vp, &va, cred);
1066         if (error)
1067                 return (error);
1068
1069         len = omin((off_t)va.va_size - offset, *ap->a_len);
1070         while (len > 0) {
1071                 noff = offset;
1072                 error = vn_bmap_seekhole_locked(vp, FIOSEEKDATA, &noff, cred);
1073                 if (error) {
1074                         if (error != ENXIO)
1075                                 /* XXX: Is it okay to fallback further? */
1076                                 goto out;
1077
1078                         /*
1079                          * No more data region to be filled
1080                          */
1081                         offset += len;
1082                         len = 0;
1083                         error = 0;
1084                         break;
1085                 }
1086                 KASSERT(noff >= offset, ("FIOSEEKDATA going backward"));
1087                 if (noff != offset) {
1088                         xfersize = omin(noff - offset, len);
1089                         len -= xfersize;
1090                         offset += xfersize;
1091                         if (len == 0)
1092                                 break;
1093                 }
1094                 error = vn_bmap_seekhole_locked(vp, FIOSEEKHOLE, &noff, cred);
1095                 if (error)
1096                         goto out;
1097
1098                 /* Fill zeroes */
1099                 xfersize = rem = omin(noff - offset, len);
1100                 error = vp_zerofill(vp, &va, &offset, &rem, ap->a_ioflag, cred);
1101                 if (error) {
1102                         len -= xfersize - rem;
1103                         goto out;
1104                 }
1105
1106                 len -= xfersize;
1107                 if (should_yield())
1108                         break;
1109         }
1110         /* Handle the case when offset is beyond EOF */
1111         if (len < 0)
1112                 len = 0;
1113 out:
1114         *ap->a_offset = offset;
1115         *ap->a_len = len;
1116         return (error);
1117 }
1118
1119 int
1120 vop_stdadvise(struct vop_advise_args *ap)
1121 {
1122         struct vnode *vp;
1123         struct bufobj *bo;
1124         daddr_t startn, endn;
1125         off_t bstart, bend, start, end;
1126         int bsize, error;
1127
1128         vp = ap->a_vp;
1129         switch (ap->a_advice) {
1130         case POSIX_FADV_WILLNEED:
1131                 /*
1132                  * Do nothing for now.  Filesystems should provide a
1133                  * custom method which starts an asynchronous read of
1134                  * the requested region.
1135                  */
1136                 error = 0;
1137                 break;
1138         case POSIX_FADV_DONTNEED:
1139                 error = 0;
1140                 vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
1141                 if (VN_IS_DOOMED(vp)) {
1142                         VOP_UNLOCK(vp);
1143                         break;
1144                 }
1145
1146                 /*
1147                  * Round to block boundaries (and later possibly further to
1148                  * page boundaries).  Applications cannot reasonably be aware  
1149                  * of the boundaries, and the rounding must be to expand at
1150                  * both extremities to cover enough.  It still doesn't cover
1151                  * read-ahead.  For partial blocks, this gives unnecessary
1152                  * discarding of buffers but is efficient enough since the
1153                  * pages usually remain in VMIO for some time.
1154                  */
1155                 bsize = vp->v_bufobj.bo_bsize;
1156                 bstart = rounddown(ap->a_start, bsize);
1157                 bend = roundup(ap->a_end, bsize);
1158
1159                 /*
1160                  * Deactivate pages in the specified range from the backing VM
1161                  * object.  Pages that are resident in the buffer cache will
1162                  * remain wired until their corresponding buffers are released
1163                  * below.
1164                  */
1165                 if (vp->v_object != NULL) {
1166                         start = trunc_page(bstart);
1167                         end = round_page(bend);
1168                         VM_OBJECT_RLOCK(vp->v_object);
1169                         vm_object_page_noreuse(vp->v_object, OFF_TO_IDX(start),
1170                             OFF_TO_IDX(end));
1171                         VM_OBJECT_RUNLOCK(vp->v_object);
1172                 }
1173
1174                 bo = &vp->v_bufobj;
1175                 BO_RLOCK(bo);
1176                 startn = bstart / bsize;
1177                 endn = bend / bsize;
1178                 error = bnoreuselist(&bo->bo_clean, bo, startn, endn);
1179                 if (error == 0)
1180                         error = bnoreuselist(&bo->bo_dirty, bo, startn, endn);
1181                 BO_RUNLOCK(bo);
1182                 VOP_UNLOCK(vp);
1183                 break;
1184         default:
1185                 error = EINVAL;
1186                 break;
1187         }
1188         return (error);
1189 }
1190
1191 int
1192 vop_stdunp_bind(struct vop_unp_bind_args *ap)
1193 {
1194
1195         ap->a_vp->v_unpcb = ap->a_unpcb;
1196         return (0);
1197 }
1198
1199 int
1200 vop_stdunp_connect(struct vop_unp_connect_args *ap)
1201 {
1202
1203         *ap->a_unpcb = ap->a_vp->v_unpcb;
1204         return (0);
1205 }
1206
1207 int
1208 vop_stdunp_detach(struct vop_unp_detach_args *ap)
1209 {
1210
1211         ap->a_vp->v_unpcb = NULL;
1212         return (0);
1213 }
1214
1215 static int
1216 vop_stdis_text(struct vop_is_text_args *ap)
1217 {
1218
1219         return (atomic_load_int(&ap->a_vp->v_writecount) < 0);
1220 }
1221
1222 int
1223 vop_stdset_text(struct vop_set_text_args *ap)
1224 {
1225         struct vnode *vp;
1226         int n;
1227         bool gotref;
1228
1229         vp = ap->a_vp;
1230
1231         n = atomic_load_int(&vp->v_writecount);
1232         for (;;) {
1233                 if (__predict_false(n > 0)) {
1234                         return (ETXTBSY);
1235                 }
1236
1237                 /*
1238                  * Transition point, we may need to grab a reference on the vnode.
1239                  *
1240                  * Take the ref early As a safety measure against bogus calls
1241                  * to vop_stdunset_text.
1242                  */
1243                 if (n == 0) {
1244                         gotref = false;
1245                         if ((vn_irflag_read(vp) & VIRF_TEXT_REF) != 0) {
1246                                 vref(vp);
1247                                 gotref = true;
1248                         }
1249                         if (atomic_fcmpset_int(&vp->v_writecount, &n, -1)) {
1250                                 return (0);
1251                         }
1252                         if (gotref) {
1253                                 vunref(vp);
1254                         }
1255                         continue;
1256                 }
1257
1258                 MPASS(n < 0);
1259                 if (atomic_fcmpset_int(&vp->v_writecount, &n, n - 1)) {
1260                         return (0);
1261                 }
1262         }
1263         __assert_unreachable();
1264 }
1265
1266 static int
1267 vop_stdunset_text(struct vop_unset_text_args *ap)
1268 {
1269         struct vnode *vp;
1270         int n;
1271
1272         vp = ap->a_vp;
1273
1274         n = atomic_load_int(&vp->v_writecount);
1275         for (;;) {
1276                 if (__predict_false(n >= 0)) {
1277                         return (EINVAL);
1278                 }
1279
1280                 /*
1281                  * Transition point, we may need to release a reference on the vnode.
1282                  */
1283                 if (n == -1) {
1284                         if (atomic_fcmpset_int(&vp->v_writecount, &n, 0)) {
1285                                 if ((vn_irflag_read(vp) & VIRF_TEXT_REF) != 0) {
1286                                         vunref(vp);
1287                                 }
1288                                 return (0);
1289                         }
1290                         continue;
1291                 }
1292
1293                 MPASS(n < -1);
1294                 if (atomic_fcmpset_int(&vp->v_writecount, &n, n + 1)) {
1295                         return (0);
1296                 }
1297         }
1298         __assert_unreachable();
1299 }
1300
1301 static int __always_inline
1302 vop_stdadd_writecount_impl(struct vop_add_writecount_args *ap, bool handle_msync)
1303 {
1304         struct vnode *vp;
1305         struct mount *mp __diagused;
1306         int n;
1307
1308         vp = ap->a_vp;
1309
1310 #ifdef INVARIANTS
1311         mp = vp->v_mount;
1312         if (mp != NULL) {
1313                 if (handle_msync) {
1314                         VNPASS((mp->mnt_kern_flag & MNTK_NOMSYNC) == 0, vp);
1315                 } else {
1316                         VNPASS((mp->mnt_kern_flag & MNTK_NOMSYNC) != 0, vp);
1317                 }
1318         }
1319 #endif
1320
1321         n = atomic_load_int(&vp->v_writecount);
1322         for (;;) {
1323                 if (__predict_false(n < 0)) {
1324                         return (ETXTBSY);
1325                 }
1326
1327                 VNASSERT(n + ap->a_inc >= 0, vp,
1328                     ("neg writecount increment %d + %d = %d", n, ap->a_inc,
1329                     n + ap->a_inc));
1330                 if (n == 0) {
1331                         if (handle_msync) {
1332                                 vlazy(vp);
1333                         }
1334                 }
1335
1336                 if (atomic_fcmpset_int(&vp->v_writecount, &n, n + ap->a_inc)) {
1337                         return (0);
1338                 }
1339         }
1340         __assert_unreachable();
1341 }
1342
1343 int
1344 vop_stdadd_writecount(struct vop_add_writecount_args *ap)
1345 {
1346
1347         return (vop_stdadd_writecount_impl(ap, true));
1348 }
1349
1350 int
1351 vop_stdadd_writecount_nomsync(struct vop_add_writecount_args *ap)
1352 {
1353
1354         return (vop_stdadd_writecount_impl(ap, false));
1355 }
1356
1357 int
1358 vop_stdneed_inactive(struct vop_need_inactive_args *ap)
1359 {
1360
1361         return (1);
1362 }
1363
1364 int
1365 vop_stdioctl(struct vop_ioctl_args *ap)
1366 {
1367         struct vnode *vp;
1368         struct vattr va;
1369         off_t *offp;
1370         int error;
1371
1372         switch (ap->a_command) {
1373         case FIOSEEKDATA:
1374         case FIOSEEKHOLE:
1375                 vp = ap->a_vp;
1376                 error = vn_lock(vp, LK_SHARED);
1377                 if (error != 0)
1378                         return (EBADF);
1379                 if (vp->v_type == VREG)
1380                         error = VOP_GETATTR(vp, &va, ap->a_cred);
1381                 else
1382                         error = ENOTTY;
1383                 if (error == 0) {
1384                         offp = ap->a_data;
1385                         if (*offp < 0 || *offp >= va.va_size)
1386                                 error = ENXIO;
1387                         else if (ap->a_command == FIOSEEKHOLE)
1388                                 *offp = va.va_size;
1389                 }
1390                 VOP_UNLOCK(vp);
1391                 break;
1392         default:
1393                 error = ENOTTY;
1394                 break;
1395         }
1396         return (error);
1397 }
1398
1399 /*
1400  * vfs default ops
1401  * used to fill the vfs function table to get reasonable default return values.
1402  */
1403 int
1404 vfs_stdroot(struct mount *mp, int flags, struct vnode **vpp)
1405 {
1406
1407         return (EOPNOTSUPP);
1408 }
1409
1410 int
1411 vfs_stdstatfs(struct mount *mp, struct statfs *sbp)
1412 {
1413
1414         return (EOPNOTSUPP);
1415 }
1416
1417 int
1418 vfs_stdquotactl(struct mount *mp, int cmds, uid_t uid, void *arg, bool *mp_busy)
1419 {
1420         return (EOPNOTSUPP);
1421 }
1422
1423 int
1424 vfs_stdsync(struct mount *mp, int waitfor)
1425 {
1426         struct vnode *vp, *mvp;
1427         struct thread *td;
1428         int error, lockreq, allerror = 0;
1429
1430         td = curthread;
1431         lockreq = LK_EXCLUSIVE | LK_INTERLOCK;
1432         if (waitfor != MNT_WAIT)
1433                 lockreq |= LK_NOWAIT;
1434         /*
1435          * Force stale buffer cache information to be flushed.
1436          */
1437 loop:
1438         MNT_VNODE_FOREACH_ALL(vp, mp, mvp) {
1439                 if (vp->v_bufobj.bo_dirty.bv_cnt == 0) {
1440                         VI_UNLOCK(vp);
1441                         continue;
1442                 }
1443                 if ((error = vget(vp, lockreq)) != 0) {
1444                         if (error == ENOENT) {
1445                                 MNT_VNODE_FOREACH_ALL_ABORT(mp, mvp);
1446                                 goto loop;
1447                         }
1448                         continue;
1449                 }
1450                 error = VOP_FSYNC(vp, waitfor, td);
1451                 if (error)
1452                         allerror = error;
1453                 vput(vp);
1454         }
1455         return (allerror);
1456 }
1457
1458 int
1459 vfs_stdnosync(struct mount *mp, int waitfor)
1460 {
1461
1462         return (0);
1463 }
1464
1465 static int
1466 vop_stdcopy_file_range(struct vop_copy_file_range_args *ap)
1467 {
1468         int error;
1469
1470         error = vn_generic_copy_file_range(ap->a_invp, ap->a_inoffp,
1471             ap->a_outvp, ap->a_outoffp, ap->a_lenp, ap->a_flags, ap->a_incred,
1472             ap->a_outcred, ap->a_fsizetd);
1473         return (error);
1474 }
1475
1476 int
1477 vfs_stdvget(struct mount *mp, ino_t ino, int flags, struct vnode **vpp)
1478 {
1479
1480         return (EOPNOTSUPP);
1481 }
1482
1483 int
1484 vfs_stdfhtovp(struct mount *mp, struct fid *fhp, int flags, struct vnode **vpp)
1485 {
1486
1487         return (EOPNOTSUPP);
1488 }
1489
1490 int
1491 vfs_stdinit(struct vfsconf *vfsp)
1492 {
1493
1494         return (0);
1495 }
1496
1497 int
1498 vfs_stduninit(struct vfsconf *vfsp)
1499 {
1500
1501         return(0);
1502 }
1503
1504 int
1505 vfs_stdextattrctl(struct mount *mp, int cmd, struct vnode *filename_vp,
1506     int attrnamespace, const char *attrname)
1507 {
1508
1509         if (filename_vp != NULL)
1510                 VOP_UNLOCK(filename_vp);
1511         return (EOPNOTSUPP);
1512 }
1513
1514 int
1515 vfs_stdsysctl(struct mount *mp, fsctlop_t op, struct sysctl_req *req)
1516 {
1517
1518         return (EOPNOTSUPP);
1519 }
1520
1521 static vop_bypass_t *
1522 bp_by_off(struct vop_vector *vop, struct vop_generic_args *a)
1523 {
1524
1525         return (*(vop_bypass_t **)((char *)vop + a->a_desc->vdesc_vop_offset));
1526 }
1527
1528 int
1529 vop_sigdefer(struct vop_vector *vop, struct vop_generic_args *a)
1530 {
1531         vop_bypass_t *bp;
1532         int prev_stops, rc;
1533
1534         bp = bp_by_off(vop, a);
1535         MPASS(bp != NULL);
1536
1537         prev_stops = sigdeferstop(SIGDEFERSTOP_SILENT);
1538         rc = bp(a);
1539         sigallowstop(prev_stops);
1540         return (rc);
1541 }
1542
1543 static int
1544 vop_stdstat(struct vop_stat_args *a)
1545 {
1546         struct vattr vattr;
1547         struct vattr *vap;
1548         struct vnode *vp;
1549         struct stat *sb;
1550         int error;
1551         u_short mode;
1552
1553         vp = a->a_vp;
1554         sb = a->a_sb;
1555
1556         error = vop_stat_helper_pre(a);
1557         if (error != 0)
1558                 return (error);
1559
1560         vap = &vattr;
1561
1562         /*
1563          * Initialize defaults for new and unusual fields, so that file
1564          * systems which don't support these fields don't need to know
1565          * about them.
1566          */
1567         vap->va_birthtime.tv_sec = -1;
1568         vap->va_birthtime.tv_nsec = 0;
1569         vap->va_fsid = VNOVAL;
1570         vap->va_gen = 0;
1571         vap->va_rdev = NODEV;
1572
1573         error = VOP_GETATTR(vp, vap, a->a_active_cred);
1574         if (error)
1575                 goto out;
1576
1577         /*
1578          * Zero the spare stat fields
1579          */
1580         bzero(sb, sizeof *sb);
1581
1582         /*
1583          * Copy from vattr table
1584          */
1585         if (vap->va_fsid != VNOVAL)
1586                 sb->st_dev = vap->va_fsid;
1587         else
1588                 sb->st_dev = vp->v_mount->mnt_stat.f_fsid.val[0];
1589         sb->st_ino = vap->va_fileid;
1590         mode = vap->va_mode;
1591         switch (vap->va_type) {
1592         case VREG:
1593                 mode |= S_IFREG;
1594                 break;
1595         case VDIR:
1596                 mode |= S_IFDIR;
1597                 break;
1598         case VBLK:
1599                 mode |= S_IFBLK;
1600                 break;
1601         case VCHR:
1602                 mode |= S_IFCHR;
1603                 break;
1604         case VLNK:
1605                 mode |= S_IFLNK;
1606                 break;
1607         case VSOCK:
1608                 mode |= S_IFSOCK;
1609                 break;
1610         case VFIFO:
1611                 mode |= S_IFIFO;
1612                 break;
1613         default:
1614                 error = EBADF;
1615                 goto out;
1616         }
1617         sb->st_mode = mode;
1618         sb->st_nlink = vap->va_nlink;
1619         sb->st_uid = vap->va_uid;
1620         sb->st_gid = vap->va_gid;
1621         sb->st_rdev = vap->va_rdev;
1622         if (vap->va_size > OFF_MAX) {
1623                 error = EOVERFLOW;
1624                 goto out;
1625         }
1626         sb->st_size = vap->va_size;
1627         sb->st_atim.tv_sec = vap->va_atime.tv_sec;
1628         sb->st_atim.tv_nsec = vap->va_atime.tv_nsec;
1629         sb->st_mtim.tv_sec = vap->va_mtime.tv_sec;
1630         sb->st_mtim.tv_nsec = vap->va_mtime.tv_nsec;
1631         sb->st_ctim.tv_sec = vap->va_ctime.tv_sec;
1632         sb->st_ctim.tv_nsec = vap->va_ctime.tv_nsec;
1633         sb->st_birthtim.tv_sec = vap->va_birthtime.tv_sec;
1634         sb->st_birthtim.tv_nsec = vap->va_birthtime.tv_nsec;
1635
1636         /*
1637          * According to www.opengroup.org, the meaning of st_blksize is
1638          *   "a filesystem-specific preferred I/O block size for this
1639          *    object.  In some filesystem types, this may vary from file
1640          *    to file"
1641          * Use minimum/default of PAGE_SIZE (e.g. for VCHR).
1642          */
1643
1644         sb->st_blksize = max(PAGE_SIZE, vap->va_blocksize);
1645         sb->st_flags = vap->va_flags;
1646         sb->st_blocks = vap->va_bytes / S_BLKSIZE;
1647         sb->st_gen = vap->va_gen;
1648 out:
1649         return (vop_stat_helper_post(a, error));
1650 }
1651
1652 static int
1653 vop_stdread_pgcache(struct vop_read_pgcache_args *ap __unused)
1654 {
1655         return (EJUSTRETURN);
1656 }
1657
1658 static int
1659 vop_stdvput_pair(struct vop_vput_pair_args *ap)
1660 {
1661         struct vnode *dvp, *vp, **vpp;
1662
1663         dvp = ap->a_dvp;
1664         vpp = ap->a_vpp;
1665         vput(dvp);
1666         if (vpp != NULL && ap->a_unlock_vp && (vp = *vpp) != NULL)
1667                 vput(vp);
1668         return (0);
1669 }