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