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