auto_fs.h (6450B)
1/* SPDX-License-Identifier: GPL-2.0+ WITH Linux-syscall-note */ 2/* 3 * Copyright 1997 Transmeta Corporation - All Rights Reserved 4 * Copyright 1999-2000 Jeremy Fitzhardinge <jeremy@goop.org> 5 * Copyright 2005-2006,2013,2017-2018 Ian Kent <raven@themaw.net> 6 * 7 * This file is part of the Linux kernel and is made available under 8 * the terms of the GNU General Public License, version 2, or at your 9 * option, any later version, incorporated herein by reference. 10 * 11 * ----------------------------------------------------------------------- */ 12 13#ifndef _UAPI_LINUX_AUTO_FS_H 14#define _UAPI_LINUX_AUTO_FS_H 15 16#include <linux/types.h> 17#include <linux/limits.h> 18#ifndef __KERNEL__ 19#include <sys/ioctl.h> 20#endif /* __KERNEL__ */ 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 5 27 28/* 29 * The wait_queue_token (autofs_wqt_t) is part of a structure which is passed 30 * back to the kernel via ioctl from userspace. On architectures where 32- and 31 * 64-bit userspace binaries can be executed it's important that the size of 32 * autofs_wqt_t stays constant between 32- and 64-bit Linux kernels so that we 33 * do not break the binary ABI interface by changing the structure size. 34 */ 35#if defined(__ia64__) || defined(__alpha__) /* pure 64bit architectures */ 36typedef unsigned long autofs_wqt_t; 37#else 38typedef unsigned int autofs_wqt_t; 39#endif 40 41/* Packet types */ 42#define autofs_ptype_missing 0 /* Missing entry (mount request) */ 43#define autofs_ptype_expire 1 /* Expire entry (umount request) */ 44 45struct autofs_packet_hdr { 46 int proto_version; /* Protocol version */ 47 int type; /* Type of packet */ 48}; 49 50struct autofs_packet_missing { 51 struct autofs_packet_hdr hdr; 52 autofs_wqt_t wait_queue_token; 53 int len; 54 char name[NAME_MAX+1]; 55}; 56 57/* v3 expire (via ioctl) */ 58struct autofs_packet_expire { 59 struct autofs_packet_hdr hdr; 60 int len; 61 char name[NAME_MAX+1]; 62}; 63 64#define AUTOFS_IOCTL 0x93 65 66enum { 67 AUTOFS_IOC_READY_CMD = 0x60, 68 AUTOFS_IOC_FAIL_CMD, 69 AUTOFS_IOC_CATATONIC_CMD, 70 AUTOFS_IOC_PROTOVER_CMD, 71 AUTOFS_IOC_SETTIMEOUT_CMD, 72 AUTOFS_IOC_EXPIRE_CMD, 73}; 74 75#define AUTOFS_IOC_READY _IO(AUTOFS_IOCTL, AUTOFS_IOC_READY_CMD) 76#define AUTOFS_IOC_FAIL _IO(AUTOFS_IOCTL, AUTOFS_IOC_FAIL_CMD) 77#define AUTOFS_IOC_CATATONIC _IO(AUTOFS_IOCTL, AUTOFS_IOC_CATATONIC_CMD) 78#define AUTOFS_IOC_PROTOVER _IOR(AUTOFS_IOCTL, \ 79 AUTOFS_IOC_PROTOVER_CMD, int) 80#define AUTOFS_IOC_SETTIMEOUT32 _IOWR(AUTOFS_IOCTL, \ 81 AUTOFS_IOC_SETTIMEOUT_CMD, \ 82 compat_ulong_t) 83#define AUTOFS_IOC_SETTIMEOUT _IOWR(AUTOFS_IOCTL, \ 84 AUTOFS_IOC_SETTIMEOUT_CMD, \ 85 unsigned long) 86#define AUTOFS_IOC_EXPIRE _IOR(AUTOFS_IOCTL, \ 87 AUTOFS_IOC_EXPIRE_CMD, \ 88 struct autofs_packet_expire) 89 90/* autofs version 4 and later definitions */ 91 92/* Mask for expire behaviour */ 93#define AUTOFS_EXP_NORMAL 0x00 94#define AUTOFS_EXP_IMMEDIATE 0x01 95#define AUTOFS_EXP_LEAVES 0x02 96#define AUTOFS_EXP_FORCED 0x04 97 98#define AUTOFS_TYPE_ANY 0U 99#define AUTOFS_TYPE_INDIRECT 1U 100#define AUTOFS_TYPE_DIRECT 2U 101#define AUTOFS_TYPE_OFFSET 4U 102 103static inline void set_autofs_type_indirect(unsigned int *type) 104{ 105 *type = AUTOFS_TYPE_INDIRECT; 106} 107 108static inline unsigned int autofs_type_indirect(unsigned int type) 109{ 110 return (type == AUTOFS_TYPE_INDIRECT); 111} 112 113static inline void set_autofs_type_direct(unsigned int *type) 114{ 115 *type = AUTOFS_TYPE_DIRECT; 116} 117 118static inline unsigned int autofs_type_direct(unsigned int type) 119{ 120 return (type == AUTOFS_TYPE_DIRECT); 121} 122 123static inline void set_autofs_type_offset(unsigned int *type) 124{ 125 *type = AUTOFS_TYPE_OFFSET; 126} 127 128static inline unsigned int autofs_type_offset(unsigned int type) 129{ 130 return (type == AUTOFS_TYPE_OFFSET); 131} 132 133static inline unsigned int autofs_type_trigger(unsigned int type) 134{ 135 return (type == AUTOFS_TYPE_DIRECT || type == AUTOFS_TYPE_OFFSET); 136} 137 138/* 139 * This isn't really a type as we use it to say "no type set" to 140 * indicate we want to search for "any" mount in the 141 * autofs_dev_ioctl_ismountpoint() device ioctl function. 142 */ 143static inline void set_autofs_type_any(unsigned int *type) 144{ 145 *type = AUTOFS_TYPE_ANY; 146} 147 148static inline unsigned int autofs_type_any(unsigned int type) 149{ 150 return (type == AUTOFS_TYPE_ANY); 151} 152 153/* Daemon notification packet types */ 154enum autofs_notify { 155 NFY_NONE, 156 NFY_MOUNT, 157 NFY_EXPIRE 158}; 159 160/* Kernel protocol version 4 packet types */ 161 162/* Expire entry (umount request) */ 163#define autofs_ptype_expire_multi 2 164 165/* Kernel protocol version 5 packet types */ 166 167/* Indirect mount missing and expire requests. */ 168#define autofs_ptype_missing_indirect 3 169#define autofs_ptype_expire_indirect 4 170 171/* Direct mount missing and expire requests */ 172#define autofs_ptype_missing_direct 5 173#define autofs_ptype_expire_direct 6 174 175/* v4 multi expire (via pipe) */ 176struct autofs_packet_expire_multi { 177 struct autofs_packet_hdr hdr; 178 autofs_wqt_t wait_queue_token; 179 int len; 180 char name[NAME_MAX+1]; 181}; 182 183union autofs_packet_union { 184 struct autofs_packet_hdr hdr; 185 struct autofs_packet_missing missing; 186 struct autofs_packet_expire expire; 187 struct autofs_packet_expire_multi expire_multi; 188}; 189 190/* autofs v5 common packet struct */ 191struct autofs_v5_packet { 192 struct autofs_packet_hdr hdr; 193 autofs_wqt_t wait_queue_token; 194 __u32 dev; 195 __u64 ino; 196 __u32 uid; 197 __u32 gid; 198 __u32 pid; 199 __u32 tgid; 200 __u32 len; 201 char name[NAME_MAX+1]; 202}; 203 204typedef struct autofs_v5_packet autofs_packet_missing_indirect_t; 205typedef struct autofs_v5_packet autofs_packet_expire_indirect_t; 206typedef struct autofs_v5_packet autofs_packet_missing_direct_t; 207typedef struct autofs_v5_packet autofs_packet_expire_direct_t; 208 209union autofs_v5_packet_union { 210 struct autofs_packet_hdr hdr; 211 struct autofs_v5_packet v5_packet; 212 autofs_packet_missing_indirect_t missing_indirect; 213 autofs_packet_expire_indirect_t expire_indirect; 214 autofs_packet_missing_direct_t missing_direct; 215 autofs_packet_expire_direct_t expire_direct; 216}; 217 218enum { 219 AUTOFS_IOC_EXPIRE_MULTI_CMD = 0x66, /* AUTOFS_IOC_EXPIRE_CMD + 1 */ 220 AUTOFS_IOC_PROTOSUBVER_CMD, 221 AUTOFS_IOC_ASKUMOUNT_CMD = 0x70, /* AUTOFS_DEV_IOCTL_VERSION_CMD - 1 */ 222}; 223 224#define AUTOFS_IOC_EXPIRE_MULTI _IOW(AUTOFS_IOCTL, \ 225 AUTOFS_IOC_EXPIRE_MULTI_CMD, int) 226#define AUTOFS_IOC_PROTOSUBVER _IOR(AUTOFS_IOCTL, \ 227 AUTOFS_IOC_PROTOSUBVER_CMD, int) 228#define AUTOFS_IOC_ASKUMOUNT _IOR(AUTOFS_IOCTL, \ 229 AUTOFS_IOC_ASKUMOUNT_CMD, int) 230 231#endif /* _UAPI_LINUX_AUTO_FS_H */