Home | History | Annotate | Download | only in nfs
      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