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/list.h>
20
21
22#define AUTOFS_IOC_FIRST AUTOFS_IOC_READY
23#define AUTOFS_IOC_COUNT 32
24
25#define AUTOFS_DEV_IOCTL_IOC_FIRST (AUTOFS_DEV_IOCTL_VERSION)
26#define AUTOFS_DEV_IOCTL_IOC_COUNT (AUTOFS_IOC_COUNT - 11)
27
28#include <linux/kernel.h>
29#include <linux/slab.h>
30#include <linux/time.h>
31#include <linux/string.h>
32#include <linux/wait.h>
33#include <linux/sched.h>
34#include <linux/mount.h>
35#include <linux/namei.h>
36#include <asm/current.h>
37#include <asm/uaccess.h>
38
39
40
41#ifdef DEBUG
42#define DPRINTK(fmt, args...) \
43do { \
44 printk(KERN_DEBUG "pid %d: %s: " fmt "\n", \
45 current->pid, __func__, ##args); \
46} while (0)
47#else
48#define DPRINTK(fmt, args...) do {} while (0)
49#endif
50
51#define AUTOFS_WARN(fmt, args...) \
52do { \
53 printk(KERN_WARNING "pid %d: %s: " fmt "\n", \
54 current->pid, __func__, ##args); \
55} while (0)
56
57#define AUTOFS_ERROR(fmt, args...) \
58do { \
59 printk(KERN_ERR "pid %d: %s: " fmt "\n", \
60 current->pid, __func__, ##args); \
61} while (0)
62
63
64
65
66
67
68
69struct autofs_info {
70 struct dentry *dentry;
71 struct inode *inode;
72
73 int flags;
74
75 struct completion expire_complete;
76
77 struct list_head active;
78 struct list_head expiring;
79
80 struct autofs_sb_info *sbi;
81 unsigned long last_used;
82 atomic_t count;
83
84 uid_t uid;
85 gid_t gid;
86
87 mode_t mode;
88 size_t size;
89
90 void (*free)(struct autofs_info *);
91 union {
92 const char *symlink;
93 } u;
94};
95
96#define AUTOFS_INF_EXPIRING (1<<0)
97#define AUTOFS_INF_MOUNTPOINT (1<<1)
98
99struct autofs_wait_queue {
100 wait_queue_head_t queue;
101 struct autofs_wait_queue *next;
102 autofs_wqt_t wait_queue_token;
103
104 struct qstr name;
105 u32 dev;
106 u64 ino;
107 uid_t uid;
108 gid_t gid;
109 pid_t pid;
110 pid_t tgid;
111
112 int status;
113 unsigned int wait_ctr;
114};
115
116#define AUTOFS_SBI_MAGIC 0x6d4a556d
117
118struct autofs_sb_info {
119 u32 magic;
120 int pipefd;
121 struct file *pipe;
122 pid_t oz_pgrp;
123 int catatonic;
124 int version;
125 int sub_version;
126 int min_proto;
127 int max_proto;
128 unsigned long exp_timeout;
129 unsigned int type;
130 int reghost_enabled;
131 int needs_reghost;
132 struct super_block *sb;
133 struct mutex wq_mutex;
134 spinlock_t fs_lock;
135 struct autofs_wait_queue *queues;
136 spinlock_t lookup_lock;
137 struct list_head active_list;
138 struct list_head expiring_list;
139};
140
141static inline struct autofs_sb_info *autofs4_sbi(struct super_block *sb)
142{
143 return (struct autofs_sb_info *)(sb->s_fs_info);
144}
145
146static inline struct autofs_info *autofs4_dentry_ino(struct dentry *dentry)
147{
148 return (struct autofs_info *)(dentry->d_fsdata);
149}
150
151
152
153
154
155static inline int autofs4_oz_mode(struct autofs_sb_info *sbi) {
156 return sbi->catatonic || task_pgrp_nr(current) == sbi->oz_pgrp;
157}
158
159
160static inline int autofs4_ispending(struct dentry *dentry)
161{
162 struct autofs_info *inf = autofs4_dentry_ino(dentry);
163
164 if (dentry->d_flags & DCACHE_AUTOFS_PENDING)
165 return 1;
166
167 if (inf->flags & AUTOFS_INF_EXPIRING)
168 return 1;
169
170 return 0;
171}
172
173static inline void autofs4_copy_atime(struct file *src, struct file *dst)
174{
175 dst->f_path.dentry->d_inode->i_atime =
176 src->f_path.dentry->d_inode->i_atime;
177 return;
178}
179
180struct inode *autofs4_get_inode(struct super_block *, struct autofs_info *);
181void autofs4_free_ino(struct autofs_info *);
182
183
184int is_autofs4_dentry(struct dentry *);
185int autofs4_expire_wait(struct dentry *dentry);
186int autofs4_expire_run(struct super_block *, struct vfsmount *,
187 struct autofs_sb_info *,
188 struct autofs_packet_expire __user *);
189int autofs4_do_expire_multi(struct super_block *sb, struct vfsmount *mnt,
190 struct autofs_sb_info *sbi, int when);
191int autofs4_expire_multi(struct super_block *, struct vfsmount *,
192 struct autofs_sb_info *, int __user *);
193struct dentry *autofs4_expire_direct(struct super_block *sb,
194 struct vfsmount *mnt,
195 struct autofs_sb_info *sbi, int how);
196struct dentry *autofs4_expire_indirect(struct super_block *sb,
197 struct vfsmount *mnt,
198 struct autofs_sb_info *sbi, int how);
199
200
201
202int autofs_dev_ioctl_init(void);
203void autofs_dev_ioctl_exit(void);
204
205
206
207extern const struct inode_operations autofs4_symlink_inode_operations;
208extern const struct inode_operations autofs4_dir_inode_operations;
209extern const struct inode_operations autofs4_root_inode_operations;
210extern const struct inode_operations autofs4_indirect_root_inode_operations;
211extern const struct inode_operations autofs4_direct_root_inode_operations;
212extern const struct file_operations autofs4_dir_operations;
213extern const struct file_operations autofs4_root_operations;
214
215
216
217int autofs4_fill_super(struct super_block *, void *, int);
218struct autofs_info *autofs4_init_ino(struct autofs_info *, struct autofs_sb_info *sbi, mode_t mode);
219
220
221
222int autofs4_wait(struct autofs_sb_info *,struct dentry *, enum autofs_notify);
223int autofs4_wait_release(struct autofs_sb_info *,autofs_wqt_t,int);
224void autofs4_catatonic_mode(struct autofs_sb_info *);
225
226static inline int autofs4_follow_mount(struct path *path)
227{
228 int res = 0;
229
230 while (d_mountpoint(path->dentry)) {
231 int followed = follow_down(path);
232 if (!followed)
233 break;
234 res = 1;
235 }
236 return res;
237}
238
239static inline u32 autofs4_get_dev(struct autofs_sb_info *sbi)
240{
241 return new_encode_dev(sbi->sb->s_dev);
242}
243
244static inline u64 autofs4_get_ino(struct autofs_sb_info *sbi)
245{
246 return sbi->sb->s_root->d_inode->i_ino;
247}
248
249static inline int simple_positive(struct dentry *dentry)
250{
251 return dentry->d_inode && !d_unhashed(dentry);
252}
253
254static inline int __simple_empty(struct dentry *dentry)
255{
256 struct dentry *child;
257 int ret = 0;
258
259 list_for_each_entry(child, &dentry->d_subdirs, d_u.d_child)
260 if (simple_positive(child))
261 goto out;
262 ret = 1;
263out:
264 return ret;
265}
266
267void autofs4_dentry_release(struct dentry *);
268extern void autofs4_kill_sb(struct super_block *);
269