Blame view

fs/autofs4/autofs_i.h 7.59 KB
e9a7c2f1a   Ian Kent   autofs4: coding s...
1
2
3
  /*
   *  Copyright 1997-1998 Transmeta Corporation - All Rights Reserved
   *  Copyright 2005-2006 Ian Kent <raven@themaw.net>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
4
5
6
7
   *
   * This file is part of the Linux kernel and is made available under
   * the terms of the GNU General Public License, version 2, or at your
   * option, any later version, incorporated herein by reference.
e9a7c2f1a   Ian Kent   autofs4: coding s...
8
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9
10
11
12
  
  /* Internal header file for autofs */
  
  #include <linux/auto_fs4.h>
8d7b48e0b   Ian Kent   autofs4: add misc...
13
  #include <linux/auto_dev-ioctl.h>
1d5599e39   Ingo Molnar   [PATCH] sem2mutex...
14
  #include <linux/mutex.h>
b5c84bf6f   Nick Piggin   fs: dcache remove...
15
  #include <linux/spinlock.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
16
17
18
19
20
  #include <linux/list.h>
  
  /* This is the range of ioctl() numbers we claim as ours */
  #define AUTOFS_IOC_FIRST     AUTOFS_IOC_READY
  #define AUTOFS_IOC_COUNT     32
8d7b48e0b   Ian Kent   autofs4: add misc...
21
  #define AUTOFS_DEV_IOCTL_IOC_FIRST	(AUTOFS_DEV_IOCTL_VERSION)
aa8419367   Ian Kent   autofs: fix dev i...
22
23
  #define AUTOFS_DEV_IOCTL_IOC_COUNT \
  	(AUTOFS_DEV_IOCTL_ISMOUNTPOINT_CMD - AUTOFS_DEV_IOCTL_VERSION_CMD)
8d7b48e0b   Ian Kent   autofs4: add misc...
24

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
25
26
27
28
29
30
31
32
33
  #include <linux/kernel.h>
  #include <linux/slab.h>
  #include <linux/time.h>
  #include <linux/string.h>
  #include <linux/wait.h>
  #include <linux/sched.h>
  #include <linux/mount.h>
  #include <linux/namei.h>
  #include <asm/current.h>
e9a7c2f1a   Ian Kent   autofs4: coding s...
34
  #include <linux/uaccess.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35

8a78d5930   Ian Kent   autofs4: use pr_x...
36
37
38
39
  #ifdef pr_fmt
  #undef pr_fmt
  #endif
  #define pr_fmt(fmt) KBUILD_MODNAME ":pid:%d:%s: " fmt, current->pid, __func__
8d7b48e0b   Ian Kent   autofs4: add misc...
40

e9a7c2f1a   Ian Kent   autofs4: coding s...
41
42
43
44
45
46
47
48
  /*
   * Unified info structure.  This is pointed to by both the dentry and
   * inode structures.  Each file in the filesystem has an instance of this
   * structure.  It holds a reference to the dentry, so dentries are never
   * flushed while the file exists.  All name lookups are dealt with at the
   * dentry level, although the filesystem can interfere in the validation
   * process.  Readdir is implemented by traversing the dentry lists.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
50
51
52
53
  struct autofs_info {
  	struct dentry	*dentry;
  	struct inode	*inode;
  
  	int		flags;
6e60a9ab5   Ian Kent   autofs4: fix dire...
54
  	struct completion expire_complete;
257673787   Ian Kent   autofs4: use look...
55
  	struct list_head active;
4f8427d19   Ian Kent   autofs4: use help...
56
  	int active_count;
5f6f4f28b   Ian Kent   autofs4: don't ma...
57
  	struct list_head expiring;
f50b6f869   Ian Kent   [PATCH] autofs4: ...
58

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59
60
  	struct autofs_sb_info *sbi;
  	unsigned long last_used;
1aff3c8b0   Ian Kent   [PATCH] autofs4: ...
61
  	atomic_t count;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
62

45634cd8c   Eric W. Biederman   userns: Support a...
63
64
  	kuid_t uid;
  	kgid_t gid;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
65
  };
e9a7c2f1a   Ian Kent   autofs4: coding s...
66
  #define AUTOFS_INF_EXPIRING	(1<<0) /* dentry in the process of expiring */
