autofs4: device node ioctl documentation
[linux-2.6-block.git] / fs / autofs4 / autofs_i.h
CommitLineData
1da177e4
LT
1/* -*- c -*- ------------------------------------------------------------- *
2 *
3 * linux/fs/autofs/autofs_i.h
4 *
5 * Copyright 1997-1998 Transmeta Corporation - All Rights Reserved
34ca959c 6 * Copyright 2005-2006 Ian Kent <raven@themaw.net>
1da177e4
LT
7 *
8 * This file is part of the Linux kernel and is made available under
9 * the terms of the GNU General Public License, version 2, or at your
10 * option, any later version, incorporated herein by reference.
11 *
12 * ----------------------------------------------------------------------- */
13
14/* Internal header file for autofs */
15
16#include <linux/auto_fs4.h>
1d5599e3 17#include <linux/mutex.h>
1da177e4
LT
18#include <linux/list.h>
19
20/* This is the range of ioctl() numbers we claim as ours */
21#define AUTOFS_IOC_FIRST AUTOFS_IOC_READY
22#define AUTOFS_IOC_COUNT 32
23
bb979d7f
IK
24#define AUTOFS_TYPE_TRIGGER (AUTOFS_TYPE_DIRECT|AUTOFS_TYPE_OFFSET)
25
1da177e4
LT
26#include <linux/kernel.h>
27#include <linux/slab.h>
28#include <linux/time.h>
29#include <linux/string.h>
30#include <linux/wait.h>
31#include <linux/sched.h>
32#include <linux/mount.h>
33#include <linux/namei.h>
34#include <asm/current.h>
35#include <asm/uaccess.h>
36
37/* #define DEBUG */
38
39#ifdef DEBUG
8e24eea7 40#define DPRINTK(fmt,args...) do { printk(KERN_DEBUG "pid %d: %s: " fmt "\n" , current->pid , __func__ , ##args); } while(0)
1da177e4
LT
41#else
42#define DPRINTK(fmt,args...) do {} while(0)
43#endif
44
1da177e4
LT
45/* Unified info structure. This is pointed to by both the dentry and
46 inode structures. Each file in the filesystem has an instance of this
47 structure. It holds a reference to the dentry, so dentries are never
48 flushed while the file exists. All name lookups are dealt with at the
49 dentry level, although the filesystem can interfere in the validation
50 process. Readdir is implemented by traversing the dentry lists. */
51struct autofs_info {
52 struct dentry *dentry;
53 struct inode *inode;
54
55 int flags;
56
6e60a9ab
IK
57 struct completion expire_complete;
58
25767378 59 struct list_head active;
5f6f4f28 60 struct list_head expiring;
f50b6f86 61
1da177e4
LT
62 struct autofs_sb_info *sbi;
63 unsigned long last_used;
1aff3c8b 64 atomic_t count;
1da177e4 65
c0f54d3e
IK
66 uid_t uid;
67 gid_t gid;
68
1da177e4
LT
69 mode_t mode;
70 size_t size;
71
72 void (*free)(struct autofs_info *);
73 union {
74 const char *symlink;
75 } u;
76};
77
78#define AUTOFS_INF_EXPIRING (1<<0) /* dentry is in the process of expiring */
6e60a9ab 79#define AUTOFS_INF_MOUNTPOINT (1<<1) /* mountpoint status for direct expire */
1da177e4
LT
80
81struct autofs_wait_queue {
82 wait_queue_head_t queue;
83 struct autofs_wait_queue *next;
84 autofs_wqt_t wait_queue_token;
85 /* We use the following to see what we are waiting for */
70b52a0a 86 struct qstr name;
5c0a32fc
IK
87 u32 dev;
88 u64 ino;
89 uid_t uid;
90 gid_t gid;
91 pid_t pid;
92 pid_t tgid;
1da177e4
LT
93 /* This is for status reporting upon return */
94 int status;
296f7bf7 95 unsigned int wait_ctr;
1da177e4
LT
96};
97
98#define AUTOFS_SBI_MAGIC 0x6d4a556d
99
100struct autofs_sb_info {
101 u32 magic;
d7c4a5f1 102 int pipefd;
1da177e4
LT
103 struct file *pipe;
104 pid_t oz_pgrp;
105 int catatonic;
106 int version;
107 int sub_version;
d7c4a5f1
IK
108 int min_proto;
109 int max_proto;
1da177e4 110 unsigned long exp_timeout;
34ca959c 111 unsigned int type;
1da177e4
LT
112 int reghost_enabled;
113 int needs_reghost;
114 struct super_block *sb;
1d5599e3 115 struct mutex wq_mutex;
3a9720ce 116 spinlock_t fs_lock;
1da177e4 117 struct autofs_wait_queue *queues; /* Wait queue pointer */
5f6f4f28 118 spinlock_t lookup_lock;
25767378 119 struct list_head active_list;
5f6f4f28 120 struct list_head expiring_list;
1da177e4
LT
121};
122
123static inline struct autofs_sb_info *autofs4_sbi(struct super_block *sb)
124{
125 return (struct autofs_sb_info *)(sb->s_fs_info);
126}
127
128static inline struct autofs_info *autofs4_dentry_ino(struct dentry *dentry)
129{
130 return (struct autofs_info *)(dentry->d_fsdata);
131}
132
133/* autofs4_oz_mode(): do we see the man behind the curtain? (The
134 processes which do manipulations for us in user space sees the raw
135 filesystem without "magic".) */
136
137static inline int autofs4_oz_mode(struct autofs_sb_info *sbi) {
a47afb0f 138 return sbi->catatonic || task_pgrp_nr(current) == sbi->oz_pgrp;
1da177e4
LT
139}
140
141/* Does a dentry have some pending activity? */
142static inline int autofs4_ispending(struct dentry *dentry)
143{
144 struct autofs_info *inf = autofs4_dentry_ino(dentry);
145
3a9720ce
IK
146 if (dentry->d_flags & DCACHE_AUTOFS_PENDING)
147 return 1;
148
97e7449a
IK
149 if (inf->flags & AUTOFS_INF_EXPIRING)
150 return 1;
3a9720ce 151
97e7449a 152 return 0;
1da177e4
LT
153}
154
155static inline void autofs4_copy_atime(struct file *src, struct file *dst)
156{
a4669ed8
JJS
157 dst->f_path.dentry->d_inode->i_atime =
158 src->f_path.dentry->d_inode->i_atime;
1da177e4
LT
159 return;
160}
161
162struct inode *autofs4_get_inode(struct super_block *, struct autofs_info *);
163void autofs4_free_ino(struct autofs_info *);
164
165/* Expiration */
166int is_autofs4_dentry(struct dentry *);
06a35985 167int autofs4_expire_wait(struct dentry *dentry);
1da177e4
LT
168int autofs4_expire_run(struct super_block *, struct vfsmount *,
169 struct autofs_sb_info *,
170 struct autofs_packet_expire __user *);
171int autofs4_expire_multi(struct super_block *, struct vfsmount *,
172 struct autofs_sb_info *, int __user *);
173
174/* Operations structures */
175
754661f1
AV
176extern const struct inode_operations autofs4_symlink_inode_operations;
177extern const struct inode_operations autofs4_dir_inode_operations;
178extern const struct inode_operations autofs4_root_inode_operations;
179extern const struct inode_operations autofs4_indirect_root_inode_operations;
180extern const struct inode_operations autofs4_direct_root_inode_operations;
4b6f5d20
AV
181extern const struct file_operations autofs4_dir_operations;
182extern const struct file_operations autofs4_root_operations;
1da177e4
LT
183
184/* Initializing function */
185
186int autofs4_fill_super(struct super_block *, void *, int);
187struct autofs_info *autofs4_init_ino(struct autofs_info *, struct autofs_sb_info *sbi, mode_t mode);
188
189/* Queue management functions */
190
1da177e4
LT
191int autofs4_wait(struct autofs_sb_info *,struct dentry *, enum autofs_notify);
192int autofs4_wait_release(struct autofs_sb_info *,autofs_wqt_t,int);
193void autofs4_catatonic_mode(struct autofs_sb_info *);
194
9b1e3afd
IK
195static inline int autofs4_follow_mount(struct vfsmount **mnt, struct dentry **dentry)
196{
197 int res = 0;
198
199 while (d_mountpoint(*dentry)) {
200 int followed = follow_down(mnt, dentry);
201 if (!followed)
202 break;
203 res = 1;
204 }
205 return res;
206}
207
5c0a32fc
IK
208static inline u32 autofs4_get_dev(struct autofs_sb_info *sbi)
209{
210 return new_encode_dev(sbi->sb->s_dev);
211}
212
213static inline u64 autofs4_get_ino(struct autofs_sb_info *sbi)
214{
215 return sbi->sb->s_root->d_inode->i_ino;
216}
217
1da177e4
LT
218static inline int simple_positive(struct dentry *dentry)
219{
220 return dentry->d_inode && !d_unhashed(dentry);
221}
222
90a59c7c 223static inline int __simple_empty(struct dentry *dentry)
1da177e4
LT
224{
225 struct dentry *child;
226 int ret = 0;
227
5160ee6f 228 list_for_each_entry(child, &dentry->d_subdirs, d_u.d_child)
1da177e4
LT
229 if (simple_positive(child))
230 goto out;
231 ret = 1;
232out:
233 return ret;
234}
f5b95ff0
AB
235
236void autofs4_dentry_release(struct dentry *);
6ce31523 237extern void autofs4_kill_sb(struct super_block *);