1 1.2 pgoyette /* $NetBSD: nfs_fha_new.c,v 1.2 2016/12/13 21:50:32 pgoyette Exp $ */ 2 1.1 dholland /*- 3 1.1 dholland * Copyright (c) 2008 Isilon Inc http://www.isilon.com/ 4 1.1 dholland * Copyright (c) 2013 Spectra Logic Corporation 5 1.1 dholland * 6 1.1 dholland * Redistribution and use in source and binary forms, with or without 7 1.1 dholland * modification, are permitted provided that the following conditions 8 1.1 dholland * are met: 9 1.1 dholland * 1. Redistributions of source code must retain the above copyright 10 1.1 dholland * notice, this list of conditions and the following disclaimer. 11 1.1 dholland * 2. Redistributions in binary form must reproduce the above copyright 12 1.1 dholland * notice, this list of conditions and the following disclaimer in the 13 1.1 dholland * documentation and/or other materials provided with the distribution. 14 1.1 dholland * 15 1.1 dholland * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 1.1 dholland * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 1.1 dholland * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 1.1 dholland * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 1.1 dholland * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 1.1 dholland * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 1.1 dholland * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 1.1 dholland * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 1.1 dholland * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 1.1 dholland * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 1.1 dholland * SUCH DAMAGE. 26 1.1 dholland */ 27 1.1 dholland 28 1.1 dholland #include <sys/cdefs.h> 29 1.2 pgoyette /* __FBSDID("FreeBSD: head/sys/fs/nfsserver/nfs_fha_new.c 259765 2013-12-23 08:43:16Z mav "); */ 30 1.2 pgoyette __RCSID("$NetBSD: nfs_fha_new.c,v 1.2 2016/12/13 21:50:32 pgoyette Exp $"); 31 1.1 dholland 32 1.2 pgoyette #include <fs/nfs/common/nfsport.h> 33 1.1 dholland 34 1.1 dholland #include <rpc/rpc.h> 35 1.2 pgoyette #include <fs/nfs/common/nfs_fha.h> 36 1.2 pgoyette #include <fs/nfs/common/xdr_subs.h> 37 1.2 pgoyette #include <fs/nfs/common/nfs.h> 38 1.2 pgoyette #include <fs/nfs/common/nfsproto.h> 39 1.2 pgoyette #include <fs/nfs/common/nfsm_subs.h> 40 1.2 pgoyette #include <fs/nfs/server/nfs_fha_new.h> 41 1.1 dholland 42 1.1 dholland static void fhanew_init(void *foo); 43 1.1 dholland static void fhanew_uninit(void *foo); 44 1.1 dholland rpcproc_t fhanew_get_procnum(rpcproc_t procnum); 45 1.1 dholland int fhanew_realign(struct mbuf **mb, int malloc_flags); 46 1.2 pgoyette int fhanew_get_fh(uint64_t *fh, int v3, struct mbuf **md, caddr_t *dpos); 47 1.1 dholland int fhanew_is_read(rpcproc_t procnum); 48 1.1 dholland int fhanew_is_write(rpcproc_t procnum); 49 1.1 dholland int fhanew_get_offset(struct mbuf **md, caddr_t *dpos, int v3, 50 1.1 dholland struct fha_info *info); 51 1.1 dholland int fhanew_no_offset(rpcproc_t procnum); 52 1.1 dholland void fhanew_set_locktype(rpcproc_t procnum, struct fha_info *info); 53 1.1 dholland static int fhenew_stats_sysctl(SYSCTL_HANDLER_ARGS); 54 1.1 dholland 55 1.1 dholland static struct fha_params fhanew_softc; 56 1.1 dholland 57 1.1 dholland SYSCTL_DECL(_vfs_nfsd); 58 1.1 dholland 59 1.1 dholland extern int newnfs_nfsv3_procid[]; 60 1.1 dholland extern SVCPOOL *nfsrvd_pool; 61 1.1 dholland 62 1.1 dholland SYSINIT(nfs_fhanew, SI_SUB_ROOT_CONF, SI_ORDER_ANY, fhanew_init, NULL); 63 1.1 dholland SYSUNINIT(nfs_fhanew, SI_SUB_ROOT_CONF, SI_ORDER_ANY, fhanew_uninit, NULL); 64 1.1 dholland 65 1.1 dholland static void 66 1.1 dholland fhanew_init(void *foo) 67 1.1 dholland { 68 1.1 dholland struct fha_params *softc; 69 1.1 dholland 70 1.1 dholland softc = &fhanew_softc; 71 1.1 dholland 72 1.1 dholland bzero(softc, sizeof(*softc)); 73 1.1 dholland 74 1.1 dholland /* 75 1.1 dholland * Setup the callbacks for this FHA personality. 76 1.1 dholland */ 77 1.1 dholland softc->callbacks.get_procnum = fhanew_get_procnum; 78 1.1 dholland softc->callbacks.realign = fhanew_realign; 79 1.1 dholland softc->callbacks.get_fh = fhanew_get_fh; 80 1.1 dholland softc->callbacks.is_read = fhanew_is_read; 81 1.1 dholland softc->callbacks.is_write = fhanew_is_write; 82 1.1 dholland softc->callbacks.get_offset = fhanew_get_offset; 83 1.1 dholland softc->callbacks.no_offset = fhanew_no_offset; 84 1.1 dholland softc->callbacks.set_locktype = fhanew_set_locktype; 85 1.1 dholland softc->callbacks.fhe_stats_sysctl = fhenew_stats_sysctl; 86 1.1 dholland 87 1.1 dholland snprintf(softc->server_name, sizeof(softc->server_name), 88 1.1 dholland FHANEW_SERVER_NAME); 89 1.1 dholland 90 1.1 dholland softc->pool = &nfsrvd_pool; 91 1.1 dholland 92 1.1 dholland /* 93 1.1 dholland * Initialize the sysctl context list for the fha module. 94 1.1 dholland */ 95 1.1 dholland sysctl_ctx_init(&softc->sysctl_ctx); 96 1.1 dholland softc->sysctl_tree = SYSCTL_ADD_NODE(&softc->sysctl_ctx, 97 1.1 dholland SYSCTL_STATIC_CHILDREN(_vfs_nfsd), OID_AUTO, "fha", CTLFLAG_RD, 98 1.1 dholland 0, "fha node"); 99 1.1 dholland if (softc->sysctl_tree == NULL) { 100 1.1 dholland printf("%s: unable to allocate sysctl tree\n", __func__); 101 1.1 dholland return; 102 1.1 dholland } 103 1.1 dholland 104 1.1 dholland fha_init(softc); 105 1.1 dholland } 106 1.1 dholland 107 1.1 dholland static void 108 1.1 dholland fhanew_uninit(void *foo) 109 1.1 dholland { 110 1.1 dholland struct fha_params *softc; 111 1.1 dholland 112 1.1 dholland softc = &fhanew_softc; 113 1.1 dholland 114 1.1 dholland fha_uninit(softc); 115 1.1 dholland } 116 1.1 dholland 117 1.1 dholland rpcproc_t 118 1.1 dholland fhanew_get_procnum(rpcproc_t procnum) 119 1.1 dholland { 120 1.1 dholland if (procnum > NFSV2PROC_STATFS) 121 1.1 dholland return (-1); 122 1.1 dholland 123 1.1 dholland return (newnfs_nfsv3_procid[procnum]); 124 1.1 dholland } 125 1.1 dholland 126 1.1 dholland int 127 1.1 dholland fhanew_realign(struct mbuf **mb, int malloc_flags) 128 1.1 dholland { 129 1.1 dholland return (newnfs_realign(mb, malloc_flags)); 130 1.1 dholland } 131 1.1 dholland 132 1.1 dholland int 133 1.2 pgoyette fhanew_get_fh(uint64_t *fh, int v3, struct mbuf **md, caddr_t *dpos) 134 1.1 dholland { 135 1.1 dholland struct nfsrv_descript lnd, *nd; 136 1.1 dholland uint32_t *tl; 137 1.2 pgoyette uint8_t *buf; 138 1.2 pgoyette uint64_t t; 139 1.2 pgoyette int error, len, i; 140 1.1 dholland 141 1.1 dholland error = 0; 142 1.1 dholland len = 0; 143 1.1 dholland nd = &lnd; 144 1.1 dholland 145 1.1 dholland nd->nd_md = *md; 146 1.1 dholland nd->nd_dpos = *dpos; 147 1.1 dholland 148 1.1 dholland if (v3) { 149 1.1 dholland NFSM_DISSECT_NONBLOCK(tl, uint32_t *, NFSX_UNSIGNED); 150 1.1 dholland if ((len = fxdr_unsigned(int, *tl)) <= 0 || len > NFSX_FHMAX) { 151 1.1 dholland error = EBADRPC; 152 1.1 dholland goto nfsmout; 153 1.1 dholland } 154 1.1 dholland } else { 155 1.1 dholland len = NFSX_V2FH; 156 1.1 dholland } 157 1.1 dholland 158 1.2 pgoyette t = 0; 159 1.1 dholland if (len != 0) { 160 1.2 pgoyette NFSM_DISSECT_NONBLOCK(buf, uint8_t *, len); 161 1.2 pgoyette for (i = 0; i < len; i++) 162 1.2 pgoyette t ^= ((uint64_t)buf[i] << (i & 7) * 8); 163 1.2 pgoyette } 164 1.2 pgoyette *fh = t; 165 1.1 dholland 166 1.1 dholland nfsmout: 167 1.1 dholland *md = nd->nd_md; 168 1.1 dholland *dpos = nd->nd_dpos; 169 1.1 dholland 170 1.1 dholland return (error); 171 1.1 dholland } 172 1.1 dholland 173 1.1 dholland int 174 1.1 dholland fhanew_is_read(rpcproc_t procnum) 175 1.1 dholland { 176 1.1 dholland if (procnum == NFSPROC_READ) 177 1.1 dholland return (1); 178 1.1 dholland else 179 1.1 dholland return (0); 180 1.1 dholland } 181 1.1 dholland 182 1.1 dholland int 183 1.1 dholland fhanew_is_write(rpcproc_t procnum) 184 1.1 dholland { 185 1.1 dholland if (procnum == NFSPROC_WRITE) 186 1.1 dholland return (1); 187 1.1 dholland else 188 1.1 dholland return (0); 189 1.1 dholland } 190 1.1 dholland 191 1.1 dholland int 192 1.1 dholland fhanew_get_offset(struct mbuf **md, caddr_t *dpos, int v3, 193 1.1 dholland struct fha_info *info) 194 1.1 dholland { 195 1.1 dholland struct nfsrv_descript lnd, *nd; 196 1.1 dholland uint32_t *tl; 197 1.1 dholland int error; 198 1.1 dholland 199 1.1 dholland error = 0; 200 1.1 dholland 201 1.1 dholland nd = &lnd; 202 1.1 dholland nd->nd_md = *md; 203 1.1 dholland nd->nd_dpos = *dpos; 204 1.1 dholland 205 1.1 dholland if (v3) { 206 1.1 dholland NFSM_DISSECT_NONBLOCK(tl, uint32_t *, 2 * NFSX_UNSIGNED); 207 1.1 dholland info->offset = fxdr_hyper(tl); 208 1.1 dholland } else { 209 1.1 dholland NFSM_DISSECT_NONBLOCK(tl, uint32_t *, NFSX_UNSIGNED); 210 1.1 dholland info->offset = fxdr_unsigned(uint32_t, *tl); 211 1.1 dholland } 212 1.1 dholland 213 1.1 dholland nfsmout: 214 1.1 dholland *md = nd->nd_md; 215 1.1 dholland *dpos = nd->nd_dpos; 216 1.1 dholland 217 1.1 dholland return (error); 218 1.1 dholland } 219 1.1 dholland 220 1.1 dholland int 221 1.1 dholland fhanew_no_offset(rpcproc_t procnum) 222 1.1 dholland { 223 1.1 dholland if (procnum == NFSPROC_FSSTAT || 224 1.1 dholland procnum == NFSPROC_FSINFO || 225 1.1 dholland procnum == NFSPROC_PATHCONF || 226 1.1 dholland procnum == NFSPROC_NOOP || 227 1.1 dholland procnum == NFSPROC_NULL) 228 1.1 dholland return (1); 229 1.1 dholland else 230 1.1 dholland return (0); 231 1.1 dholland } 232 1.1 dholland 233 1.1 dholland void 234 1.1 dholland fhanew_set_locktype(rpcproc_t procnum, struct fha_info *info) 235 1.1 dholland { 236 1.1 dholland switch (procnum) { 237 1.1 dholland case NFSPROC_NULL: 238 1.1 dholland case NFSPROC_GETATTR: 239 1.1 dholland case NFSPROC_LOOKUP: 240 1.1 dholland case NFSPROC_ACCESS: 241 1.1 dholland case NFSPROC_READLINK: 242 1.1 dholland case NFSPROC_READ: 243 1.1 dholland case NFSPROC_READDIR: 244 1.1 dholland case NFSPROC_READDIRPLUS: 245 1.1 dholland case NFSPROC_WRITE: 246 1.1 dholland info->locktype = LK_SHARED; 247 1.1 dholland break; 248 1.1 dholland case NFSPROC_SETATTR: 249 1.1 dholland case NFSPROC_CREATE: 250 1.1 dholland case NFSPROC_MKDIR: 251 1.1 dholland case NFSPROC_SYMLINK: 252 1.1 dholland case NFSPROC_MKNOD: 253 1.1 dholland case NFSPROC_REMOVE: 254 1.1 dholland case NFSPROC_RMDIR: 255 1.1 dholland case NFSPROC_RENAME: 256 1.1 dholland case NFSPROC_LINK: 257 1.1 dholland case NFSPROC_FSSTAT: 258 1.1 dholland case NFSPROC_FSINFO: 259 1.1 dholland case NFSPROC_PATHCONF: 260 1.1 dholland case NFSPROC_COMMIT: 261 1.1 dholland case NFSPROC_NOOP: 262 1.1 dholland info->locktype = LK_EXCLUSIVE; 263 1.1 dholland break; 264 1.1 dholland } 265 1.1 dholland } 266 1.1 dholland 267 1.1 dholland static int 268 1.1 dholland fhenew_stats_sysctl(SYSCTL_HANDLER_ARGS) 269 1.1 dholland { 270 1.1 dholland return (fhe_stats_sysctl(oidp, arg1, arg2, req, &fhanew_softc)); 271 1.1 dholland } 272 1.1 dholland 273 1.1 dholland 274 1.1 dholland SVCTHREAD * 275 1.1 dholland fhanew_assign(SVCTHREAD *this_thread, struct svc_req *req) 276 1.1 dholland { 277 1.1 dholland return (fha_assign(this_thread, req, &fhanew_softc)); 278 1.1 dholland } 279