ea01a1849   Al Viro   autofs races
67
  #define AUTOFS_INF_WANT_EXPIRE	(1<<1) /* the dentry is being considered
4d885f90e   NeilBrown   autofs4: avoid ta...
68
  					* for expiry, so RCU_walk is
ea01a1849   Al Viro   autofs races
69
70
71
72
73
  					* not permitted.  If it progresses to
  					* actual expiry attempt, the flag is
  					* not cleared when EXPIRING is set -
  					* in that case it gets cleared only
  					* when it comes to clearing EXPIRING.
4d885f90e   NeilBrown   autofs4: avoid ta...
74
  					*/
aa952eb26   Ian Kent   autofs4: use auto...
75
  #define AUTOFS_INF_PENDING	(1<<2) /* dentry pending mount */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
76
77
78
79
80
81
  
  struct autofs_wait_queue {
  	wait_queue_head_t queue;
  	struct autofs_wait_queue *next;
  	autofs_wqt_t wait_queue_token;
  	/* We use the following to see what we are waiting for */
70b52a0a5   Jeff Moyer   autofs4: use stru...
82
  	struct qstr name;
5c0a32fc2   Ian Kent   [PATCH] autofs4: ...
83
84
  	u32 dev;
  	u64 ino;
45634cd8c   Eric W. Biederman   userns: Support a...
85
86
  	kuid_t uid;
  	kgid_t gid;
5c0a32fc2   Ian Kent   [PATCH] autofs4: ...
87
88
  	pid_t pid;
  	pid_t tgid;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
89
90
  	/* This is for status reporting upon return */
  	int status;
296f7bf78   Ian Kent   autofs4: fix wait...
91
  	unsigned int wait_ctr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92
93
94
95
96
97
  };
  
  #define AUTOFS_SBI_MAGIC 0x6d4a556d
  
  struct autofs_sb_info {
  	u32 magic;
d7c4a5f10   Ian Kent   [PATCH] autofs4: ...
98
  	int pipefd;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
99
  	struct file *pipe;
6eaba35b4   Sukadev Bhattiprolu   autofs4: allow au...
100
  	struct pid *oz_pgrp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101
102
103
  	int catatonic;
  	int version;
  	int sub_version;
d7c4a5f10   Ian Kent   [PATCH] autofs4: ...
104
105
  	int min_proto;
  	int max_proto;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
106
  	unsigned long exp_timeout;
34ca959cf   Ian Kent   [PATCH] autofs4: ...
107
  	unsigned int type;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
108
  	struct super_block *sb;
1d5599e39   Ingo Molnar   [PATCH] sem2mutex...
109
  	struct mutex wq_mutex;
d668dc566   Al Viro   autofs4: deal wit...
110
  	struct mutex pipe_mutex;
3a9720ce7   Ian Kent   [PATCH] autofs4: ...
111
  	spinlock_t fs_lock;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
112
  	struct autofs_wait_queue *queues; /* Wait queue pointer */
5f6f4f28b   Ian Kent   autofs4: don't ma...
113
  	spinlock_t lookup_lock;
257673787   Ian Kent   autofs4: use look...
114
  	struct list_head active_list;
5f6f4f28b   Ian Kent   autofs4: don't ma...
115
  	struct list_head expiring_list;
baa40671d   Al Viro   autofs4: make fre...
116
  	struct rcu_head rcu;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
117
118
119
120
121
122
123
124
125
126
127
128
129
  };
  
  static inline struct autofs_sb_info *autofs4_sbi(struct super_block *sb)
  {
  	return (struct autofs_sb_info *)(sb->s_fs_info);
  }
  
  static inline struct autofs_info *autofs4_dentry_ino(struct dentry *dentry)
  {
  	return (struct autofs_info *)(dentry->d_fsdata);
  }
  
  /* autofs4_oz_mode(): do we see the man behind the curtain?  (The
e9a7c2f1a   Ian Kent   autofs4: coding s...
130
131
132
133
134
   * processes which do manipulations for us in user space sees the raw
   * filesystem without "magic".)
   */
  static inline int autofs4_oz_mode(struct autofs_sb_info *sbi)
  {
6eaba35b4   Sukadev Bhattiprolu   autofs4: allow au...
135
  	return sbi->catatonic || task_pgrp(current) == sbi->oz_pgrp;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
136
  }
