xref: /illumos-gate/usr/src/uts/common/sys/fs/autofs.h (revision 2e0fe3efe5f9d579d4e44b3532d8e342c68b40ca)
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 (c) 1992, 2010, Oracle and/or its affiliates. All rights reserved.
23  */
24 
25 #ifndef	_SYS_FS_AUTOFS_H
26 #define	_SYS_FS_AUTOFS_H
27 
28 #include <rpc/clnt.h>
29 #include <gssapi/gssapi.h>
30 #include <sys/vfs.h>
31 #include <sys/dirent.h>
32 #include <sys/types.h>
33 #include <sys/types32.h>
34 #include <sys/note.h>
35 #include <sys/time_impl.h>
36 #include <sys/mntent.h>
37 #include <nfs/mount.h>
38 #include <rpc/rpcsec_gss.h>
39 #include <sys/zone.h>
40 #include <sys/door.h>
41 #include <rpcsvc/autofs_prot.h>
42 
43 #ifdef _KERNEL
44 #include <sys/vfs_opreg.h>
45 #endif
46 
47 #ifdef	__cplusplus
48 extern "C" {
49 #endif
50 
51 
52 #ifdef	_KERNEL
53 
54 
55 /*
56  * Tracing macro; expands to nothing for non-debug kernels.
57  */
58 #ifndef DEBUG
59 #define	AUTOFS_DPRINT(x)
60 #else
61 #define	AUTOFS_DPRINT(x)	auto_dprint x
62 #endif
63 
64 /*
65  * Per AUTOFS mountpoint information.
66  */
67 typedef struct fninfo {
68 	struct vfs	*fi_mountvfs;		/* mounted-here VFS */
69 	struct vnode	*fi_rootvp;		/* root vnode */
70 	struct knetconfig fi_knconf;		/* netconfig */
71 	struct netbuf	fi_addr;		/* daemon address */
72 	char		*fi_path;		/* autofs mountpoint */
73 	char 		*fi_map;		/* context/map-name */
74 	char		*fi_subdir;		/* subdir within map */
75 	char		*fi_key;		/* key to use on direct maps */
76 	char		*fi_opts;		/* default mount options */
77 	int		fi_pathlen;		/* autofs mountpoint len */
78 	int		fi_maplen;		/* size of context */
79 	int		fi_subdirlen;
80 	int		fi_keylen;
81 	int		fi_optslen;		/* default mount options len */
82 	int		fi_refcnt;		/* reference count */
83 	int		fi_flags;
84 	int		fi_mount_to;
85 	int		fi_rpc_to;
86 	zoneid_t	fi_zoneid;		/* zone mounted in */
87 } fninfo_t;
88 
89 /*
90  * The AUTOFS locking scheme:
91  *
92  * The locks:
93  * 	fn_lock: protects the fn_node. It must be grabbed to change any
94  *		 field on the fn_node, except for those protected by
95  *		 fn_rwlock.
96  *
97  * 	fn_rwlock: readers/writers lock to protect the subdirectory and
98  *		   top level list traversal.
99  *		   Protects: fn_dirents
100  *			     fn_next
101  *		             fn_size
102  *		             fn_linkcnt
103  *                 - Grab readers when checking if certain fn_node exists
104  *                   under fn_dirents.
105  *		   - Grab readers when attempting to reference a node
106  *                   pointed to by fn_dirents, fn_next, and fn_parent.
107  *                 - Grab writers to add a new fnnode under fn_dirents and
108  *		     to remove a node pointed to by fn_dirents or fn_next.
109  *
110  *
111  * The flags:
112  *	MF_INPROG:
113  *		- Indicates a mount request has been sent to the daemon.
114  *		- If this flag is set, the thread sets MF_WAITING on the
115  *                fnnode and sleeps.
116  *
117  *	MF_WAITING:
118  *		- Set by a thread when it puts itself to sleep waiting for
119  *		  the ongoing operation on this fnnode to be done.
120  *
121  * 	MF_LOOKUP:
122  * 		- Indicates a lookup request has been sent to the daemon.
123  *		- If this flag is set, the thread sets MF_WAITING on the
124  *                fnnode and sleeps.
125  *
126  *	MF_IK_MOUNT:
127  *		- This flag is set to indicate the mount was done in the
128  *		  kernel, and so should the unmount.
129  *
130  *	MF_DIRECT:
131  *		- Direct mountpoint if set, indirect otherwise.
132  *
133  *	MF_TRIGGER:
134  *		- This is a trigger node.
135  *
136  *	MF_THISUID_MATCH_RQD:
137  *		- User-relative context binding kind of node.
138  *		- Node with this flag set requires a name match as well
139  *		  as a cred match in order to be returned from the directory
140  *		  hierarchy.
141  *
142  * 	MF_MOUNTPOINT:
143  * 		- At some point automountd mounted a filesystem on this node.
144  * 		If fn_trigger is non-NULL, v_vfsmountedhere is NULL and this
145  * 		flag is set then the filesystem must have been forcibly
146  * 		unmounted.
147  */
148 
149 /*
150  * The inode of AUTOFS
151  */
152 typedef struct fnnode {
153 	char		*fn_name;
154 	char		*fn_symlink;		/* if VLNK, this is what it */
155 						/* points to */
156 	int		fn_namelen;
157 	int		fn_symlinklen;
158 	uint_t		fn_linkcnt;		/* link count */
159 	mode_t		fn_mode;		/* file mode bits */
160 	uid_t		fn_uid;			/* owner's uid */
161 	gid_t		fn_gid;			/* group's uid */
162 	int		fn_error;		/* mount/lookup error */
163 	ino_t		fn_nodeid;
164 	off_t		fn_offset;		/* offset into directory */
165 	int		fn_flags;
166 	uint_t		fn_size;		/* size of directory */
167 	struct vnode	*fn_vnode;
168 	struct fnnode	*fn_parent;
169 	struct fnnode	*fn_next;		/* sibling */
170 	struct fnnode	*fn_dirents;		/* children */
171 	struct fnnode	*fn_trigger; 		/* pointer to next level */
172 						/* AUTOFS trigger nodes */
173 	struct action_list *fn_alp;		/* Pointer to mount info */
174 						/* used for remounting */
175 						/* trigger nodes */
176 	cred_t		*fn_cred;		/* pointer to cred, used for */
177 						/* "thisuser" processing */
178 	krwlock_t	fn_rwlock;		/* protects list traversal */
179 	kmutex_t	fn_lock;		/* protects the fnnode */
180 	timestruc_t	fn_atime;
181 	timestruc_t	fn_mtime;
182 	timestruc_t	fn_ctime;
183 	time_t		fn_ref_time;		/* time last referenced */
184 	time_t		fn_unmount_ref_time;	/* last time unmount was done */
185 	kcondvar_t	fn_cv_mount;		/* mount blocking variable */
186 	struct vnode	*fn_seen;		/* vnode already traversed */
187 	kthread_t	*fn_thread;		/* thread that has currently */
188 						/* modified fn_seen */
189 	struct autofs_globals *fn_globals;	/* global variables */
190 } fnnode_t;
191 
192 
193 #define	vntofn(vp)	((struct fnnode *)((vp)->v_data))
194 #define	fntovn(fnp)	(((fnp)->fn_vnode))
195 #define	vfstofni(vfsp)	((struct fninfo *)((vfsp)->vfs_data))
196 
197 #define	MF_DIRECT	0x001
198 #define	MF_INPROG	0x002		/* Mount in progress */
199 #define	MF_WAITING	0x004
200 #define	MF_LOOKUP	0x008		/* Lookup in progress */
201 #define	MF_ATTR_WAIT	0x010
202 #define	MF_IK_MOUNT	0x040
203 #define	MF_TRIGGER	0x080
204 #define	MF_THISUID_MATCH_RQD	0x100	/* UID match required for this node */
205 					/* required for thisuser kind of */
206 					/* nodes */
207 #define	MF_MOUNTPOINT	0x200		/* Node is/was a mount point */
208 
209 #define	AUTOFS_MODE		0555
210 #define	AUTOFS_BLOCKSIZE	1024
211 
212 struct autofs_callargs {
213 	fnnode_t	*fnc_fnp;	/* fnnode */
214 	char		*fnc_name;	/* path to lookup/mount */
215 	kthread_t	*fnc_origin;	/* thread that fired up this thread */
216 					/* used for debugging purposes */
217 	cred_t		*fnc_cred;
218 };
219 
220 struct autofs_globals {
221 	fnnode_t		*fng_rootfnnodep;
222 	int			fng_fnnode_count;
223 	int			fng_printed_not_running_msg;
224 	kmutex_t		fng_unmount_threads_lock;
225 	int			fng_unmount_threads;
226 	int			fng_verbose;
227 	zoneid_t		fng_zoneid;
228 	pid_t			fng_autofs_pid;
229 	kmutex_t		fng_autofs_daemon_lock;
230 	/*
231 	 * autofs_daemon_lock protects fng_autofs_daemon_dh
232 	 */
233 	door_handle_t		fng_autofs_daemon_dh;
234 };
235 
236 extern kmutex_t autofs_minor_lock;
237 extern zone_key_t autofs_key;
238 
239 /*
240  * Sets the MF_INPROG flag on this fnnode.
241  * fnp->fn_lock should be held before this macro is called,
242  * operation is either MF_INPROG or MF_LOOKUP.
243  */
244 #define	AUTOFS_BLOCK_OTHERS(fnp, operation)	{ \
245 	ASSERT(MUTEX_HELD(&(fnp)->fn_lock)); \
246 	ASSERT(!((fnp)->fn_flags & operation)); \
247 	(fnp)->fn_flags |= (operation); \
248 }
249 
250 #define	AUTOFS_UNBLOCK_OTHERS(fnp, operation)	{ \
251 	auto_unblock_others((fnp), (operation)); \
252 }
253 
254 extern struct vnodeops *auto_vnodeops;
255 extern const struct fs_operation_def auto_vnodeops_template[];
256 
257 /*
258  * Utility routines
259  */
260 extern int auto_search(fnnode_t *, char *, fnnode_t **, cred_t *);
261 extern int auto_enter(fnnode_t *, char *, fnnode_t **, cred_t *);
262 extern void auto_unblock_others(fnnode_t *, uint_t);
263 extern int auto_wait4mount(fnnode_t *);
264 extern fnnode_t *auto_makefnnode(vtype_t, vfs_t *, char *, cred_t *,
265     struct autofs_globals *);
266 extern void auto_freefnnode(fnnode_t *);
267 extern void auto_disconnect(fnnode_t *, fnnode_t *);
268 extern void auto_do_unmount(struct autofs_globals *);
269 /*PRINTFLIKE4*/
270 extern void auto_log(int verbose, zoneid_t zoneid, int level,
271 	const char *fmt, ...)
272     __KPRINTFLIKE(4);
273 /*PRINTFLIKE2*/
274 extern void auto_dprint(int level, const char *fmt, ...)
275     __KPRINTFLIKE(2);
276 extern int auto_calldaemon(zoneid_t, int, xdrproc_t, void *, xdrproc_t,
277 	void *, int, bool_t);
278 extern int auto_lookup_aux(fnnode_t *, char *, cred_t *);
279 extern void auto_new_mount_thread(fnnode_t *, char *, cred_t *);
280 extern int auto_nobrowse_option(char *);
281 
282 extern int unmount_subtree(fnnode_t *, boolean_t);
283 extern void unmount_tree(struct autofs_globals *, boolean_t);
284 extern void autofs_free_globals(struct autofs_globals *);
285 extern void autofs_shutdown_zone(struct autofs_globals *);
286 /*
287  * external routines not defined in any header file
288  */
289 extern bool_t xdr_uid_t(XDR *, uid_t *);
290 
291 #endif	/* _KERNEL */
292 
293 /*
294  * autofs structures and defines needed for use with doors.
295  */
296 #define	AUTOFS_NULL	0
297 #define	AUTOFS_MOUNT	1
298 #define	AUTOFS_UNMOUNT	2
299 #define	AUTOFS_READDIR	3
300 #define	AUTOFS_LOOKUP	4
301 #define	AUTOFS_SRVINFO	5
302 #define	AUTOFS_MNTINFO	6
303 
304 /*
305  * autofs_door_args is a generic structure used to grab the command
306  * from any of the argument structures passed in.
307  */
308 
309 typedef struct {
310 	int cmd;
311 	int xdr_len;
312 	char xdr_arg[1];	/* buffer holding xdr encoded data */
313 } autofs_door_args_t;
314 
315 
316 typedef struct {
317 	int res_status;
318 	int xdr_len;
319 	char xdr_res[1];	/* buffer holding xdr encoded data */
320 } autofs_door_res_t;
321 
322 typedef enum autofs_res autofs_res_t;
323 typedef enum autofs_stat autofs_stat_t;
324 typedef enum autofs_action autofs_action_t;
325 
326 typedef struct {
327 	void *	atsd_buf;
328 	size_t	atsd_len;
329 } autofs_tsd_t;
330 
331 typedef struct sec_desdata {
332 	int		nd_sec_syncaddr_len;
333 	int		nd_sec_knc_semantics;
334 	int		nd_sec_netnamelen;
335 	uint64_t	nd_sec_knc_rdev;
336 	int		nd_sec_knc_unused[8];
337 } sec_desdata_t;
338 
339 typedef struct sec_gssdata {
340 	int			element_length;
341 	rpc_gss_service_t	service;
342 	char			uname[MAX_NAME_LEN];
343 	char			inst[MAX_NAME_LEN];
344 	char			realm[MAX_NAME_LEN];
345 	uint_t			qop;
346 } sec_gssdata_t;
347 
348 typedef struct nfs_secdata  {
349 	sec_desdata_t	nfs_des_clntdata;
350 	sec_gssdata_t	nfs_gss_clntdata;
351 } nfs_secdata_t;
352 
353 /*
354  * Comma separated list of mntoptions which are inherited when the
355  * "restrict" option is present.  The RESTRICT option must be first!
356  * This define is shared between the kernel and the automount daemon.
357  */
358 #define	RESTRICTED_MNTOPTS	\
359 	MNTOPT_RESTRICT, MNTOPT_NOSUID, MNTOPT_NOSETUID, MNTOPT_NODEVICES
360 
361 /*
362  * AUTOFS syscall entry point
363  */
364 enum autofssys_op { AUTOFS_UNMOUNTALL, AUTOFS_SETDOOR };
365 
366 #ifdef	_KERNEL
367 extern int autofssys(enum autofssys_op, uintptr_t);
368 
369 #endif	/* _KERNEL */
370 
371 #ifdef	__cplusplus
372 }
373 #endif
374 
375 #endif	/* _SYS_FS_AUTOFS_H */
376