xref: /freebsd/sys/tools/vnode_if.awk (revision df8bae1de4b67ccf57f4afebd4e2bf258c38910d)
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