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
64
65
66
67
68
69
70struct autofs_info {
71 struct dentry *dentry;
72 struct inode *inode;
73
74 int flags;
75
76 struct completion expire_complete;
77
78 struct list_head active;
79 int active_count;
80
81 struct list_head expiring;
82
83 struct autofs_sb_info *sbi;
84 unsigned long last_used;
85 atomic_t count;
86
87 uid_t uid;
88 gid_t gid;
89};
90
91#define AUTOFS_INF_EXPIRING (1<<0)
92#define AUTOFS_INF_PENDING (1<<2)
93
94struct autofs_wait_queue {
95 wait_queue_head_t queue;
96 struct autofs_wait_queue *next;
97 autofs_wqt_t wait_queue_token;
98
99 struct qstr name;
100 u32 dev;
101 u64 ino;
102 uid_t uid;
103 gid_t gid;
104 pid_t pid;
105 pid_t tgid;
106
107 int status;
108 unsigned int wait_ctr;
109};
110
111#define AUTOFS_SBI_MAGIC 0x6d4a556d
112
113struct autofs_sb_info {
114 u32 magic;
115 int pipefd;
116 struct file *pipe;
117 pid_t oz_pgrp;
118 int catatonic;
119 int version;
120 int sub_version;
121 int min_proto;
122 int max_proto;
123 unsigned long exp_timeout;
124 unsigned int type;
125 int reghost_enabled;
126 int needs_reghost;
127 struct super_block *sb;
128 struct mutex wq_mutex;
129 spinlock_t fs_lock;
130 struct autofs_wait_queue *queues;
131 spinlock_t lookup_lock;
132 struct list_head active_list;
133 struct list_head expiring_list;
134};
135
136static inline struct autofs_sb_info *autofs4_sbi(struct super_block *sb)
137{
138 return (struct autofs_sb_info *)(sb->s_fs_info);
139}
140
141static inline struct autofs_info *autofs4_dentry_ino(struct dentry *dentry)
142{
143 return (struct autofs_info *)(dentry->d_fsdata);
144}
145
146
147
148
149
150static inline int autofs4_oz_mode(struct autofs_sb_info *sbi) {
151 return sbi->catatonic || task_pgrp_nr(current) == sbi->oz_pgrp;
152}
153
154
155static inline int autofs4_ispending(struct dentry *dentry)
156{
157 struct autofs_info *inf = autofs4_dentry_ino(dentry);
158
159 if (inf->flags & AUTOFS_INF_PENDING)
160 return 1;
161
162 if (inf->flags & AUTOFS_INF_EXPIRING)
163 return 1;
164
165 return 0;
166}
167
168struct inode *autofs4_get_inode(struct super_block *, mode_t);
169void autofs4_free_ino(struct autofs_info *);
170
171
172int is_autofs4_dentry(struct dentry *);
173int autofs4_expire_wait(struct dentry *dentry);
174int autofs4_expire_run(struct super_block *, struct vfsmount *,
175 struct autofs_sb_info *,
176 struct autofs_packet_expire __user *);
177int autofs4_do_expire_multi(struct super_block *sb, struct vfsmount *mnt,
178 struct autofs_sb_info *sbi, int when);
179int autofs4_expire_multi(struct super_block *, struct vfsmount *,
180 struct autofs_sb_info *, int __user *);
181struct dentry *autofs4_expire_direct(struct super_block *sb,
182 struct vfsmount *mnt,
183 struct autofs_sb_info *sbi, int how);
184struct dentry *autofs4_expire_indirect(struct super_block *sb,
185 struct vfsmount *mnt,
186 struct autofs_sb_info *sbi, int how);
187
188
189
190int autofs_dev_ioctl_init(void);
191void autofs_dev_ioctl_exit(void);
192
193
194
195extern const struct inode_operations autofs4_symlink_inode_operations;
196extern const struct inode_operations autofs4_dir_inode_operations;
197extern const struct file_operations autofs4_dir_operations;
198extern const struct file_operations autofs4_root_operations;
199extern const struct dentry_operations autofs4_dentry_operations;
200
201
202
203static inline void __managed_dentry_set_automount(struct dentry *dentry)
204{
205 dentry->d_flags |= DCACHE_NEED_AUTOMOUNT;
206}
207
208static inline void managed_dentry_set_automount(struct dentry *dentry)
209{
210 spin_lock(&dentry->d_lock);
211 __managed_dentry_set_automount(dentry);
212 spin_unlock(&dentry->d_lock);
213}
214
215static inline void __managed_dentry_clear_automount(struct dentry *dentry)
216{
217 dentry->d_flags &= ~DCACHE_NEED_AUTOMOUNT;
218}
219
220static inline void managed_dentry_clear_automount(struct dentry *dentry)
221{
222 spin_lock(&dentry->d_lock);
223 __managed_dentry_clear_automount(dentry);
224 spin_unlock(&dentry->d_lock);
225}
226
227static inline void __managed_dentry_set_transit(struct dentry *dentry)
228{
229 dentry->d_flags |= DCACHE_MANAGE_TRANSIT;
230}
231
232static inline void managed_dentry_set_transit(struct dentry *dentry)
233{
234 spin_lock(&dentry->d_lock);
235 __managed_dentry_set_transit(dentry);
236 spin_unlock(&dentry->d_lock);
237}
238
239static inline void __managed_dentry_clear_transit(struct dentry *dentry)
240{
241 dentry->d_flags &= ~DCACHE_MANAGE_TRANSIT;
242}
243
244static inline void managed_dentry_clear_transit(struct dentry *dentry)
245{
246 spin_lock(&dentry->d_lock);
247 __managed_dentry_clear_transit(dentry);
248 spin_unlock(&dentry->d_lock);
249}
250
251static inline void __managed_dentry_set_managed(struct dentry *dentry)
252{
253 dentry->d_flags |= (DCACHE_NEED_AUTOMOUNT|DCACHE_MANAGE_TRANSIT);
254}
255
256static inline void managed_dentry_set_managed(struct dentry *dentry)
257{
258 spin_lock(&dentry->d_lock);
259 __managed_dentry_set_managed(dentry);
260 spin_unlock(&dentry->d_lock);
261}
262
263static inline void __managed_dentry_clear_managed(struct dentry *dentry)
264{
265 dentry->d_flags &= ~(DCACHE_NEED_AUTOMOUNT|DCACHE_MANAGE_TRANSIT);
266}
267
268static inline void managed_dentry_clear_managed(struct dentry *dentry)
269{
270 spin_lock(&dentry->d_lock);
271 __managed_dentry_clear_managed(dentry);
272 spin_unlock(&dentry->d_lock);
273}
274
275
276
277int autofs4_fill_super(struct super_block *, void *, int);
278struct autofs_info *autofs4_new_ino(struct autofs_sb_info *);
279void autofs4_clean_ino(struct autofs_info *);
280
281
282
283int autofs4_wait(struct autofs_sb_info *,struct dentry *, enum autofs_notify);
284int autofs4_wait_release(struct autofs_sb_info *,autofs_wqt_t,int);
285void autofs4_catatonic_mode(struct autofs_sb_info *);
286
287static inline u32 autofs4_get_dev(struct autofs_sb_info *sbi)
288{
289 return new_encode_dev(sbi->sb->s_dev);
290}
291
292static inline u64 autofs4_get_ino(struct autofs_sb_info *sbi)
293{
294 return sbi->sb->s_root->d_inode->i_ino;
295}
296
297static inline int simple_positive(struct dentry *dentry)
298{
299 return dentry->d_inode && !d_unhashed(dentry);
300}
301
302static inline void __autofs4_add_expiring(struct dentry *dentry)
303{
304 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
305 struct autofs_info *ino = autofs4_dentry_ino(dentry);
306 if (ino) {
307 if (list_empty(&ino->expiring))
308 list_add(&ino->expiring, &sbi->expiring_list);
309 }
310 return;
311}
312
313static inline void autofs4_add_expiring(struct dentry *dentry)
314{
315 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
316 struct autofs_info *ino = autofs4_dentry_ino(dentry);
317 if (ino) {
318 spin_lock(&sbi->lookup_lock);
319 if (list_empty(&ino->expiring))
320 list_add(&ino->expiring, &sbi->expiring_list);
321 spin_unlock(&sbi->lookup_lock);
322 }
323 return;
324}
325
326static inline void autofs4_del_expiring(struct dentry *dentry)
327{
328 struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
329 struct autofs_info *ino = autofs4_dentry_ino(dentry);
330 if (ino) {
331 spin_lock(&sbi->lookup_lock);
332 if (!list_empty(&ino->expiring))
333 list_del_init(&ino->expiring);
334 spin_unlock(&sbi->lookup_lock);
335 }
336 return;
337}
338
339extern void autofs4_kill_sb(struct super_block *);
340