1 1.113 dholland /* $NetBSD: vnode_if.c,v 1.119 2023/06/15 09:15:13 hannken Exp $ */ 2 1.9 thorpej 3 1.1 cgd /* 4 1.52 perry * Warning: DO NOT EDIT! This file is automatically generated! 5 1.1 cgd * (Modifications made here may easily be lost!) 6 1.1 cgd * 7 1.1 cgd * Created from the file: 8 1.119 hannken * NetBSD: vnode_if.src,v 1.85 2023/06/15 09:13:36 hannken Exp 9 1.1 cgd * by the script: 10 1.119 hannken * NetBSD: vnode_if.sh,v 1.77 2022/10/26 23:39:43 riastradh Exp 11 1.1 cgd */ 12 1.1 cgd 13 1.1 cgd /* 14 1.10 fvdl * Copyright (c) 1992, 1993, 1994, 1995 15 1.1 cgd * The Regents of the University of California. All rights reserved. 16 1.1 cgd * 17 1.1 cgd * Redistribution and use in source and binary forms, with or without 18 1.1 cgd * modification, are permitted provided that the following conditions 19 1.1 cgd * are met: 20 1.1 cgd * 1. Redistributions of source code must retain the above copyright 21 1.1 cgd * notice, this list of conditions and the following disclaimer. 22 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 23 1.1 cgd * notice, this list of conditions and the following disclaimer in the 24 1.1 cgd * documentation and/or other materials provided with the distribution. 25 1.45 agc * 3. Neither the name of the University nor the names of its contributors 26 1.1 cgd * may be used to endorse or promote products derived from this software 27 1.1 cgd * without specific prior written permission. 28 1.1 cgd * 29 1.14 christos * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 30 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 31 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 32 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 33 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 34 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 35 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 36 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 37 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 38 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 39 1.1 cgd * SUCH DAMAGE. 40 1.1 cgd */ 41 1.39 lukem 42 1.39 lukem #include <sys/cdefs.h> 43 1.113 dholland __KERNEL_RCSID(0, "$NetBSD: vnode_if.c,v 1.119 2023/06/15 09:15:13 hannken Exp $"); 44 1.39 lukem 45 1.116 hannken #ifdef _KERNEL_OPT 46 1.116 hannken #include "opt_vnode_lockdebug.h" 47 1.116 hannken #endif /* _KERNEL_OPT */ 48 1.116 hannken 49 1.1 cgd #include <sys/param.h> 50 1.1 cgd #include <sys/mount.h> 51 1.23 thorpej #include <sys/buf.h> 52 1.115 thorpej #include <sys/fcntl.h> 53 1.1 cgd #include <sys/vnode.h> 54 1.72 ad #include <sys/lock.h> 55 1.97 hannken #include <sys/fstrans.h> 56 1.1 cgd 57 1.119 hannken #include <miscfs/deadfs/deadfs.h> 58 1.119 hannken 59 1.108 hannken enum fst_op { FST_NO, FST_YES, FST_LAZY, FST_TRY }; 60 1.105 hannken 61 1.105 hannken static inline int 62 1.105 hannken vop_pre(vnode_t *vp, struct mount **mp, bool *mpsafe, enum fst_op op) 63 1.105 hannken { 64 1.105 hannken int error; 65 1.105 hannken 66 1.105 hannken *mpsafe = (vp->v_vflag & VV_MPSAFE); 67 1.105 hannken 68 1.105 hannken if (!*mpsafe) { 69 1.105 hannken KERNEL_LOCK(1, curlwp); 70 1.105 hannken } 71 1.105 hannken 72 1.108 hannken if (op == FST_YES || op == FST_LAZY || op == FST_TRY) { 73 1.105 hannken for (;;) { 74 1.105 hannken *mp = vp->v_mount; 75 1.105 hannken if (op == FST_TRY) { 76 1.106 hannken error = fstrans_start_nowait(*mp); 77 1.105 hannken if (error) { 78 1.105 hannken if (!*mpsafe) { 79 1.105 hannken KERNEL_UNLOCK_ONE(curlwp); 80 1.105 hannken } 81 1.105 hannken return error; 82 1.105 hannken } 83 1.108 hannken } else if (op == FST_LAZY) { 84 1.108 hannken fstrans_start_lazy(*mp); 85 1.105 hannken } else { 86 1.106 hannken fstrans_start(*mp); 87 1.105 hannken } 88 1.105 hannken if (__predict_true(*mp == vp->v_mount)) 89 1.105 hannken break; 90 1.105 hannken fstrans_done(*mp); 91 1.105 hannken } 92 1.105 hannken } else { 93 1.105 hannken *mp = vp->v_mount; 94 1.105 hannken } 95 1.105 hannken 96 1.105 hannken return 0; 97 1.105 hannken } 98 1.105 hannken 99 1.115 thorpej static inline u_quad_t 100 1.115 thorpej vop_pre_get_size(struct vnode *vp) 101 1.115 thorpej { 102 1.115 thorpej mutex_enter(vp->v_interlock); 103 1.115 thorpej KASSERT(vp->v_size != VSIZENOTSET); 104 1.115 thorpej u_quad_t rv = (u_quad_t)vp->v_size; 105 1.115 thorpej mutex_exit(vp->v_interlock); 106 1.115 thorpej 107 1.115 thorpej return rv; 108 1.115 thorpej } 109 1.115 thorpej 110 1.115 thorpej /* 111 1.115 thorpej * VOP_RMDIR(), VOP_REMOVE(), and VOP_RENAME() need special handling 112 1.115 thorpej * because they each drop the caller's references on one or more of 113 1.115 thorpej * their arguments. While there must be an open file descriptor in 114 1.115 thorpej * associated with a vnode in order for knotes to be attached to it, 115 1.115 thorpej * that status could change during the course of the operation. So, 116 1.115 thorpej * for the vnode arguments that are WILLRELE or WILLPUT, we check 117 1.115 thorpej * pre-op if there are registered knotes, take a hold count if so, 118 1.115 thorpej * and post-op release the hold after activating any knotes still 119 1.115 thorpej * associated with the vnode. 120 1.115 thorpej */ 121 1.115 thorpej 122 1.115 thorpej #define VOP_POST_KNOTE(thisvp, e, n) \ 123 1.115 thorpej do { \ 124 1.115 thorpej if (__predict_true((e) == 0)) { \ 125 1.115 thorpej /* \ 126 1.115 thorpej * VN_KNOTE() does the VN_KEVENT_INTEREST() \ 127 1.115 thorpej * check for us. \ 128 1.115 thorpej */ \ 129 1.115 thorpej VN_KNOTE((thisvp), (n)); \ 130 1.115 thorpej } \ 131 1.115 thorpej } while (/*CONSTCOND*/0) 132 1.115 thorpej 133 1.115 thorpej #define VOP_POST_KNOTE_HELD(thisvp, e, n) \ 134 1.115 thorpej do { \ 135 1.115 thorpej /* \ 136 1.115 thorpej * We don't perform a VN_KEVENT_INTEREST() check here; it \ 137 1.115 thorpej * was already performed when we did the pre-op work that \ 138 1.115 thorpej * caused the vnode to be held in the first place. \ 139 1.115 thorpej */ \ 140 1.115 thorpej mutex_enter((thisvp)->v_interlock); \ 141 1.115 thorpej if (__predict_true((e) == 0)) { \ 142 1.118 thorpej knote(&(thisvp)->v_klist->vk_klist, (n)); \ 143 1.115 thorpej } \ 144 1.115 thorpej holdrelel((thisvp)); \ 145 1.115 thorpej mutex_exit((thisvp)->v_interlock); \ 146 1.115 thorpej /* \ 147 1.115 thorpej * thisvp might be gone now! Don't touch! \ 148 1.115 thorpej */ \ 149 1.115 thorpej } while (/*CONSTCOND*/0) 150 1.115 thorpej 151 1.115 thorpej #define vop_create_post(ap, e) \ 152 1.115 thorpej VOP_POST_KNOTE((ap)->a_dvp, (e), NOTE_WRITE) 153 1.115 thorpej 154 1.115 thorpej #define vop_mknod_post(ap, e) \ 155 1.115 thorpej VOP_POST_KNOTE((ap)->a_dvp, (e), NOTE_WRITE) 156 1.115 thorpej 157 1.115 thorpej #define vop_setattr_pre(ap) \ 158 1.115 thorpej u_quad_t osize = 0; \ 159 1.115 thorpej long vp_events = \ 160 1.115 thorpej VN_KEVENT_INTEREST((ap)->a_vp, NOTE_ATTRIB | NOTE_EXTEND) \ 161 1.115 thorpej ? NOTE_ATTRIB : 0; \ 162 1.115 thorpej bool check_extend = false; \ 163 1.115 thorpej if (__predict_false(vp_events != 0 && \ 164 1.115 thorpej (ap)->a_vap->va_size != VNOVALSIZE)) { \ 165 1.115 thorpej check_extend = true; \ 166 1.115 thorpej osize = vop_pre_get_size((ap)->a_vp); \ 167 1.115 thorpej } 168 1.115 thorpej 169 1.115 thorpej #define vop_setattr_post(ap, e) \ 170 1.115 thorpej do { \ 171 1.115 thorpej if (__predict_false(vp_events != 0)) { \ 172 1.115 thorpej if (__predict_false(check_extend && \ 173 1.115 thorpej (ap)->a_vap->va_size > osize)) { \ 174 1.115 thorpej vp_events |= NOTE_EXTEND; \ 175 1.115 thorpej } \ 176 1.115 thorpej VOP_POST_KNOTE((ap)->a_vp, (e), vp_events); \ 177 1.115 thorpej } \ 178 1.115 thorpej } while (/*CONSTCOND*/0) 179 1.115 thorpej 180 1.115 thorpej #define vop_setacl_post(ap, e) \ 181 1.115 thorpej VOP_POST_KNOTE((ap)->a_vp, (e), NOTE_ATTRIB) 182 1.115 thorpej 183 1.115 thorpej #define vop_link_post(ap, e) \ 184 1.115 thorpej do { \ 185 1.115 thorpej VOP_POST_KNOTE((ap)->a_dvp, (e), NOTE_WRITE); \ 186 1.115 thorpej VOP_POST_KNOTE((ap)->a_vp, (e), NOTE_LINK); \ 187 1.115 thorpej } while (/*CONSTCOND*/0) 188 1.115 thorpej 189 1.115 thorpej #define vop_mkdir_post(ap, e) \ 190 1.115 thorpej VOP_POST_KNOTE((ap)->a_dvp, (e), NOTE_WRITE | NOTE_LINK) 191 1.115 thorpej 192 1.115 thorpej #define vop_remove_pre_common(ap) \ 193 1.115 thorpej bool post_event_vp = \ 194 1.115 thorpej VN_KEVENT_INTEREST((ap)->a_vp, NOTE_DELETE | NOTE_LINK); \ 195 1.115 thorpej if (__predict_false(post_event_vp)) { \ 196 1.115 thorpej vhold((ap)->a_vp); \ 197 1.115 thorpej } 198 1.115 thorpej 199 1.115 thorpej #define vop_remove_post_common(ap, e, dn, lc) \ 200 1.115 thorpej do { \ 201 1.115 thorpej VOP_POST_KNOTE((ap)->a_dvp, (e), (dn)); \ 202 1.115 thorpej if (__predict_false(post_event_vp)) { \ 203 1.115 thorpej VOP_POST_KNOTE_HELD((ap)->a_vp, (e), \ 204 1.115 thorpej (lc) ? NOTE_LINK : NOTE_DELETE); \ 205 1.115 thorpej } \ 206 1.115 thorpej } while (/*CONSTCOND*/0) 207 1.115 thorpej 208 1.115 thorpej /* 209 1.115 thorpej * One could make the argument that VOP_REMOVE() should send NOTE_LINK 210 1.115 thorpej * on vp if the resulting link count is not zero, but that's not what 211 1.115 thorpej * the documentation says. 212 1.115 thorpej * 213 1.115 thorpej * We could change this easily by passing ap->ctx_vp_new_nlink to 214 1.115 thorpej * vop_remove_post_common(). 215 1.115 thorpej */ 216 1.115 thorpej #define vop_remove_pre(ap) \ 217 1.115 thorpej vop_remove_pre_common((ap)); \ 218 1.115 thorpej /* \ 219 1.115 thorpej * We will assume that the file being removed is deleted unless \ 220 1.115 thorpej * the file system tells us otherwise by updating vp_new_nlink. \ 221 1.115 thorpej */ \ 222 1.115 thorpej (ap)->ctx_vp_new_nlink = 0; 223 1.115 thorpej 224 1.115 thorpej #define vop_remove_post(ap, e) \ 225 1.115 thorpej vop_remove_post_common((ap), (e), NOTE_WRITE, 0) 226 1.115 thorpej 227 1.115 thorpej #define vop_rmdir_pre(ap) \ 228 1.115 thorpej vop_remove_pre_common(ap) 229 1.115 thorpej 230 1.115 thorpej #define vop_rmdir_post(ap, e) \ 231 1.115 thorpej vop_remove_post_common((ap), (e), NOTE_WRITE | NOTE_LINK, 0) 232 1.115 thorpej 233 1.115 thorpej #define vop_symlink_post(ap, e) \ 234 1.115 thorpej VOP_POST_KNOTE((ap)->a_dvp, (e), NOTE_WRITE) 235 1.115 thorpej 236 1.115 thorpej #define vop_open_post(ap, e) \ 237 1.115 thorpej VOP_POST_KNOTE((ap)->a_vp, (e), NOTE_OPEN) 238 1.115 thorpej 239 1.115 thorpej #define vop_close_post(ap, e) \ 240 1.115 thorpej do { \ 241 1.115 thorpej /* See the definition of VN_KNOTE() in <sys/vnode.h>. */ \ 242 1.115 thorpej if (__predict_false(VN_KEVENT_INTEREST((ap)->a_vp, \ 243 1.115 thorpej NOTE_CLOSE_WRITE | NOTE_CLOSE) && (e) == 0)) { \ 244 1.115 thorpej struct vnode *thisvp = (ap)->a_vp; \ 245 1.115 thorpej mutex_enter(thisvp->v_interlock); \ 246 1.115 thorpej /* \ 247 1.115 thorpej * Don't send NOTE_CLOSE when closing a vnode that's \ 248 1.115 thorpej * been reclaimed or otherwise revoked; a NOTE_REVOKE \ 249 1.115 thorpej * has already been sent, and this close is effectively \ 250 1.115 thorpej * meaningless from the watcher's perspective. \ 251 1.115 thorpej */ \ 252 1.115 thorpej if (__predict_true(thisvp->v_op != dead_vnodeop_p)) { \ 253 1.118 thorpej knote(&thisvp->v_klist->vk_klist, \ 254 1.115 thorpej ((ap)->a_fflag & FWRITE) \ 255 1.115 thorpej ? NOTE_CLOSE_WRITE : NOTE_CLOSE); \ 256 1.115 thorpej } \ 257 1.115 thorpej mutex_exit(thisvp->v_interlock); \ 258 1.115 thorpej } \ 259 1.115 thorpej } while (/*CONSTCOND*/0) 260 1.115 thorpej 261 1.115 thorpej #define vop_read_post(ap, e) \ 262 1.115 thorpej VOP_POST_KNOTE((ap)->a_vp, (e), NOTE_READ) 263 1.115 thorpej 264 1.115 thorpej #define vop_write_pre(ap) \ 265 1.115 thorpej off_t ooffset = 0, noffset = 0; \ 266 1.115 thorpej u_quad_t osize = 0; \ 267 1.115 thorpej long vp_events = \ 268 1.115 thorpej VN_KEVENT_INTEREST((ap)->a_vp, NOTE_WRITE | NOTE_EXTEND) \ 269 1.115 thorpej ? NOTE_WRITE : 0; \ 270 1.115 thorpej if (__predict_false(vp_events != 0)) { \ 271 1.115 thorpej ooffset = (ap)->a_uio->uio_offset; \ 272 1.115 thorpej osize = vop_pre_get_size((ap)->a_vp); \ 273 1.115 thorpej } 274 1.115 thorpej 275 1.115 thorpej #define vop_write_post(ap, e) \ 276 1.115 thorpej do { \ 277 1.115 thorpej /* \ 278 1.115 thorpej * If any data was written, we'll post an event, even if \ 279 1.115 thorpej * there was an error. \ 280 1.115 thorpej */ \ 281 1.115 thorpej noffset = (ap)->a_uio->uio_offset; \ 282 1.115 thorpej if (__predict_false(vp_events != 0 && noffset > ooffset)) { \ 283 1.115 thorpej if (noffset > osize) { \ 284 1.115 thorpej vp_events |= NOTE_EXTEND; \ 285 1.115 thorpej } \ 286 1.115 thorpej VN_KNOTE((ap)->a_vp, vp_events); \ 287 1.115 thorpej } \ 288 1.115 thorpej } while (/*CONSTCOND*/0) 289 1.115 thorpej 290 1.105 hannken static inline void 291 1.105 hannken vop_post(vnode_t *vp, struct mount *mp, bool mpsafe, enum fst_op op) 292 1.105 hannken { 293 1.105 hannken 294 1.108 hannken if (op == FST_YES || op == FST_LAZY) { 295 1.105 hannken fstrans_done(mp); 296 1.105 hannken } 297 1.105 hannken 298 1.105 hannken if (!mpsafe) { 299 1.105 hannken KERNEL_UNLOCK_ONE(curlwp); 300 1.105 hannken } 301 1.105 hannken } 302 1.105 hannken 303 1.116 hannken static inline void 304 1.116 hannken assert_vop_unlocked(vnode_t *vp, const char *str) 305 1.116 hannken { 306 1.117 hannken #if defined(VNODE_LOCKDEBUG) 307 1.116 hannken 308 1.116 hannken if (VOP_ISLOCKED(vp) == LK_EXCLUSIVE) 309 1.116 hannken panic("%s: %p %d/%d is locked but should not be", 310 1.116 hannken str, vp, vp->v_tag, vp->v_type); 311 1.117 hannken #endif 312 1.116 hannken } 313 1.116 hannken 314 1.116 hannken static inline void 315 1.116 hannken assert_vop_locked(vnode_t *vp, const char *str) 316 1.116 hannken { 317 1.117 hannken #if defined(VNODE_LOCKDEBUG) 318 1.116 hannken 319 1.116 hannken if (VOP_ISLOCKED(vp) == LK_NONE) 320 1.116 hannken panic("%s: %p %d/%d is not locked but should be", 321 1.116 hannken str, vp, vp->v_tag, vp->v_type); 322 1.117 hannken #endif 323 1.116 hannken } 324 1.116 hannken 325 1.116 hannken static inline void 326 1.116 hannken assert_vop_elocked(vnode_t *vp, const char *str) 327 1.116 hannken { 328 1.117 hannken #if defined(VNODE_LOCKDEBUG) 329 1.116 hannken 330 1.116 hannken if (VOP_ISLOCKED(vp) != LK_EXCLUSIVE) 331 1.116 hannken panic("%s: %p %d/%d is not exclusive locked but should be", 332 1.116 hannken str, vp, vp->v_tag, vp->v_type); 333 1.117 hannken #endif 334 1.116 hannken } 335 1.116 hannken 336 1.34 lukem const struct vnodeop_desc vop_default_desc = { 337 1.1 cgd 0, 338 1.1 cgd "default", 339 1.1 cgd 0, 340 1.1 cgd NULL, 341 1.1 cgd VDESC_NO_OFFSET, 342 1.1 cgd VDESC_NO_OFFSET, 343 1.1 cgd VDESC_NO_OFFSET, 344 1.1 cgd }; 345 1.1 cgd 346 1.1 cgd 347 1.33 jdolecek const int vop_bwrite_vp_offsets[] = { 348 1.88 hannken VOPARG_OFFSETOF(struct vop_bwrite_args,a_vp), 349 1.33 jdolecek VDESC_NO_OFFSET 350 1.33 jdolecek }; 351 1.33 jdolecek const struct vnodeop_desc vop_bwrite_desc = { 352 1.67 pooka VOP_BWRITE_DESCOFFSET, 353 1.33 jdolecek "vop_bwrite", 354 1.33 jdolecek 0, 355 1.33 jdolecek vop_bwrite_vp_offsets, 356 1.33 jdolecek VDESC_NO_OFFSET, 357 1.33 jdolecek VDESC_NO_OFFSET, 358 1.33 jdolecek VDESC_NO_OFFSET, 359 1.33 jdolecek }; 360 1.33 jdolecek int 361 1.88 hannken VOP_BWRITE(struct vnode *vp, 362 1.88 hannken struct buf *bp) 363 1.33 jdolecek { 364 1.72 ad int error; 365 1.72 ad bool mpsafe; 366 1.33 jdolecek struct vop_bwrite_args a; 367 1.105 hannken struct mount *mp; 368 1.33 jdolecek a.a_desc = VDESC(vop_bwrite); 369 1.88 hannken a.a_vp = vp; 370 1.33 jdolecek a.a_bp = bp; 371 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_YES); 372 1.105 hannken if (error) 373 1.105 hannken return error; 374 1.88 hannken error = (VCALL(vp, VOFFSET(vop_bwrite), &a)); 375 1.105 hannken vop_post(vp, mp, mpsafe, FST_YES); 376 1.72 ad return error; 377 1.33 jdolecek } 378 1.33 jdolecek 379 1.113 dholland const int vop_parsepath_vp_offsets[] = { 380 1.113 dholland VOPARG_OFFSETOF(struct vop_parsepath_args,a_dvp), 381 1.113 dholland VDESC_NO_OFFSET 382 1.113 dholland }; 383 1.113 dholland const struct vnodeop_desc vop_parsepath_desc = { 384 1.113 dholland VOP_PARSEPATH_DESCOFFSET, 385 1.113 dholland "vop_parsepath", 386 1.113 dholland 0, 387 1.113 dholland vop_parsepath_vp_offsets, 388 1.113 dholland VDESC_NO_OFFSET, 389 1.113 dholland VDESC_NO_OFFSET, 390 1.113 dholland VDESC_NO_OFFSET, 391 1.113 dholland }; 392 1.113 dholland int 393 1.113 dholland VOP_PARSEPATH(struct vnode *dvp, 394 1.113 dholland const char *name, 395 1.113 dholland size_t *retval) 396 1.113 dholland { 397 1.113 dholland int error; 398 1.113 dholland bool mpsafe; 399 1.113 dholland struct vop_parsepath_args a; 400 1.113 dholland struct mount *mp; 401 1.113 dholland a.a_desc = VDESC(vop_parsepath); 402 1.113 dholland a.a_dvp = dvp; 403 1.113 dholland a.a_name = name; 404 1.113 dholland a.a_retval = retval; 405 1.114 dholland error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 406 1.113 dholland if (error) 407 1.113 dholland return error; 408 1.113 dholland error = (VCALL(dvp, VOFFSET(vop_parsepath), &a)); 409 1.114 dholland vop_post(dvp, mp, mpsafe, FST_NO); 410 1.113 dholland return error; 411 1.113 dholland } 412 1.113 dholland 413 1.31 jdolecek const int vop_lookup_vp_offsets[] = { 414 1.92 hannken VOPARG_OFFSETOF(struct vop_lookup_v2_args,a_dvp), 415 1.1 cgd VDESC_NO_OFFSET 416 1.1 cgd }; 417 1.33 jdolecek const struct vnodeop_desc vop_lookup_desc = { 418 1.67 pooka VOP_LOOKUP_DESCOFFSET, 419 1.1 cgd "vop_lookup", 420 1.1 cgd 0, 421 1.1 cgd vop_lookup_vp_offsets, 422 1.92 hannken VOPARG_OFFSETOF(struct vop_lookup_v2_args, a_vpp), 423 1.1 cgd VDESC_NO_OFFSET, 424 1.92 hannken VOPARG_OFFSETOF(struct vop_lookup_v2_args, a_cnp), 425 1.1 cgd }; 426 1.23 thorpej int 427 1.60 thorpej VOP_LOOKUP(struct vnode *dvp, 428 1.60 thorpej struct vnode **vpp, 429 1.60 thorpej struct componentname *cnp) 430 1.23 thorpej { 431 1.72 ad int error; 432 1.72 ad bool mpsafe; 433 1.92 hannken struct vop_lookup_v2_args a; 434 1.105 hannken struct mount *mp; 435 1.23 thorpej a.a_desc = VDESC(vop_lookup); 436 1.23 thorpej a.a_dvp = dvp; 437 1.23 thorpej a.a_vpp = vpp; 438 1.23 thorpej a.a_cnp = cnp; 439 1.116 hannken assert_vop_locked(dvp, "vop_lookup: dvp"); 440 1.105 hannken error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 441 1.105 hannken if (error) 442 1.105 hannken return error; 443 1.72 ad error = (VCALL(dvp, VOFFSET(vop_lookup), &a)); 444 1.105 hannken vop_post(dvp, mp, mpsafe, FST_NO); 445 1.69 pooka #ifdef DIAGNOSTIC 446 1.72 ad if (error == 0) 447 1.69 pooka KASSERT((*vpp)->v_size != VSIZENOTSET 448 1.69 pooka && (*vpp)->v_writesize != VSIZENOTSET); 449 1.69 pooka #endif /* DIAGNOSTIC */ 450 1.72 ad return error; 451 1.23 thorpej } 452 1.1 cgd 453 1.31 jdolecek const int vop_create_vp_offsets[] = { 454 1.91 hannken VOPARG_OFFSETOF(struct vop_create_v3_args,a_dvp), 455 1.1 cgd VDESC_NO_OFFSET 456 1.1 cgd }; 457 1.33 jdolecek const struct vnodeop_desc vop_create_desc = { 458 1.67 pooka VOP_CREATE_DESCOFFSET, 459 1.1 cgd "vop_create", 460 1.90 hannken 0, 461 1.1 cgd vop_create_vp_offsets, 462 1.91 hannken VOPARG_OFFSETOF(struct vop_create_v3_args, a_vpp), 463 1.1 cgd VDESC_NO_OFFSET, 464 1.91 hannken VOPARG_OFFSETOF(struct vop_create_v3_args, a_cnp), 465 1.1 cgd }; 466 1.23 thorpej int 467 1.60 thorpej VOP_CREATE(struct vnode *dvp, 468 1.60 thorpej struct vnode **vpp, 469 1.60 thorpej struct componentname *cnp, 470 1.60 thorpej struct vattr *vap) 471 1.23 thorpej { 472 1.72 ad int error; 473 1.72 ad bool mpsafe; 474 1.91 hannken struct vop_create_v3_args a; 475 1.105 hannken struct mount *mp; 476 1.23 thorpej a.a_desc = VDESC(vop_create); 477 1.23 thorpej a.a_dvp = dvp; 478 1.23 thorpej a.a_vpp = vpp; 479 1.23 thorpej a.a_cnp = cnp; 480 1.23 thorpej a.a_vap = vap; 481 1.116 hannken assert_vop_elocked(dvp, "vop_create: dvp"); 482 1.105 hannken error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 483 1.105 hannken if (error) 484 1.105 hannken return error; 485 1.72 ad error = (VCALL(dvp, VOFFSET(vop_create), &a)); 486 1.105 hannken vop_post(dvp, mp, mpsafe, FST_NO); 487 1.115 thorpej vop_create_post(&a, error); 488 1.69 pooka #ifdef DIAGNOSTIC 489 1.72 ad if (error == 0) 490 1.69 pooka KASSERT((*vpp)->v_size != VSIZENOTSET 491 1.69 pooka && (*vpp)->v_writesize != VSIZENOTSET); 492 1.69 pooka #endif /* DIAGNOSTIC */ 493 1.72 ad return error; 494 1.23 thorpej } 495 1.1 cgd 496 1.31 jdolecek const int vop_mknod_vp_offsets[] = { 497 1.91 hannken VOPARG_OFFSETOF(struct vop_mknod_v3_args,a_dvp), 498 1.1 cgd VDESC_NO_OFFSET 499 1.1 cgd }; 500 1.33 jdolecek const struct vnodeop_desc vop_mknod_desc = { 501 1.67 pooka VOP_MKNOD_DESCOFFSET, 502 1.1 cgd "vop_mknod", 503 1.90 hannken 0, 504 1.1 cgd vop_mknod_vp_offsets, 505 1.91 hannken VOPARG_OFFSETOF(struct vop_mknod_v3_args, a_vpp), 506 1.1 cgd VDESC_NO_OFFSET, 507 1.91 hannken VOPARG_OFFSETOF(struct vop_mknod_v3_args, a_cnp), 508 1.1 cgd }; 509 1.23 thorpej int 510 1.60 thorpej VOP_MKNOD(struct vnode *dvp, 511 1.60 thorpej struct vnode **vpp, 512 1.60 thorpej struct componentname *cnp, 513 1.60 thorpej struct vattr *vap) 514 1.23 thorpej { 515 1.72 ad int error; 516 1.72 ad bool mpsafe; 517 1.91 hannken struct vop_mknod_v3_args a; 518 1.105 hannken struct mount *mp; 519 1.23 thorpej a.a_desc = VDESC(vop_mknod); 520 1.23 thorpej a.a_dvp = dvp; 521 1.23 thorpej a.a_vpp = vpp; 522 1.23 thorpej a.a_cnp = cnp; 523 1.23 thorpej a.a_vap = vap; 524 1.116 hannken assert_vop_elocked(dvp, "vop_mknod: dvp"); 525 1.105 hannken error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 526 1.105 hannken if (error) 527 1.105 hannken return error; 528 1.72 ad error = (VCALL(dvp, VOFFSET(vop_mknod), &a)); 529 1.105 hannken vop_post(dvp, mp, mpsafe, FST_NO); 530 1.115 thorpej vop_mknod_post(&a, error); 531 1.69 pooka #ifdef DIAGNOSTIC 532 1.72 ad if (error == 0) 533 1.69 pooka KASSERT((*vpp)->v_size != VSIZENOTSET 534 1.69 pooka && (*vpp)->v_writesize != VSIZENOTSET); 535 1.69 pooka #endif /* DIAGNOSTIC */ 536 1.72 ad return error; 537 1.23 thorpej } 538 1.1 cgd 539 1.31 jdolecek const int vop_open_vp_offsets[] = { 540 1.1 cgd VOPARG_OFFSETOF(struct vop_open_args,a_vp), 541 1.1 cgd VDESC_NO_OFFSET 542 1.1 cgd }; 543 1.33 jdolecek const struct vnodeop_desc vop_open_desc = { 544 1.67 pooka VOP_OPEN_DESCOFFSET, 545 1.1 cgd "vop_open", 546 1.1 cgd 0, 547 1.1 cgd vop_open_vp_offsets, 548 1.1 cgd VDESC_NO_OFFSET, 549 1.1 cgd VOPARG_OFFSETOF(struct vop_open_args, a_cred), 550 1.1 cgd VDESC_NO_OFFSET, 551 1.1 cgd }; 552 1.23 thorpej int 553 1.60 thorpej VOP_OPEN(struct vnode *vp, 554 1.60 thorpej int mode, 555 1.73 pooka kauth_cred_t cred) 556 1.23 thorpej { 557 1.72 ad int error; 558 1.72 ad bool mpsafe; 559 1.23 thorpej struct vop_open_args a; 560 1.105 hannken struct mount *mp; 561 1.23 thorpej a.a_desc = VDESC(vop_open); 562 1.23 thorpej a.a_vp = vp; 563 1.23 thorpej a.a_mode = mode; 564 1.23 thorpej a.a_cred = cred; 565 1.116 hannken assert_vop_locked(vp, "vop_open: vp"); 566 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 567 1.105 hannken if (error) 568 1.105 hannken return error; 569 1.72 ad error = (VCALL(vp, VOFFSET(vop_open), &a)); 570 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 571 1.115 thorpej vop_open_post(&a, error); 572 1.72 ad return error; 573 1.23 thorpej } 574 1.1 cgd 575 1.31 jdolecek const int vop_close_vp_offsets[] = { 576 1.1 cgd VOPARG_OFFSETOF(struct vop_close_args,a_vp), 577 1.1 cgd VDESC_NO_OFFSET 578 1.1 cgd }; 579 1.33 jdolecek const struct vnodeop_desc vop_close_desc = { 580 1.67 pooka VOP_CLOSE_DESCOFFSET, 581 1.1 cgd "vop_close", 582 1.1 cgd 0, 583 1.1 cgd vop_close_vp_offsets, 584 1.1 cgd VDESC_NO_OFFSET, 585 1.1 cgd VOPARG_OFFSETOF(struct vop_close_args, a_cred), 586 1.1 cgd VDESC_NO_OFFSET, 587 1.1 cgd }; 588 1.23 thorpej int 589 1.60 thorpej VOP_CLOSE(struct vnode *vp, 590 1.60 thorpej int fflag, 591 1.73 pooka kauth_cred_t cred) 592 1.23 thorpej { 593 1.72 ad int error; 594 1.72 ad bool mpsafe; 595 1.23 thorpej struct vop_close_args a; 596 1.105 hannken struct mount *mp; 597 1.23 thorpej a.a_desc = VDESC(vop_close); 598 1.23 thorpej a.a_vp = vp; 599 1.23 thorpej a.a_fflag = fflag; 600 1.23 thorpej a.a_cred = cred; 601 1.116 hannken assert_vop_locked(vp, "vop_close: vp"); 602 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 603 1.105 hannken if (error) 604 1.105 hannken return error; 605 1.72 ad error = (VCALL(vp, VOFFSET(vop_close), &a)); 606 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 607 1.115 thorpej vop_close_post(&a, error); 608 1.72 ad return error; 609 1.23 thorpej } 610 1.1 cgd 611 1.31 jdolecek const int vop_access_vp_offsets[] = { 612 1.1 cgd VOPARG_OFFSETOF(struct vop_access_args,a_vp), 613 1.1 cgd VDESC_NO_OFFSET 614 1.1 cgd }; 615 1.33 jdolecek const struct vnodeop_desc vop_access_desc = { 616 1.67 pooka VOP_ACCESS_DESCOFFSET, 617 1.1 cgd "vop_access", 618 1.1 cgd 0, 619 1.1 cgd vop_access_vp_offsets, 620 1.1 cgd VDESC_NO_OFFSET, 621 1.1 cgd VOPARG_OFFSETOF(struct vop_access_args, a_cred), 622 1.1 cgd VDESC_NO_OFFSET, 623 1.1 cgd }; 624 1.23 thorpej int 625 1.60 thorpej VOP_ACCESS(struct vnode *vp, 626 1.111 christos accmode_t accmode, 627 1.73 pooka kauth_cred_t cred) 628 1.23 thorpej { 629 1.72 ad int error; 630 1.72 ad bool mpsafe; 631 1.23 thorpej struct vop_access_args a; 632 1.105 hannken struct mount *mp; 633 1.23 thorpej a.a_desc = VDESC(vop_access); 634 1.23 thorpej a.a_vp = vp; 635 1.111 christos a.a_accmode = accmode; 636 1.23 thorpej a.a_cred = cred; 637 1.116 hannken assert_vop_locked(vp, "vop_access: vp"); 638 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 639 1.105 hannken if (error) 640 1.105 hannken return error; 641 1.72 ad error = (VCALL(vp, VOFFSET(vop_access), &a)); 642 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 643 1.72 ad return error; 644 1.23 thorpej } 645 1.1 cgd 646 1.111 christos const int vop_accessx_vp_offsets[] = { 647 1.111 christos VOPARG_OFFSETOF(struct vop_accessx_args,a_vp), 648 1.111 christos VDESC_NO_OFFSET 649 1.111 christos }; 650 1.111 christos const struct vnodeop_desc vop_accessx_desc = { 651 1.111 christos VOP_ACCESSX_DESCOFFSET, 652 1.111 christos "vop_accessx", 653 1.111 christos 0, 654 1.111 christos vop_accessx_vp_offsets, 655 1.111 christos VDESC_NO_OFFSET, 656 1.111 christos VOPARG_OFFSETOF(struct vop_accessx_args, a_cred), 657 1.111 christos VDESC_NO_OFFSET, 658 1.111 christos }; 659 1.111 christos int 660 1.111 christos VOP_ACCESSX(struct vnode *vp, 661 1.111 christos accmode_t accmode, 662 1.111 christos kauth_cred_t cred) 663 1.111 christos { 664 1.111 christos int error; 665 1.111 christos bool mpsafe; 666 1.111 christos struct vop_accessx_args a; 667 1.111 christos struct mount *mp; 668 1.111 christos a.a_desc = VDESC(vop_accessx); 669 1.111 christos a.a_vp = vp; 670 1.111 christos a.a_accmode = accmode; 671 1.111 christos a.a_cred = cred; 672 1.116 hannken assert_vop_locked(vp, "vop_accessx: vp"); 673 1.111 christos error = vop_pre(vp, &mp, &mpsafe, FST_NO); 674 1.111 christos if (error) 675 1.111 christos return error; 676 1.111 christos error = (VCALL(vp, VOFFSET(vop_accessx), &a)); 677 1.111 christos vop_post(vp, mp, mpsafe, FST_NO); 678 1.111 christos return error; 679 1.111 christos } 680 1.111 christos 681 1.31 jdolecek const int vop_getattr_vp_offsets[] = { 682 1.1 cgd VOPARG_OFFSETOF(struct vop_getattr_args,a_vp), 683 1.1 cgd VDESC_NO_OFFSET 684 1.1 cgd }; 685 1.33 jdolecek const struct vnodeop_desc vop_getattr_desc = { 686 1.67 pooka VOP_GETATTR_DESCOFFSET, 687 1.1 cgd "vop_getattr", 688 1.1 cgd 0, 689 1.1 cgd vop_getattr_vp_offsets, 690 1.1 cgd VDESC_NO_OFFSET, 691 1.1 cgd VOPARG_OFFSETOF(struct vop_getattr_args, a_cred), 692 1.1 cgd VDESC_NO_OFFSET, 693 1.1 cgd }; 694 1.23 thorpej int 695 1.60 thorpej VOP_GETATTR(struct vnode *vp, 696 1.60 thorpej struct vattr *vap, 697 1.73 pooka kauth_cred_t cred) 698 1.23 thorpej { 699 1.72 ad int error; 700 1.72 ad bool mpsafe; 701 1.23 thorpej struct vop_getattr_args a; 702 1.105 hannken struct mount *mp; 703 1.23 thorpej a.a_desc = VDESC(vop_getattr); 704 1.23 thorpej a.a_vp = vp; 705 1.23 thorpej a.a_vap = vap; 706 1.23 thorpej a.a_cred = cred; 707 1.116 hannken assert_vop_locked(vp, "vop_getattr: vp"); 708 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 709 1.105 hannken if (error) 710 1.105 hannken return error; 711 1.72 ad error = (VCALL(vp, VOFFSET(vop_getattr), &a)); 712 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 713 1.72 ad return error; 714 1.23 thorpej } 715 1.1 cgd 716 1.31 jdolecek const int vop_setattr_vp_offsets[] = { 717 1.1 cgd VOPARG_OFFSETOF(struct vop_setattr_args,a_vp), 718 1.1 cgd VDESC_NO_OFFSET 719 1.1 cgd }; 720 1.33 jdolecek const struct vnodeop_desc vop_setattr_desc = { 721 1.67 pooka VOP_SETATTR_DESCOFFSET, 722 1.1 cgd "vop_setattr", 723 1.1 cgd 0, 724 1.1 cgd vop_setattr_vp_offsets, 725 1.1 cgd VDESC_NO_OFFSET, 726 1.1 cgd VOPARG_OFFSETOF(struct vop_setattr_args, a_cred), 727 1.1 cgd VDESC_NO_OFFSET, 728 1.1 cgd }; 729 1.23 thorpej int 730 1.60 thorpej VOP_SETATTR(struct vnode *vp, 731 1.60 thorpej struct vattr *vap, 732 1.73 pooka kauth_cred_t cred) 733 1.23 thorpej { 734 1.72 ad int error; 735 1.72 ad bool mpsafe; 736 1.23 thorpej struct vop_setattr_args a; 737 1.105 hannken struct mount *mp; 738 1.23 thorpej a.a_desc = VDESC(vop_setattr); 739 1.23 thorpej a.a_vp = vp; 740 1.23 thorpej a.a_vap = vap; 741 1.23 thorpej a.a_cred = cred; 742 1.116 hannken assert_vop_elocked(vp, "vop_setattr: vp"); 743 1.115 thorpej vop_setattr_pre(&a); 744 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 745 1.105 hannken if (error) 746 1.105 hannken return error; 747 1.72 ad error = (VCALL(vp, VOFFSET(vop_setattr), &a)); 748 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 749 1.115 thorpej vop_setattr_post(&a, error); 750 1.72 ad return error; 751 1.23 thorpej } 752 1.1 cgd 753 1.31 jdolecek const int vop_read_vp_offsets[] = { 754 1.1 cgd VOPARG_OFFSETOF(struct vop_read_args,a_vp), 755 1.1 cgd VDESC_NO_OFFSET 756 1.1 cgd }; 757 1.33 jdolecek const struct vnodeop_desc vop_read_desc = { 758 1.67 pooka VOP_READ_DESCOFFSET, 759 1.1 cgd "vop_read", 760 1.1 cgd 0, 761 1.1 cgd vop_read_vp_offsets, 762 1.1 cgd VDESC_NO_OFFSET, 763 1.1 cgd VOPARG_OFFSETOF(struct vop_read_args, a_cred), 764 1.1 cgd VDESC_NO_OFFSET, 765 1.1 cgd }; 766 1.23 thorpej int 767 1.60 thorpej VOP_READ(struct vnode *vp, 768 1.60 thorpej struct uio *uio, 769 1.60 thorpej int ioflag, 770 1.65 elad kauth_cred_t cred) 771 1.23 thorpej { 772 1.72 ad int error; 773 1.72 ad bool mpsafe; 774 1.23 thorpej struct vop_read_args a; 775 1.105 hannken struct mount *mp; 776 1.23 thorpej a.a_desc = VDESC(vop_read); 777 1.23 thorpej a.a_vp = vp; 778 1.23 thorpej a.a_uio = uio; 779 1.23 thorpej a.a_ioflag = ioflag; 780 1.23 thorpej a.a_cred = cred; 781 1.116 hannken assert_vop_locked(vp, "vop_read: vp"); 782 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 783 1.105 hannken if (error) 784 1.105 hannken return error; 785 1.72 ad error = (VCALL(vp, VOFFSET(vop_read), &a)); 786 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 787 1.115 thorpej vop_read_post(&a, error); 788 1.72 ad return error; 789 1.23 thorpej } 790 1.1 cgd 791 1.31 jdolecek const int vop_write_vp_offsets[] = { 792 1.1 cgd VOPARG_OFFSETOF(struct vop_write_args,a_vp), 793 1.1 cgd VDESC_NO_OFFSET 794 1.1 cgd }; 795 1.33 jdolecek const struct vnodeop_desc vop_write_desc = { 796 1.67 pooka VOP_WRITE_DESCOFFSET, 797 1.1 cgd "vop_write", 798 1.1 cgd 0, 799 1.1 cgd vop_write_vp_offsets, 800 1.1 cgd VDESC_NO_OFFSET, 801 1.1 cgd VOPARG_OFFSETOF(struct vop_write_args, a_cred), 802 1.1 cgd VDESC_NO_OFFSET, 803 1.1 cgd }; 804 1.23 thorpej int 805 1.60 thorpej VOP_WRITE(struct vnode *vp, 806 1.60 thorpej struct uio *uio, 807 1.60 thorpej int ioflag, 808 1.65 elad kauth_cred_t cred) 809 1.23 thorpej { 810 1.72 ad int error; 811 1.72 ad bool mpsafe; 812 1.23 thorpej struct vop_write_args a; 813 1.105 hannken struct mount *mp; 814 1.23 thorpej a.a_desc = VDESC(vop_write); 815 1.23 thorpej a.a_vp = vp; 816 1.23 thorpej a.a_uio = uio; 817 1.23 thorpej a.a_ioflag = ioflag; 818 1.23 thorpej a.a_cred = cred; 819 1.116 hannken assert_vop_locked(vp, "vop_write: vp"); 820 1.115 thorpej vop_write_pre(&a); 821 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 822 1.105 hannken if (error) 823 1.105 hannken return error; 824 1.72 ad error = (VCALL(vp, VOFFSET(vop_write), &a)); 825 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 826 1.115 thorpej vop_write_post(&a, error); 827 1.72 ad return error; 828 1.23 thorpej } 829 1.1 cgd 830 1.93 dholland const int vop_fallocate_vp_offsets[] = { 831 1.93 dholland VOPARG_OFFSETOF(struct vop_fallocate_args,a_vp), 832 1.93 dholland VDESC_NO_OFFSET 833 1.93 dholland }; 834 1.93 dholland const struct vnodeop_desc vop_fallocate_desc = { 835 1.93 dholland VOP_FALLOCATE_DESCOFFSET, 836 1.93 dholland "vop_fallocate", 837 1.93 dholland 0, 838 1.93 dholland vop_fallocate_vp_offsets, 839 1.93 dholland VDESC_NO_OFFSET, 840 1.93 dholland VDESC_NO_OFFSET, 841 1.93 dholland VDESC_NO_OFFSET, 842 1.93 dholland }; 843 1.93 dholland int 844 1.93 dholland VOP_FALLOCATE(struct vnode *vp, 845 1.93 dholland off_t pos, 846 1.93 dholland off_t len) 847 1.93 dholland { 848 1.93 dholland int error; 849 1.93 dholland bool mpsafe; 850 1.93 dholland struct vop_fallocate_args a; 851 1.105 hannken struct mount *mp; 852 1.93 dholland a.a_desc = VDESC(vop_fallocate); 853 1.93 dholland a.a_vp = vp; 854 1.93 dholland a.a_pos = pos; 855 1.93 dholland a.a_len = len; 856 1.116 hannken assert_vop_locked(vp, "vop_fallocate: vp"); 857 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 858 1.105 hannken if (error) 859 1.105 hannken return error; 860 1.93 dholland error = (VCALL(vp, VOFFSET(vop_fallocate), &a)); 861 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 862 1.93 dholland return error; 863 1.93 dholland } 864 1.93 dholland 865 1.93 dholland const int vop_fdiscard_vp_offsets[] = { 866 1.93 dholland VOPARG_OFFSETOF(struct vop_fdiscard_args,a_vp), 867 1.93 dholland VDESC_NO_OFFSET 868 1.93 dholland }; 869 1.93 dholland const struct vnodeop_desc vop_fdiscard_desc = { 870 1.93 dholland VOP_FDISCARD_DESCOFFSET, 871 1.93 dholland "vop_fdiscard", 872 1.93 dholland 0, 873 1.93 dholland vop_fdiscard_vp_offsets, 874 1.93 dholland VDESC_NO_OFFSET, 875 1.93 dholland VDESC_NO_OFFSET, 876 1.93 dholland VDESC_NO_OFFSET, 877 1.93 dholland }; 878 1.93 dholland int 879 1.93 dholland VOP_FDISCARD(struct vnode *vp, 880 1.93 dholland off_t pos, 881 1.93 dholland off_t len) 882 1.93 dholland { 883 1.93 dholland int error; 884 1.93 dholland bool mpsafe; 885 1.93 dholland struct vop_fdiscard_args a; 886 1.105 hannken struct mount *mp; 887 1.93 dholland a.a_desc = VDESC(vop_fdiscard); 888 1.93 dholland a.a_vp = vp; 889 1.93 dholland a.a_pos = pos; 890 1.93 dholland a.a_len = len; 891 1.116 hannken assert_vop_locked(vp, "vop_fdiscard: vp"); 892 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 893 1.105 hannken if (error) 894 1.105 hannken return error; 895 1.93 dholland error = (VCALL(vp, VOFFSET(vop_fdiscard), &a)); 896 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 897 1.93 dholland return error; 898 1.93 dholland } 899 1.93 dholland 900 1.31 jdolecek const int vop_ioctl_vp_offsets[] = { 901 1.1 cgd VOPARG_OFFSETOF(struct vop_ioctl_args,a_vp), 902 1.1 cgd VDESC_NO_OFFSET 903 1.1 cgd }; 904 1.33 jdolecek const struct vnodeop_desc vop_ioctl_desc = { 905 1.67 pooka VOP_IOCTL_DESCOFFSET, 906 1.1 cgd "vop_ioctl", 907 1.1 cgd 0, 908 1.1 cgd vop_ioctl_vp_offsets, 909 1.1 cgd VDESC_NO_OFFSET, 910 1.1 cgd VOPARG_OFFSETOF(struct vop_ioctl_args, a_cred), 911 1.1 cgd VDESC_NO_OFFSET, 912 1.1 cgd }; 913 1.23 thorpej int 914 1.60 thorpej VOP_IOCTL(struct vnode *vp, 915 1.60 thorpej u_long command, 916 1.60 thorpej void *data, 917 1.60 thorpej int fflag, 918 1.73 pooka kauth_cred_t cred) 919 1.23 thorpej { 920 1.72 ad int error; 921 1.72 ad bool mpsafe; 922 1.23 thorpej struct vop_ioctl_args a; 923 1.105 hannken struct mount *mp; 924 1.23 thorpej a.a_desc = VDESC(vop_ioctl); 925 1.23 thorpej a.a_vp = vp; 926 1.23 thorpej a.a_command = command; 927 1.23 thorpej a.a_data = data; 928 1.23 thorpej a.a_fflag = fflag; 929 1.23 thorpej a.a_cred = cred; 930 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 931 1.105 hannken if (error) 932 1.105 hannken return error; 933 1.72 ad error = (VCALL(vp, VOFFSET(vop_ioctl), &a)); 934 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 935 1.72 ad return error; 936 1.23 thorpej } 937 1.1 cgd 938 1.31 jdolecek const int vop_fcntl_vp_offsets[] = { 939 1.18 wrstuden VOPARG_OFFSETOF(struct vop_fcntl_args,a_vp), 940 1.18 wrstuden VDESC_NO_OFFSET 941 1.18 wrstuden }; 942 1.33 jdolecek const struct vnodeop_desc vop_fcntl_desc = { 943 1.67 pooka VOP_FCNTL_DESCOFFSET, 944 1.18 wrstuden "vop_fcntl", 945 1.18 wrstuden 0, 946 1.18 wrstuden vop_fcntl_vp_offsets, 947 1.18 wrstuden VDESC_NO_OFFSET, 948 1.18 wrstuden VOPARG_OFFSETOF(struct vop_fcntl_args, a_cred), 949 1.18 wrstuden VDESC_NO_OFFSET, 950 1.18 wrstuden }; 951 1.23 thorpej int 952 1.60 thorpej VOP_FCNTL(struct vnode *vp, 953 1.60 thorpej u_int command, 954 1.60 thorpej void *data, 955 1.60 thorpej int fflag, 956 1.73 pooka kauth_cred_t cred) 957 1.23 thorpej { 958 1.72 ad int error; 959 1.72 ad bool mpsafe; 960 1.23 thorpej struct vop_fcntl_args a; 961 1.105 hannken struct mount *mp; 962 1.23 thorpej a.a_desc = VDESC(vop_fcntl); 963 1.23 thorpej a.a_vp = vp; 964 1.23 thorpej a.a_command = command; 965 1.23 thorpej a.a_data = data; 966 1.23 thorpej a.a_fflag = fflag; 967 1.23 thorpej a.a_cred = cred; 968 1.116 hannken assert_vop_unlocked(vp, "vop_fcntl: vp"); 969 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 970 1.105 hannken if (error) 971 1.105 hannken return error; 972 1.72 ad error = (VCALL(vp, VOFFSET(vop_fcntl), &a)); 973 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 974 1.72 ad return error; 975 1.23 thorpej } 976 1.18 wrstuden 977 1.31 jdolecek const int vop_poll_vp_offsets[] = { 978 1.3 mycroft VOPARG_OFFSETOF(struct vop_poll_args,a_vp), 979 1.1 cgd VDESC_NO_OFFSET 980 1.1 cgd }; 981 1.33 jdolecek const struct vnodeop_desc vop_poll_desc = { 982 1.67 pooka VOP_POLL_DESCOFFSET, 983 1.3 mycroft "vop_poll", 984 1.1 cgd 0, 985 1.3 mycroft vop_poll_vp_offsets, 986 1.1 cgd VDESC_NO_OFFSET, 987 1.3 mycroft VDESC_NO_OFFSET, 988 1.1 cgd VDESC_NO_OFFSET, 989 1.1 cgd }; 990 1.23 thorpej int 991 1.60 thorpej VOP_POLL(struct vnode *vp, 992 1.73 pooka int events) 993 1.23 thorpej { 994 1.72 ad int error; 995 1.72 ad bool mpsafe; 996 1.23 thorpej struct vop_poll_args a; 997 1.105 hannken struct mount *mp; 998 1.23 thorpej a.a_desc = VDESC(vop_poll); 999 1.23 thorpej a.a_vp = vp; 1000 1.23 thorpej a.a_events = events; 1001 1.116 hannken assert_vop_unlocked(vp, "vop_poll: vp"); 1002 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_YES); 1003 1.105 hannken if (error) 1004 1.105 hannken return error; 1005 1.72 ad error = (VCALL(vp, VOFFSET(vop_poll), &a)); 1006 1.105 hannken vop_post(vp, mp, mpsafe, FST_YES); 1007 1.72 ad return error; 1008 1.23 thorpej } 1009 1.1 cgd 1010 1.40 jdolecek const int vop_kqfilter_vp_offsets[] = { 1011 1.40 jdolecek VOPARG_OFFSETOF(struct vop_kqfilter_args,a_vp), 1012 1.40 jdolecek VDESC_NO_OFFSET 1013 1.40 jdolecek }; 1014 1.40 jdolecek const struct vnodeop_desc vop_kqfilter_desc = { 1015 1.67 pooka VOP_KQFILTER_DESCOFFSET, 1016 1.40 jdolecek "vop_kqfilter", 1017 1.40 jdolecek 0, 1018 1.40 jdolecek vop_kqfilter_vp_offsets, 1019 1.40 jdolecek VDESC_NO_OFFSET, 1020 1.40 jdolecek VDESC_NO_OFFSET, 1021 1.40 jdolecek VDESC_NO_OFFSET, 1022 1.40 jdolecek }; 1023 1.40 jdolecek int 1024 1.60 thorpej VOP_KQFILTER(struct vnode *vp, 1025 1.60 thorpej struct knote *kn) 1026 1.40 jdolecek { 1027 1.72 ad int error; 1028 1.72 ad bool mpsafe; 1029 1.40 jdolecek struct vop_kqfilter_args a; 1030 1.105 hannken struct mount *mp; 1031 1.40 jdolecek a.a_desc = VDESC(vop_kqfilter); 1032 1.40 jdolecek a.a_vp = vp; 1033 1.40 jdolecek a.a_kn = kn; 1034 1.116 hannken assert_vop_unlocked(vp, "vop_kqfilter: vp"); 1035 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_YES); 1036 1.105 hannken if (error) 1037 1.105 hannken return error; 1038 1.72 ad error = (VCALL(vp, VOFFSET(vop_kqfilter), &a)); 1039 1.105 hannken vop_post(vp, mp, mpsafe, FST_YES); 1040 1.72 ad return error; 1041 1.40 jdolecek } 1042 1.40 jdolecek 1043 1.31 jdolecek const int vop_revoke_vp_offsets[] = { 1044 1.10 fvdl VOPARG_OFFSETOF(struct vop_revoke_args,a_vp), 1045 1.10 fvdl VDESC_NO_OFFSET 1046 1.10 fvdl }; 1047 1.33 jdolecek const struct vnodeop_desc vop_revoke_desc = { 1048 1.67 pooka VOP_REVOKE_DESCOFFSET, 1049 1.10 fvdl "vop_revoke", 1050 1.10 fvdl 0, 1051 1.10 fvdl vop_revoke_vp_offsets, 1052 1.10 fvdl VDESC_NO_OFFSET, 1053 1.10 fvdl VDESC_NO_OFFSET, 1054 1.10 fvdl VDESC_NO_OFFSET, 1055 1.10 fvdl }; 1056 1.23 thorpej int 1057 1.60 thorpej VOP_REVOKE(struct vnode *vp, 1058 1.60 thorpej int flags) 1059 1.23 thorpej { 1060 1.72 ad int error; 1061 1.72 ad bool mpsafe; 1062 1.23 thorpej struct vop_revoke_args a; 1063 1.105 hannken struct mount *mp; 1064 1.23 thorpej a.a_desc = VDESC(vop_revoke); 1065 1.23 thorpej a.a_vp = vp; 1066 1.23 thorpej a.a_flags = flags; 1067 1.116 hannken assert_vop_unlocked(vp, "vop_revoke: vp"); 1068 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1069 1.105 hannken if (error) 1070 1.105 hannken return error; 1071 1.72 ad error = (VCALL(vp, VOFFSET(vop_revoke), &a)); 1072 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 1073 1.72 ad return error; 1074 1.23 thorpej } 1075 1.10 fvdl 1076 1.31 jdolecek const int vop_mmap_vp_offsets[] = { 1077 1.1 cgd VOPARG_OFFSETOF(struct vop_mmap_args,a_vp), 1078 1.1 cgd VDESC_NO_OFFSET 1079 1.1 cgd }; 1080 1.33 jdolecek const struct vnodeop_desc vop_mmap_desc = { 1081 1.67 pooka VOP_MMAP_DESCOFFSET, 1082 1.1 cgd "vop_mmap", 1083 1.1 cgd 0, 1084 1.1 cgd vop_mmap_vp_offsets, 1085 1.1 cgd VDESC_NO_OFFSET, 1086 1.1 cgd VOPARG_OFFSETOF(struct vop_mmap_args, a_cred), 1087 1.1 cgd VDESC_NO_OFFSET, 1088 1.1 cgd }; 1089 1.23 thorpej int 1090 1.60 thorpej VOP_MMAP(struct vnode *vp, 1091 1.70 pooka vm_prot_t prot, 1092 1.73 pooka kauth_cred_t cred) 1093 1.23 thorpej { 1094 1.72 ad int error; 1095 1.72 ad bool mpsafe; 1096 1.23 thorpej struct vop_mmap_args a; 1097 1.105 hannken struct mount *mp; 1098 1.23 thorpej a.a_desc = VDESC(vop_mmap); 1099 1.23 thorpej a.a_vp = vp; 1100 1.70 pooka a.a_prot = prot; 1101 1.23 thorpej a.a_cred = cred; 1102 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_YES); 1103 1.105 hannken if (error) 1104 1.105 hannken return error; 1105 1.72 ad error = (VCALL(vp, VOFFSET(vop_mmap), &a)); 1106 1.105 hannken vop_post(vp, mp, mpsafe, FST_YES); 1107 1.72 ad return error; 1108 1.23 thorpej } 1109 1.1 cgd 1110 1.31 jdolecek const int vop_fsync_vp_offsets[] = { 1111 1.1 cgd VOPARG_OFFSETOF(struct vop_fsync_args,a_vp), 1112 1.1 cgd VDESC_NO_OFFSET 1113 1.1 cgd }; 1114 1.33 jdolecek const struct vnodeop_desc vop_fsync_desc = { 1115 1.67 pooka VOP_FSYNC_DESCOFFSET, 1116 1.1 cgd "vop_fsync", 1117 1.1 cgd 0, 1118 1.1 cgd vop_fsync_vp_offsets, 1119 1.1 cgd VDESC_NO_OFFSET, 1120 1.1 cgd VOPARG_OFFSETOF(struct vop_fsync_args, a_cred), 1121 1.1 cgd VDESC_NO_OFFSET, 1122 1.1 cgd }; 1123 1.23 thorpej int 1124 1.60 thorpej VOP_FSYNC(struct vnode *vp, 1125 1.65 elad kauth_cred_t cred, 1126 1.60 thorpej int flags, 1127 1.60 thorpej off_t offlo, 1128 1.73 pooka off_t offhi) 1129 1.23 thorpej { 1130 1.72 ad int error; 1131 1.72 ad bool mpsafe; 1132 1.23 thorpej struct vop_fsync_args a; 1133 1.105 hannken struct mount *mp; 1134 1.23 thorpej a.a_desc = VDESC(vop_fsync); 1135 1.23 thorpej a.a_vp = vp; 1136 1.23 thorpej a.a_cred = cred; 1137 1.23 thorpej a.a_flags = flags; 1138 1.25 fvdl a.a_offlo = offlo; 1139 1.25 fvdl a.a_offhi = offhi; 1140 1.116 hannken assert_vop_locked(vp, "vop_fsync: vp"); 1141 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1142 1.105 hannken if (error) 1143 1.105 hannken return error; 1144 1.72 ad error = (VCALL(vp, VOFFSET(vop_fsync), &a)); 1145 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 1146 1.72 ad return error; 1147 1.23 thorpej } 1148 1.1 cgd 1149 1.31 jdolecek const int vop_seek_vp_offsets[] = { 1150 1.1 cgd VOPARG_OFFSETOF(struct vop_seek_args,a_vp), 1151 1.1 cgd VDESC_NO_OFFSET 1152 1.1 cgd }; 1153 1.33 jdolecek const struct vnodeop_desc vop_seek_desc = { 1154 1.67 pooka VOP_SEEK_DESCOFFSET, 1155 1.1 cgd "vop_seek", 1156 1.1 cgd 0, 1157 1.1 cgd vop_seek_vp_offsets, 1158 1.1 cgd VDESC_NO_OFFSET, 1159 1.1 cgd VOPARG_OFFSETOF(struct vop_seek_args, a_cred), 1160 1.1 cgd VDESC_NO_OFFSET, 1161 1.1 cgd }; 1162 1.23 thorpej int 1163 1.60 thorpej VOP_SEEK(struct vnode *vp, 1164 1.60 thorpej off_t oldoff, 1165 1.60 thorpej off_t newoff, 1166 1.65 elad kauth_cred_t cred) 1167 1.23 thorpej { 1168 1.72 ad int error; 1169 1.72 ad bool mpsafe; 1170 1.23 thorpej struct vop_seek_args a; 1171 1.105 hannken struct mount *mp; 1172 1.23 thorpej a.a_desc = VDESC(vop_seek); 1173 1.23 thorpej a.a_vp = vp; 1174 1.23 thorpej a.a_oldoff = oldoff; 1175 1.23 thorpej a.a_newoff = newoff; 1176 1.23 thorpej a.a_cred = cred; 1177 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_YES); 1178 1.105 hannken if (error) 1179 1.105 hannken return error; 1180 1.72 ad error = (VCALL(vp, VOFFSET(vop_seek), &a)); 1181 1.105 hannken vop_post(vp, mp, mpsafe, FST_YES); 1182 1.72 ad return error; 1183 1.23 thorpej } 1184 1.1 cgd 1185 1.31 jdolecek const int vop_remove_vp_offsets[] = { 1186 1.115 thorpej VOPARG_OFFSETOF(struct vop_remove_v3_args,a_dvp), 1187 1.115 thorpej VOPARG_OFFSETOF(struct vop_remove_v3_args,a_vp), 1188 1.1 cgd VDESC_NO_OFFSET 1189 1.1 cgd }; 1190 1.33 jdolecek const struct vnodeop_desc vop_remove_desc = { 1191 1.67 pooka VOP_REMOVE_DESCOFFSET, 1192 1.1 cgd "vop_remove", 1193 1.103 riastrad 0 | VDESC_VP1_WILLPUT, 1194 1.1 cgd vop_remove_vp_offsets, 1195 1.1 cgd VDESC_NO_OFFSET, 1196 1.1 cgd VDESC_NO_OFFSET, 1197 1.115 thorpej VOPARG_OFFSETOF(struct vop_remove_v3_args, a_cnp), 1198 1.1 cgd }; 1199 1.23 thorpej int 1200 1.60 thorpej VOP_REMOVE(struct vnode *dvp, 1201 1.60 thorpej struct vnode *vp, 1202 1.60 thorpej struct componentname *cnp) 1203 1.23 thorpej { 1204 1.72 ad int error; 1205 1.72 ad bool mpsafe; 1206 1.115 thorpej struct vop_remove_v3_args a; 1207 1.105 hannken struct mount *mp; 1208 1.23 thorpej a.a_desc = VDESC(vop_remove); 1209 1.23 thorpej a.a_dvp = dvp; 1210 1.81 pooka a.a_vp = vp; 1211 1.23 thorpej a.a_cnp = cnp; 1212 1.116 hannken assert_vop_elocked(dvp, "vop_remove: dvp"); 1213 1.116 hannken assert_vop_locked(vp, "vop_remove: vp"); 1214 1.115 thorpej vop_remove_pre(&a); 1215 1.105 hannken error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 1216 1.105 hannken if (error) 1217 1.105 hannken return error; 1218 1.72 ad error = (VCALL(dvp, VOFFSET(vop_remove), &a)); 1219 1.105 hannken vop_post(dvp, mp, mpsafe, FST_NO); 1220 1.115 thorpej vop_remove_post(&a, error); 1221 1.72 ad return error; 1222 1.23 thorpej } 1223 1.1 cgd 1224 1.31 jdolecek const int vop_link_vp_offsets[] = { 1225 1.94 riastrad VOPARG_OFFSETOF(struct vop_link_v2_args,a_dvp), 1226 1.94 riastrad VOPARG_OFFSETOF(struct vop_link_v2_args,a_vp), 1227 1.1 cgd VDESC_NO_OFFSET 1228 1.1 cgd }; 1229 1.33 jdolecek const struct vnodeop_desc vop_link_desc = { 1230 1.67 pooka VOP_LINK_DESCOFFSET, 1231 1.1 cgd "vop_link", 1232 1.94 riastrad 0, 1233 1.1 cgd vop_link_vp_offsets, 1234 1.1 cgd VDESC_NO_OFFSET, 1235 1.1 cgd VDESC_NO_OFFSET, 1236 1.94 riastrad VOPARG_OFFSETOF(struct vop_link_v2_args, a_cnp), 1237 1.1 cgd }; 1238 1.23 thorpej int 1239 1.60 thorpej VOP_LINK(struct vnode *dvp, 1240 1.60 thorpej struct vnode *vp, 1241 1.60 thorpej struct componentname *cnp) 1242 1.23 thorpej { 1243 1.72 ad int error; 1244 1.72 ad bool mpsafe; 1245 1.94 riastrad struct vop_link_v2_args a; 1246 1.105 hannken struct mount *mp; 1247 1.23 thorpej a.a_desc = VDESC(vop_link); 1248 1.23 thorpej a.a_dvp = dvp; 1249 1.81 pooka a.a_vp = vp; 1250 1.23 thorpej a.a_cnp = cnp; 1251 1.116 hannken assert_vop_elocked(dvp, "vop_link: dvp"); 1252 1.116 hannken assert_vop_unlocked(vp, "vop_link: vp"); 1253 1.105 hannken error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 1254 1.105 hannken if (error) 1255 1.105 hannken return error; 1256 1.72 ad error = (VCALL(dvp, VOFFSET(vop_link), &a)); 1257 1.105 hannken vop_post(dvp, mp, mpsafe, FST_NO); 1258 1.115 thorpej vop_link_post(&a, error); 1259 1.72 ad return error; 1260 1.23 thorpej } 1261 1.1 cgd 1262 1.31 jdolecek const int vop_rename_vp_offsets[] = { 1263 1.1 cgd VOPARG_OFFSETOF(struct vop_rename_args,a_fdvp), 1264 1.1 cgd VOPARG_OFFSETOF(struct vop_rename_args,a_fvp), 1265 1.1 cgd VOPARG_OFFSETOF(struct vop_rename_args,a_tdvp), 1266 1.1 cgd VOPARG_OFFSETOF(struct vop_rename_args,a_tvp), 1267 1.1 cgd VDESC_NO_OFFSET 1268 1.1 cgd }; 1269 1.33 jdolecek const struct vnodeop_desc vop_rename_desc = { 1270 1.67 pooka VOP_RENAME_DESCOFFSET, 1271 1.1 cgd "vop_rename", 1272 1.42 jdolecek 0 | VDESC_VP0_WILLRELE | VDESC_VP1_WILLRELE | VDESC_VP2_WILLPUT | VDESC_VP3_WILLPUT, 1273 1.1 cgd vop_rename_vp_offsets, 1274 1.1 cgd VDESC_NO_OFFSET, 1275 1.1 cgd VDESC_NO_OFFSET, 1276 1.1 cgd VOPARG_OFFSETOF(struct vop_rename_args, a_fcnp), 1277 1.1 cgd }; 1278 1.23 thorpej int 1279 1.60 thorpej VOP_RENAME(struct vnode *fdvp, 1280 1.60 thorpej struct vnode *fvp, 1281 1.60 thorpej struct componentname *fcnp, 1282 1.60 thorpej struct vnode *tdvp, 1283 1.60 thorpej struct vnode *tvp, 1284 1.60 thorpej struct componentname *tcnp) 1285 1.23 thorpej { 1286 1.72 ad int error; 1287 1.72 ad bool mpsafe; 1288 1.23 thorpej struct vop_rename_args a; 1289 1.105 hannken struct mount *mp; 1290 1.23 thorpej a.a_desc = VDESC(vop_rename); 1291 1.23 thorpej a.a_fdvp = fdvp; 1292 1.23 thorpej a.a_fvp = fvp; 1293 1.23 thorpej a.a_fcnp = fcnp; 1294 1.23 thorpej a.a_tdvp = tdvp; 1295 1.23 thorpej a.a_tvp = tvp; 1296 1.23 thorpej a.a_tcnp = tcnp; 1297 1.116 hannken assert_vop_locked(tdvp, "vop_rename: tdvp"); 1298 1.105 hannken error = vop_pre(fdvp, &mp, &mpsafe, FST_YES); 1299 1.105 hannken if (error) 1300 1.105 hannken return error; 1301 1.72 ad error = (VCALL(fdvp, VOFFSET(vop_rename), &a)); 1302 1.105 hannken vop_post(fdvp, mp, mpsafe, FST_YES); 1303 1.72 ad return error; 1304 1.23 thorpej } 1305 1.1 cgd 1306 1.31 jdolecek const int vop_mkdir_vp_offsets[] = { 1307 1.91 hannken VOPARG_OFFSETOF(struct vop_mkdir_v3_args,a_dvp), 1308 1.1 cgd VDESC_NO_OFFSET 1309 1.1 cgd }; 1310 1.33 jdolecek const struct vnodeop_desc vop_mkdir_desc = { 1311 1.67 pooka VOP_MKDIR_DESCOFFSET, 1312 1.1 cgd "vop_mkdir", 1313 1.90 hannken 0, 1314 1.1 cgd vop_mkdir_vp_offsets, 1315 1.91 hannken VOPARG_OFFSETOF(struct vop_mkdir_v3_args, a_vpp), 1316 1.1 cgd VDESC_NO_OFFSET, 1317 1.91 hannken VOPARG_OFFSETOF(struct vop_mkdir_v3_args, a_cnp), 1318 1.1 cgd }; 1319 1.23 thorpej int 1320 1.60 thorpej VOP_MKDIR(struct vnode *dvp, 1321 1.60 thorpej struct vnode **vpp, 1322 1.60 thorpej struct componentname *cnp, 1323 1.60 thorpej struct vattr *vap) 1324 1.23 thorpej { 1325 1.72 ad int error; 1326 1.72 ad bool mpsafe; 1327 1.91 hannken struct vop_mkdir_v3_args a; 1328 1.105 hannken struct mount *mp; 1329 1.23 thorpej a.a_desc = VDESC(vop_mkdir); 1330 1.23 thorpej a.a_dvp = dvp; 1331 1.23 thorpej a.a_vpp = vpp; 1332 1.23 thorpej a.a_cnp = cnp; 1333 1.23 thorpej a.a_vap = vap; 1334 1.116 hannken assert_vop_elocked(dvp, "vop_mkdir: dvp"); 1335 1.105 hannken error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 1336 1.105 hannken if (error) 1337 1.105 hannken return error; 1338 1.72 ad error = (VCALL(dvp, VOFFSET(vop_mkdir), &a)); 1339 1.105 hannken vop_post(dvp, mp, mpsafe, FST_NO); 1340 1.115 thorpej vop_mkdir_post(&a, error); 1341 1.69 pooka #ifdef DIAGNOSTIC 1342 1.72 ad if (error == 0) 1343 1.69 pooka KASSERT((*vpp)->v_size != VSIZENOTSET 1344 1.69 pooka && (*vpp)->v_writesize != VSIZENOTSET); 1345 1.69 pooka #endif /* DIAGNOSTIC */ 1346 1.72 ad return error; 1347 1.23 thorpej } 1348 1.1 cgd 1349 1.31 jdolecek const int vop_rmdir_vp_offsets[] = { 1350 1.103 riastrad VOPARG_OFFSETOF(struct vop_rmdir_v2_args,a_dvp), 1351 1.103 riastrad VOPARG_OFFSETOF(struct vop_rmdir_v2_args,a_vp), 1352 1.1 cgd VDESC_NO_OFFSET 1353 1.1 cgd }; 1354 1.33 jdolecek const struct vnodeop_desc vop_rmdir_desc = { 1355 1.67 pooka VOP_RMDIR_DESCOFFSET, 1356 1.1 cgd "vop_rmdir", 1357 1.103 riastrad 0 | VDESC_VP1_WILLPUT, 1358 1.1 cgd vop_rmdir_vp_offsets, 1359 1.1 cgd VDESC_NO_OFFSET, 1360 1.1 cgd VDESC_NO_OFFSET, 1361 1.103 riastrad VOPARG_OFFSETOF(struct vop_rmdir_v2_args, a_cnp), 1362 1.1 cgd }; 1363 1.23 thorpej int 1364 1.60 thorpej VOP_RMDIR(struct vnode *dvp, 1365 1.60 thorpej struct vnode *vp, 1366 1.60 thorpej struct componentname *cnp) 1367 1.23 thorpej { 1368 1.72 ad int error; 1369 1.72 ad bool mpsafe; 1370 1.103 riastrad struct vop_rmdir_v2_args a; 1371 1.105 hannken struct mount *mp; 1372 1.23 thorpej a.a_desc = VDESC(vop_rmdir); 1373 1.23 thorpej a.a_dvp = dvp; 1374 1.81 pooka a.a_vp = vp; 1375 1.23 thorpej a.a_cnp = cnp; 1376 1.116 hannken assert_vop_elocked(dvp, "vop_rmdir: dvp"); 1377 1.116 hannken assert_vop_elocked(vp, "vop_rmdir: vp"); 1378 1.115 thorpej vop_rmdir_pre(&a); 1379 1.105 hannken error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 1380 1.105 hannken if (error) 1381 1.105 hannken return error; 1382 1.72 ad error = (VCALL(dvp, VOFFSET(vop_rmdir), &a)); 1383 1.105 hannken vop_post(dvp, mp, mpsafe, FST_NO); 1384 1.115 thorpej vop_rmdir_post(&a, error); 1385 1.72 ad return error; 1386 1.23 thorpej } 1387 1.1 cgd 1388 1.31 jdolecek const int vop_symlink_vp_offsets[] = { 1389 1.91 hannken VOPARG_OFFSETOF(struct vop_symlink_v3_args,a_dvp), 1390 1.1 cgd VDESC_NO_OFFSET 1391 1.1 cgd }; 1392 1.33 jdolecek const struct vnodeop_desc vop_symlink_desc = { 1393 1.67 pooka VOP_SYMLINK_DESCOFFSET, 1394 1.1 cgd "vop_symlink", 1395 1.90 hannken 0, 1396 1.1 cgd vop_symlink_vp_offsets, 1397 1.91 hannken VOPARG_OFFSETOF(struct vop_symlink_v3_args, a_vpp), 1398 1.1 cgd VDESC_NO_OFFSET, 1399 1.91 hannken VOPARG_OFFSETOF(struct vop_symlink_v3_args, a_cnp), 1400 1.1 cgd }; 1401 1.23 thorpej int 1402 1.60 thorpej VOP_SYMLINK(struct vnode *dvp, 1403 1.60 thorpej struct vnode **vpp, 1404 1.60 thorpej struct componentname *cnp, 1405 1.60 thorpej struct vattr *vap, 1406 1.60 thorpej char *target) 1407 1.23 thorpej { 1408 1.72 ad int error; 1409 1.72 ad bool mpsafe; 1410 1.91 hannken struct vop_symlink_v3_args a; 1411 1.105 hannken struct mount *mp; 1412 1.23 thorpej a.a_desc = VDESC(vop_symlink); 1413 1.23 thorpej a.a_dvp = dvp; 1414 1.23 thorpej a.a_vpp = vpp; 1415 1.23 thorpej a.a_cnp = cnp; 1416 1.23 thorpej a.a_vap = vap; 1417 1.23 thorpej a.a_target = target; 1418 1.116 hannken assert_vop_elocked(dvp, "vop_symlink: dvp"); 1419 1.105 hannken error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 1420 1.105 hannken if (error) 1421 1.105 hannken return error; 1422 1.72 ad error = (VCALL(dvp, VOFFSET(vop_symlink), &a)); 1423 1.105 hannken vop_post(dvp, mp, mpsafe, FST_NO); 1424 1.115 thorpej vop_symlink_post(&a, error); 1425 1.69 pooka #ifdef DIAGNOSTIC 1426 1.72 ad if (error == 0) 1427 1.69 pooka KASSERT((*vpp)->v_size != VSIZENOTSET 1428 1.69 pooka && (*vpp)->v_writesize != VSIZENOTSET); 1429 1.69 pooka #endif /* DIAGNOSTIC */ 1430 1.72 ad return error; 1431 1.23 thorpej } 1432 1.1 cgd 1433 1.31 jdolecek const int vop_readdir_vp_offsets[] = { 1434 1.1 cgd VOPARG_OFFSETOF(struct vop_readdir_args,a_vp), 1435 1.1 cgd VDESC_NO_OFFSET 1436 1.1 cgd }; 1437 1.33 jdolecek const struct vnodeop_desc vop_readdir_desc = { 1438 1.67 pooka VOP_READDIR_DESCOFFSET, 1439 1.1 cgd "vop_readdir", 1440 1.1 cgd 0, 1441 1.1 cgd vop_readdir_vp_offsets, 1442 1.1 cgd VDESC_NO_OFFSET, 1443 1.1 cgd VOPARG_OFFSETOF(struct vop_readdir_args, a_cred), 1444 1.1 cgd VDESC_NO_OFFSET, 1445 1.1 cgd }; 1446 1.23 thorpej int 1447 1.60 thorpej VOP_READDIR(struct vnode *vp, 1448 1.60 thorpej struct uio *uio, 1449 1.65 elad kauth_cred_t cred, 1450 1.60 thorpej int *eofflag, 1451 1.60 thorpej off_t **cookies, 1452 1.60 thorpej int *ncookies) 1453 1.23 thorpej { 1454 1.72 ad int error; 1455 1.72 ad bool mpsafe; 1456 1.23 thorpej struct vop_readdir_args a; 1457 1.105 hannken struct mount *mp; 1458 1.23 thorpej a.a_desc = VDESC(vop_readdir); 1459 1.23 thorpej a.a_vp = vp; 1460 1.23 thorpej a.a_uio = uio; 1461 1.23 thorpej a.a_cred = cred; 1462 1.23 thorpej a.a_eofflag = eofflag; 1463 1.23 thorpej a.a_cookies = cookies; 1464 1.23 thorpej a.a_ncookies = ncookies; 1465 1.116 hannken assert_vop_locked(vp, "vop_readdir: vp"); 1466 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1467 1.105 hannken if (error) 1468 1.105 hannken return error; 1469 1.72 ad error = (VCALL(vp, VOFFSET(vop_readdir), &a)); 1470 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 1471 1.72 ad return error; 1472 1.23 thorpej } 1473 1.1 cgd 1474 1.31 jdolecek const int vop_readlink_vp_offsets[] = { 1475 1.1 cgd VOPARG_OFFSETOF(struct vop_readlink_args,a_vp), 1476 1.1 cgd VDESC_NO_OFFSET 1477 1.1 cgd }; 1478 1.33 jdolecek const struct vnodeop_desc vop_readlink_desc = { 1479 1.67 pooka VOP_READLINK_DESCOFFSET, 1480 1.1 cgd "vop_readlink", 1481 1.1 cgd 0, 1482 1.1 cgd vop_readlink_vp_offsets, 1483 1.1 cgd VDESC_NO_OFFSET, 1484 1.1 cgd VOPARG_OFFSETOF(struct vop_readlink_args, a_cred), 1485 1.1 cgd VDESC_NO_OFFSET, 1486 1.1 cgd }; 1487 1.23 thorpej int 1488 1.60 thorpej VOP_READLINK(struct vnode *vp, 1489 1.60 thorpej struct uio *uio, 1490 1.65 elad kauth_cred_t cred) 1491 1.23 thorpej { 1492 1.72 ad int error; 1493 1.72 ad bool mpsafe; 1494 1.23 thorpej struct vop_readlink_args a; 1495 1.105 hannken struct mount *mp; 1496 1.23 thorpej a.a_desc = VDESC(vop_readlink); 1497 1.23 thorpej a.a_vp = vp; 1498 1.23 thorpej a.a_uio = uio; 1499 1.23 thorpej a.a_cred = cred; 1500 1.116 hannken assert_vop_locked(vp, "vop_readlink: vp"); 1501 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1502 1.105 hannken if (error) 1503 1.105 hannken return error; 1504 1.72 ad error = (VCALL(vp, VOFFSET(vop_readlink), &a)); 1505 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 1506 1.72 ad return error; 1507 1.23 thorpej } 1508 1.1 cgd 1509 1.31 jdolecek const int vop_abortop_vp_offsets[] = { 1510 1.1 cgd VOPARG_OFFSETOF(struct vop_abortop_args,a_dvp), 1511 1.1 cgd VDESC_NO_OFFSET 1512 1.1 cgd }; 1513 1.33 jdolecek const struct vnodeop_desc vop_abortop_desc = { 1514 1.67 pooka VOP_ABORTOP_DESCOFFSET, 1515 1.1 cgd "vop_abortop", 1516 1.1 cgd 0, 1517 1.1 cgd vop_abortop_vp_offsets, 1518 1.1 cgd VDESC_NO_OFFSET, 1519 1.1 cgd VDESC_NO_OFFSET, 1520 1.1 cgd VOPARG_OFFSETOF(struct vop_abortop_args, a_cnp), 1521 1.1 cgd }; 1522 1.23 thorpej int 1523 1.60 thorpej VOP_ABORTOP(struct vnode *dvp, 1524 1.60 thorpej struct componentname *cnp) 1525 1.23 thorpej { 1526 1.72 ad int error; 1527 1.72 ad bool mpsafe; 1528 1.23 thorpej struct vop_abortop_args a; 1529 1.105 hannken struct mount *mp; 1530 1.23 thorpej a.a_desc = VDESC(vop_abortop); 1531 1.23 thorpej a.a_dvp = dvp; 1532 1.23 thorpej a.a_cnp = cnp; 1533 1.105 hannken error = vop_pre(dvp, &mp, &mpsafe, FST_YES); 1534 1.105 hannken if (error) 1535 1.105 hannken return error; 1536 1.72 ad error = (VCALL(dvp, VOFFSET(vop_abortop), &a)); 1537 1.105 hannken vop_post(dvp, mp, mpsafe, FST_YES); 1538 1.72 ad return error; 1539 1.23 thorpej } 1540 1.1 cgd 1541 1.31 jdolecek const int vop_inactive_vp_offsets[] = { 1542 1.98 riastrad VOPARG_OFFSETOF(struct vop_inactive_v2_args,a_vp), 1543 1.1 cgd VDESC_NO_OFFSET 1544 1.1 cgd }; 1545 1.33 jdolecek const struct vnodeop_desc vop_inactive_desc = { 1546 1.67 pooka VOP_INACTIVE_DESCOFFSET, 1547 1.1 cgd "vop_inactive", 1548 1.98 riastrad 0, 1549 1.1 cgd vop_inactive_vp_offsets, 1550 1.1 cgd VDESC_NO_OFFSET, 1551 1.1 cgd VDESC_NO_OFFSET, 1552 1.1 cgd VDESC_NO_OFFSET, 1553 1.1 cgd }; 1554 1.23 thorpej int 1555 1.75 ad VOP_INACTIVE(struct vnode *vp, 1556 1.75 ad bool *recycle) 1557 1.23 thorpej { 1558 1.72 ad int error; 1559 1.72 ad bool mpsafe; 1560 1.98 riastrad struct vop_inactive_v2_args a; 1561 1.105 hannken struct mount *mp; 1562 1.23 thorpej a.a_desc = VDESC(vop_inactive); 1563 1.23 thorpej a.a_vp = vp; 1564 1.75 ad a.a_recycle = recycle; 1565 1.116 hannken assert_vop_elocked(vp, "vop_inactive: vp"); 1566 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1567 1.105 hannken if (error) 1568 1.105 hannken return error; 1569 1.72 ad error = (VCALL(vp, VOFFSET(vop_inactive), &a)); 1570 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 1571 1.72 ad return error; 1572 1.23 thorpej } 1573 1.1 cgd 1574 1.31 jdolecek const int vop_reclaim_vp_offsets[] = { 1575 1.104 riastrad VOPARG_OFFSETOF(struct vop_reclaim_v2_args,a_vp), 1576 1.1 cgd VDESC_NO_OFFSET 1577 1.1 cgd }; 1578 1.33 jdolecek const struct vnodeop_desc vop_reclaim_desc = { 1579 1.67 pooka VOP_RECLAIM_DESCOFFSET, 1580 1.1 cgd "vop_reclaim", 1581 1.1 cgd 0, 1582 1.1 cgd vop_reclaim_vp_offsets, 1583 1.1 cgd VDESC_NO_OFFSET, 1584 1.1 cgd VDESC_NO_OFFSET, 1585 1.1 cgd VDESC_NO_OFFSET, 1586 1.1 cgd }; 1587 1.23 thorpej int 1588 1.73 pooka VOP_RECLAIM(struct vnode *vp) 1589 1.23 thorpej { 1590 1.72 ad int error; 1591 1.72 ad bool mpsafe; 1592 1.104 riastrad struct vop_reclaim_v2_args a; 1593 1.105 hannken struct mount *mp; 1594 1.23 thorpej a.a_desc = VDESC(vop_reclaim); 1595 1.23 thorpej a.a_vp = vp; 1596 1.116 hannken assert_vop_elocked(vp, "vop_reclaim: vp"); 1597 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1598 1.105 hannken if (error) 1599 1.105 hannken return error; 1600 1.72 ad error = (VCALL(vp, VOFFSET(vop_reclaim), &a)); 1601 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 1602 1.72 ad return error; 1603 1.23 thorpej } 1604 1.1 cgd 1605 1.31 jdolecek const int vop_lock_vp_offsets[] = { 1606 1.1 cgd VOPARG_OFFSETOF(struct vop_lock_args,a_vp), 1607 1.1 cgd VDESC_NO_OFFSET 1608 1.1 cgd }; 1609 1.33 jdolecek const struct vnodeop_desc vop_lock_desc = { 1610 1.67 pooka VOP_LOCK_DESCOFFSET, 1611 1.1 cgd "vop_lock", 1612 1.1 cgd 0, 1613 1.1 cgd vop_lock_vp_offsets, 1614 1.1 cgd VDESC_NO_OFFSET, 1615 1.1 cgd VDESC_NO_OFFSET, 1616 1.1 cgd VDESC_NO_OFFSET, 1617 1.1 cgd }; 1618 1.23 thorpej int 1619 1.60 thorpej VOP_LOCK(struct vnode *vp, 1620 1.60 thorpej int flags) 1621 1.23 thorpej { 1622 1.72 ad int error; 1623 1.72 ad bool mpsafe; 1624 1.23 thorpej struct vop_lock_args a; 1625 1.105 hannken struct mount *mp; 1626 1.23 thorpej a.a_desc = VDESC(vop_lock); 1627 1.23 thorpej a.a_vp = vp; 1628 1.23 thorpej a.a_flags = flags; 1629 1.110 ad error = vop_pre(vp, &mp, &mpsafe, (!(flags & (LK_SHARED|LK_EXCLUSIVE)) ? FST_NO : (flags & LK_NOWAIT ? FST_TRY : FST_YES))); 1630 1.105 hannken if (error) 1631 1.105 hannken return error; 1632 1.72 ad error = (VCALL(vp, VOFFSET(vop_lock), &a)); 1633 1.109 ad vop_post(vp, mp, mpsafe, (flags & (LK_UPGRADE|LK_DOWNGRADE) ? FST_NO : (error ? FST_YES : FST_NO))); 1634 1.72 ad return error; 1635 1.23 thorpej } 1636 1.1 cgd 1637 1.31 jdolecek const int vop_unlock_vp_offsets[] = { 1638 1.1 cgd VOPARG_OFFSETOF(struct vop_unlock_args,a_vp), 1639 1.1 cgd VDESC_NO_OFFSET 1640 1.1 cgd }; 1641 1.33 jdolecek const struct vnodeop_desc vop_unlock_desc = { 1642 1.67 pooka VOP_UNLOCK_DESCOFFSET, 1643 1.1 cgd "vop_unlock", 1644 1.1 cgd 0, 1645 1.1 cgd vop_unlock_vp_offsets, 1646 1.1 cgd VDESC_NO_OFFSET, 1647 1.1 cgd VDESC_NO_OFFSET, 1648 1.1 cgd VDESC_NO_OFFSET, 1649 1.1 cgd }; 1650 1.23 thorpej int 1651 1.85 hannken VOP_UNLOCK(struct vnode *vp) 1652 1.23 thorpej { 1653 1.72 ad int error; 1654 1.72 ad bool mpsafe; 1655 1.23 thorpej struct vop_unlock_args a; 1656 1.105 hannken struct mount *mp; 1657 1.23 thorpej a.a_desc = VDESC(vop_unlock); 1658 1.23 thorpej a.a_vp = vp; 1659 1.116 hannken assert_vop_locked(vp, "vop_unlock: vp"); 1660 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1661 1.105 hannken if (error) 1662 1.105 hannken return error; 1663 1.72 ad error = (VCALL(vp, VOFFSET(vop_unlock), &a)); 1664 1.105 hannken vop_post(vp, mp, mpsafe, FST_YES); 1665 1.72 ad return error; 1666 1.23 thorpej } 1667 1.1 cgd 1668 1.31 jdolecek const int vop_bmap_vp_offsets[] = { 1669 1.1 cgd VOPARG_OFFSETOF(struct vop_bmap_args,a_vp), 1670 1.1 cgd VDESC_NO_OFFSET 1671 1.1 cgd }; 1672 1.33 jdolecek const struct vnodeop_desc vop_bmap_desc = { 1673 1.67 pooka VOP_BMAP_DESCOFFSET, 1674 1.1 cgd "vop_bmap", 1675 1.1 cgd 0, 1676 1.1 cgd vop_bmap_vp_offsets, 1677 1.1 cgd VOPARG_OFFSETOF(struct vop_bmap_args, a_vpp), 1678 1.1 cgd VDESC_NO_OFFSET, 1679 1.1 cgd VDESC_NO_OFFSET, 1680 1.1 cgd }; 1681 1.23 thorpej int 1682 1.60 thorpej VOP_BMAP(struct vnode *vp, 1683 1.60 thorpej daddr_t bn, 1684 1.60 thorpej struct vnode **vpp, 1685 1.60 thorpej daddr_t *bnp, 1686 1.60 thorpej int *runp) 1687 1.23 thorpej { 1688 1.72 ad int error; 1689 1.72 ad bool mpsafe; 1690 1.23 thorpej struct vop_bmap_args a; 1691 1.105 hannken struct mount *mp; 1692 1.23 thorpej a.a_desc = VDESC(vop_bmap); 1693 1.23 thorpej a.a_vp = vp; 1694 1.23 thorpej a.a_bn = bn; 1695 1.23 thorpej a.a_vpp = vpp; 1696 1.23 thorpej a.a_bnp = bnp; 1697 1.23 thorpej a.a_runp = runp; 1698 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_YES); 1699 1.105 hannken if (error) 1700 1.105 hannken return error; 1701 1.72 ad error = (VCALL(vp, VOFFSET(vop_bmap), &a)); 1702 1.105 hannken vop_post(vp, mp, mpsafe, FST_YES); 1703 1.72 ad return error; 1704 1.23 thorpej } 1705 1.1 cgd 1706 1.46 hannken const int vop_strategy_vp_offsets[] = { 1707 1.46 hannken VOPARG_OFFSETOF(struct vop_strategy_args,a_vp), 1708 1.46 hannken VDESC_NO_OFFSET 1709 1.46 hannken }; 1710 1.46 hannken const struct vnodeop_desc vop_strategy_desc = { 1711 1.67 pooka VOP_STRATEGY_DESCOFFSET, 1712 1.46 hannken "vop_strategy", 1713 1.46 hannken 0, 1714 1.46 hannken vop_strategy_vp_offsets, 1715 1.46 hannken VDESC_NO_OFFSET, 1716 1.46 hannken VDESC_NO_OFFSET, 1717 1.46 hannken VDESC_NO_OFFSET, 1718 1.46 hannken }; 1719 1.46 hannken int 1720 1.60 thorpej VOP_STRATEGY(struct vnode *vp, 1721 1.60 thorpej struct buf *bp) 1722 1.46 hannken { 1723 1.72 ad int error; 1724 1.72 ad bool mpsafe; 1725 1.46 hannken struct vop_strategy_args a; 1726 1.105 hannken struct mount *mp; 1727 1.46 hannken a.a_desc = VDESC(vop_strategy); 1728 1.46 hannken a.a_vp = vp; 1729 1.46 hannken a.a_bp = bp; 1730 1.112 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1731 1.105 hannken if (error) 1732 1.105 hannken return error; 1733 1.72 ad error = (VCALL(vp, VOFFSET(vop_strategy), &a)); 1734 1.112 hannken vop_post(vp, mp, mpsafe, FST_NO); 1735 1.72 ad return error; 1736 1.46 hannken } 1737 1.46 hannken 1738 1.31 jdolecek const int vop_print_vp_offsets[] = { 1739 1.1 cgd VOPARG_OFFSETOF(struct vop_print_args,a_vp), 1740 1.1 cgd VDESC_NO_OFFSET 1741 1.1 cgd }; 1742 1.33 jdolecek const struct vnodeop_desc vop_print_desc = { 1743 1.67 pooka VOP_PRINT_DESCOFFSET, 1744 1.1 cgd "vop_print", 1745 1.1 cgd 0, 1746 1.1 cgd vop_print_vp_offsets, 1747 1.1 cgd VDESC_NO_OFFSET, 1748 1.1 cgd VDESC_NO_OFFSET, 1749 1.1 cgd VDESC_NO_OFFSET, 1750 1.1 cgd }; 1751 1.23 thorpej int 1752 1.60 thorpej VOP_PRINT(struct vnode *vp) 1753 1.23 thorpej { 1754 1.72 ad int error; 1755 1.72 ad bool mpsafe; 1756 1.23 thorpej struct vop_print_args a; 1757 1.105 hannken struct mount *mp; 1758 1.23 thorpej a.a_desc = VDESC(vop_print); 1759 1.23 thorpej a.a_vp = vp; 1760 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_YES); 1761 1.105 hannken if (error) 1762 1.105 hannken return error; 1763 1.72 ad error = (VCALL(vp, VOFFSET(vop_print), &a)); 1764 1.105 hannken vop_post(vp, mp, mpsafe, FST_YES); 1765 1.72 ad return error; 1766 1.23 thorpej } 1767 1.1 cgd 1768 1.31 jdolecek const int vop_islocked_vp_offsets[] = { 1769 1.1 cgd VOPARG_OFFSETOF(struct vop_islocked_args,a_vp), 1770 1.1 cgd VDESC_NO_OFFSET 1771 1.1 cgd }; 1772 1.33 jdolecek const struct vnodeop_desc vop_islocked_desc = { 1773 1.67 pooka VOP_ISLOCKED_DESCOFFSET, 1774 1.1 cgd "vop_islocked", 1775 1.1 cgd 0, 1776 1.1 cgd vop_islocked_vp_offsets, 1777 1.1 cgd VDESC_NO_OFFSET, 1778 1.1 cgd VDESC_NO_OFFSET, 1779 1.1 cgd VDESC_NO_OFFSET, 1780 1.1 cgd }; 1781 1.23 thorpej int 1782 1.60 thorpej VOP_ISLOCKED(struct vnode *vp) 1783 1.23 thorpej { 1784 1.72 ad int error; 1785 1.72 ad bool mpsafe; 1786 1.23 thorpej struct vop_islocked_args a; 1787 1.105 hannken struct mount *mp; 1788 1.23 thorpej a.a_desc = VDESC(vop_islocked); 1789 1.23 thorpej a.a_vp = vp; 1790 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1791 1.105 hannken if (error) 1792 1.105 hannken return error; 1793 1.72 ad error = (VCALL(vp, VOFFSET(vop_islocked), &a)); 1794 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 1795 1.72 ad return error; 1796 1.23 thorpej } 1797 1.1 cgd 1798 1.31 jdolecek const int vop_pathconf_vp_offsets[] = { 1799 1.1 cgd VOPARG_OFFSETOF(struct vop_pathconf_args,a_vp), 1800 1.1 cgd VDESC_NO_OFFSET 1801 1.1 cgd }; 1802 1.33 jdolecek const struct vnodeop_desc vop_pathconf_desc = { 1803 1.67 pooka VOP_PATHCONF_DESCOFFSET, 1804 1.1 cgd "vop_pathconf", 1805 1.1 cgd 0, 1806 1.1 cgd vop_pathconf_vp_offsets, 1807 1.1 cgd VDESC_NO_OFFSET, 1808 1.1 cgd VDESC_NO_OFFSET, 1809 1.1 cgd VDESC_NO_OFFSET, 1810 1.1 cgd }; 1811 1.23 thorpej int 1812 1.60 thorpej VOP_PATHCONF(struct vnode *vp, 1813 1.60 thorpej int name, 1814 1.60 thorpej register_t *retval) 1815 1.23 thorpej { 1816 1.72 ad int error; 1817 1.72 ad bool mpsafe; 1818 1.23 thorpej struct vop_pathconf_args a; 1819 1.105 hannken struct mount *mp; 1820 1.23 thorpej a.a_desc = VDESC(vop_pathconf); 1821 1.23 thorpej a.a_vp = vp; 1822 1.23 thorpej a.a_name = name; 1823 1.23 thorpej a.a_retval = retval; 1824 1.116 hannken assert_vop_locked(vp, "vop_pathconf: vp"); 1825 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1826 1.105 hannken if (error) 1827 1.105 hannken return error; 1828 1.72 ad error = (VCALL(vp, VOFFSET(vop_pathconf), &a)); 1829 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 1830 1.72 ad return error; 1831 1.23 thorpej } 1832 1.1 cgd 1833 1.31 jdolecek const int vop_advlock_vp_offsets[] = { 1834 1.1 cgd VOPARG_OFFSETOF(struct vop_advlock_args,a_vp), 1835 1.1 cgd VDESC_NO_OFFSET 1836 1.1 cgd }; 1837 1.33 jdolecek const struct vnodeop_desc vop_advlock_desc = { 1838 1.67 pooka VOP_ADVLOCK_DESCOFFSET, 1839 1.1 cgd "vop_advlock", 1840 1.1 cgd 0, 1841 1.1 cgd vop_advlock_vp_offsets, 1842 1.1 cgd VDESC_NO_OFFSET, 1843 1.1 cgd VDESC_NO_OFFSET, 1844 1.1 cgd VDESC_NO_OFFSET, 1845 1.1 cgd }; 1846 1.23 thorpej int 1847 1.60 thorpej VOP_ADVLOCK(struct vnode *vp, 1848 1.60 thorpej void *id, 1849 1.60 thorpej int op, 1850 1.60 thorpej struct flock *fl, 1851 1.60 thorpej int flags) 1852 1.23 thorpej { 1853 1.72 ad int error; 1854 1.72 ad bool mpsafe; 1855 1.23 thorpej struct vop_advlock_args a; 1856 1.105 hannken struct mount *mp; 1857 1.23 thorpej a.a_desc = VDESC(vop_advlock); 1858 1.23 thorpej a.a_vp = vp; 1859 1.23 thorpej a.a_id = id; 1860 1.23 thorpej a.a_op = op; 1861 1.23 thorpej a.a_fl = fl; 1862 1.23 thorpej a.a_flags = flags; 1863 1.116 hannken assert_vop_unlocked(vp, "vop_advlock: vp"); 1864 1.107 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1865 1.105 hannken if (error) 1866 1.105 hannken return error; 1867 1.72 ad error = (VCALL(vp, VOFFSET(vop_advlock), &a)); 1868 1.107 hannken vop_post(vp, mp, mpsafe, FST_NO); 1869 1.72 ad return error; 1870 1.23 thorpej } 1871 1.1 cgd 1872 1.31 jdolecek const int vop_whiteout_vp_offsets[] = { 1873 1.1 cgd VOPARG_OFFSETOF(struct vop_whiteout_args,a_dvp), 1874 1.1 cgd VDESC_NO_OFFSET 1875 1.1 cgd }; 1876 1.33 jdolecek const struct vnodeop_desc vop_whiteout_desc = { 1877 1.67 pooka VOP_WHITEOUT_DESCOFFSET, 1878 1.1 cgd "vop_whiteout", 1879 1.1 cgd 0, 1880 1.1 cgd vop_whiteout_vp_offsets, 1881 1.1 cgd VDESC_NO_OFFSET, 1882 1.1 cgd VDESC_NO_OFFSET, 1883 1.1 cgd VOPARG_OFFSETOF(struct vop_whiteout_args, a_cnp), 1884 1.1 cgd }; 1885 1.23 thorpej int 1886 1.60 thorpej VOP_WHITEOUT(struct vnode *dvp, 1887 1.60 thorpej struct componentname *cnp, 1888 1.60 thorpej int flags) 1889 1.23 thorpej { 1890 1.72 ad int error; 1891 1.72 ad bool mpsafe; 1892 1.23 thorpej struct vop_whiteout_args a; 1893 1.105 hannken struct mount *mp; 1894 1.23 thorpej a.a_desc = VDESC(vop_whiteout); 1895 1.23 thorpej a.a_dvp = dvp; 1896 1.23 thorpej a.a_cnp = cnp; 1897 1.23 thorpej a.a_flags = flags; 1898 1.116 hannken assert_vop_elocked(dvp, "vop_whiteout: dvp"); 1899 1.105 hannken error = vop_pre(dvp, &mp, &mpsafe, FST_NO); 1900 1.105 hannken if (error) 1901 1.105 hannken return error; 1902 1.72 ad error = (VCALL(dvp, VOFFSET(vop_whiteout), &a)); 1903 1.105 hannken vop_post(dvp, mp, mpsafe, FST_NO); 1904 1.72 ad return error; 1905 1.23 thorpej } 1906 1.1 cgd 1907 1.31 jdolecek const int vop_getpages_vp_offsets[] = { 1908 1.26 chs VOPARG_OFFSETOF(struct vop_getpages_args,a_vp), 1909 1.26 chs VDESC_NO_OFFSET 1910 1.26 chs }; 1911 1.33 jdolecek const struct vnodeop_desc vop_getpages_desc = { 1912 1.67 pooka VOP_GETPAGES_DESCOFFSET, 1913 1.26 chs "vop_getpages", 1914 1.26 chs 0, 1915 1.26 chs vop_getpages_vp_offsets, 1916 1.26 chs VDESC_NO_OFFSET, 1917 1.26 chs VDESC_NO_OFFSET, 1918 1.26 chs VDESC_NO_OFFSET, 1919 1.26 chs }; 1920 1.26 chs int 1921 1.60 thorpej VOP_GETPAGES(struct vnode *vp, 1922 1.60 thorpej voff_t offset, 1923 1.60 thorpej struct vm_page **m, 1924 1.60 thorpej int *count, 1925 1.60 thorpej int centeridx, 1926 1.60 thorpej vm_prot_t access_type, 1927 1.60 thorpej int advice, 1928 1.60 thorpej int flags) 1929 1.26 chs { 1930 1.72 ad int error; 1931 1.72 ad bool mpsafe; 1932 1.26 chs struct vop_getpages_args a; 1933 1.105 hannken struct mount *mp; 1934 1.26 chs a.a_desc = VDESC(vop_getpages); 1935 1.26 chs a.a_vp = vp; 1936 1.26 chs a.a_offset = offset; 1937 1.26 chs a.a_m = m; 1938 1.26 chs a.a_count = count; 1939 1.26 chs a.a_centeridx = centeridx; 1940 1.26 chs a.a_access_type = access_type; 1941 1.26 chs a.a_advice = advice; 1942 1.26 chs a.a_flags = flags; 1943 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1944 1.105 hannken if (error) 1945 1.105 hannken return error; 1946 1.72 ad error = (VCALL(vp, VOFFSET(vop_getpages), &a)); 1947 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 1948 1.72 ad return error; 1949 1.26 chs } 1950 1.26 chs 1951 1.31 jdolecek const int vop_putpages_vp_offsets[] = { 1952 1.26 chs VOPARG_OFFSETOF(struct vop_putpages_args,a_vp), 1953 1.26 chs VDESC_NO_OFFSET 1954 1.26 chs }; 1955 1.33 jdolecek const struct vnodeop_desc vop_putpages_desc = { 1956 1.67 pooka VOP_PUTPAGES_DESCOFFSET, 1957 1.26 chs "vop_putpages", 1958 1.26 chs 0, 1959 1.26 chs vop_putpages_vp_offsets, 1960 1.26 chs VDESC_NO_OFFSET, 1961 1.26 chs VDESC_NO_OFFSET, 1962 1.26 chs VDESC_NO_OFFSET, 1963 1.26 chs }; 1964 1.26 chs int 1965 1.60 thorpej VOP_PUTPAGES(struct vnode *vp, 1966 1.60 thorpej voff_t offlo, 1967 1.60 thorpej voff_t offhi, 1968 1.60 thorpej int flags) 1969 1.26 chs { 1970 1.72 ad int error; 1971 1.72 ad bool mpsafe; 1972 1.26 chs struct vop_putpages_args a; 1973 1.105 hannken struct mount *mp; 1974 1.26 chs a.a_desc = VDESC(vop_putpages); 1975 1.26 chs a.a_vp = vp; 1976 1.38 chs a.a_offlo = offlo; 1977 1.38 chs a.a_offhi = offhi; 1978 1.26 chs a.a_flags = flags; 1979 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 1980 1.105 hannken if (error) 1981 1.105 hannken return error; 1982 1.72 ad error = (VCALL(vp, VOFFSET(vop_putpages), &a)); 1983 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 1984 1.72 ad return error; 1985 1.26 chs } 1986 1.26 chs 1987 1.111 christos const int vop_getacl_vp_offsets[] = { 1988 1.111 christos VOPARG_OFFSETOF(struct vop_getacl_args,a_vp), 1989 1.111 christos VDESC_NO_OFFSET 1990 1.111 christos }; 1991 1.111 christos const struct vnodeop_desc vop_getacl_desc = { 1992 1.111 christos VOP_GETACL_DESCOFFSET, 1993 1.111 christos "vop_getacl", 1994 1.111 christos 0, 1995 1.111 christos vop_getacl_vp_offsets, 1996 1.111 christos VDESC_NO_OFFSET, 1997 1.111 christos VOPARG_OFFSETOF(struct vop_getacl_args, a_cred), 1998 1.111 christos VDESC_NO_OFFSET, 1999 1.111 christos }; 2000 1.111 christos int 2001 1.111 christos VOP_GETACL(struct vnode *vp, 2002 1.111 christos acl_type_t type, 2003 1.111 christos struct acl *aclp, 2004 1.111 christos kauth_cred_t cred) 2005 1.111 christos { 2006 1.111 christos int error; 2007 1.111 christos bool mpsafe; 2008 1.111 christos struct vop_getacl_args a; 2009 1.111 christos struct mount *mp; 2010 1.111 christos a.a_desc = VDESC(vop_getacl); 2011 1.111 christos a.a_vp = vp; 2012 1.111 christos a.a_type = type; 2013 1.111 christos a.a_aclp = aclp; 2014 1.111 christos a.a_cred = cred; 2015 1.111 christos error = vop_pre(vp, &mp, &mpsafe, FST_YES); 2016 1.111 christos if (error) 2017 1.111 christos return error; 2018 1.111 christos error = (VCALL(vp, VOFFSET(vop_getacl), &a)); 2019 1.111 christos vop_post(vp, mp, mpsafe, FST_YES); 2020 1.111 christos return error; 2021 1.111 christos } 2022 1.111 christos 2023 1.111 christos const int vop_setacl_vp_offsets[] = { 2024 1.111 christos VOPARG_OFFSETOF(struct vop_setacl_args,a_vp), 2025 1.111 christos VDESC_NO_OFFSET 2026 1.111 christos }; 2027 1.111 christos const struct vnodeop_desc vop_setacl_desc = { 2028 1.111 christos VOP_SETACL_DESCOFFSET, 2029 1.111 christos "vop_setacl", 2030 1.111 christos 0, 2031 1.111 christos vop_setacl_vp_offsets, 2032 1.111 christos VDESC_NO_OFFSET, 2033 1.111 christos VOPARG_OFFSETOF(struct vop_setacl_args, a_cred), 2034 1.111 christos VDESC_NO_OFFSET, 2035 1.111 christos }; 2036 1.111 christos int 2037 1.111 christos VOP_SETACL(struct vnode *vp, 2038 1.111 christos acl_type_t type, 2039 1.111 christos struct acl *aclp, 2040 1.111 christos kauth_cred_t cred) 2041 1.111 christos { 2042 1.111 christos int error; 2043 1.111 christos bool mpsafe; 2044 1.111 christos struct vop_setacl_args a; 2045 1.111 christos struct mount *mp; 2046 1.111 christos a.a_desc = VDESC(vop_setacl); 2047 1.111 christos a.a_vp = vp; 2048 1.111 christos a.a_type = type; 2049 1.111 christos a.a_aclp = aclp; 2050 1.111 christos a.a_cred = cred; 2051 1.116 hannken assert_vop_elocked(vp, "vop_setacl: vp"); 2052 1.116 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 2053 1.111 christos if (error) 2054 1.111 christos return error; 2055 1.111 christos error = (VCALL(vp, VOFFSET(vop_setacl), &a)); 2056 1.116 hannken vop_post(vp, mp, mpsafe, FST_NO); 2057 1.115 thorpej vop_setacl_post(&a, error); 2058 1.111 christos return error; 2059 1.111 christos } 2060 1.111 christos 2061 1.111 christos const int vop_aclcheck_vp_offsets[] = { 2062 1.111 christos VOPARG_OFFSETOF(struct vop_aclcheck_args,a_vp), 2063 1.111 christos VDESC_NO_OFFSET 2064 1.111 christos }; 2065 1.111 christos const struct vnodeop_desc vop_aclcheck_desc = { 2066 1.111 christos VOP_ACLCHECK_DESCOFFSET, 2067 1.111 christos "vop_aclcheck", 2068 1.111 christos 0, 2069 1.111 christos vop_aclcheck_vp_offsets, 2070 1.111 christos VDESC_NO_OFFSET, 2071 1.111 christos VOPARG_OFFSETOF(struct vop_aclcheck_args, a_cred), 2072 1.111 christos VDESC_NO_OFFSET, 2073 1.111 christos }; 2074 1.111 christos int 2075 1.111 christos VOP_ACLCHECK(struct vnode *vp, 2076 1.111 christos acl_type_t type, 2077 1.111 christos struct acl *aclp, 2078 1.111 christos kauth_cred_t cred) 2079 1.111 christos { 2080 1.111 christos int error; 2081 1.111 christos bool mpsafe; 2082 1.111 christos struct vop_aclcheck_args a; 2083 1.111 christos struct mount *mp; 2084 1.111 christos a.a_desc = VDESC(vop_aclcheck); 2085 1.111 christos a.a_vp = vp; 2086 1.111 christos a.a_type = type; 2087 1.111 christos a.a_aclp = aclp; 2088 1.111 christos a.a_cred = cred; 2089 1.111 christos error = vop_pre(vp, &mp, &mpsafe, FST_YES); 2090 1.111 christos if (error) 2091 1.111 christos return error; 2092 1.111 christos error = (VCALL(vp, VOFFSET(vop_aclcheck), &a)); 2093 1.111 christos vop_post(vp, mp, mpsafe, FST_YES); 2094 1.111 christos return error; 2095 1.111 christos } 2096 1.111 christos 2097 1.51 thorpej const int vop_closeextattr_vp_offsets[] = { 2098 1.51 thorpej VOPARG_OFFSETOF(struct vop_closeextattr_args,a_vp), 2099 1.51 thorpej VDESC_NO_OFFSET 2100 1.51 thorpej }; 2101 1.51 thorpej const struct vnodeop_desc vop_closeextattr_desc = { 2102 1.67 pooka VOP_CLOSEEXTATTR_DESCOFFSET, 2103 1.51 thorpej "vop_closeextattr", 2104 1.51 thorpej 0, 2105 1.51 thorpej vop_closeextattr_vp_offsets, 2106 1.51 thorpej VDESC_NO_OFFSET, 2107 1.51 thorpej VOPARG_OFFSETOF(struct vop_closeextattr_args, a_cred), 2108 1.51 thorpej VDESC_NO_OFFSET, 2109 1.51 thorpej }; 2110 1.51 thorpej int 2111 1.60 thorpej VOP_CLOSEEXTATTR(struct vnode *vp, 2112 1.60 thorpej int commit, 2113 1.73 pooka kauth_cred_t cred) 2114 1.51 thorpej { 2115 1.72 ad int error; 2116 1.72 ad bool mpsafe; 2117 1.51 thorpej struct vop_closeextattr_args a; 2118 1.105 hannken struct mount *mp; 2119 1.51 thorpej a.a_desc = VDESC(vop_closeextattr); 2120 1.51 thorpej a.a_vp = vp; 2121 1.51 thorpej a.a_commit = commit; 2122 1.51 thorpej a.a_cred = cred; 2123 1.116 hannken assert_vop_locked(vp, "vop_closeextattr: vp"); 2124 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 2125 1.105 hannken if (error) 2126 1.105 hannken return error; 2127 1.72 ad error = (VCALL(vp, VOFFSET(vop_closeextattr), &a)); 2128 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 2129 1.72 ad return error; 2130 1.51 thorpej } 2131 1.51 thorpej 2132 1.51 thorpej const int vop_getextattr_vp_offsets[] = { 2133 1.51 thorpej VOPARG_OFFSETOF(struct vop_getextattr_args,a_vp), 2134 1.51 thorpej VDESC_NO_OFFSET 2135 1.51 thorpej }; 2136 1.51 thorpej const struct vnodeop_desc vop_getextattr_desc = { 2137 1.67 pooka VOP_GETEXTATTR_DESCOFFSET, 2138 1.51 thorpej "vop_getextattr", 2139 1.51 thorpej 0, 2140 1.51 thorpej vop_getextattr_vp_offsets, 2141 1.51 thorpej VDESC_NO_OFFSET, 2142 1.51 thorpej VOPARG_OFFSETOF(struct vop_getextattr_args, a_cred), 2143 1.51 thorpej VDESC_NO_OFFSET, 2144 1.51 thorpej }; 2145 1.51 thorpej int 2146 1.60 thorpej VOP_GETEXTATTR(struct vnode *vp, 2147 1.60 thorpej int attrnamespace, 2148 1.60 thorpej const char *name, 2149 1.60 thorpej struct uio *uio, 2150 1.60 thorpej size_t *size, 2151 1.73 pooka kauth_cred_t cred) 2152 1.51 thorpej { 2153 1.72 ad int error; 2154 1.72 ad bool mpsafe; 2155 1.51 thorpej struct vop_getextattr_args a; 2156 1.105 hannken struct mount *mp; 2157 1.51 thorpej a.a_desc = VDESC(vop_getextattr); 2158 1.51 thorpej a.a_vp = vp; 2159 1.51 thorpej a.a_attrnamespace = attrnamespace; 2160 1.51 thorpej a.a_name = name; 2161 1.51 thorpej a.a_uio = uio; 2162 1.51 thorpej a.a_size = size; 2163 1.51 thorpej a.a_cred = cred; 2164 1.116 hannken assert_vop_locked(vp, "vop_getextattr: vp"); 2165 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 2166 1.105 hannken if (error) 2167 1.105 hannken return error; 2168 1.72 ad error = (VCALL(vp, VOFFSET(vop_getextattr), &a)); 2169 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 2170 1.72 ad return error; 2171 1.51 thorpej } 2172 1.51 thorpej 2173 1.51 thorpej const int vop_listextattr_vp_offsets[] = { 2174 1.51 thorpej VOPARG_OFFSETOF(struct vop_listextattr_args,a_vp), 2175 1.51 thorpej VDESC_NO_OFFSET 2176 1.51 thorpej }; 2177 1.51 thorpej const struct vnodeop_desc vop_listextattr_desc = { 2178 1.67 pooka VOP_LISTEXTATTR_DESCOFFSET, 2179 1.51 thorpej "vop_listextattr", 2180 1.51 thorpej 0, 2181 1.51 thorpej vop_listextattr_vp_offsets, 2182 1.51 thorpej VDESC_NO_OFFSET, 2183 1.51 thorpej VOPARG_OFFSETOF(struct vop_listextattr_args, a_cred), 2184 1.51 thorpej VDESC_NO_OFFSET, 2185 1.51 thorpej }; 2186 1.51 thorpej int 2187 1.60 thorpej VOP_LISTEXTATTR(struct vnode *vp, 2188 1.60 thorpej int attrnamespace, 2189 1.60 thorpej struct uio *uio, 2190 1.60 thorpej size_t *size, 2191 1.87 manu int flag, 2192 1.73 pooka kauth_cred_t cred) 2193 1.51 thorpej { 2194 1.72 ad int error; 2195 1.72 ad bool mpsafe; 2196 1.51 thorpej struct vop_listextattr_args a; 2197 1.105 hannken struct mount *mp; 2198 1.51 thorpej a.a_desc = VDESC(vop_listextattr); 2199 1.51 thorpej a.a_vp = vp; 2200 1.51 thorpej a.a_attrnamespace = attrnamespace; 2201 1.51 thorpej a.a_uio = uio; 2202 1.51 thorpej a.a_size = size; 2203 1.87 manu a.a_flag = flag; 2204 1.51 thorpej a.a_cred = cred; 2205 1.116 hannken assert_vop_locked(vp, "vop_listextattr: vp"); 2206 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 2207 1.105 hannken if (error) 2208 1.105 hannken return error; 2209 1.72 ad error = (VCALL(vp, VOFFSET(vop_listextattr), &a)); 2210 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 2211 1.72 ad return error; 2212 1.51 thorpej } 2213 1.51 thorpej 2214 1.51 thorpej const int vop_openextattr_vp_offsets[] = { 2215 1.51 thorpej VOPARG_OFFSETOF(struct vop_openextattr_args,a_vp), 2216 1.51 thorpej VDESC_NO_OFFSET 2217 1.51 thorpej }; 2218 1.51 thorpej const struct vnodeop_desc vop_openextattr_desc = { 2219 1.67 pooka VOP_OPENEXTATTR_DESCOFFSET, 2220 1.51 thorpej "vop_openextattr", 2221 1.51 thorpej 0, 2222 1.51 thorpej vop_openextattr_vp_offsets, 2223 1.51 thorpej VDESC_NO_OFFSET, 2224 1.51 thorpej VOPARG_OFFSETOF(struct vop_openextattr_args, a_cred), 2225 1.51 thorpej VDESC_NO_OFFSET, 2226 1.51 thorpej }; 2227 1.51 thorpej int 2228 1.60 thorpej VOP_OPENEXTATTR(struct vnode *vp, 2229 1.73 pooka kauth_cred_t cred) 2230 1.51 thorpej { 2231 1.72 ad int error; 2232 1.72 ad bool mpsafe; 2233 1.51 thorpej struct vop_openextattr_args a; 2234 1.105 hannken struct mount *mp; 2235 1.51 thorpej a.a_desc = VDESC(vop_openextattr); 2236 1.51 thorpej a.a_vp = vp; 2237 1.51 thorpej a.a_cred = cred; 2238 1.116 hannken assert_vop_locked(vp, "vop_openextattr: vp"); 2239 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 2240 1.105 hannken if (error) 2241 1.105 hannken return error; 2242 1.72 ad error = (VCALL(vp, VOFFSET(vop_openextattr), &a)); 2243 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 2244 1.72 ad return error; 2245 1.51 thorpej } 2246 1.51 thorpej 2247 1.51 thorpej const int vop_deleteextattr_vp_offsets[] = { 2248 1.51 thorpej VOPARG_OFFSETOF(struct vop_deleteextattr_args,a_vp), 2249 1.51 thorpej VDESC_NO_OFFSET 2250 1.51 thorpej }; 2251 1.51 thorpej const struct vnodeop_desc vop_deleteextattr_desc = { 2252 1.67 pooka VOP_DELETEEXTATTR_DESCOFFSET, 2253 1.51 thorpej "vop_deleteextattr", 2254 1.51 thorpej 0, 2255 1.51 thorpej vop_deleteextattr_vp_offsets, 2256 1.51 thorpej VDESC_NO_OFFSET, 2257 1.51 thorpej VOPARG_OFFSETOF(struct vop_deleteextattr_args, a_cred), 2258 1.51 thorpej VDESC_NO_OFFSET, 2259 1.51 thorpej }; 2260 1.51 thorpej int 2261 1.60 thorpej VOP_DELETEEXTATTR(struct vnode *vp, 2262 1.60 thorpej int attrnamespace, 2263 1.60 thorpej const char *name, 2264 1.73 pooka kauth_cred_t cred) 2265 1.51 thorpej { 2266 1.72 ad int error; 2267 1.72 ad bool mpsafe; 2268 1.51 thorpej struct vop_deleteextattr_args a; 2269 1.105 hannken struct mount *mp; 2270 1.51 thorpej a.a_desc = VDESC(vop_deleteextattr); 2271 1.51 thorpej a.a_vp = vp; 2272 1.51 thorpej a.a_attrnamespace = attrnamespace; 2273 1.51 thorpej a.a_name = name; 2274 1.51 thorpej a.a_cred = cred; 2275 1.116 hannken assert_vop_elocked(vp, "vop_deleteextattr: vp"); 2276 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 2277 1.105 hannken if (error) 2278 1.105 hannken return error; 2279 1.72 ad error = (VCALL(vp, VOFFSET(vop_deleteextattr), &a)); 2280 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 2281 1.72 ad return error; 2282 1.51 thorpej } 2283 1.51 thorpej 2284 1.51 thorpej const int vop_setextattr_vp_offsets[] = { 2285 1.51 thorpej VOPARG_OFFSETOF(struct vop_setextattr_args,a_vp), 2286 1.51 thorpej VDESC_NO_OFFSET 2287 1.51 thorpej }; 2288 1.51 thorpej const struct vnodeop_desc vop_setextattr_desc = { 2289 1.67 pooka VOP_SETEXTATTR_DESCOFFSET, 2290 1.51 thorpej "vop_setextattr", 2291 1.51 thorpej 0, 2292 1.51 thorpej vop_setextattr_vp_offsets, 2293 1.51 thorpej VDESC_NO_OFFSET, 2294 1.51 thorpej VOPARG_OFFSETOF(struct vop_setextattr_args, a_cred), 2295 1.51 thorpej VDESC_NO_OFFSET, 2296 1.51 thorpej }; 2297 1.51 thorpej int 2298 1.60 thorpej VOP_SETEXTATTR(struct vnode *vp, 2299 1.60 thorpej int attrnamespace, 2300 1.60 thorpej const char *name, 2301 1.60 thorpej struct uio *uio, 2302 1.73 pooka kauth_cred_t cred) 2303 1.51 thorpej { 2304 1.72 ad int error; 2305 1.72 ad bool mpsafe; 2306 1.51 thorpej struct vop_setextattr_args a; 2307 1.105 hannken struct mount *mp; 2308 1.51 thorpej a.a_desc = VDESC(vop_setextattr); 2309 1.51 thorpej a.a_vp = vp; 2310 1.51 thorpej a.a_attrnamespace = attrnamespace; 2311 1.51 thorpej a.a_name = name; 2312 1.51 thorpej a.a_uio = uio; 2313 1.51 thorpej a.a_cred = cred; 2314 1.116 hannken assert_vop_elocked(vp, "vop_setextattr: vp"); 2315 1.105 hannken error = vop_pre(vp, &mp, &mpsafe, FST_NO); 2316 1.105 hannken if (error) 2317 1.105 hannken return error; 2318 1.72 ad error = (VCALL(vp, VOFFSET(vop_setextattr), &a)); 2319 1.105 hannken vop_post(vp, mp, mpsafe, FST_NO); 2320 1.72 ad return error; 2321 1.51 thorpej } 2322 1.51 thorpej 2323 1.33 jdolecek const struct vnodeop_desc * const vfs_op_descs[] = { 2324 1.1 cgd &vop_default_desc, /* MUST BE FIRST */ 2325 1.1 cgd 2326 1.88 hannken &vop_bwrite_desc, 2327 1.113 dholland &vop_parsepath_desc, 2328 1.1 cgd &vop_lookup_desc, 2329 1.1 cgd &vop_create_desc, 2330 1.1 cgd &vop_mknod_desc, 2331 1.1 cgd &vop_open_desc, 2332 1.1 cgd &vop_close_desc, 2333 1.1 cgd &vop_access_desc, 2334 1.111 christos &vop_accessx_desc, 2335 1.1 cgd &vop_getattr_desc, 2336 1.1 cgd &vop_setattr_desc, 2337 1.1 cgd &vop_read_desc, 2338 1.1 cgd &vop_write_desc, 2339 1.93 dholland &vop_fallocate_desc, 2340 1.93 dholland &vop_fdiscard_desc, 2341 1.1 cgd &vop_ioctl_desc, 2342 1.18 wrstuden &vop_fcntl_desc, 2343 1.3 mycroft &vop_poll_desc, 2344 1.40 jdolecek &vop_kqfilter_desc, 2345 1.10 fvdl &vop_revoke_desc, 2346 1.1 cgd &vop_mmap_desc, 2347 1.1 cgd &vop_fsync_desc, 2348 1.1 cgd &vop_seek_desc, 2349 1.1 cgd &vop_remove_desc, 2350 1.1 cgd &vop_link_desc, 2351 1.1 cgd &vop_rename_desc, 2352 1.1 cgd &vop_mkdir_desc, 2353 1.1 cgd &vop_rmdir_desc, 2354 1.1 cgd &vop_symlink_desc, 2355 1.1 cgd &vop_readdir_desc, 2356 1.1 cgd &vop_readlink_desc, 2357 1.1 cgd &vop_abortop_desc, 2358 1.1 cgd &vop_inactive_desc, 2359 1.1 cgd &vop_reclaim_desc, 2360 1.1 cgd &vop_lock_desc, 2361 1.1 cgd &vop_unlock_desc, 2362 1.1 cgd &vop_bmap_desc, 2363 1.46 hannken &vop_strategy_desc, 2364 1.1 cgd &vop_print_desc, 2365 1.1 cgd &vop_islocked_desc, 2366 1.1 cgd &vop_pathconf_desc, 2367 1.1 cgd &vop_advlock_desc, 2368 1.1 cgd &vop_whiteout_desc, 2369 1.26 chs &vop_getpages_desc, 2370 1.26 chs &vop_putpages_desc, 2371 1.111 christos &vop_getacl_desc, 2372 1.111 christos &vop_setacl_desc, 2373 1.111 christos &vop_aclcheck_desc, 2374 1.51 thorpej &vop_closeextattr_desc, 2375 1.51 thorpej &vop_getextattr_desc, 2376 1.51 thorpej &vop_listextattr_desc, 2377 1.51 thorpej &vop_openextattr_desc, 2378 1.51 thorpej &vop_deleteextattr_desc, 2379 1.51 thorpej &vop_setextattr_desc, 2380 1.1 cgd NULL 2381 1.1 cgd }; 2382