030a8ba48   Al Viro   autofs4: propagat...
137
  struct inode *autofs4_get_inode(struct super_block *, umode_t);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
138
139
140
141
  void autofs4_free_ino(struct autofs_info *);
  
  /* Expiration */
  int is_autofs4_dentry(struct dentry *);
74f504cff   Ian Kent   autofs: change au...
142
  int autofs4_expire_wait(const struct path *path, int rcu_walk);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
143
  int autofs4_expire_run(struct super_block *, struct vfsmount *,
e9a7c2f1a   Ian Kent   autofs4: coding s...
144
145
  		       struct autofs_sb_info *,
  		       struct autofs_packet_expire __user *);
56fcef751   Ian Kent   autofs4: cleanup ...
146
147
  int autofs4_do_expire_multi(struct super_block *sb, struct vfsmount *mnt,
  			    struct autofs_sb_info *sbi, int when);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
148
  int autofs4_expire_multi(struct super_block *, struct vfsmount *,
e9a7c2f1a   Ian Kent   autofs4: coding s...
149
  			 struct autofs_sb_info *, int __user *);
8d7b48e0b   Ian Kent   autofs4: add misc...
150
151
152
153
154
155
156
157
158
159
160
  struct dentry *autofs4_expire_direct(struct super_block *sb,
  				     struct vfsmount *mnt,
  				     struct autofs_sb_info *sbi, int how);
  struct dentry *autofs4_expire_indirect(struct super_block *sb,
  				       struct vfsmount *mnt,
  				       struct autofs_sb_info *sbi, int how);
  
  /* Device node initialization */
  
  int autofs_dev_ioctl_init(void);
  void autofs_dev_ioctl_exit(void);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
161
162
  
  /* Operations structures */
754661f14   Arjan van de Ven   [PATCH] mark stru...
163
164
  extern const struct inode_operations autofs4_symlink_inode_operations;
  extern const struct inode_operations autofs4_dir_inode_operations;
4b6f5d20b   Arjan van de Ven   [PATCH] Make most...
165
166
  extern const struct file_operations autofs4_dir_operations;
  extern const struct file_operations autofs4_root_operations;
71e469db2   Ian Kent   autofs4: Clean up...
167
  extern const struct dentry_operations autofs4_dentry_operations;
10584211e   Ian Kent   autofs4: Add d_au...
168
169
  
  /* VFS automount flags management functions */
