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#ifdef DEBUG
43#define DPRINTK(fmt, args...) \
44do { \
45 printk(KERN_DEBUG "pid %d: %s: " fmt "\n", \
46 current->pid, __func__, ##args); \
47} while (0)
48#else
49#define DPRINTK(fmt, args...) do {} while (0)
50#endif
51
52#define AUTOFS_WARN(fmt, args...) \
53do { \
54 printk(KERN_WARNING "pid %d: %s: " fmt "\n", \
55 current->pid, __func__, ##args); \
56} while (0)
57
58#define AUTOFS_ERROR(fmt, args...) \
59do { \
60 printk(KERN_ERR "pid %d: %s: " fmt "\n", \
61 current->pid, __func__, ##args); \
62} while (0)
63
64extern spinlock_t autofs4_lock;
65
66
67
68
69
70
71
72struct autofs_info {
73 struct dentry *dentry;
74 struct inode *inode;
75
76 int flags;
77
78 struct completion expire_complete;
79
80 struct list_head active;
81 int active_count;
82
83 struct list_head expiring;
84
85 struct autofs_sb_info *sbi;
86 unsigned long last_used;
87 atomic_t count;
88
89 uid_t uid;
90 gid_t gid;
91};
92
93#define AUTOFS_INF_EXPIRING (1<<0)
94#define AUTOFS_INF_PENDING (1<<2)
95
96struct autofs_wait_queue {
97 wait_queue_head_t queue;
98 struct autofs_wait_queue *next;
99 autofs_wqt_t wait_queue_token;
100
101 struct qstr name;
102 u32 dev;
103 u64 ino;
104 uid_t uid;
105 gid_t gid;
106 pid_t pid;
107 pid_t tgid;
108
109 int status;
110 unsigned int wait_ctr;
111};
112
113#define AUTOFS_SBI_MAGIC 0x6d4a556d
114
115struct autofs_sb_info {
116 u32 magic;
117 int pipefd;
118 struct file *pipe;
119 pid_t oz_pgrp;
120 int catatonic;
121 int version;
122 int sub_version;
123 int min_proto;
124 int max_proto;
125 unsigned long exp_timeout;
126 unsigned int type;
127 int reghost_enabled;
128 int needs_reghost;
129 struct super_block *sb;
130 struct mutex wq_mutex;
131 spinlock_t fs_lock;
132 struct autofs_wait_queue *queues;
133 spinlock_t lookup_lock;
134 struct list_head active_list;
135 struct list_head expiring_list;
136};
137
138static inline struct autofs_sb_info *autofs4_sbi(struct super_block *sb)
139{
140 return (struct autofs_sb_info *)(sb->s_fs_info);
141}
142
143static inline struct autofs_info *autofs4_dentry_ino(struct dentry *dentry)
144{
145 return (struct autofs_info *)(dentry->d_fsdata);
146}
147
148
149
150
151
152static inline int autofs4_oz_mode(struct autofs_sb_info *sbi) {
153 return sbi->catatonic || task_pgrp_nr(current) == sbi->oz_pgrp;
154}
155
156
157static inline int autofs4_ispending(struct dentry *dentry)
158{
159 struct autofs_info *inf = autofs4_dentry_ino(dentry);
160
161 if (inf->flags & AUTOFS_INF_PENDING)
162 return 1;
163
164 if (inf->flags & AUTOFS_INF_EXPIRING)
165 return 1;
166
167 return 0;
168}
169
170struct inode *autofs4_get_inode(struct super_block *, mode_t);
171void autofs4_free_ino(struct autofs_info *);
172
173
174int is_autofs4_dentry(struct dentry *);
175int autofs4_expire_wait(struct dentry *dentry);
176int autofs4_expire_run(struct super_block *, struct vfsmount *,
177 struct autofs_sb_info *,
178 struct autofs_packet_expire __user *);
179int autofs4_do_expire_multi(struct super_block *sb, struct vfsmount *mnt,
180 struct autofs_sb_info *sbi, int when);
181int autofs4_expire_multi(struct super_block *, struct vfsmount *,
182 struct autofs_sb_info *, int __user *);
183struct dentry *autofs4_expire_direct(struct super_block *sb,
184 struct vfsmount *mnt,
185 struct autofs_sb_info *sbi, int how);
186struct dentry *autofs4_expire_indirect(struct super_block *sb,
187 struct vfsmount *mnt,
188 struct autofs_sb_info *sbi, int how);
189
190
191
192int autofs_dev_ioctl_init(void);
193void autofs_dev_ioctl_exit(void);
194
195
196
197extern const struct inode_operations autofs4_symlink_inode_operations;
198extern const struct inode_operations autofs4_dir_inode_operations;
199extern const struct file_operations autofs4_dir_operations;
200extern const struct file_operations autofs4_root_operations;
201extern const struct dentry_operations autofs4_dentry_operations;
202
203
204
205static inline void __managed_dentry_set_automount(struct dentry *dentry)
206{
207 dentry->d_flags |= DCACHE_NEED_AUTOMOUNT;
208}
209
210static inline void managed_dentry_set_automount(struct dentry *dentry)
211{
212 spin_lock(&dentry->d_lock);
213 __managed_dentry_set_automount(dentry);
214 spin_unlock(&dentry->d_lock);
215}
216
217static inline void __managed_dentry_clear_automount(struct dentry *dentry)
218{
219 dentry->d_flags &= ~DCACHE_NEED_AUTOMOUNT;
220}
221
222static inline void managed_dentry_clear_automount(struct dentry *dentry)
223{
224 spin_lock(&dentry->d_lock);
225 __managed_dentry_clear_automount(dentry);
226 spin_unlock(&dentry->d_lock);
227}
228
229static inline void __managed_dentry_set_transit(struct dentry *dentry)
230{
231 dentry->d_flags |= DCACHE_MANAGE_TRANSIT;
232}
233
234static inline void managed_dentry_set_transit(struct dentry *dentry)
235{
236 spin_lock(&dentry->d_lock);
237 __managed_dentry_set_transit(dentry);
238 spin_unlock(&dentry->d_lock);
239}
240
241static inline void __managed_dentry_clear_transit(struct dentry *dentry)
242{
243 dentry->d_flags &= ~DCACHE_MANAGE_TRANSIT;
244}
245
246static inline void managed_dentry_clear_transit(struct dentry *dentry)
247{
248 spin_lock(&dentry->d_lock);
249 __managed_dentry_clear_transit(dentry);
250 spin_unlock(&dentry->d_lock);
251}
252
253static inline void __managed_dentry_set_managed(struct dentry *dentry)
254{
255 dentry->d_flags |= (DCACHE_NEED_AUTOMOUNT|DCACHE_MANAGE_TRANSIT);
256}
257
258static inline void managed_dentry_set_managed(struct dentry *dentry)
259{
260 spin_lock(&dentry->d_lock);
261 __managed_dentry_set_managed(dentry);
262 spin_unlock(&dentry->d_lock);
263}
264
265static inline void __managed_dentry_clear_managed(struct dentry *dentry)
266{
267 dentry->d_flags &= ~(DCACHE_NEED_AUTOMOUNT|DCACHE_MANAGE_TRANSIT);
268}
269
270static inline void managed_dentry_clear_managed(struct dentry *dentry)
271{
272 spin_lock(&dentry->d_lock);
273 __managed_dentry_clear_managed(dentry);
274 spin_unlock(&dentry->d_lock);
275}
276
277
278
279int autofs4_fill_super(struct super_block *, void *, int);
280struct autofs_info *autofs4_new_ino(struct autofs_sb_info *);
281void autofs4_clean_ino(struct autofs_info *);
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