1df8bae1dSRodney W. Grimes#!/bin/sh - 2df8bae1dSRodney W. Grimes# 3df8bae1dSRodney W. Grimes# Copyright (c) 1992, 1993 4df8bae1dSRodney W. Grimes# The Regents of the University of California. All rights reserved. 5df8bae1dSRodney W. Grimes# 6df8bae1dSRodney W. Grimes# Redistribution and use in source and binary forms, with or without 7df8bae1dSRodney W. Grimes# modification, are permitted provided that the following conditions 8df8bae1dSRodney W. Grimes# are met: 9df8bae1dSRodney W. Grimes# 1. Redistributions of source code must retain the above copyright 10df8bae1dSRodney W. Grimes# notice, this list of conditions and the following disclaimer. 11df8bae1dSRodney W. Grimes# 2. Redistributions in binary form must reproduce the above copyright 12df8bae1dSRodney W. Grimes# notice, this list of conditions and the following disclaimer in the 13df8bae1dSRodney W. Grimes# documentation and/or other materials provided with the distribution. 14df8bae1dSRodney W. Grimes# 3. All advertising materials mentioning features or use of this software 15df8bae1dSRodney W. Grimes# must display the following acknowledgement: 16df8bae1dSRodney W. Grimes# This product includes software developed by the University of 17df8bae1dSRodney W. Grimes# California, Berkeley and its contributors. 18df8bae1dSRodney W. Grimes# 4. Neither the name of the University nor the names of its contributors 19df8bae1dSRodney W. Grimes# may be used to endorse or promote products derived from this software 20df8bae1dSRodney W. Grimes# without specific prior written permission. 21df8bae1dSRodney W. Grimes# 22df8bae1dSRodney W. Grimes# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23df8bae1dSRodney W. Grimes# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24df8bae1dSRodney W. Grimes# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25df8bae1dSRodney W. Grimes# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26df8bae1dSRodney W. Grimes# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27df8bae1dSRodney W. Grimes# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28df8bae1dSRodney W. Grimes# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29df8bae1dSRodney W. Grimes# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30df8bae1dSRodney W. Grimes# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31df8bae1dSRodney W. Grimes# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32df8bae1dSRodney W. Grimes# SUCH DAMAGE. 33df8bae1dSRodney W. Grimes# 34df8bae1dSRodney W. Grimes# @(#)vnode_if.sh 8.1 (Berkeley) 6/10/93 35df8bae1dSRodney W. Grimes# 36df8bae1dSRodney W. Grimes 37df8bae1dSRodney W. Grimes# Script to produce VFS front-end sugar. 38df8bae1dSRodney W. Grimes# 39df8bae1dSRodney W. Grimes# usage: vnode_if.sh srcfile 40df8bae1dSRodney W. Grimes# (where srcfile is currently /sys/kern/vnode_if.src) 41df8bae1dSRodney W. Grimes# 42df8bae1dSRodney W. Grimes# These awk scripts are not particularly well written, specifically they 43df8bae1dSRodney W. Grimes# don't use arrays well and figure out the same information repeatedly. 44df8bae1dSRodney W. Grimes# Please rewrite them if you actually understand how to use awk. Note, 45df8bae1dSRodney W. Grimes# they use nawk extensions and gawk's toupper. 46df8bae1dSRodney W. Grimes 47df8bae1dSRodney W. Grimesif [ $# -ne 1 ] ; then 48df8bae1dSRodney W. Grimes echo 'usage: vnode_if.sh srcfile' 49df8bae1dSRodney W. Grimes exit 1 50df8bae1dSRodney W. Grimesfi 51df8bae1dSRodney W. Grimes 52df8bae1dSRodney W. Grimes# Name of the source file. 53df8bae1dSRodney W. GrimesSRC=$1 54df8bae1dSRodney W. Grimes 55df8bae1dSRodney W. Grimes# Names of the created files. 56df8bae1dSRodney W. GrimesCFILE=vnode_if.c 57df8bae1dSRodney W. GrimesHEADER=vnode_if.h 58df8bae1dSRodney W. Grimes 59df8bae1dSRodney W. Grimes# Awk program (must support nawk extensions and gawk's "toupper") 60df8bae1dSRodney W. Grimes# Use "awk" at Berkeley, "gawk" elsewhere. 61df8bae1dSRodney W. GrimesAWK=awk 62df8bae1dSRodney W. Grimes 63df8bae1dSRodney W. Grimes# Print out header information for vnode_if.h. 64df8bae1dSRodney W. Grimescat << END_OF_LEADING_COMMENT > $HEADER 65df8bae1dSRodney W. Grimes/* 66df8bae1dSRodney W. Grimes * This file is produced automatically. 67df8bae1dSRodney W. Grimes * Do not modify anything in here by hand. 68df8bae1dSRodney W. Grimes * 69df8bae1dSRodney W. Grimes * Created from @(#)vnode_if.sh 8.1 (Berkeley) 6/10/93 70df8bae1dSRodney W. Grimes */ 71df8bae1dSRodney W. Grimes 72df8bae1dSRodney W. Grimesextern struct vnodeop_desc vop_default_desc; 73df8bae1dSRodney W. GrimesEND_OF_LEADING_COMMENT 74df8bae1dSRodney W. Grimes 75df8bae1dSRodney W. Grimes# Awk script to take vnode_if.src and turn it into vnode_if.h. 76df8bae1dSRodney W. Grimes$AWK ' 77df8bae1dSRodney W. Grimes NF == 0 || $0 ~ "^#" { 78df8bae1dSRodney W. Grimes next; 79df8bae1dSRodney W. Grimes } 80df8bae1dSRodney W. Grimes { 81df8bae1dSRodney W. Grimes # Get the function name. 82df8bae1dSRodney W. Grimes name = $1; 83df8bae1dSRodney W. Grimes uname = toupper(name); 84df8bae1dSRodney W. Grimes 85df8bae1dSRodney W. Grimes # Get the function arguments. 86df8bae1dSRodney W. Grimes for (c1 = 0;; ++c1) { 87df8bae1dSRodney W. Grimes if (getline <= 0) 88df8bae1dSRodney W. Grimes exit 89df8bae1dSRodney W. Grimes if ($0 ~ "^};") 90df8bae1dSRodney W. Grimes break; 91df8bae1dSRodney W. Grimes a[c1] = $0; 92df8bae1dSRodney W. Grimes } 93df8bae1dSRodney W. Grimes 94df8bae1dSRodney W. Grimes # Print out the vop_F_args structure. 95df8bae1dSRodney W. Grimes printf("struct %s_args {\n\tstruct vnodeop_desc *a_desc;\n", 96df8bae1dSRodney W. Grimes name); 97df8bae1dSRodney W. Grimes for (c2 = 0; c2 < c1; ++c2) { 98df8bae1dSRodney W. Grimes c3 = split(a[c2], t); 99df8bae1dSRodney W. Grimes printf("\t"); 100df8bae1dSRodney W. Grimes if (t[2] ~ "WILLRELE") 101df8bae1dSRodney W. Grimes c4 = 3; 102df8bae1dSRodney W. Grimes else 103df8bae1dSRodney W. Grimes c4 = 2; 104df8bae1dSRodney W. Grimes for (; c4 < c3; ++c4) 105df8bae1dSRodney W. Grimes printf("%s ", t[c4]); 106df8bae1dSRodney W. Grimes beg = match(t[c3], "[^*]"); 107df8bae1dSRodney W. Grimes printf("%sa_%s\n", 108df8bae1dSRodney W. Grimes substr(t[c4], 0, beg - 1), substr(t[c4], beg)); 109df8bae1dSRodney W. Grimes } 110df8bae1dSRodney W. Grimes printf("};\n"); 111df8bae1dSRodney W. Grimes 112df8bae1dSRodney W. Grimes # Print out extern declaration. 113df8bae1dSRodney W. Grimes printf("extern struct vnodeop_desc %s_desc;\n", name); 114df8bae1dSRodney W. Grimes 115df8bae1dSRodney W. Grimes # Print out inline struct. 116df8bae1dSRodney W. Grimes printf("static inline int %s(", uname); 117df8bae1dSRodney W. Grimes sep = ", "; 118df8bae1dSRodney W. Grimes for (c2 = 0; c2 < c1; ++c2) { 119df8bae1dSRodney W. Grimes if (c2 == c1 - 1) 120df8bae1dSRodney W. Grimes sep = ")\n"; 121df8bae1dSRodney W. Grimes c3 = split(a[c2], t); 122df8bae1dSRodney W. Grimes beg = match(t[c3], "[^*]"); 123df8bae1dSRodney W. Grimes end = match(t[c3], ";"); 124df8bae1dSRodney W. Grimes printf("%s%s", substr(t[c3], beg, end - beg), sep); 125df8bae1dSRodney W. Grimes } 126df8bae1dSRodney W. Grimes for (c2 = 0; c2 < c1; ++c2) { 127df8bae1dSRodney W. Grimes c3 = split(a[c2], t); 128df8bae1dSRodney W. Grimes printf("\t"); 129df8bae1dSRodney W. Grimes if (t[2] ~ "WILLRELE") 130df8bae1dSRodney W. Grimes c4 = 3; 131df8bae1dSRodney W. Grimes else 132df8bae1dSRodney W. Grimes c4 = 2; 133df8bae1dSRodney W. Grimes for (; c4 < c3; ++c4) 134df8bae1dSRodney W. Grimes printf("%s ", t[c4]); 135df8bae1dSRodney W. Grimes beg = match(t[c3], "[^*]"); 136df8bae1dSRodney W. Grimes printf("%s%s\n", 137df8bae1dSRodney W. Grimes substr(t[c4], 0, beg - 1), substr(t[c4], beg)); 138df8bae1dSRodney W. Grimes } 139df8bae1dSRodney W. Grimes printf("{\n\tstruct %s_args a;\n\n", name); 140df8bae1dSRodney W. Grimes printf("\ta.a_desc = VDESC(%s);\n", name); 141df8bae1dSRodney W. Grimes for (c2 = 0; c2 < c1; ++c2) { 142df8bae1dSRodney W. Grimes c3 = split(a[c2], t); 143df8bae1dSRodney W. Grimes printf("\t"); 144df8bae1dSRodney W. Grimes beg = match(t[c3], "[^*]"); 145df8bae1dSRodney W. Grimes end = match(t[c3], ";"); 146df8bae1dSRodney W. Grimes printf("a.a_%s = %s\n", 147df8bae1dSRodney W. Grimes substr(t[c3], beg, end - beg), substr(t[c3], beg)); 148df8bae1dSRodney W. Grimes } 149df8bae1dSRodney W. Grimes c1 = split(a[0], t); 150df8bae1dSRodney W. Grimes beg = match(t[c1], "[^*]"); 151df8bae1dSRodney W. Grimes end = match(t[c1], ";"); 152df8bae1dSRodney W. Grimes printf("\treturn (VCALL(%s, VOFFSET(%s), &a));\n}\n", 153df8bae1dSRodney W. Grimes substr(t[c1], beg, end - beg), name); 154df8bae1dSRodney W. Grimes }' < $SRC >> $HEADER 155df8bae1dSRodney W. Grimes 156df8bae1dSRodney W. Grimes# Print out header information for vnode_if.c. 157df8bae1dSRodney W. Grimescat << END_OF_LEADING_COMMENT > $CFILE 158df8bae1dSRodney W. Grimes/* 159df8bae1dSRodney W. Grimes * This file is produced automatically. 160df8bae1dSRodney W. Grimes * Do not modify anything in here by hand. 161df8bae1dSRodney W. Grimes * 162df8bae1dSRodney W. Grimes * Created from @(#)vnode_if.sh 8.1 (Berkeley) 6/10/93 163df8bae1dSRodney W. Grimes */ 164df8bae1dSRodney W. Grimes 165df8bae1dSRodney W. Grimes#include <sys/param.h> 166df8bae1dSRodney W. Grimes#include <sys/mount.h> 167df8bae1dSRodney W. Grimes#include <sys/vnode.h> 168df8bae1dSRodney W. Grimes 169df8bae1dSRodney W. Grimesstruct vnodeop_desc vop_default_desc = { 170df8bae1dSRodney W. Grimes 0, 171df8bae1dSRodney W. Grimes "default", 172df8bae1dSRodney W. Grimes 0, 173df8bae1dSRodney W. Grimes NULL, 174df8bae1dSRodney W. Grimes VDESC_NO_OFFSET, 175df8bae1dSRodney W. Grimes VDESC_NO_OFFSET, 176df8bae1dSRodney W. Grimes VDESC_NO_OFFSET, 177df8bae1dSRodney W. Grimes VDESC_NO_OFFSET, 178df8bae1dSRodney W. Grimes NULL, 179df8bae1dSRodney W. Grimes}; 180df8bae1dSRodney W. Grimes 181df8bae1dSRodney W. GrimesEND_OF_LEADING_COMMENT 182df8bae1dSRodney W. Grimes 183df8bae1dSRodney W. Grimes# Awk script to take vnode_if.src and turn it into vnode_if.c. 184df8bae1dSRodney W. Grimes$AWK 'function kill_surrounding_ws (s) { 185df8bae1dSRodney W. Grimes sub (/^[ \t]*/, "", s); 186df8bae1dSRodney W. Grimes sub (/[ \t]*$/, "", s); 187df8bae1dSRodney W. Grimes return s; 188df8bae1dSRodney W. Grimes } 189df8bae1dSRodney W. Grimes 190df8bae1dSRodney W. Grimes function read_args() { 191df8bae1dSRodney W. Grimes numargs = 0; 192df8bae1dSRodney W. Grimes while (getline ln) { 193df8bae1dSRodney W. Grimes if (ln ~ /}/) { 194df8bae1dSRodney W. Grimes break; 195df8bae1dSRodney W. Grimes }; 196df8bae1dSRodney W. Grimes 197df8bae1dSRodney W. Grimes # Delete comments, if any. 198df8bae1dSRodney W. Grimes gsub (/\/\*.*\*\//, "", ln); 199df8bae1dSRodney W. Grimes 200df8bae1dSRodney W. Grimes # Delete leading/trailing space. 201df8bae1dSRodney W. Grimes ln = kill_surrounding_ws(ln); 202df8bae1dSRodney W. Grimes 203df8bae1dSRodney W. Grimes # Pick off direction. 204df8bae1dSRodney W. Grimes if (1 == sub(/^INOUT[ \t]+/, "", ln)) 205df8bae1dSRodney W. Grimes dir = "INOUT"; 206df8bae1dSRodney W. Grimes else if (1 == sub(/^IN[ \t]+/, "", ln)) 207df8bae1dSRodney W. Grimes dir = "IN"; 208df8bae1dSRodney W. Grimes else if (1 == sub(/^OUT[ \t]+/, "", ln)) 209df8bae1dSRodney W. Grimes dir = "OUT"; 210df8bae1dSRodney W. Grimes else 211df8bae1dSRodney W. Grimes bail("No IN/OUT direction for \"" ln "\"."); 212df8bae1dSRodney W. Grimes 213df8bae1dSRodney W. Grimes # check for "WILLRELE" 214df8bae1dSRodney W. Grimes if (1 == sub(/^WILLRELE[ \t]+/, "", ln)) { 215df8bae1dSRodney W. Grimes rele = "WILLRELE"; 216df8bae1dSRodney W. Grimes } else { 217df8bae1dSRodney W. Grimes rele = "WONTRELE"; 218df8bae1dSRodney W. Grimes }; 219df8bae1dSRodney W. Grimes 220df8bae1dSRodney W. Grimes # kill trailing ; 221df8bae1dSRodney W. Grimes if (1 != sub (/;$/, "", ln)) { 222df8bae1dSRodney W. Grimes bail("Missing end-of-line ; in \"" ln "\"."); 223df8bae1dSRodney W. Grimes }; 224df8bae1dSRodney W. Grimes 225df8bae1dSRodney W. Grimes # pick off variable name 226df8bae1dSRodney W. Grimes if (!(i = match(ln, /[A-Za-z0-9_]+$/))) { 227df8bae1dSRodney W. Grimes bail("Missing var name \"a_foo\" in \"" ln "\"."); 228df8bae1dSRodney W. Grimes }; 229df8bae1dSRodney W. Grimes arg = substr (ln, i); 230df8bae1dSRodney W. Grimes # Want to <<substr(ln, i) = "";>>, but nawk cannot. 231df8bae1dSRodney W. Grimes # Hack around this. 232df8bae1dSRodney W. Grimes ln = substr(ln, 1, i-1); 233df8bae1dSRodney W. Grimes 234df8bae1dSRodney W. Grimes # what is left must be type 235df8bae1dSRodney W. Grimes # (put clean it up some) 236df8bae1dSRodney W. Grimes type = ln; 237df8bae1dSRodney W. Grimes gsub (/[ \t]+/, " ", type); # condense whitespace 238df8bae1dSRodney W. Grimes type = kill_surrounding_ws(type); 239df8bae1dSRodney W. Grimes 240df8bae1dSRodney W. Grimes # (boy this was easier in Perl) 241df8bae1dSRodney W. Grimes 242df8bae1dSRodney W. Grimes numargs++; 243df8bae1dSRodney W. Grimes dirs[numargs] = dir; 244df8bae1dSRodney W. Grimes reles[numargs] = rele; 245df8bae1dSRodney W. Grimes types[numargs] = type; 246df8bae1dSRodney W. Grimes args[numargs] = arg; 247df8bae1dSRodney W. Grimes }; 248df8bae1dSRodney W. Grimes } 249df8bae1dSRodney W. Grimes 250df8bae1dSRodney W. Grimes function generate_operation_vp_offsets() { 251df8bae1dSRodney W. Grimes printf ("int %s_vp_offsets[] = {\n", name); 252df8bae1dSRodney W. Grimes # as a side effect, figure out the releflags 253df8bae1dSRodney W. Grimes releflags = ""; 254df8bae1dSRodney W. Grimes vpnum = 0; 255df8bae1dSRodney W. Grimes for (i=1; i<=numargs; i++) { 256df8bae1dSRodney W. Grimes if (types[i] == "struct vnode *") { 257df8bae1dSRodney W. Grimes printf ("\tVOPARG_OFFSETOF(struct %s_args,a_%s),\n", 258df8bae1dSRodney W. Grimes name, args[i]); 259df8bae1dSRodney W. Grimes if (reles[i] == "WILLRELE") { 260df8bae1dSRodney W. Grimes releflags = releflags "|VDESC_VP" vpnum "_WILLRELE"; 261df8bae1dSRodney W. Grimes }; 262df8bae1dSRodney W. Grimes vpnum++; 263df8bae1dSRodney W. Grimes }; 264df8bae1dSRodney W. Grimes }; 265df8bae1dSRodney W. Grimes sub (/^\|/, "", releflags); 266df8bae1dSRodney W. Grimes print "\tVDESC_NO_OFFSET"; 267df8bae1dSRodney W. Grimes print "};"; 268df8bae1dSRodney W. Grimes } 269df8bae1dSRodney W. Grimes 270df8bae1dSRodney W. Grimes function find_arg_with_type (type) { 271df8bae1dSRodney W. Grimes for (i=1; i<=numargs; i++) { 272df8bae1dSRodney W. Grimes if (types[i] == type) { 273df8bae1dSRodney W. Grimes return "VOPARG_OFFSETOF(struct " name "_args,a_" args[i] ")"; 274df8bae1dSRodney W. Grimes }; 275df8bae1dSRodney W. Grimes }; 276df8bae1dSRodney W. Grimes return "VDESC_NO_OFFSET"; 277df8bae1dSRodney W. Grimes } 278df8bae1dSRodney W. Grimes 279df8bae1dSRodney W. Grimes function generate_operation_desc() { 280df8bae1dSRodney W. Grimes printf ("struct vnodeop_desc %s_desc = {\n", name); 281df8bae1dSRodney W. Grimes # offset 282df8bae1dSRodney W. Grimes printf ("\t0,\n"); 283df8bae1dSRodney W. Grimes # printable name 284df8bae1dSRodney W. Grimes printf ("\t\"%s\",\n", name); 285df8bae1dSRodney W. Grimes # flags 286df8bae1dSRodney W. Grimes vppwillrele = ""; 287df8bae1dSRodney W. Grimes for (i=1; i<=numargs; i++) { 288df8bae1dSRodney W. Grimes if (types[i] == "struct vnode **" && 289df8bae1dSRodney W. Grimes (reles[i] == "WILLRELE")) { 290df8bae1dSRodney W. Grimes vppwillrele = "|VDESC_VPP_WILLRELE"; 291df8bae1dSRodney W. Grimes }; 292df8bae1dSRodney W. Grimes }; 293df8bae1dSRodney W. Grimes if (releflags == "") { 294df8bae1dSRodney W. Grimes printf ("\t0%s,\n", vppwillrele); 295df8bae1dSRodney W. Grimes } else { 296df8bae1dSRodney W. Grimes printf ("\t%s%s,\n", releflags, vppwillrele); 297df8bae1dSRodney W. Grimes }; 298df8bae1dSRodney W. Grimes # vp offsets 299df8bae1dSRodney W. Grimes printf ("\t%s_vp_offsets,\n", name); 300df8bae1dSRodney W. Grimes # vpp (if any) 301df8bae1dSRodney W. Grimes printf ("\t%s,\n", find_arg_with_type("struct vnode **")); 302df8bae1dSRodney W. Grimes # cred (if any) 303df8bae1dSRodney W. Grimes printf ("\t%s,\n", find_arg_with_type("struct ucred *")); 304df8bae1dSRodney W. Grimes # proc (if any) 305df8bae1dSRodney W. Grimes printf ("\t%s,\n", find_arg_with_type("struct proc *")); 306df8bae1dSRodney W. Grimes # componentname 307df8bae1dSRodney W. Grimes printf ("\t%s,\n", find_arg_with_type("struct componentname *")); 308df8bae1dSRodney W. Grimes # transport layer information 309df8bae1dSRodney W. Grimes printf ("\tNULL,\n};\n"); 310df8bae1dSRodney W. Grimes } 311df8bae1dSRodney W. Grimes 312df8bae1dSRodney W. Grimes NF == 0 || $0 ~ "^#" { 313df8bae1dSRodney W. Grimes next; 314df8bae1dSRodney W. Grimes } 315df8bae1dSRodney W. Grimes { 316df8bae1dSRodney W. Grimes # get the function name 317df8bae1dSRodney W. Grimes name = $1; 318df8bae1dSRodney W. Grimes 319df8bae1dSRodney W. Grimes # get the function arguments 320df8bae1dSRodney W. Grimes read_args(); 321df8bae1dSRodney W. Grimes 322df8bae1dSRodney W. Grimes # Print out the vop_F_vp_offsets structure. This all depends 323df8bae1dSRodney W. Grimes # on naming conventions and nothing else. 324df8bae1dSRodney W. Grimes generate_operation_vp_offsets(); 325df8bae1dSRodney W. Grimes 326df8bae1dSRodney W. Grimes # Print out the vnodeop_desc structure. 327df8bae1dSRodney W. Grimes generate_operation_desc(); 328df8bae1dSRodney W. Grimes 329df8bae1dSRodney W. Grimes printf "\n"; 330df8bae1dSRodney W. Grimes 331df8bae1dSRodney W. Grimes }' < $SRC >> $CFILE 332df8bae1dSRodney W. Grimes# THINGS THAT DON'T WORK RIGHT YET. 333df8bae1dSRodney W. Grimes# 334df8bae1dSRodney W. Grimes# Two existing BSD vnodeops (bwrite and strategy) don't take any vnodes as 335df8bae1dSRodney W. Grimes# arguments. This means that these operations can't function successfully 336df8bae1dSRodney W. Grimes# through a bypass routine. 337df8bae1dSRodney W. Grimes# 338df8bae1dSRodney W. Grimes# Bwrite and strategy will be replaced when the VM page/buffer cache 339df8bae1dSRodney W. Grimes# integration happens. 340df8bae1dSRodney W. Grimes# 341df8bae1dSRodney W. Grimes# To get around this problem for now we handle these ops as special cases. 342df8bae1dSRodney W. Grimes 343df8bae1dSRodney W. Grimescat << END_OF_SPECIAL_CASES >> $HEADER 344df8bae1dSRodney W. Grimes#include <sys/buf.h> 345df8bae1dSRodney W. Grimesstruct vop_strategy_args { 346df8bae1dSRodney W. Grimes struct vnodeop_desc *a_desc; 347df8bae1dSRodney W. Grimes struct buf *a_bp; 348df8bae1dSRodney W. Grimes}; 349df8bae1dSRodney W. Grimesextern struct vnodeop_desc vop_strategy_desc; 350df8bae1dSRodney W. Grimesstatic inline int VOP_STRATEGY(bp) 351df8bae1dSRodney W. Grimes struct buf *bp; 352df8bae1dSRodney W. Grimes{ 353df8bae1dSRodney W. Grimes struct vop_strategy_args a; 354df8bae1dSRodney W. Grimes 355df8bae1dSRodney W. Grimes a.a_desc = VDESC(vop_strategy); 356df8bae1dSRodney W. Grimes a.a_bp = bp; 357df8bae1dSRodney W. Grimes return (VCALL((bp)->b_vp, VOFFSET(vop_strategy), &a)); 358df8bae1dSRodney W. Grimes} 359df8bae1dSRodney W. Grimes 360df8bae1dSRodney W. Grimesstruct vop_bwrite_args { 361df8bae1dSRodney W. Grimes struct vnodeop_desc *a_desc; 362df8bae1dSRodney W. Grimes struct buf *a_bp; 363df8bae1dSRodney W. Grimes}; 364df8bae1dSRodney W. Grimesextern struct vnodeop_desc vop_bwrite_desc; 365df8bae1dSRodney W. Grimesstatic inline int VOP_BWRITE(bp) 366df8bae1dSRodney W. Grimes struct buf *bp; 367df8bae1dSRodney W. Grimes{ 368df8bae1dSRodney W. Grimes struct vop_bwrite_args a; 369df8bae1dSRodney W. Grimes 370df8bae1dSRodney W. Grimes a.a_desc = VDESC(vop_bwrite); 371df8bae1dSRodney W. Grimes a.a_bp = bp; 372df8bae1dSRodney W. Grimes return (VCALL((bp)->b_vp, VOFFSET(vop_bwrite), &a)); 373df8bae1dSRodney W. Grimes} 374df8bae1dSRodney W. GrimesEND_OF_SPECIAL_CASES 375df8bae1dSRodney W. Grimes 376df8bae1dSRodney W. Grimescat << END_OF_SPECIAL_CASES >> $CFILE 377df8bae1dSRodney W. Grimesint vop_strategy_vp_offsets[] = { 378df8bae1dSRodney W. Grimes VDESC_NO_OFFSET 379df8bae1dSRodney W. Grimes}; 380df8bae1dSRodney W. Grimesstruct vnodeop_desc vop_strategy_desc = { 381df8bae1dSRodney W. Grimes 0, 382df8bae1dSRodney W. Grimes "vop_strategy", 383df8bae1dSRodney W. Grimes 0, 384df8bae1dSRodney W. Grimes vop_strategy_vp_offsets, 385df8bae1dSRodney W. Grimes VDESC_NO_OFFSET, 386df8bae1dSRodney W. Grimes VDESC_NO_OFFSET, 387df8bae1dSRodney W. Grimes VDESC_NO_OFFSET, 388df8bae1dSRodney W. Grimes VDESC_NO_OFFSET, 389df8bae1dSRodney W. Grimes NULL, 390df8bae1dSRodney W. Grimes}; 391df8bae1dSRodney W. Grimesint vop_bwrite_vp_offsets[] = { 392df8bae1dSRodney W. Grimes VDESC_NO_OFFSET 393df8bae1dSRodney W. Grimes}; 394df8bae1dSRodney W. Grimesstruct vnodeop_desc vop_bwrite_desc = { 395df8bae1dSRodney W. Grimes 0, 396df8bae1dSRodney W. Grimes "vop_bwrite", 397df8bae1dSRodney W. Grimes 0, 398df8bae1dSRodney W. Grimes vop_bwrite_vp_offsets, 399df8bae1dSRodney W. Grimes VDESC_NO_OFFSET, 400df8bae1dSRodney W. Grimes VDESC_NO_OFFSET, 401df8bae1dSRodney W. Grimes VDESC_NO_OFFSET, 402df8bae1dSRodney W. Grimes VDESC_NO_OFFSET, 403df8bae1dSRodney W. Grimes NULL, 404df8bae1dSRodney W. Grimes}; 405df8bae1dSRodney W. GrimesEND_OF_SPECIAL_CASES 406df8bae1dSRodney W. Grimes 407df8bae1dSRodney W. Grimes# Add the vfs_op_descs array to the C file. 408df8bae1dSRodney W. Grimes$AWK ' 409df8bae1dSRodney W. Grimes BEGIN { 410df8bae1dSRodney W. Grimes printf("\nstruct vnodeop_desc *vfs_op_descs[] = {\n"); 411df8bae1dSRodney W. Grimes printf("\t&vop_default_desc, /* MUST BE FIRST */\n"); 412df8bae1dSRodney W. Grimes printf("\t&vop_strategy_desc, /* XXX: SPECIAL CASE */\n"); 413df8bae1dSRodney W. Grimes printf("\t&vop_bwrite_desc, /* XXX: SPECIAL CASE */\n"); 414df8bae1dSRodney W. Grimes } 415df8bae1dSRodney W. Grimes END { 416df8bae1dSRodney W. Grimes printf("\tNULL\n};\n"); 417df8bae1dSRodney W. Grimes } 418df8bae1dSRodney W. Grimes NF == 0 || $0 ~ "^#" { 419df8bae1dSRodney W. Grimes next; 420df8bae1dSRodney W. Grimes } 421df8bae1dSRodney W. Grimes { 422df8bae1dSRodney W. Grimes # Get the function name. 423df8bae1dSRodney W. Grimes printf("\t&%s_desc,\n", $1); 424df8bae1dSRodney W. Grimes 425df8bae1dSRodney W. Grimes # Skip the function arguments. 426df8bae1dSRodney W. Grimes for (;;) { 427df8bae1dSRodney W. Grimes if (getline <= 0) 428df8bae1dSRodney W. Grimes exit 429df8bae1dSRodney W. Grimes if ($0 ~ "^};") 430df8bae1dSRodney W. Grimes break; 431df8bae1dSRodney W. Grimes } 432df8bae1dSRodney W. Grimes }' < $SRC >> $CFILE 433df8bae1dSRodney W. Grimes 434