b5b801779   Ian Kent   autofs4: Add d_ma...
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
  static inline void __managed_dentry_set_managed(struct dentry *dentry)
  {
  	dentry->d_flags |= (DCACHE_NEED_AUTOMOUNT|DCACHE_MANAGE_TRANSIT);
  }
  
  static inline void managed_dentry_set_managed(struct dentry *dentry)
  {
  	spin_lock(&dentry->d_lock);
  	__managed_dentry_set_managed(dentry);
  	spin_unlock(&dentry->d_lock);
  }
  
  static inline void __managed_dentry_clear_managed(struct dentry *dentry)
  {
  	dentry->d_flags &= ~(DCACHE_NEED_AUTOMOUNT|DCACHE_MANAGE_TRANSIT);
  }
  
  static inline void managed_dentry_clear_managed(struct dentry *dentry)
  {
  	spin_lock(&dentry->d_lock);
  	__managed_dentry_clear_managed(dentry);
  	spin_unlock(&dentry->d_lock);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
193
194
195
  /* Initializing function */
  
  int autofs4_fill_super(struct super_block *, void *, int);
26e6c9106   Al Viro   autofs4: split au...
196
197
  struct autofs_info *autofs4_new_ino(struct autofs_sb_info *);
  void autofs4_clean_ino(struct autofs_info *);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
198

64f371bc3   Linus Torvalds   autofs: make the ...
199
200
  static inline int autofs_prepare_pipe(struct file *pipe)
  {
a35fb914a   Al Viro   autofs: switch to...
201
  	if (!(pipe->f_mode & FMODE_CAN_WRITE))
64f371bc3   Linus Torvalds   autofs: make the ...
202
  		return -EINVAL;
496ad9aa8   Al Viro   new helper: file_...
203
  	if (!S_ISFIFO(file_inode(pipe)->i_mode))
64f371bc3   Linus Torvalds   autofs: make the ...
204
205
206
207
208
  		return -EINVAL;
  	/* We want a packet pipe */
  	pipe->f_flags |= O_DIRECT;
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
209
  /* Queue management functions */
dd36a882e   Ian Kent   autofs: change au...
210
211
  int autofs4_wait(struct autofs_sb_info *,
  		 const struct path *, enum autofs_notify);
e9a7c2f1a   Ian Kent   autofs4: coding s...
212
  int autofs4_wait_release(struct autofs_sb_info *, autofs_wqt_t, int);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
213
  void autofs4_catatonic_mode(struct autofs_sb_info *);
5c0a32fc2   Ian Kent   [PATCH] autofs4: ...
214
215
216
217
218
219
220
  static inline u32 autofs4_get_dev(struct autofs_sb_info *sbi)
  {
  	return new_encode_dev(sbi->sb->s_dev);
  }
  
  static inline u64 autofs4_get_ino(struct autofs_sb_info *sbi)
  {
2b0143b5c   David Howells   VFS: normal files...
221
  	return d_inode(sbi->sb->s_root)->i_ino;
5c0a32fc2   Ian Kent   [PATCH] autofs4: ...
222
  }
2fd6b7f50   Nick Piggin   fs: dcache scale ...
223
224
225
226
  static inline void __autofs4_add_expiring(struct dentry *dentry)
  {
  	struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
  	struct autofs_info *ino = autofs4_dentry_ino(dentry);
e9a7c2f1a   Ian Kent   autofs4: coding s...
227

2fd6b7f50   Nick Piggin   fs: dcache scale ...
228
229
230
231
  	if (ino) {
  		if (list_empty(&ino->expiring))
  			list_add(&ino->expiring, &sbi->expiring_list);
  	}
2fd6b7f50   Nick Piggin   fs: dcache scale ...
232
  }
c4cd70b3e   Ian Kent   autofs4: use help...
233
234
235
236
  static inline void autofs4_add_expiring(struct dentry *dentry)
  {
  	struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
  	struct autofs_info *ino = autofs4_dentry_ino(dentry);
e9a7c2f1a   Ian Kent   autofs4: coding s...
237

c4cd70b3e   Ian Kent   autofs4: use help...
238
239
240
241
242
243
  	if (ino) {
  		spin_lock(&sbi->lookup_lock);
  		if (list_empty(&ino->expiring))
  			list_add(&ino->expiring, &sbi->expiring_list);
  		spin_unlock(&sbi->lookup_lock);
  	}
c4cd70b3e   Ian Kent   autofs4: use help...
244
245
246
247
248
249
  }
  
  static inline void autofs4_del_expiring(struct dentry *dentry)
  {
  	struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
  	struct autofs_info *ino = autofs4_dentry_ino(dentry);
e9a7c2f1a   Ian Kent   autofs4: coding s...
250

c4cd70b3e   Ian Kent   autofs4: use help...
251
252
253
254
255
256
  	if (ino) {
  		spin_lock(&sbi->lookup_lock);
  		if (!list_empty(&ino->expiring))
  			list_del_init(&ino->expiring);
  		spin_unlock(&sbi->lookup_lock);
  	}
c4cd70b3e   Ian Kent   autofs4: use help...
257
  }
4a44c1859   Tomohiro Kusumi   autofs: drop unne...
258
  void autofs4_kill_sb(struct super_block *);