diff options
author | peter <peter@FreeBSD.org> | 2001-09-28 04:37:08 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 2001-09-28 04:37:08 +0000 |
commit | 562ebdfbed6da83efa5110cabff6bbb6c685cfea (patch) | |
tree | 70885e3ccbc8ca40ca489f691745bc22fb96720d /sys | |
parent | d1e3264e13fc0aa3ac602b4919d9a89d613bc315 (diff) | |
download | FreeBSD-src-562ebdfbed6da83efa5110cabff6bbb6c685cfea.zip FreeBSD-src-562ebdfbed6da83efa5110cabff6bbb6c685cfea.tar.gz |
Unwind some more macros. NFSMADV() was kinda silly since it was right
next to equivalent m_len adjustments. Move the nfsm_subs.h macros
into groups depending on which phase they are used in, since that
affects the error recovery requirements. Collect some of the common error
checking into a single macro as preparation for unwinding some more.
Have nfs_rephead return a value instead of secretly modifying args.
Remove some unused function arguments that were being passed around.
Clarify nfsm_reply()'s error handling (I hope).
Diffstat (limited to 'sys')
-rw-r--r-- | sys/nfs/nfs_common.c | 2 | ||||
-rw-r--r-- | sys/nfs/nfs_common.h | 76 | ||||
-rw-r--r-- | sys/nfsclient/nfsm_subs.h | 140 | ||||
-rw-r--r-- | sys/nfsserver/nfs.h | 9 | ||||
-rw-r--r-- | sys/nfsserver/nfs_serv.c | 4 | ||||
-rw-r--r-- | sys/nfsserver/nfs_srvcache.c | 7 | ||||
-rw-r--r-- | sys/nfsserver/nfs_srvsock.c | 14 | ||||
-rw-r--r-- | sys/nfsserver/nfs_srvsubs.c | 14 | ||||
-rw-r--r-- | sys/nfsserver/nfs_syscalls.c | 2 | ||||
-rw-r--r-- | sys/nfsserver/nfsm_subs.h | 114 |
10 files changed, 175 insertions, 207 deletions
diff --git a/sys/nfs/nfs_common.c b/sys/nfs/nfs_common.c index b4123f9..029096a 100644 --- a/sys/nfs/nfs_common.c +++ b/sys/nfs/nfs_common.c @@ -209,7 +209,7 @@ nfsm_disct(struct mbuf **mdp, caddr_t *dposp, int siz, int left) xfer = (siz2 > mp2->m_len) ? mp2->m_len : siz2; if (xfer > 0) { bcopy(mtod(mp2, caddr_t), ptr, xfer); - NFSMADV(mp2, xfer); + mp2->m_data += xfer; mp2->m_len -= xfer; ptr += xfer; siz2 -= xfer; diff --git a/sys/nfs/nfs_common.h b/sys/nfs/nfs_common.h index a751a67..889054d 100644 --- a/sys/nfs/nfs_common.h +++ b/sys/nfs/nfs_common.h @@ -50,33 +50,52 @@ extern nfstype nfsv3_type[]; #define nfsv3tov_type(a) nv3tov_type[fxdr_unsigned(u_int32_t,(a))&0x7] #define vtonfsv3_type(a) txdr_unsigned(nfsv3_type[((int32_t)(a))]) -#define NFSMADV(m, s) \ - do { \ - (m)->m_data += (s); \ - } while (0) - int nfs_adv(struct mbuf **, caddr_t *, int, int); -void *nfsm_build_xx(int s, struct mbuf **mb, caddr_t *bpos); -void *nfsm_dissect_xx(int s, struct mbuf **md, caddr_t *dpos); -int nfsm_strsiz_xx(int *s, int m, u_int32_t **tl, struct mbuf **mb, - caddr_t *bpos); -int nfsm_adv_xx(int s, u_int32_t **tl, struct mbuf **md, caddr_t *dpos); u_quad_t nfs_curusec(void); void *nfsm_disct(struct mbuf **, caddr_t *, int, int); +/* ****************************** */ +/* Build request/reply phase macros */ + +void *nfsm_build_xx(int s, struct mbuf **mb, caddr_t *bpos); + #define nfsm_build(c, s) \ (c)nfsm_build_xx((s), &mb, &bpos) +/* ****************************** */ +/* Interpretation phase macros */ + +void *nfsm_dissect_xx(int s, struct mbuf **md, caddr_t *dpos); +int nfsm_strsiz_xx(int *s, int m, u_int32_t **tl, struct mbuf **md, + caddr_t *dpos); +int nfsm_adv_xx(int s, u_int32_t **tl, struct mbuf **md, caddr_t *dpos); + +/* Error check helpers */ +#define nfsm_dcheck(t1, mrep) \ +do { \ + if (t1 != 0) { \ + error = t1; \ + m_freem((mrep)); \ + (mrep) = NULL; \ + goto nfsmout; \ + } \ +} while (0) + +#define nfsm_dcheckp(retp, mrep) \ +do { \ + if (retp == NULL) { \ + error = EBADRPC; \ + m_freem((mrep)); \ + (mrep) = NULL; \ + goto nfsmout; \ + } \ +} while (0) + #define nfsm_dissect(c, s) \ ({ \ void *ret; \ ret = nfsm_dissect_xx((s), &md, &dpos); \ - if (ret == NULL) { \ - error = EBADRPC; \ - m_freem(mrep); \ - mrep = NULL; \ - goto nfsmout; \ - } \ + nfsm_dcheckp(ret, mrep); \ (c)ret; \ }) @@ -84,23 +103,15 @@ void *nfsm_disct(struct mbuf **, caddr_t *, int, int); do { \ int t1; \ t1 = nfsm_strsiz_xx(&(s), (m), &tl, &md, &dpos); \ - if (t1) { \ - error = t1; \ - m_freem(mrep); \ - mrep = NULL; \ - goto nfsmout; \ - } \ + nfsm_dcheck(t1, mrep); \ } while(0) #define nfsm_mtouio(p,s) \ do {\ - int32_t t1; \ - if ((s) > 0 && (t1 = nfsm_mbuftouio(&md, (p), (s), &dpos)) != 0) { \ - error = t1; \ - m_freem(mrep); \ - mrep = NULL; \ - goto nfsmout; \ - } \ + int32_t t1 = 0; \ + if ((s) > 0) \ + t1 = nfsm_mbuftouio(&md, (p), (s), &dpos); \ + nfsm_dcheck(t1, mrep); \ } while (0) #define nfsm_rndup(a) (((a)+3)&(~0x3)) @@ -109,12 +120,7 @@ do {\ do { \ int t1; \ t1 = nfsm_adv_xx((s), &tl, &md, &dpos); \ - if (t1) { \ - error = t1; \ - m_freem(mrep); \ - mrep = NULL; \ - goto nfsmout; \ - } \ + nfsm_dcheck(t1, mrep); \ } while (0) #endif diff --git a/sys/nfsclient/nfsm_subs.h b/sys/nfsclient/nfsm_subs.h index 47ca520..2795482 100644 --- a/sys/nfsclient/nfsm_subs.h +++ b/sys/nfsclient/nfsm_subs.h @@ -88,27 +88,19 @@ struct mbuf *nfsm_rpchead(struct ucred *cr, int nmflag, int procid, * unions. */ + +/* *********************************** */ +/* Request generation phase macros */ + int nfsm_fhtom_xx(struct vnode *v, int v3, u_int32_t **tl, struct mbuf **mb, caddr_t *bpos); -int nfsm_mtofh_xx(struct vnode *d, struct vnode **v, int v3, int *f, - u_int32_t **tl, struct mbuf **md, caddr_t *dpos); -int nfsm_getfh_xx(nfsfh_t **f, int *s, int v3, u_int32_t **tl, - struct mbuf **md, caddr_t *dpos); void nfsm_v3attrbuild_xx(struct vattr *va, int full, u_int32_t **tl, struct mbuf **mb, caddr_t *bpos); -int nfsm_loadattr_xx(struct vnode **v, struct vattr *va, u_int32_t **tl, - struct mbuf **md, caddr_t *dpos); -int nfsm_postop_attr_xx(struct vnode **v, int *f, u_int32_t **tl, - struct mbuf **md, caddr_t *dpos); -int nfsm_wcc_data_xx(struct vnode **v, int *f, u_int32_t **tl, - struct mbuf **md, caddr_t *dpos); int nfsm_strtom_xx(const char *a, int s, int m, u_int32_t **tl, struct mbuf **mb, caddr_t *bpos); -#define nfsm_fhtom(v, v3) \ +#define nfsm_bcheck(t1, mreq) \ do { \ - int32_t t1; \ - t1 = nfsm_fhtom_xx((v), (v3), &tl, &mb, &bpos); \ if (t1) { \ error = t1; \ m_freem(mreq); \ @@ -116,48 +108,85 @@ do { \ } \ } while (0) +#define nfsm_fhtom(v, v3) \ +do { \ + int32_t t1; \ + t1 = nfsm_fhtom_xx((v), (v3), &tl, &mb, &bpos); \ + nfsm_bcheck(t1, mreq); \ +} while (0) + +/* If full is true, set all fields, otherwise just set mode and time fields */ +#define nfsm_v3attrbuild(a, full) \ + nfsm_v3attrbuild_xx(a, full, &tl, &mb, &bpos) + +#define nfsm_uiotom(p, s) \ +do { \ + int t1; \ + t1 = nfsm_uiotombuf((p), &mb, (s), &bpos); \ + nfsm_bcheck(t1, mreq); \ +} while (0) + +#define nfsm_strtom(a, s, m) \ +do { \ + int t1; \ + t1 = nfsm_strtom_xx((a), (s), (m), &tl, &mb, &bpos); \ + nfsm_bcheck(t1, mreq); \ +} while (0) + +/* *********************************** */ +/* Send the request */ + +#define nfsm_request(v, t, p, c) \ +do { \ + error = nfs_request((v), mreq, (t), (p), (c), &mrep, &md, &dpos); \ + if (error != 0) { \ + if (error & NFSERR_RETERR) \ + error &= ~NFSERR_RETERR; \ + else \ + goto nfsmout; \ + } \ +} while (0) + +/* *********************************** */ +/* Reply interpretation phase macros */ + +int nfsm_mtofh_xx(struct vnode *d, struct vnode **v, int v3, int *f, + u_int32_t **tl, struct mbuf **md, caddr_t *dpos); +int nfsm_getfh_xx(nfsfh_t **f, int *s, int v3, u_int32_t **tl, + struct mbuf **md, caddr_t *dpos); +int nfsm_loadattr_xx(struct vnode **v, struct vattr *va, u_int32_t **tl, + struct mbuf **md, caddr_t *dpos); +int nfsm_postop_attr_xx(struct vnode **v, int *f, u_int32_t **tl, + struct mbuf **md, caddr_t *dpos); +int nfsm_wcc_data_xx(struct vnode **v, int *f, u_int32_t **tl, + struct mbuf **md, caddr_t *dpos); + #define nfsm_mtofh(d, v, v3, f) \ do { \ int32_t t1; \ t1 = nfsm_mtofh_xx((d), &(v), (v3), &(f), &tl, &md, &dpos); \ - if (t1) { \ - error = t1; \ - m_freem(mrep); \ - goto nfsmout; \ - } \ + nfsm_dcheck(t1, mrep); \ } while (0) #define nfsm_getfh(f, s, v3) \ do { \ int32_t t1; \ t1 = nfsm_getfh_xx(&(f), &(s), (v3), &tl, &md, &dpos); \ - if (t1) { \ - error = t1; \ - m_freem(mrep); \ - goto nfsmout; \ - } \ + nfsm_dcheck(t1, mrep); \ } while (0) #define nfsm_loadattr(v, a) \ do { \ int32_t t1; \ t1 = nfsm_loadattr_xx(&v, a, &tl, &md, &dpos); \ - if (t1 != 0) { \ - error = t1; \ - m_freem(mrep); \ - goto nfsmout; \ - } \ + nfsm_dcheck(t1, mrep); \ } while (0) #define nfsm_postop_attr(v, f) \ do { \ int32_t t1; \ t1 = nfsm_postop_attr_xx(&v, &f, &tl, &md, &dpos); \ - if (t1 != 0) { \ - error = t1; \ - m_freem(mrep); \ - goto nfsmout; \ - } \ + nfsm_dcheck(t1, mrep); \ } while (0) /* Used as (f) for nfsm_wcc_data() */ @@ -168,50 +197,7 @@ do { \ do { \ int32_t t1; \ t1 = nfsm_wcc_data_xx(&v, &f, &tl, &md, &dpos); \ - if (t1 != 0) { \ - error = t1; \ - m_freem(mrep); \ - goto nfsmout; \ - } \ -} while (0) - -/* If full is true, set all fields, otherwise just set mode and time fields */ -#define nfsm_v3attrbuild(a, full) \ -do { \ - nfsm_v3attrbuild_xx(a, full, &tl, &mb, &bpos); \ -} while(0) - -#define nfsm_uiotom(p, s) \ -do { \ - int t1; \ - t1 = nfsm_uiotombuf((p), &mb, (s), &bpos); \ - if (t1 != 0) { \ - error = t1; \ - m_freem(mreq); \ - goto nfsmout; \ - } \ -} while (0) - -#define nfsm_request(v, t, p, c) \ -do { \ - error = nfs_request((v), mreq, (t), (p), (c), &mrep, &md, &dpos); \ - if (error != 0) { \ - if (error & NFSERR_RETERR) \ - error &= ~NFSERR_RETERR; \ - else \ - goto nfsmout; \ - } \ -} while (0) - -#define nfsm_strtom(a, s, m) \ -do { \ - int t1; \ - t1 = nfsm_strtom_xx((a), (s), (m), &tl, &mb, &bpos); \ - if (t1 != 0) { \ - error = t1; \ - m_freem(mreq); \ - goto nfsmout; \ - } \ + nfsm_dcheck(t1, mrep); \ } while (0) #endif diff --git a/sys/nfsserver/nfs.h b/sys/nfsserver/nfs.h index 93e56eb..610201b 100644 --- a/sys/nfsserver/nfs.h +++ b/sys/nfsserver/nfs.h @@ -346,8 +346,8 @@ extern int nfs_debug; int nfs_getreq(struct nfsrv_descript *, struct nfsd *, int); int nfsrv_send(struct socket *, struct sockaddr *, struct mbuf *); -void nfs_rephead(int, struct nfsrv_descript *, struct nfssvc_sock *, - int, struct mbuf **, struct mbuf **, caddr_t *); +struct mbuf *nfs_rephead(int, struct nfsrv_descript *, int, struct mbuf **, + caddr_t *); int nfs_slplock(struct nfssvc_sock *, int); void nfs_slpunlock(struct nfssvc_sock *); void nfsm_srvfattr(struct nfsrv_descript *, struct vattr *, @@ -363,11 +363,10 @@ int nfs_namei(struct nameidata *, fhandle_t *, int, void nfsm_adj(struct mbuf *, int, int); int nfsm_mbuftouio(struct mbuf **, struct uio *, int, caddr_t *); void nfsrv_initcache(void); -void nfsrv_timer(void*); +void nfsrv_timer(void *); int nfsrv_dorec(struct nfssvc_sock *, struct nfsd *, struct nfsrv_descript **); -int nfsrv_getcache(struct nfsrv_descript *, struct nfssvc_sock *, - struct mbuf **); +int nfsrv_getcache(struct nfsrv_descript *, struct mbuf **); void nfsrv_updatecache(struct nfsrv_descript *, int, struct mbuf *); void nfsrv_cleancache(void); void nfsrv_init(int); diff --git a/sys/nfsserver/nfs_serv.c b/sys/nfsserver/nfs_serv.c index f28d638..f3e0c9a 100644 --- a/sys/nfsserver/nfs_serv.c +++ b/sys/nfsserver/nfs_serv.c @@ -1055,7 +1055,7 @@ nfsrv_write(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, adjust = dpos - mtod(mp, caddr_t); mp->m_len -= adjust; if (mp->m_len > 0 && adjust > 0) - NFSMADV(mp, adjust); + mp->m_data += adjust; } if (zeroing) mp->m_len = 0; @@ -1273,7 +1273,7 @@ nfsrv_writegather(struct nfsrv_descript **ndp, struct nfssvc_sock *slp, adjust = dpos - mtod(mp, caddr_t); mp->m_len -= adjust; if (mp->m_len > 0 && adjust > 0) - NFSMADV(mp, adjust); + mp->m_data += adjust; } if (zeroing) mp->m_len = 0; diff --git a/sys/nfsserver/nfs_srvcache.c b/sys/nfsserver/nfs_srvcache.c index 4bab5d0..2222ffa 100644 --- a/sys/nfsserver/nfs_srvcache.c +++ b/sys/nfsserver/nfs_srvcache.c @@ -150,8 +150,7 @@ nfsrv_initcache(void) * Update/add new request at end of lru list */ int -nfsrv_getcache(struct nfsrv_descript *nd, struct nfssvc_sock *slp, - struct mbuf **repp) +nfsrv_getcache(struct nfsrv_descript *nd, struct mbuf **repp) { struct nfsrvcache *rp; struct mbuf *mb; @@ -188,8 +187,8 @@ loop: ret = RC_DROPIT; } else if (rp->rc_flag & RC_REPSTATUS) { nfsrvstats.srvcache_nonidemdonehits++; - nfs_rephead(0, nd, slp, rp->rc_status, - repp, &mb, &bpos); + *repp = nfs_rephead(0, nd, rp->rc_status, + &mb, &bpos); ret = RC_REPLY; } else if (rp->rc_flag & RC_REPMBUF) { nfsrvstats.srvcache_nonidemdonehits++; diff --git a/sys/nfsserver/nfs_srvsock.c b/sys/nfsserver/nfs_srvsock.c index cb2276d..1483396 100644 --- a/sys/nfsserver/nfs_srvsock.c +++ b/sys/nfsserver/nfs_srvsock.c @@ -136,9 +136,9 @@ int (*nfsrv3_procs[NFS_NPROCS])(struct nfsrv_descript *nd, * Generate the rpc reply header * siz arg. is used to decide if adding a cluster is worthwhile */ -void -nfs_rephead(int siz, struct nfsrv_descript *nd, struct nfssvc_sock *slp, - int err, struct mbuf **mrq, struct mbuf **mbp, caddr_t *bposp) +struct mbuf * +nfs_rephead(int siz, struct nfsrv_descript *nd, int err, + struct mbuf **mbp, caddr_t *bposp) { u_int32_t *tl; struct mbuf *mreq; @@ -148,7 +148,6 @@ nfs_rephead(int siz, struct nfsrv_descript *nd, struct nfssvc_sock *slp, nd->nd_repstat = err; if (err && (nd->nd_flag & ND_NFSV3) == 0) /* XXX recheck */ siz = 0; - MGETHDR(mreq, M_TRYWAIT, MT_DATA); mb = mreq; /* @@ -179,7 +178,6 @@ nfs_rephead(int siz, struct nfsrv_descript *nd, struct nfssvc_sock *slp, } } else { *tl++ = rpc_msgaccepted; - /* * Send a RPCAUTH_NULL verifier - no Kerberos. */ @@ -211,15 +209,13 @@ nfs_rephead(int siz, struct nfsrv_descript *nd, struct nfssvc_sock *slp, *tl = 0; } break; - }; + } } - - if (mrq != NULL) - *mrq = mreq; *mbp = mb; *bposp = bpos; if (err != 0 && err != NFSERR_RETVOID) nfsrvstats.srvrpc_errs++; + return mreq; } diff --git a/sys/nfsserver/nfs_srvsubs.c b/sys/nfsserver/nfs_srvsubs.c index c47de7d..dc329c2 100644 --- a/sys/nfsserver/nfs_srvsubs.c +++ b/sys/nfsserver/nfs_srvsubs.c @@ -1376,17 +1376,3 @@ nfsm_srvsattr_xx(struct vattr *a, } return 0; } - -void -nfs_rephead_xx(int s, struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, - int error, struct mbuf **mrq, struct mbuf **mb, - struct mbuf **mreq, struct mbuf **mrep, caddr_t *bpos) -{ - - nfs_rephead(s, nfsd, slp, error, mrq, mb, bpos); - if (*mrep != NULL) { - m_freem(*mrep); - *mrep = NULL; - } - *mreq = *mrq; -} diff --git a/sys/nfsserver/nfs_syscalls.c b/sys/nfsserver/nfs_syscalls.c index be8fc69..17f90f7 100644 --- a/sys/nfsserver/nfs_syscalls.c +++ b/sys/nfsserver/nfs_syscalls.c @@ -376,7 +376,7 @@ nfssvc_nfsd(struct nfsd_srvargs *nsd, caddr_t argp, struct thread *td) /* * Check to see if authorization is needed. */ - cacherep = nfsrv_getcache(nd, slp, &mreq); + cacherep = nfsrv_getcache(nd, &mreq); if (nfs_privport) { /* Check if source port is privileged */ diff --git a/sys/nfsserver/nfsm_subs.h b/sys/nfsserver/nfsm_subs.h index 2f60521..d39b207 100644 --- a/sys/nfsserver/nfsm_subs.h +++ b/sys/nfsserver/nfsm_subs.h @@ -55,10 +55,6 @@ */ #define M_HASCL(m) ((m)->m_flags & M_EXT) -#define NFSMADV(m, s) \ - do { \ - (m)->m_data += (s); \ - } while (0) #define NFSMSIZ(m) ((M_HASCL(m))?MCLBYTES: \ (((m)->m_flags & M_PKTHDR)?MHLEN:MLEN)) @@ -76,36 +72,19 @@ */ -/* Helpers for macros */ -void nfsm_srvfhtom_xx(fhandle_t *f, int v3, u_int32_t **tl, struct mbuf **mb, - caddr_t *bpos); -void nfsm_srvpostop_fh_xx(fhandle_t *f, u_int32_t **tl, struct mbuf **mb, - caddr_t *bpos); + +/* ************************************* */ +/* Dissection phase macros */ + int nfsm_srvstrsiz_xx(int *s, int m, u_int32_t **tl, struct mbuf **md, caddr_t *dpos); int nfsm_srvnamesiz_xx(int *s, u_int32_t **tl, struct mbuf **md, caddr_t *dpos); -void nfs_rephead_xx(int s, struct nfsrv_descript *nfsd, - struct nfssvc_sock *slp, int error, struct mbuf **mrq, - struct mbuf **mb, struct mbuf **mreq, struct mbuf **mrep, - caddr_t *bpos); int nfsm_srvmtofh_xx(fhandle_t *f, struct nfsrv_descript *nfsd, u_int32_t **tl, struct mbuf **md, caddr_t *dpos); -void nfsm_clget_xx(u_int32_t **tl, struct mbuf *mb, struct mbuf **mp, - char **bp, char **be, caddr_t bpos); int nfsm_srvsattr_xx(struct vattr *a, u_int32_t **tl, struct mbuf **md, caddr_t *dpos); -#define nfsm_srvfhtom(f, v3) \ -do { \ - nfsm_srvfhtom_xx((f), (v3), &tl, &mb, &bpos); \ -} while (0) - -#define nfsm_srvpostop_fh(f) \ -do { \ - nfsm_srvpostop_fh_xx((f), &tl, &mb, &bpos); \ -} while (0) - #define nfsm_srvstrsiz(s, m) \ do { \ int t1; \ @@ -126,20 +105,6 @@ do { \ } \ } while (0) -#define nfsm_reply(s) \ -do { \ - nfs_rephead_xx((s), nfsd, slp, error, mrq, &mb, &mreq, &mrep, &bpos); \ - if (error && error == EBADRPC) { \ - error = 0; \ - goto nfsmout; \ - } \ -} while (0) - -#define nfsm_writereply(s) \ -do { \ - nfs_rephead((s), nfsd, slp, error, &mreq, &mb, &bpos); \ -} while (0) - #define nfsm_srvmtofh(f) \ do { \ int t1; \ @@ -150,26 +115,7 @@ do { \ } \ } while (0) -#define nfsm_clget \ -do { \ - nfsm_clget_xx(&tl, mb, &mp, &bp, &be, bpos); \ -} while (0) - -#define nfsm_srvfillattr(a, f) \ -do { \ - nfsm_srvfattr(nfsd, (a), (f)); \ -} while (0) - -#define nfsm_srvwcc_data(br, b, ar, a) \ -do { \ - nfsm_srvwcc(nfsd, (br), (b), (ar), (a), &mb, &bpos); \ -} while (0) - -#define nfsm_srvpostop_attr(r, a) \ -do { \ - nfsm_srvpostopattr(nfsd, (r), (a), &mb, &bpos); \ -} while (0) - +/* XXX why is this different? */ #define nfsm_srvsattr(a) \ do { \ int t1; \ @@ -182,4 +128,54 @@ do { \ } \ } while (0) +/* ************************************* */ +/* Prepare the reply */ + +#define nfsm_reply(s) \ +do { \ + if (mrep != NULL) { \ + m_freem(mrep); \ + mrep = NULL; \ + } \ + if (error == EBADRPC) { \ + error = 0; \ + goto nfsmout; \ + } \ + mreq = nfs_rephead((s), nfsd, error, &mb, &bpos); \ + *mrq = mreq; \ +} while (0) + +#define nfsm_writereply(s) \ +do { \ + mreq = nfs_rephead((s), nfsd, error, &mb, &bpos); \ +} while(0) + +/* ************************************* */ +/* Reply phase macros - add additional reply info */ + +void nfsm_srvfhtom_xx(fhandle_t *f, int v3, u_int32_t **tl, struct mbuf **mb, + caddr_t *bpos); +void nfsm_srvpostop_fh_xx(fhandle_t *f, u_int32_t **tl, struct mbuf **mb, + caddr_t *bpos); +void nfsm_clget_xx(u_int32_t **tl, struct mbuf *mb, struct mbuf **mp, + char **bp, char **be, caddr_t bpos); + +#define nfsm_srvfhtom(f, v3) \ + nfsm_srvfhtom_xx((f), (v3), &tl, &mb, &bpos) + +#define nfsm_srvpostop_fh(f) \ + nfsm_srvpostop_fh_xx((f), &tl, &mb, &bpos) + +#define nfsm_srvwcc_data(br, b, ar, a) \ + nfsm_srvwcc(nfsd, (br), (b), (ar), (a), &mb, &bpos) + +#define nfsm_srvpostop_attr(r, a) \ + nfsm_srvpostopattr(nfsd, (r), (a), &mb, &bpos) + +#define nfsm_srvfillattr(a, f) \ + nfsm_srvfattr(nfsd, (a), (f)) + +#define nfsm_clget \ + nfsm_clget_xx(&tl, mb, &mp, &bp, &be, bpos) + #endif |