xref: /csrg-svn/sys/nfs/nfsm_subs.h (revision 68653)
138414Smckusick /*
263488Sbostic  * Copyright (c) 1989, 1993
363488Sbostic  *	The Regents of the University of California.  All rights reserved.
438414Smckusick  *
538414Smckusick  * This code is derived from software contributed to Berkeley by
638414Smckusick  * Rick Macklem at The University of Guelph.
738414Smckusick  *
844515Sbostic  * %sccs.include.redist.c%
938414Smckusick  *
10*68653Smckusick  *	@(#)nfsm_subs.h	8.2 (Berkeley) 03/30/95
1138414Smckusick  */
1238414Smckusick 
13*68653Smckusick 
14*68653Smckusick #ifndef _NFS_NFSM_SUBS_H_
15*68653Smckusick #define _NFS_NFSM_SUBS_H_
16*68653Smckusick 
17*68653Smckusick 
1838414Smckusick /*
1938414Smckusick  * These macros do strange and peculiar things to mbuf chains for
2038414Smckusick  * the assistance of the nfs code. To attempt to use them for any
2138414Smckusick  * other purpose will be dangerous. (they make weird assumptions)
2238414Smckusick  */
2338414Smckusick 
2438414Smckusick /*
2538414Smckusick  * First define what the actual subs. return
2638414Smckusick  */
2739494Smckusick extern struct mbuf *nfsm_reqh();
2838414Smckusick 
2938414Smckusick #define	M_HASCL(m)	((m)->m_flags & M_EXT)
3038414Smckusick #define	NFSMINOFF(m) \
3138414Smckusick 		if (M_HASCL(m)) \
3238414Smckusick 			(m)->m_data = (m)->m_ext.ext_buf; \
3352196Smckusick 		else if ((m)->m_flags & M_PKTHDR) \
3452196Smckusick 			(m)->m_data = (m)->m_pktdat; \
3538414Smckusick 		else \
3638414Smckusick 			(m)->m_data = (m)->m_dat
3738414Smckusick #define	NFSMADV(m, s)	(m)->m_data += (s)
3838425Smckusick #define	NFSMSIZ(m)	((M_HASCL(m))?MCLBYTES: \
3938414Smckusick 				(((m)->m_flags & M_PKTHDR)?MHLEN:MLEN))
4038414Smckusick 
4138414Smckusick /*
4238414Smckusick  * Now for the macros that do the simple stuff and call the functions
4338414Smckusick  * for the hard stuff.
4438414Smckusick  * These macros use several vars. declared in nfsm_reqhead and these
4538414Smckusick  * vars. must not be used elsewhere unless you are careful not to corrupt
4638414Smckusick  * them. The vars. starting with pN and tN (N=1,2,3,..) are temporaries
4738414Smckusick  * that may be used so long as the value is not expected to retained
4838414Smckusick  * after a macro.
4938414Smckusick  * I know, this is kind of dorkey, but it makes the actual op functions
5038414Smckusick  * fairly clean and deals with the mess caused by the xdr discriminating
5138414Smckusick  * unions.
5238414Smckusick  */
5338414Smckusick 
5438414Smckusick #define	nfsm_build(a,c,s) \
5552196Smckusick 		{ if ((s) > M_TRAILINGSPACE(mb)) { \
5638414Smckusick 			MGET(mb2, M_WAIT, MT_DATA); \
5738414Smckusick 			if ((s) > MLEN) \
5838414Smckusick 				panic("build > MLEN"); \
5938414Smckusick 			mb->m_next = mb2; \
6038414Smckusick 			mb = mb2; \
6138414Smckusick 			mb->m_len = 0; \
6238414Smckusick 			bpos = mtod(mb, caddr_t); \
6338414Smckusick 		} \
6438414Smckusick 		(a) = (c)(bpos); \
6538414Smckusick 		mb->m_len += (s); \
6652196Smckusick 		bpos += (s); }
6738414Smckusick 
68*68653Smckusick #define	nfsm_dissect(a, c, s) \
6952196Smckusick 		{ t1 = mtod(md, caddr_t)+md->m_len-dpos; \
7038414Smckusick 		if (t1 >= (s)) { \
7138414Smckusick 			(a) = (c)(dpos); \
7238414Smckusick 			dpos += (s); \
73*68653Smckusick 		} else if (t1 = nfsm_disct(&md, &dpos, (s), t1, &cp2)) { \
74*68653Smckusick 			error = t1; \
7538414Smckusick 			m_freem(mrep); \
7638414Smckusick 			goto nfsmout; \
7738414Smckusick 		} else { \
7838414Smckusick 			(a) = (c)cp2; \
7952196Smckusick 		} }
8038414Smckusick 
81*68653Smckusick #define nfsm_fhtom(v, v3) \
82*68653Smckusick 	      { if (v3) { \
83*68653Smckusick 			t2 = nfsm_rndup(VTONFS(v)->n_fhsize) + NFSX_UNSIGNED; \
84*68653Smckusick 			if (t2 <= M_TRAILINGSPACE(mb)) { \
85*68653Smckusick 				nfsm_build(tl, u_long *, t2); \
86*68653Smckusick 				*tl++ = txdr_unsigned(VTONFS(v)->n_fhsize); \
87*68653Smckusick 				*(tl + ((t2>>2) - 2)) = 0; \
88*68653Smckusick 				bcopy((caddr_t)VTONFS(v)->n_fhp,(caddr_t)tl, \
89*68653Smckusick 					VTONFS(v)->n_fhsize); \
90*68653Smckusick 			} else if (t2 = nfsm_strtmbuf(&mb, &bpos, \
91*68653Smckusick 				(caddr_t)VTONFS(v)->n_fhp, VTONFS(v)->n_fhsize)) { \
92*68653Smckusick 				error = t2; \
93*68653Smckusick 				m_freem(mreq); \
94*68653Smckusick 				goto nfsmout; \
95*68653Smckusick 			} \
96*68653Smckusick 		} else { \
97*68653Smckusick 			nfsm_build(cp, caddr_t, NFSX_V2FH); \
98*68653Smckusick 			bcopy((caddr_t)VTONFS(v)->n_fhp, cp, NFSX_V2FH); \
99*68653Smckusick 		} }
10038414Smckusick 
101*68653Smckusick #define nfsm_srvfhtom(f, v3) \
102*68653Smckusick 		{ if (v3) { \
103*68653Smckusick 			nfsm_build(tl, u_long *, NFSX_UNSIGNED + NFSX_V3FH); \
104*68653Smckusick 			*tl++ = txdr_unsigned(NFSX_V3FH); \
105*68653Smckusick 			bcopy((caddr_t)(f), (caddr_t)tl, NFSX_V3FH); \
106*68653Smckusick 		} else { \
107*68653Smckusick 			nfsm_build(cp, caddr_t, NFSX_V2FH); \
108*68653Smckusick 			bcopy((caddr_t)(f), cp, NFSX_V2FH); \
109*68653Smckusick 		} }
11038414Smckusick 
111*68653Smckusick #define nfsm_srvpostop_fh(f) \
112*68653Smckusick 		{ nfsm_build(tl, u_long *, 2 * NFSX_UNSIGNED + NFSX_V3FH); \
113*68653Smckusick 		*tl++ = nfs_true; \
114*68653Smckusick 		*tl++ = txdr_unsigned(NFSX_V3FH); \
115*68653Smckusick 		bcopy((caddr_t)(f), (caddr_t)tl, NFSX_V3FH); \
116*68653Smckusick 		}
117*68653Smckusick 
118*68653Smckusick #define nfsm_mtofh(d, v, v3, f) \
119*68653Smckusick 		{ struct nfsnode *ttnp; nfsfh_t *ttfhp; int ttfhsize; \
120*68653Smckusick 		if (v3) { \
121*68653Smckusick 			nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \
122*68653Smckusick 			(f) = fxdr_unsigned(int, *tl); \
123*68653Smckusick 		} else \
124*68653Smckusick 			(f) = 1; \
125*68653Smckusick 		if (f) { \
126*68653Smckusick 			nfsm_getfh(ttfhp, ttfhsize, (v3)); \
127*68653Smckusick 			if (t1 = nfs_nget((d)->v_mount, ttfhp, ttfhsize, \
128*68653Smckusick 				&ttnp)) { \
129*68653Smckusick 				error = t1; \
130*68653Smckusick 				m_freem(mrep); \
131*68653Smckusick 				goto nfsmout; \
132*68653Smckusick 			} \
133*68653Smckusick 			(v) = NFSTOV(ttnp); \
13438414Smckusick 		} \
135*68653Smckusick 		if (v3) { \
136*68653Smckusick 			nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \
137*68653Smckusick 			if (f) \
138*68653Smckusick 				(f) = fxdr_unsigned(int, *tl); \
139*68653Smckusick 			else if (fxdr_unsigned(int, *tl)) \
140*68653Smckusick 				nfsm_adv(NFSX_V3FATTR); \
141*68653Smckusick 		} \
142*68653Smckusick 		if (f) \
143*68653Smckusick 			nfsm_loadattr((v), (struct vattr *)0); \
14438414Smckusick 		}
14538414Smckusick 
146*68653Smckusick #define nfsm_getfh(f, s, v3) \
147*68653Smckusick 		{ if (v3) { \
148*68653Smckusick 			nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \
149*68653Smckusick 			if (((s) = fxdr_unsigned(int, *tl)) <= 0 || \
150*68653Smckusick 				(s) > NFSX_V3FHMAX) { \
151*68653Smckusick 				m_freem(mrep); \
152*68653Smckusick 				error = EBADRPC; \
153*68653Smckusick 				goto nfsmout; \
154*68653Smckusick 			} \
155*68653Smckusick 		} else \
156*68653Smckusick 			(s) = NFSX_V2FH; \
157*68653Smckusick 		nfsm_dissect((f), nfsfh_t *, nfsm_rndup(s)); }
158*68653Smckusick 
159*68653Smckusick #define	nfsm_loadattr(v, a) \
160*68653Smckusick 		{ struct vnode *ttvp = (v); \
161*68653Smckusick 		if (t1 = nfs_loadattrcache(&ttvp, &md, &dpos, (a))) { \
162*68653Smckusick 			error = t1; \
16338414Smckusick 			m_freem(mrep); \
16438414Smckusick 			goto nfsmout; \
16539494Smckusick 		} \
166*68653Smckusick 		(v) = ttvp; }
16738414Smckusick 
168*68653Smckusick #define	nfsm_postop_attr(v, f) \
169*68653Smckusick 		{ struct vnode *ttvp = (v); \
170*68653Smckusick 		nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \
171*68653Smckusick 		if ((f) = fxdr_unsigned(int, *tl)) { \
172*68653Smckusick 			if (t1 = nfs_loadattrcache(&ttvp, &md, &dpos, \
173*68653Smckusick 				(struct vattr *)0)) { \
174*68653Smckusick 				error = t1; \
175*68653Smckusick 				(f) = 0; \
176*68653Smckusick 				m_freem(mrep); \
177*68653Smckusick 				goto nfsmout; \
178*68653Smckusick 			} \
179*68653Smckusick 			(v) = ttvp; \
180*68653Smckusick 		} }
181*68653Smckusick 
182*68653Smckusick /* Used as (f) for nfsm_wcc_data() */
183*68653Smckusick #define NFSV3_WCCRATTR	0
184*68653Smckusick #define NFSV3_WCCCHK	1
185*68653Smckusick 
186*68653Smckusick #define	nfsm_wcc_data(v, f) \
187*68653Smckusick 		{ int ttattrf, ttretf = 0; \
188*68653Smckusick 		nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \
189*68653Smckusick 		if (*tl == nfs_true) { \
190*68653Smckusick 			nfsm_dissect(tl, u_long *, 6 * NFSX_UNSIGNED); \
191*68653Smckusick 			if (f) \
192*68653Smckusick 				ttretf = (VTONFS(v)->n_mtime == \
193*68653Smckusick 					fxdr_unsigned(u_long, *(tl + 2))); \
194*68653Smckusick 		} \
195*68653Smckusick 		nfsm_postop_attr((v), ttattrf); \
196*68653Smckusick 		if (f) { \
197*68653Smckusick 			(f) = ttretf; \
198*68653Smckusick 		} else { \
199*68653Smckusick 			(f) = ttattrf; \
200*68653Smckusick 		} }
201*68653Smckusick 
202*68653Smckusick #define nfsm_v3sattr(s, a, u, g) \
203*68653Smckusick 		{ (s)->sa_modetrue = nfs_true; \
204*68653Smckusick 		(s)->sa_mode = vtonfsv3_mode((a)->va_mode); \
205*68653Smckusick 		(s)->sa_uidtrue = nfs_true; \
206*68653Smckusick 		(s)->sa_uid = txdr_unsigned(u); \
207*68653Smckusick 		(s)->sa_gidtrue = nfs_true; \
208*68653Smckusick 		(s)->sa_gid = txdr_unsigned(g); \
209*68653Smckusick 		(s)->sa_sizefalse = nfs_false; \
210*68653Smckusick 		(s)->sa_atimetype = txdr_unsigned(NFSV3SATTRTIME_TOCLIENT); \
211*68653Smckusick 		txdr_nfsv3time(&(a)->va_atime, &(s)->sa_atime); \
212*68653Smckusick 		(s)->sa_mtimetype = txdr_unsigned(NFSV3SATTRTIME_TOCLIENT); \
213*68653Smckusick 		txdr_nfsv3time(&(a)->va_mtime, &(s)->sa_mtime); \
214*68653Smckusick 		}
215*68653Smckusick 
21638414Smckusick #define	nfsm_strsiz(s,m) \
21752196Smckusick 		{ nfsm_dissect(tl,u_long *,NFSX_UNSIGNED); \
21848046Smckusick 		if (((s) = fxdr_unsigned(long,*tl)) > (m)) { \
21938414Smckusick 			m_freem(mrep); \
22038414Smckusick 			error = EBADRPC; \
22138414Smckusick 			goto nfsmout; \
22252196Smckusick 		} }
22338414Smckusick 
22438414Smckusick #define	nfsm_srvstrsiz(s,m) \
22552196Smckusick 		{ nfsm_dissect(tl,u_long *,NFSX_UNSIGNED); \
22648046Smckusick 		if (((s) = fxdr_unsigned(long,*tl)) > (m) || (s) <= 0) { \
22738414Smckusick 			error = EBADRPC; \
22838414Smckusick 			nfsm_reply(0); \
22952196Smckusick 		} }
23038414Smckusick 
231*68653Smckusick #define	nfsm_srvnamesiz(s) \
232*68653Smckusick 		{ nfsm_dissect(tl,u_long *,NFSX_UNSIGNED); \
233*68653Smckusick 		if (((s) = fxdr_unsigned(long,*tl)) > NFS_MAXNAMLEN) \
234*68653Smckusick 			error = NFSERR_NAMETOL; \
235*68653Smckusick 		if ((s) <= 0) \
236*68653Smckusick 			error = EBADRPC; \
237*68653Smckusick 		if (error) \
238*68653Smckusick 			nfsm_reply(0); \
239*68653Smckusick 		}
240*68653Smckusick 
24138414Smckusick #define nfsm_mtouio(p,s) \
24238414Smckusick 		if ((s) > 0 && \
243*68653Smckusick 		   (t1 = nfsm_mbuftouio(&md,(p),(s),&dpos))) { \
244*68653Smckusick 			error = t1; \
24538414Smckusick 			m_freem(mrep); \
24638414Smckusick 			goto nfsmout; \
24738414Smckusick 		}
24838414Smckusick 
24938414Smckusick #define nfsm_uiotom(p,s) \
250*68653Smckusick 		if (t1 = nfsm_uiotombuf((p),&mb,(s),&bpos)) { \
251*68653Smckusick 			error = t1; \
25238414Smckusick 			m_freem(mreq); \
25338414Smckusick 			goto nfsmout; \
25438414Smckusick 		}
25538414Smckusick 
25652196Smckusick #define	nfsm_reqhead(v,a,s) \
25752196Smckusick 		mb = mreq = nfsm_reqh((v),(a),(s),&bpos)
25838414Smckusick 
25938414Smckusick #define nfsm_reqdone	m_freem(mrep); \
26038414Smckusick 		nfsmout:
26138414Smckusick 
26238414Smckusick #define nfsm_rndup(a)	(((a)+3)&(~0x3))
26338414Smckusick 
26452196Smckusick #define	nfsm_request(v, t, p, c)	\
26552196Smckusick 		if (error = nfs_request((v), mreq, (t), (p), \
266*68653Smckusick 		   (c), &mrep, &md, &dpos)) { \
267*68653Smckusick 			if (error & NFSERR_RETERR) \
268*68653Smckusick 				error &= ~NFSERR_RETERR; \
269*68653Smckusick 			else \
270*68653Smckusick 				goto nfsmout; \
271*68653Smckusick 		}
27238414Smckusick 
27338414Smckusick #define	nfsm_strtom(a,s,m) \
27438414Smckusick 		if ((s) > (m)) { \
27538414Smckusick 			m_freem(mreq); \
27638414Smckusick 			error = ENAMETOOLONG; \
27738414Smckusick 			goto nfsmout; \
27838414Smckusick 		} \
27938414Smckusick 		t2 = nfsm_rndup(s)+NFSX_UNSIGNED; \
28052196Smckusick 		if (t2 <= M_TRAILINGSPACE(mb)) { \
28148046Smckusick 			nfsm_build(tl,u_long *,t2); \
28248046Smckusick 			*tl++ = txdr_unsigned(s); \
28348046Smckusick 			*(tl+((t2>>2)-2)) = 0; \
28448046Smckusick 			bcopy((caddr_t)(a), (caddr_t)tl, (s)); \
285*68653Smckusick 		} else if (t2 = nfsm_strtmbuf(&mb, &bpos, (a), (s))) { \
286*68653Smckusick 			error = t2; \
28738414Smckusick 			m_freem(mreq); \
28838414Smckusick 			goto nfsmout; \
28938414Smckusick 		}
29038414Smckusick 
29138414Smckusick #define	nfsm_srvdone \
29238414Smckusick 		nfsmout: \
29338414Smckusick 		return(error)
29438414Smckusick 
29538414Smckusick #define	nfsm_reply(s) \
29638414Smckusick 		{ \
29752196Smckusick 		nfsd->nd_repstat = error; \
298*68653Smckusick 		if (error && !(nfsd->nd_flag & ND_NFSV3)) \
299*68653Smckusick 		   (void) nfs_rephead(0, nfsd, slp, error, cache, &frev, \
30052196Smckusick 			mrq, &mb, &bpos); \
30138414Smckusick 		else \
302*68653Smckusick 		   (void) nfs_rephead((s), nfsd, slp, error, cache, &frev, \
30352196Smckusick 			mrq, &mb, &bpos); \
30438414Smckusick 		m_freem(mrep); \
30539745Smckusick 		mreq = *mrq; \
306*68653Smckusick 		if (error && (!(nfsd->nd_flag & ND_NFSV3) || \
307*68653Smckusick 			error == EBADRPC)) \
30838414Smckusick 			return(0); \
30938414Smckusick 		}
31038414Smckusick 
311*68653Smckusick #define	nfsm_writereply(s, v3) \
312*68653Smckusick 		{ \
313*68653Smckusick 		nfsd->nd_repstat = error; \
314*68653Smckusick 		if (error && !(v3)) \
315*68653Smckusick 		   (void) nfs_rephead(0, nfsd, slp, error, cache, &frev, \
316*68653Smckusick 			&mreq, &mb, &bpos); \
317*68653Smckusick 		else \
318*68653Smckusick 		   (void) nfs_rephead((s), nfsd, slp, error, cache, &frev, \
319*68653Smckusick 			&mreq, &mb, &bpos); \
320*68653Smckusick 		}
321*68653Smckusick 
32238414Smckusick #define	nfsm_adv(s) \
323*68653Smckusick 		{ t1 = mtod(md, caddr_t)+md->m_len-dpos; \
32438414Smckusick 		if (t1 >= (s)) { \
32538414Smckusick 			dpos += (s); \
326*68653Smckusick 		} else if (t1 = nfs_adv(&md, &dpos, (s), t1)) { \
327*68653Smckusick 			error = t1; \
32838414Smckusick 			m_freem(mrep); \
32938414Smckusick 			goto nfsmout; \
330*68653Smckusick 		} }
33138414Smckusick 
33238414Smckusick #define nfsm_srvmtofh(f) \
333*68653Smckusick 		{ if (nfsd->nd_flag & ND_NFSV3) { \
334*68653Smckusick 			nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \
335*68653Smckusick 			if (fxdr_unsigned(int, *tl) != NFSX_V3FH) { \
336*68653Smckusick 				error = EBADRPC; \
337*68653Smckusick 				nfsm_reply(0); \
338*68653Smckusick 			} \
339*68653Smckusick 		} \
340*68653Smckusick 		nfsm_dissect(tl, u_long *, NFSX_V3FH); \
341*68653Smckusick 		bcopy((caddr_t)tl, (caddr_t)(f), NFSX_V3FH); \
342*68653Smckusick 		if ((nfsd->nd_flag & ND_NFSV3) == 0) \
343*68653Smckusick 			nfsm_adv(NFSX_V2FH - NFSX_V3FH); \
344*68653Smckusick 		}
34538414Smckusick 
34638414Smckusick #define	nfsm_clget \
34738414Smckusick 		if (bp >= be) { \
34852196Smckusick 			if (mp == mb) \
34952196Smckusick 				mp->m_len += bp-bpos; \
35038414Smckusick 			MGET(mp, M_WAIT, MT_DATA); \
35141894Smckusick 			MCLGET(mp, M_WAIT); \
35238414Smckusick 			mp->m_len = NFSMSIZ(mp); \
35352196Smckusick 			mp2->m_next = mp; \
35452196Smckusick 			mp2 = mp; \
35538414Smckusick 			bp = mtod(mp, caddr_t); \
35638414Smckusick 			be = bp+mp->m_len; \
35738414Smckusick 		} \
35848046Smckusick 		tl = (u_long *)bp
35938414Smckusick 
360*68653Smckusick #define	nfsm_srvfillattr(a, f) \
361*68653Smckusick 		nfsm_srvfattr(nfsd, (a), (f))
36239745Smckusick 
363*68653Smckusick #define nfsm_srvwcc_data(br, b, ar, a) \
364*68653Smckusick 		nfsm_srvwcc(nfsd, (br), (b), (ar), (a), &mb, &bpos)
365*68653Smckusick 
366*68653Smckusick #define nfsm_srvpostop_attr(r, a) \
367*68653Smckusick 		nfsm_srvpostopattr(nfsd, (r), (a), &mb, &bpos)
368*68653Smckusick 
369*68653Smckusick #define nfsm_srvsattr(a) \
370*68653Smckusick 		{ nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \
371*68653Smckusick 		if (*tl == nfs_true) { \
372*68653Smckusick 			nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \
373*68653Smckusick 			(a)->va_mode = nfstov_mode(*tl); \
374*68653Smckusick 		} \
375*68653Smckusick 		nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \
376*68653Smckusick 		if (*tl == nfs_true) { \
377*68653Smckusick 			nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \
378*68653Smckusick 			(a)->va_uid = fxdr_unsigned(uid_t, *tl); \
379*68653Smckusick 		} \
380*68653Smckusick 		nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \
381*68653Smckusick 		if (*tl == nfs_true) { \
382*68653Smckusick 			nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \
383*68653Smckusick 			(a)->va_gid = fxdr_unsigned(gid_t, *tl); \
384*68653Smckusick 		} \
385*68653Smckusick 		nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \
386*68653Smckusick 		if (*tl == nfs_true) { \
387*68653Smckusick 			nfsm_dissect(tl, u_long *, 2 * NFSX_UNSIGNED); \
388*68653Smckusick 			fxdr_hyper(tl, &(a)->va_size); \
389*68653Smckusick 		} \
390*68653Smckusick 		nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \
391*68653Smckusick 		switch (fxdr_unsigned(int, *tl)) { \
392*68653Smckusick 		case NFSV3SATTRTIME_TOCLIENT: \
393*68653Smckusick 			nfsm_dissect(tl, u_long *, 2 * NFSX_UNSIGNED); \
394*68653Smckusick 			fxdr_nfsv3time(tl, &(a)->va_atime); \
395*68653Smckusick 			break; \
396*68653Smckusick 		case NFSV3SATTRTIME_TOSERVER: \
397*68653Smckusick 			(a)->va_atime.ts_sec = time.tv_sec; \
398*68653Smckusick 			(a)->va_atime.ts_nsec = time.tv_usec * 1000; \
399*68653Smckusick 			break; \
400*68653Smckusick 		}; \
401*68653Smckusick 		nfsm_dissect(tl, u_long *, NFSX_UNSIGNED); \
402*68653Smckusick 		switch (fxdr_unsigned(int, *tl)) { \
403*68653Smckusick 		case NFSV3SATTRTIME_TOCLIENT: \
404*68653Smckusick 			nfsm_dissect(tl, u_long *, 2 * NFSX_UNSIGNED); \
405*68653Smckusick 			fxdr_nfsv3time(tl, &(a)->va_mtime); \
406*68653Smckusick 			break; \
407*68653Smckusick 		case NFSV3SATTRTIME_TOSERVER: \
408*68653Smckusick 			(a)->va_mtime.ts_sec = time.tv_sec; \
409*68653Smckusick 			(a)->va_mtime.ts_nsec = time.tv_usec * 1000; \
410*68653Smckusick 			break; \
411*68653Smckusick 		}; }
412*68653Smckusick 
413*68653Smckusick #endif
414