1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 /* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */ 27 /* All Rights Reserved */ 28 29 #ifndef _NFS_NFSSYS_H 30 #define _NFS_NFSSYS_H 31 32 #ifdef __cplusplus 33 extern "C" { 34 #endif 35 36 /* 37 * Private definitions for the nfssys system call. 38 * Note: <nfs/export.h> and <nfs/nfs.h> must be included before 39 * this file. 40 */ 41 42 /* 43 * Flavors of nfssys call. Note that OLD_mumble commands are no longer 44 * implemented, but the entries are kept as placeholders for binary 45 * compatibility. 46 */ 47 enum nfssys_op { OLD_NFS_SVC, OLD_ASYNC_DAEMON, EXPORTFS, OLD_NFS_GETFH, 48 OLD_NFS_CNVT, NFS_REVAUTH, OLD_NFS_FH_TO_FID, OLD_LM_SVC, KILL_LOCKMGR, 49 LOG_FLUSH, SVCPOOL_CREATE, NFS_SVC, LM_SVC, SVCPOOL_WAIT, SVCPOOL_RUN, 50 NFS4_SVC, RDMA_SVC_INIT, NFS4_CLR_STATE, NFS_IDMAP, 51 NFS4_SVC_REQUEST_QUIESCE, NFS_GETFH, NFS4_DSS_SETPATHS, 52 NFS4_DSS_SETPATHS_SIZE, NFS4_EPHEMERAL_MOUNT_TO, MOUNTD_ARGS, 53 NFSCMD_ARGS, MDS_RECALL_LAYOUT, MDS_NOTIFY_DEVICE, 54 NFS_INIT_STATESTORE, NFS_FINI_STATESTORE, NFSSTAT_LAYOUT, 55 DSERV_DATASET_INFO, DSERV_SETPORT, DSERV_SETMDS, DSERV_REPORTAVAIL, 56 DSERV_DATASET_PROPS, DSERV_INSTANCE_SHUTDOWN, DSERV_SVC, 57 NFS_SPE 58 }; 59 60 struct nfs_svc_args { 61 int fd; /* Connection endpoint */ 62 char *netid; /* Identify transport */ 63 struct netbuf addrmask; /* Address mask for host */ 64 int versmin; /* Min protocol version to offer */ 65 int versmax; /* Max protocol version to offer */ 66 int delegation; /* NFSv4 delegation on/off? */ 67 int dfd; /* door file descriptor */ 68 }; 69 70 #ifdef _SYSCALL32 71 struct nfs_svc_args32 { 72 int32_t fd; /* Connection endpoint */ 73 caddr32_t netid; /* Identify transport */ 74 struct netbuf32 addrmask; /* Address mask for host */ 75 int32_t versmin; /* Min protocol version to offer */ 76 int32_t versmax; /* Max protocol version to offer */ 77 int32_t delegation; /* NFSv4 delegation on/off? */ 78 int32_t dfd; /* door file descriptor */ 79 }; 80 #endif 81 82 struct exportfs_args { 83 char *dname; 84 struct exportdata *uex; 85 }; 86 87 #ifdef _SYSCALL32 88 struct exportfs_args32 { 89 caddr32_t dname; 90 caddr32_t uex; 91 }; 92 #endif 93 94 struct nfs_getfh_args { 95 char *fname; 96 int vers; 97 int *lenp; 98 char *fhp; 99 }; 100 101 #ifdef _SYSCALL32 102 struct nfs_getfh_args32 { 103 caddr32_t fname; 104 int32_t vers; 105 caddr32_t lenp; 106 caddr32_t fhp; 107 }; 108 #endif 109 110 /* 111 * Data structures related to nfssys system call for getting layout 112 * information. nfsstat -l 113 */ 114 struct pnfs_getflo_args { 115 char *fname; 116 uint32_t user_bufsize; 117 char *layoutstats; 118 uint32_t *kernel_bufsize; 119 }; 120 121 #ifdef _SYSCALL32 122 struct pnfs_getflo_args32 { 123 caddr32_t fname; 124 uint32_t user_bufsize; 125 caddr32_t layoutstats; 126 caddr32_t kernel_bufsize; 127 }; 128 #endif 129 130 /* 131 * Default size of the buffer passed to the kernel. 132 */ 133 #define DEFAULT_LAYOUT_SIZE 2048 134 135 136 struct nfs_revauth_args { 137 int authtype; 138 uid_t uid; 139 }; 140 141 #ifdef _SYSCALL32 142 struct nfs_revauth_args32 { 143 int32_t authtype; 144 uid32_t uid; 145 }; 146 #endif 147 148 /* 149 * Arguments for establishing lock manager service. If you change 150 * lm_svc_args, you should increment the version number. Try to keep 151 * supporting one or more old versions of the args, so that old lockd's 152 * will work with new kernels. 153 */ 154 155 enum lm_fmly { LM_INET, LM_INET6, LM_LOOPBACK }; 156 enum lm_proto { LM_TCP, LM_UDP }; 157 158 struct lm_svc_args { 159 int version; /* keep this first */ 160 int fd; 161 enum lm_fmly n_fmly; /* protocol family */ 162 enum lm_proto n_proto; /* protocol */ 163 dev_t n_rdev; /* device ID */ 164 int debug; /* debugging level */ 165 time_t timout; /* client handle life (asynch RPCs) */ 166 int grace; /* secs in grace period */ 167 time_t retransmittimeout; /* retransmission interval */ 168 }; 169 170 #ifdef _SYSCALL32 171 struct lm_svc_args32 { 172 int32_t version; /* keep this first */ 173 int32_t fd; 174 enum lm_fmly n_fmly; /* protocol family */ 175 enum lm_proto n_proto; /* protocol */ 176 dev32_t n_rdev; /* device ID */ 177 int32_t debug; /* debugging level */ 178 time32_t timout; /* client handle life (asynch RPCs) */ 179 int32_t grace; /* secs in grace period */ 180 time32_t retransmittimeout; /* retransmission interval */ 181 }; 182 #endif 183 184 #define LM_SVC_CUR_VERS 30 /* current lm_svc_args vers num */ 185 186 /* 187 * Arguments for nfslog flush service. 188 */ 189 struct nfsl_flush_args { 190 int version; 191 int directive; 192 char *buff; /* buffer to flush/rename */ 193 int buff_len; /* includes terminating '\0' */ 194 }; 195 196 #define NFSL_FLUSH_ARGS_VERS 1 /* current nfsl_flush_args vers num */ 197 198 #ifdef _SYSCALL32 199 struct nfsl_flush_args32 { 200 int32_t version; 201 int32_t directive; 202 caddr32_t buff; /* buffer to flush/rename */ 203 int32_t buff_len; /* includes terminating '\0' */ 204 }; 205 #endif 206 207 /* 208 * Arguments for initialising RDMA service. 209 */ 210 struct rdma_svc_args { 211 uint32_t poolid; /* Thread Pool ID */ 212 char *netid; /* Network Identifier */ 213 int nfs_versmin; /* Min NFS version to offer */ 214 int nfs_versmax; /* Max NFS version to offer */ 215 int delegation; /* NFSv4 delegation on/off? */ 216 int dfd; /* door file descriptor */ 217 }; 218 219 #ifdef _SYSCALL32 220 struct rdma_svc_args32 { 221 uint32_t poolid; /* Thread Pool ID */ 222 caddr32_t netid; /* Network Identifier */ 223 int32_t nfs_versmin; /* Min NFS version to offer */ 224 int32_t nfs_versmax; /* Max NFS version to offer */ 225 int32_t delegation; /* NFSv4 delegation on/off? */ 226 int32_t dfd; /* door file descriptor */ 227 }; 228 #endif 229 230 231 #define NFS4_CLRST_VERSION 1 232 struct nfs4clrst_args { 233 int vers; 234 int addr_type; 235 void *ap; 236 }; 237 238 #ifdef _SYSCALL32 239 struct nfs4clrst_args32 { 240 int32_t vers; 241 int32_t addr_type; 242 caddr32_t ap; 243 }; 244 #endif 245 246 struct mds_reclo_args { 247 char *lo_fname; 248 int lo_type; 249 }; 250 251 #ifdef _SYSCALL32 252 struct mds_reclo_args32 { 253 caddr32_t *lo_fname; 254 int32_t lo_type; 255 }; 256 #endif 257 258 259 /* 260 * DSERV__DATASET_INFO argruments 261 */ 262 263 #define DSERV_MAX_NETID 32 264 #define DSERV_MAX_UADDR 128 265 266 typedef struct dserv_dataset_props { 267 char ddp_name[MAXPATHLEN]; 268 char ddp_mds_netid[DSERV_MAX_NETID]; 269 char ddp_mds_uaddr[DSERV_MAX_UADDR]; 270 } dserv_dataset_props_t; 271 272 typedef struct dserv_dataset_info { 273 char dataset_name[MAXPATHLEN]; 274 } dserv_dataset_info_t; 275 276 typedef struct dserv_setmds_args { 277 char dsm_mds_netid[DSERV_MAX_NETID]; 278 char dsm_mds_uaddr[DSERV_MAX_UADDR]; 279 } dserv_setmds_args_t; 280 281 282 /* 283 * DSERV_SVC arguments 284 * Note: DSERV_SVC will be removed when dservd merged with nfsd. 285 */ 286 /* 287 * XXX Lisa 288 * 1.) If netid is tcp or rdma(?), we'll use a sockaddr_in. If netid 289 * is tcp6, we'll use a sockaddr_in6. Note: we will only support tcp not udp. 290 * 2.) make sure this is packed correctly. 291 * 3.) May need versions. 292 */ 293 294 typedef struct dserv_svc_args { 295 int fd; 296 int poolid; 297 char netid[KNC_STRSIZE]; 298 union { 299 struct sockaddr_in sin; 300 struct sockaddr_in6 sin6; 301 } sin; 302 } dserv_svc_args_t; 303 304 typedef struct dserv_setport_args { 305 char dsa_proto[32]; /* XXX use a constant */ 306 char dsa_uaddr[128]; /* XXX use a constant */ 307 char dsa_name[MAXPATHLEN]; 308 } dserv_setport_args_t; 309 310 /* 311 * XXX: Description? 312 */ 313 struct mds_notifydev_args { 314 int dev_id; 315 int notify_how; 316 int immediate; 317 }; 318 319 /* SYSCALL32 version not needed, ABI invariant */ 320 321 struct nfs_state_init_args { 322 int cap_flags; 323 char *inst_name; 324 }; 325 326 #ifdef _SYSCALL32 327 struct nfs_state_init_args32 { 328 int32_t cap_flags; 329 caddr32_t inst_name; 330 }; 331 #endif 332 333 struct nfsidmap_args { 334 uint_t state; /* Flushes caches, set state up 1 or down 0 */ 335 uint_t did; /* Door id to upcall */ 336 }; 337 338 #define NFSL_ALL 0x01 /* Flush all buffers */ 339 #define NFSL_RENAME 0x02 /* Rename buffer(s) */ 340 #define NFSL_SYNC 0x04 /* Perform operation synchronously? */ 341 342 typedef enum nfsspe_op { 343 SPE_OP_SET_DOOR, 344 SPE_OP_POLICY_POPULATE, 345 SPE_OP_POLICY_NUKE, 346 SPE_OP_POLICY_ADD, 347 SPE_OP_POLICY_DELETE, 348 SPE_OP_NPOOL_POPULATE, 349 SPE_OP_NPOOL_NUKE, 350 SPE_OP_NPOOL_ADD, 351 SPE_OP_NPOOL_DELETE, 352 SPE_OP_SCHEDULE 353 } nfsspe_op_t; 354 355 struct nfsspe_args { 356 nfsspe_op_t nsa_opcode; /* operation discriminator */ 357 uint_t nsa_did; /* Door id to upcall */ 358 char *nsa_xdr; /* XDR data */ 359 size_t nsa_xdr_len; /* Size of XDR data */ 360 }; 361 362 #ifdef _SYSCALL32 363 struct nfsspe_args32 { 364 nfsspe_op_t nsa_opcode; /* operation discriminator */ 365 uint32_t nsa_did; /* Door id to upcall */ 366 caddr32_t nsa_xdr; /* XDR data */ 367 size32_t nsa_xdr_len; /* Size of XDR data */ 368 }; 369 #endif 370 371 #ifdef _KERNEL 372 union nfssysargs { 373 struct exportfs_args *exportfs_args_u; /* exportfs args */ 374 struct nfs_getfh_args *nfs_getfh_args_u; /* nfs_getfh args */ 375 struct nfs_svc_args *nfs_svc_args_u; /* nfs_svc args */ 376 struct rdma_svc_args *rdma_svc_args_u; /* rdma_svc args */ 377 struct nfs_revauth_args *nfs_revauth_args_u; /* nfs_revauth args */ 378 struct lm_svc_args *lm_svc_args_u; /* lm_svc args */ 379 /* kill_lockmgr args: none */ 380 struct nfsl_flush_args *nfsl_flush_args_u; /* nfsl_flush args */ 381 struct svcpool_args *svcpool_args_u; /* svcpool args */ 382 struct nfs4clrst_args *nfs4clrst_u; /* nfs4 clear state */ 383 struct nfsidmap_args *nfsidmap_u; /* nfsidmap */ 384 struct nfsspe_args *nfsspe_u; /* nfsspe */ 385 struct mds_adddev_args *adddev_u; 386 dserv_dataset_props_t *ds_dset_props; /* dataset props */ 387 }; 388 389 struct nfssysa { 390 enum nfssys_op opcode; /* operation discriminator */ 391 union nfssysargs arg; /* syscall-specific arg pointer */ 392 }; 393 #define nfssysarg_exportfs arg.exportfs_args_u 394 #define nfssysarg_getfh arg.nfs_getfh_args_u 395 #define nfssysarg_svc arg.nfs_svc_args_u 396 #define nfssysarg_rdmastart arg.rdma_svc_args_u 397 #define nfssysarg_revauth arg.nfs_revauth_args_u 398 #define nfssysarg_lmsvc arg.lm_svc_args_u 399 #define nfssysarg_nfslflush arg.nfsl_flush_args_u 400 #define nfssysarg_svcpool arg.svcpool_args_u 401 #define nfssysarg_nfs4clrst arg.nfs4clrst_u 402 #define nfssysarg_nfsidmap arg.nfsidmap_u 403 #define nfssysarg_nfsspe arg.nfsspe_u 404 405 #ifdef _SYSCALL32 406 union nfssysargs32 { 407 caddr32_t exportfs_args_u; /* exportfs args */ 408 caddr32_t nfs_getfh_args_u; /* nfs_getfh args */ 409 caddr32_t nfs_svc_args_u; /* nfs_svc args */ 410 caddr32_t rdma_svc_args_u; /* rdma_start args */ 411 caddr32_t nfs_revauth_args_u; /* nfs_revauth args */ 412 caddr32_t lm_svc_args_u; /* lm_svc args */ 413 /* kill_lockmgr args: none */ 414 caddr32_t nfsl_flush_args_u; /* nfsl_flush args */ 415 caddr32_t svcpool_args_u; 416 caddr32_t nfs4clrst_u; 417 caddr32_t adddev_u; 418 }; 419 struct nfssysa32 { 420 enum nfssys_op opcode; /* operation discriminator */ 421 union nfssysargs32 arg; /* syscall-specific arg pointer */ 422 }; 423 #endif /* _SYSCALL32 */ 424 425 #endif /* _KERNEL */ 426 427 struct nfs4_svc_args { 428 int fd; /* Connection endpoint */ 429 int cmd; 430 char *netid; /* Transport Identifier */ 431 char *addr; /* Universal Address */ 432 char *protofmly; /* Protocol Family */ 433 char *proto; /* Protocol, eg. "tcp" */ 434 struct netbuf addrmask; /* Address mask for host */ 435 }; 436 437 #ifdef _SYSCALL32 438 struct nfs4_svc_args32 { 439 int32_t fd; 440 int32_t cmd; 441 caddr32_t netid; 442 caddr32_t addr; 443 caddr32_t protofmly; 444 caddr32_t proto; 445 struct netbuf32 addrmask; 446 }; 447 #endif 448 449 #define NFS4_KRPC_START 1 450 #define NFS4_SETPORT 2 451 #define NFS4_DQUERY 4 452 453 /* DSS: distributed stable storage */ 454 #define NFS4_DSS_STATE_LEAF "v4_state" 455 #define NFS4_DSS_OLDSTATE_LEAF "v4_oldstate" 456 #define NFS4_DSS_DIR_MODE 0755 457 #define NFS4_DSS_NVPAIR_NAME "dss_pathname_array" 458 /* default storage dir */ 459 #define NFS4_DSS_VAR_DIR "/var/nfs" 460 461 #define NFS4_SS_VERSION 1 462 463 /* values for stable storage cmd */ 464 #define NFS4_SS_READ 1 465 #define NFS4_SS_WRITE 2 466 #define NFS4_SS_DELETE_CLNT 3 467 #define NFS4_SS_DELETE_OLD 4 468 469 /* errors for stable storage door usage */ 470 #define NFS_DR_SUCCESS 0 471 #define NFS_DR_BADARG -1 472 #define NFS_DR_BADCMD -2 473 #define NFS_DR_BADDIR -3 474 #define NFS_DR_OVERFLOW -4 475 #define NFS_DR_NOMEM -5 476 #define NFS_DR_OPFAIL -6 477 478 /* state to be written out to stable storage */ 479 struct ss_state_rec { 480 uint64_t ss_fvers; 481 uint64_t ss_veri; 482 uint64_t ss_len; 483 char ss_val[1]; 484 }; 485 /* state returned from stable storage */ 486 struct ss_rd_state { 487 uint64_t ssr_veri; 488 uint64_t ssr_len; 489 char ssr_val[1]; 490 }; 491 /* stable storage door arg struct */ 492 struct ss_arg { 493 int cmd; 494 int rsz; 495 char path[MAXPATHLEN]; 496 struct ss_state_rec rec; 497 }; 498 /* stable storage door result struct */ 499 struct ss_res { 500 int status; 501 int nsize; /* num of recs, or size needed */ 502 struct ss_rd_state rec[1]; 503 }; 504 505 #ifdef _KERNEL 506 507 #include <sys/systm.h> /* for rval_t typedef */ 508 509 extern int nfssys(enum nfssys_op, void *); 510 extern int exportfs(struct exportfs_args *, model_t, cred_t *); 511 extern int nfs_getfh(struct nfs_getfh_args *, model_t, cred_t *); 512 extern int pnfs_collect_layoutstats( 513 struct pnfs_getflo_args *, model_t, cred_t *); 514 extern int dserv_svc(dserv_svc_args_t *); 515 extern int nfs_svc(struct nfs_svc_args *, model_t); 516 extern int lm_svc(struct lm_svc_args *uap); 517 extern int lm_shutdown(void); 518 extern int nfsl_flush(struct nfsl_flush_args *, model_t); 519 extern int nfs4_svc(struct nfs4_svc_args *, model_t); 520 extern int rdma_start(struct rdma_svc_args *); 521 extern void rfs4_clear_client_state(struct nfs4clrst_args *); 522 extern void nfs_idmap_args(struct nfsidmap_args *); 523 extern void nfs41_spe_svc(void *); 524 extern void nfs4_ephemeral_set_mount_to(uint_t); 525 extern void mountd_args(uint_t); 526 extern void (*rfs4_client_clrst)(struct nfs4clrst_args *); 527 #endif 528 529 #ifdef __cplusplus 530 } 531 #endif 532 533 #endif /* _NFS_NFSSYS_H */ 534