1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16#include <linux/auto_fs4.h>
17#include <linux/auto_dev-ioctl.h>
18#include <linux/mutex.h>
19#include <linux/spinlock.h>
20#include <linux/list.h>
21
22
23#define AUTOFS_IOC_FIRST AUTOFS_IOC_READY
24#define AUTOFS_IOC_COUNT 32
25
26#define AUTOFS_DEV_IOCTL_IOC_FIRST (AUTOFS_DEV_IOCTL_VERSION)
27#define AUTOFS_DEV_IOCTL_IOC_COUNT (AUTOFS_IOC_COUNT - 11)
28
29#include <linux/kernel.h>
30#include <linux/slab.h>
31#include <linux/time.h>
32#include <linux/string.h>
33#include <linux/wait.h>
34#include <linux/sched.h>
35#include <linux/mount.h>
36#include <linux/namei.h>
37#include <asm/current.h>
38#include <asm/uaccess.h>
39
40
41
42#define DPRINTK(fmt, ...) \
43 pr_debug("pid %d: %s: " fmt "\n", \
44 current->pid, __func__, ##__VA_ARGS__)
45
46#define AUTOFS_WARN(fmt, ...) \
47 printk(KERN_WARNING "pid %d: %s: " fmt "\n", \
48 current->pid, __func__, ##__VA_ARGS__)
49
50#define AUTOFS_ERROR(fmt, ...) \
51 printk(KERN_ERR "pid %d: %s: " fmt "\n", \
52 current->pid, __func__, ##__VA_ARGS__)
53
54
55
56
57
58
59
60struct autofs_info {
61 struct dentry *dentry;
62 struct inode *inode;
63
64 int flags;
65
66 struct completion expire_complete;
67
68 struct list_head active;
69 int active_count;
70
71 struct list_head expiring;
72
73 struct autofs_sb_info *sbi;
74 unsigned long last_used;
75 atomic_t count;
76
77 uid_t uid;
78 gid_t gid;
79};
80
81#define AUTOFS_INF_EXPIRING (1<<0)
82#define AUTOFS_INF_PENDING (1<<2)
83
84struct autofs_wait_queue {
85 wait_queue_head_t queue;
86 struct autofs_wait_queue *next;
87 autofs_wqt_t wait_queue_token;
88
89 struct qstr name;
90 u32 dev;
91 u64 ino;
92 uid_t uid;
93 gid_t gid;
94 pid_t pid;
95 pid_t tgid;
96
97 int status;
98 unsigned int wait_ctr;
99};
100
101#define AUTOFS_SBI_MAGIC 0x6d4a556d
102
103struct autofs_sb_info {
104 u32 magic;
105 int pipefd;
106 struct file *pipe;
107 pid_t oz_pgrp;
108 int catatonic;
109 int version;
110 int sub_version;
111 int min_proto;
112 int max_proto;
113 unsigned long exp_timeout;
114 unsigned int type;
115 int reghost_enabled;
116 int needs_reghost;
117 struct super_block *sb;
118 struct mutex wq_mutex;
119 struct mutex pipe_mutex;
120 spinlock_t fs_lock;
121 struct autofs_wait_queue *queues;
122 spinlock_t lookup_lock;
123 struct list_head active_list;
124 struct list_head expiring_list;
125};
126
127static inline struct autofs_sb_info *autofs4_sbi(struct super_block *sb)
128{
129 return (struct autofs_sb_info *)(sb->s_fs_info);
130}
131
132static inline struct autofs_info *autofs4_dentry_ino(struct dentry *dentry)
133{
134 return (struct autofs_info *)(dentry->d_fsdata);
135}
136
137
138
139
140
141static inline int autofs4_oz_mode(struct autofs_sb_info *sbi) {
142 return sbi->catatonic || task_pgrp_nr(current) == sbi->oz_pgrp;
143}
144
145
146static inline int autofs4_ispending(struct dentry *dentry)
147{
148 struct autofs_info *inf = autofs4_dentry_ino(dentry);
149
150 if (inf->flags & AUTOFS_INF_PENDING)
151 return 1;
152
153 if (inf->flags & AUTOFS_INF_EXPIRING)
154 return 1;
155
156 return 0;
157}
158
159struct inode *autofs4_get_inode(struct super_block *, umode_t);
160void autofs4_free_ino(struct autofs_info *);
161
162
163int is_autofs4_dentry(struct dentry *);
164int autofs4_expire_wait(struct dentry *dentry);
165int autofs4_expire_run(struct super_block *, struct vfsmount *,
166 struct autofs_sb_info *,
167 struct autofs_packet_expire __user *);
168int autofs4_do_expire_multi(struct super_block *sb, struct vfsmount *mnt,
169 struct autofs_sb_info *sbi, int when);
170int autofs4_expire_multi(struct super_block *, struct vfsmount *,
171 struct autofs_sb_info *, int __user *);
172struct dentry *autofs4_expire_direct(struct super_block *sb,
173 struct vfsmount *mnt,
174 struct autofs_sb_info *sbi, int how);
175struct dentry *autofs4_expire_indirect(struct super_block *sb,
176 struct vfsmount *mnt,
177 struct autofs_sb_info *sbi, int how);
178
179
180
181int autofs_dev_ioctl_init(void);
182void autofs_dev_ioctl_exit(void);
183
184
185
186extern const struct inode_operations autofs4_symlink_inode_operations;
187extern const struct inode_operations autofs4_dir_inode_operations;
188extern const struct file_operations autofs4_dir_operations;
189extern const struct file_operations autofs4_root_operations;
190extern const struct dentry_operations autofs4_dentry_operations;
191
192
193
194static inline void __managed_dentry_set_automount(struct dentry *dentry)
195{
196 dentry->d_flags |= DCACHE_NEED_AUTOMOUNT;
197}
198
199static inline void managed_dentry_set_automount(struct dentry *dentry)
200{
201 spin_lock(&dentry->d_lock);
202 __managed_dentry_set_automount(dentry);
203 spin_unlock(&dentry->d_lock);
204}
205
206static inline void __managed_dentry_clear_automount(struct dentry *dentry)
207{
208 dentry->d_flags &= ~DCACHE_NEED_AUTOMOUNT;
209}
210
211static inline void managed_dentry_clear_automount(struct dentry *dentry)
212{
213 spin_lock(&dentry->d_lock);
214 __managed_dentry_clear_automount(dentry);
215 spin_unlock(&dentry->d_lock);
216}
217
218static inline void __managed_dentry_set_transit(struct dentry *dentry)
219{
220 dentry->d_flags |= DCACHE_MANAGE_TRANSIT;
221}
222
223static inline void managed_dentry_set_transit(struct dentry *dentry)
224{
225 spin_lock(&dentry->d_lock);
226 __managed_dentry_set_transit(dentry);
227 spin_unlock(&dentry->d_lock);
228}
229
230static inline void __managed_dentry_clear_transit(struct dentry *dentry)
231{
232 dentry->d_flags &= ~DCACHE_MANAGE_TRANSIT;
233}
234
235static inline void managed_dentry_clear_transit(struct dentry *dentry)
236{
237 spin_lock(&dentry->d_lock);
238 __managed_dentry_clear_transit(dentry);
239 spin_unlock(&dentry->d_lock);
240}
241
242static inline void __managed_dentry_set_managed(struct dentry *dentry)
243{
244 dentry->d_flags |= (DCACHE_NEED_AUTOMOUNT|DCACHE_MANAGE_TRANSIT);
245}
246
247static inline void managed_dentry_set_managed(struct dentry *dentry)
248{
249 spin_lock(&dentry->d_lock);
250 __managed_dentry_set_managed(dentry);
251 spin_unlock(&dentry->d_lock);
252}
253
254static inline void __managed_dentry_clear_managed(struct dentry *dentry)
255{
256 dentry->d_flags &= ~(DCACHE_NEED_AUTOMOUNT|DCACHE_MANAGE_TRANSIT);
257}
258
259static inline void managed_dentry_clear_managed(struct dentry *dentry)
260{
261 spin_lock(&dentry->d_lock);
262 __managed_dentry_clear_managed(dentry);
263 spin_unlock(&dentry->d_lock);
264}
265
266
267
268int autofs4_fill_super(struct super_block *, void *, int);
269struct autofs_info *autofs4_new_ino(struct autofs_sb_info *);
270void autofs4_clean_ino(struct autofs_info *);
271
272static inline int autofs_prepare_pipe(struct file *pipe)
273{
274 if (!pipe->f_op || !pipe->f_op->write)
275 return -EINVAL;
276 if (!S_ISFIFO(pipe->f_dentry->d_inode->i_mode))
277 return -EINVAL;
278
279 pipe->f_flags |= O_DIRECT;
280 return 0;
281}
282
283
284
285int autofs4_wait(struct autofs_sb_info *,struct dentry *, enum autofs_notify);
286int autofs4_wait_release(struct autofs_sb_info *,autofs_wqt_t,int);
287void autofs4_catatonic_mode(struct autofs_sb_info *);
288
289static inline u32 autofs4_get_dev(struct autofs_sb_info *sbi)
290{
291 return new_encode_dev(sbi->sb->s_dev);
292}
293
294static inline u64 autofs4_get_ino(struct autofs_sb_info *sbi)
295{
296 return sbi->sb->s_root->d_inode->i_ino;
297}
298
299static inline int simple_positive(struct dentry *dentry)
300{
301 return dentry->d_inode && !d_unhashed(dentry);
302}
303
304static inline void __autofs4_add_expiring(struct dentry *dentry)
305{
306 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
307 struct autofs_info *ino = autofs4_dentry_ino(dentry);
308 if (ino) {
309 if (list_empty(&ino->expiring))
310 list_add(&ino->expiring, &sbi->expiring_list);
311 }
312 return;
313}
314
315static inline void autofs4_add_expiring(struct dentry *dentry)
316{
317 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
318 struct autofs_info *ino = autofs4_dentry_ino(dentry);
319 if (ino) {
320 spin_lock(&sbi->lookup_lock);
321 if (list_empty(&ino->expiring))
322 list_add(&ino->expiring, &sbi->expiring_list);
323 spin_unlock(&sbi->lookup_lock);
324 }
325 return;
326}
327
328static inline void autofs4_del_expiring(struct dentry *dentry)
329{
330 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
331 struct autofs_info *ino = autofs4_dentry_ino(dentry);
332 if (ino) {
333 spin_lock(&sbi->lookup_lock);
334 if (!list_empty(&ino->expiring))
335 list_del_init(&ino->expiring);
336 spin_unlock(&sbi->lookup_lock);
337 }
338 return;
339}
340
341extern void autofs4_kill_sb(struct super_block *);
342