sys/vfs/nfs/nfsm_subs.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 | /* * Copyright (c) 1989, 1993 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Rick Macklem at The University of Guelph. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)nfsm_subs.h 8.2 (Berkeley) 3/30/95 * $FreeBSD: src/sys/nfs/nfsm_subs.h,v 1.27.2.1 2000/10/28 16:27:27 dwmalone Exp $ * $DragonFly: src/sys/vfs/nfs/nfsm_subs.h,v 1.10 2008/09/17 21:44:25 dillon Exp $ */ #ifndef _NFS_NFSM_SUBS_H_ #define _NFS_NFSM_SUBS_H_ struct ucred; struct vnode; enum nfsm_state { NFSM_STATE_SETUP, NFSM_STATE_AUTH, NFSM_STATE_TRY, NFSM_STATE_WAITREPLY, NFSM_STATE_PROCESSREPLY, NFSM_STATE_DONE }; typedef enum nfsm_state nfsm_state_t; struct nfsm_info { /* * These fields are used by various nfsm_* functions during * the construction or deconstruction of a RPC. */ struct mbuf *mb; struct mbuf *md; struct mbuf *mrep; struct mbuf *mreq; caddr_t bpos; caddr_t dpos; int v3; /* * These fields are used by the request processing state * machine. mreq, md, dpos, and mrep above are also used. */ nfsm_state_t state; u_int32_t procnum; struct vnode *vp; struct thread *td; struct ucred *cred; struct nfsreq *req; struct nfsmount *nmp; int unused01; int error; /* * Retained state for higher level VOP and BIO operations */ struct bio *bio; void (*done)(struct nfsm_info *); union { struct { int must_commit; } writerpc; } u; }; #define info_writerpc u.writerpc typedef struct nfsm_info *nfsm_info_t; #define NULLOUT(nfsmexp) \ do { if ((nfsmexp) == NULL) { \ error = EBADRPC; goto nfsmout; } \ } while(0) #define NEGATIVEOUT(nfsmexp) \ do { if ((nfsmexp) < 0) { \ error = EBADRPC; goto nfsmout; } \ } while(0) #define NEGKEEPOUT(nfsmexp) \ do { if ((nfsmexp) < 0) { \ goto nfsmout; } \ } while(0) #define NEGREPLYOUT(nfsmexp) \ do { \ int rv = (nfsmexp); \ if (rv < 0) { \ if (rv == -2) \ nfsm_reply(&info, nfsd, slp, 0, &error); \ goto nfsmout; \ } \ } while(0) #define ERROROUT(nfsmexp) if ((error = (nfsmexp)) != 0) goto nfsmout /* * These macros do strange and peculiar things to mbuf chains for * the assistance of the nfs code. To attempt to use them for any * other purpose will be dangerous. (they make weird assumptions) */ /* * First define what the actual subs. return */ void nfsm_reqhead(nfsm_info_t info, struct vnode *vp, u_long procid, int hsiz); struct mbuf *nfsm_rpchead (struct ucred *cr, int nmflag, int procid, int auth_type, int auth_len, char *auth_str, int verf_len, char *verf_str, struct mbuf *mrest, int mrest_len, struct mbuf **mbp, u_int32_t *xidp); void *nfsm_build(nfsm_info_t info, int bytes); void *nfsm_dissect(nfsm_info_t info, int bytes); int nfsm_fhtom(nfsm_info_t info, struct vnode *vp); void nfsm_srvfhtom(nfsm_info_t info, fhandle_t *fhp); void nfsm_srvpostop_fh(nfsm_info_t info, fhandle_t *fhp); int nfsm_mtofh(nfsm_info_t info, struct vnode *dvp, struct vnode **vpp, int *gotvpp); int nfsm_getfh(nfsm_info_t info, nfsfh_t **fhpp); int nfsm_loadattr(nfsm_info_t info, struct vnode *vp, struct vattr *vap); int nfsm_postop_attr(nfsm_info_t info, struct vnode *vp, int *attrp, int lflags); int nfsm_wcc_data(nfsm_info_t info, struct vnode *vp, int *attrp); void nfsm_v3attrbuild(nfsm_info_t info, struct vattr *vap, int full); int nfsm_strsiz(nfsm_info_t info, int maxlen); int nfsm_srvstrsiz(nfsm_info_t info, int maxlen, int *errorp); int nfsm_srvnamesiz(nfsm_info_t info, int *errorp); int nfsm_mtouio(nfsm_info_t info, struct uio *uiop, int len); int nfsm_mtobio(nfsm_info_t info, struct bio *bio, int len); int nfsm_uiotom(nfsm_info_t info, struct uio *uiop, int len); int nfsm_biotom(nfsm_info_t info, struct bio *bio, int off, int len); int nfsm_request(nfsm_info_t info, struct vnode *vp, int procnum, thread_t td, struct ucred *cred, int *errorp); void nfsm_request_bio(nfsm_info_t info, struct vnode *vp, int procnum, thread_t td, struct ucred *cred); int nfsm_strtom(nfsm_info_t info, const void *data, int len, int maxlen); int nfsm_reply(nfsm_info_t info, struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, int siz, int *errorp); void nfsm_writereply(nfsm_info_t info, struct nfsrv_descript *nfsd, struct nfssvc_sock *slp, int error, int siz); int nfsm_adv(nfsm_info_t info, int len); int nfsm_srvmtofh(nfsm_info_t info, struct nfsrv_descript *nfsd, fhandle_t *fhp, int *errorp); void *_nfsm_clget(nfsm_info_t info, struct mbuf **mp1, struct mbuf **mp2, char **bp, char **be); int nfsm_srvsattr(nfsm_info_t info, struct vattr *vap); int nfsm_mbuftouio(struct mbuf **mrep, struct uio *uiop, int siz, caddr_t *dpos); int nfsm_mbuftobio(struct mbuf **mrep, struct bio *bio, int siz, caddr_t *dpos); int nfsm_uiotombuf (struct uio *uiop, struct mbuf **mq, int siz, caddr_t *bpos); int nfsm_biotombuf (struct bio *bio, struct mbuf **mq, int off, int siz, caddr_t *bpos); int nfsm_disct(struct mbuf **mdp, caddr_t *dposp, int siz, int left, caddr_t *cp2); int nfsm_strtmbuf (struct mbuf **, char **, const char *, long); void nfsm_adj(struct mbuf *mp, int len, int nul); void nfsm_srvwcc_data(nfsm_info_t info, struct nfsrv_descript *nfsd, int before_ret, struct vattr *before_vap, int after_ret, struct vattr *after_vap); void nfsm_srvpostop_attr(nfsm_info_t info, struct nfsrv_descript *nfsd, int after_ret, struct vattr *after_vap); void nfsm_srvfattr(struct nfsrv_descript *nfsd, struct vattr *vap, struct nfs_fattr *fp); int nfs_request (struct nfsm_info *, nfsm_state_t, nfsm_state_t); #define nfsm_clget(info, mp1, mp2, bp, be) \ ((bp >= be) ? _nfsm_clget(info, &mp1, &mp2, &bp, &be) : (void *)bp) #define nfsm_rndup(a) (((a) + 3) & (~0x3)) #define NFSV3_WCCRATTR 0 #define NFSV3_WCCCHK 1 #endif |