1 /* -*- c -*-
2  * linux/include/linux/auto_fs4.h
3  *
4  * Copyright 1999-2000 Jeremy Fitzhardinge <jeremy@goop.org>
5  *
6  * This file is part of the Linux kernel and is made available under
7  * the terms of the GNU General Public License, version 2, or at your
8  * option, any later version, incorporated herein by reference.
9  */
10 
11 #ifndef _LINUX_AUTO_FS4_H
12 #define _LINUX_AUTO_FS4_H
13 
14 /* Include common v3 definitions */
15 #include <linux/types.h>
16 #include <linux/auto_fs.h>
17 
18 /* autofs v4 definitions */
19 #undef AUTOFS_PROTO_VERSION
20 #undef AUTOFS_MIN_PROTO_VERSION
21 #undef AUTOFS_MAX_PROTO_VERSION
22 
23 #define AUTOFS_PROTO_VERSION		5
24 #define AUTOFS_MIN_PROTO_VERSION	3
25 #define AUTOFS_MAX_PROTO_VERSION	5
26 
27 #define AUTOFS_PROTO_SUBVERSION		2
28 
29 /* Mask for expire behaviour */
30 #define AUTOFS_EXP_IMMEDIATE		1
31 #define AUTOFS_EXP_LEAVES		2
32 
33 #define AUTOFS_TYPE_ANY			0U
34 #define AUTOFS_TYPE_INDIRECT		1U
35 #define AUTOFS_TYPE_DIRECT		2U
36 #define AUTOFS_TYPE_OFFSET		4U
37 
set_autofs_type_indirect(unsigned int * type)38 static inline void set_autofs_type_indirect(unsigned int *type)
39 {
40 	*type = AUTOFS_TYPE_INDIRECT;
41 	return;
42 }
43 
autofs_type_indirect(unsigned int type)44 static inline unsigned int autofs_type_indirect(unsigned int type)
45 {
46 	return (type == AUTOFS_TYPE_INDIRECT);
47 }
48 
set_autofs_type_direct(unsigned int * type)49 static inline void set_autofs_type_direct(unsigned int *type)
50 {
51 	*type = AUTOFS_TYPE_DIRECT;
52 	return;
53 }
54 
autofs_type_direct(unsigned int type)55 static inline unsigned int autofs_type_direct(unsigned int type)
56 {
57 	return (type == AUTOFS_TYPE_DIRECT);
58 }
59 
set_autofs_type_offset(unsigned int * type)60 static inline void set_autofs_type_offset(unsigned int *type)
61 {
62 	*type = AUTOFS_TYPE_OFFSET;
63 	return;
64 }
65 
autofs_type_offset(unsigned int type)66 static inline unsigned int autofs_type_offset(unsigned int type)
67 {
68 	return (type == AUTOFS_TYPE_OFFSET);
69 }
70 
autofs_type_trigger(unsigned int type)71 static inline unsigned int autofs_type_trigger(unsigned int type)
72 {
73 	return (type == AUTOFS_TYPE_DIRECT || type == AUTOFS_TYPE_OFFSET);
74 }
75 
76 /*
77  * This isn't really a type as we use it to say "no type set" to
78  * indicate we want to search for "any" mount in the
79  * autofs_dev_ioctl_ismountpoint() device ioctl function.
80  */
set_autofs_type_any(unsigned int * type)81 static inline void set_autofs_type_any(unsigned int *type)
82 {
83 	*type = AUTOFS_TYPE_ANY;
84 	return;
85 }
86 
autofs_type_any(unsigned int type)87 static inline unsigned int autofs_type_any(unsigned int type)
88 {
89 	return (type == AUTOFS_TYPE_ANY);
90 }
91 
92 /* Daemon notification packet types */
93 enum autofs_notify {
94 	NFY_NONE,
95 	NFY_MOUNT,
96 	NFY_EXPIRE
97 };
98 
99 /* Kernel protocol version 4 packet types */
100 
101 /* Expire entry (umount request) */
102 #define autofs_ptype_expire_multi	2
103 
104 /* Kernel protocol version 5 packet types */
105 
106 /* Indirect mount missing and expire requests. */
107 #define autofs_ptype_missing_indirect	3
108 #define autofs_ptype_expire_indirect	4
109 
110 /* Direct mount missing and expire requests */
111 #define autofs_ptype_missing_direct	5
112 #define autofs_ptype_expire_direct	6
113 
114 /* v4 multi expire (via pipe) */
115 struct autofs_packet_expire_multi {
116 	struct autofs_packet_hdr hdr;
117         autofs_wqt_t wait_queue_token;
118 	int len;
119 	char name[NAME_MAX+1];
120 };
121 
122 union autofs_packet_union {
123 	struct autofs_packet_hdr hdr;
124 	struct autofs_packet_missing missing;
125 	struct autofs_packet_expire expire;
126 	struct autofs_packet_expire_multi expire_multi;
127 };
128 
129 /* autofs v5 common packet struct */
130 struct autofs_v5_packet {
131 	struct autofs_packet_hdr hdr;
132 	autofs_wqt_t wait_queue_token;
133 	__u32 dev;
134 	__u64 ino;
135 	__u32 uid;
136 	__u32 gid;
137 	__u32 pid;
138 	__u32 tgid;
139 	__u32 len;
140 	char name[NAME_MAX+1];
141 };
142 
143 typedef struct autofs_v5_packet autofs_packet_missing_indirect_t;
144 typedef struct autofs_v5_packet autofs_packet_expire_indirect_t;
145 typedef struct autofs_v5_packet autofs_packet_missing_direct_t;
146 typedef struct autofs_v5_packet autofs_packet_expire_direct_t;
147 
148 union autofs_v5_packet_union {
149 	struct autofs_packet_hdr hdr;
150 	struct autofs_v5_packet v5_packet;
151 	autofs_packet_missing_indirect_t missing_indirect;
152 	autofs_packet_expire_indirect_t expire_indirect;
153 	autofs_packet_missing_direct_t missing_direct;
154 	autofs_packet_expire_direct_t expire_direct;
155 };
156 
157 #define AUTOFS_IOC_EXPIRE_MULTI		_IOW(0x93,0x66,int)
158 #define AUTOFS_IOC_EXPIRE_INDIRECT	AUTOFS_IOC_EXPIRE_MULTI
159 #define AUTOFS_IOC_EXPIRE_DIRECT	AUTOFS_IOC_EXPIRE_MULTI
160 #define AUTOFS_IOC_PROTOSUBVER		_IOR(0x93,0x67,int)
161 #define AUTOFS_IOC_ASKUMOUNT		_IOR(0x93,0x70,int)
162 
163 
164 #endif /* _LINUX_AUTO_FS4_H */
165