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