1 /* -*- c -*- --------------------------------------------------------------- *
3 * linux/fs/autofs/expire.c
5 * Copyright 1997-1998 Transmeta Corporation -- All Rights Reserved
6 * Copyright 1999-2000 Jeremy Fitzhardinge <jeremy@goop.org>
7 * Copyright 2001-2003 Ian Kent <raven@themaw.net>
9 * This file is part of the Linux kernel and is made available under
10 * the terms of the GNU General Public License, version 2, or at your
11 * option, any later version, incorporated herein by reference.
13 * ------------------------------------------------------------------------- */
17 static unsigned long now
;
19 /* Check if a dentry can be expired return 1 if it can else return 0 */
20 static inline int autofs4_can_expire(struct dentry
*dentry
,
21 unsigned long timeout
, int do_now
)
23 struct autofs_info
*ino
= autofs4_dentry_ino(dentry
);
25 /* dentry in the process of being deleted */
29 /* No point expiring a pending mount */
30 if (dentry
->d_flags
& DCACHE_AUTOFS_PENDING
)
34 /* Too young to die */
35 if (time_after(ino
->last_used
+ timeout
, now
))
38 /* update last_used here :-
39 - obviously makes sense if it is in use now
40 - less obviously, prevents rapid-fire expire
41 attempts if expire fails the first time */
48 /* Check a mount point for busyness return 1 if not busy, otherwise */
49 static int autofs4_check_mount(struct vfsmount
*mnt
, struct dentry
*dentry
)
53 DPRINTK("dentry %p %.*s",
54 dentry
, (int)dentry
->d_name
.len
, dentry
->d_name
.name
);
59 if (!follow_down(&mnt
, &dentry
))
62 while (d_mountpoint(dentry
) && follow_down(&mnt
, &dentry
))
65 /* This is an autofs submount, we can't expire it */
66 if (is_autofs4_dentry(dentry
))
69 /* The big question */
70 if (may_umount_tree(mnt
) == 0)
73 DPRINTK("returning = %d", status
);
79 /* Check a directory tree of mount points for busyness
80 * The tree is not busy iff no mountpoints are busy
81 * Return 1 if the tree is busy or 0 otherwise
83 static int autofs4_check_tree(struct vfsmount
*mnt
,
85 unsigned long timeout
,
88 struct dentry
*this_parent
= top
;
89 struct list_head
*next
;
91 DPRINTK("parent %p %.*s",
92 top
, (int)top
->d_name
.len
, top
->d_name
.name
);
94 /* Negative dentry - give up */
95 if (!simple_positive(top
))
98 /* Timeout of a tree mount is determined by its top dentry */
99 if (!autofs4_can_expire(top
, timeout
, do_now
))
102 spin_lock(&dcache_lock
);
104 next
= this_parent
->d_subdirs
.next
;
106 while (next
!= &this_parent
->d_subdirs
) {
107 struct dentry
*dentry
= list_entry(next
, struct dentry
, d_child
);
109 /* Negative dentry - give up */
110 if (!simple_positive(dentry
)) {
115 DPRINTK("dentry %p %.*s",
116 dentry
, (int)dentry
->d_name
.len
, dentry
->d_name
.name
);
118 if (!simple_empty_nolock(dentry
)) {
119 this_parent
= dentry
;
123 dentry
= dget(dentry
);
124 spin_unlock(&dcache_lock
);
126 if (d_mountpoint(dentry
)) {
127 /* First busy => tree busy */
128 if (!autofs4_check_mount(mnt
, dentry
)) {
135 spin_lock(&dcache_lock
);
139 if (this_parent
!= top
) {
140 next
= this_parent
->d_child
.next
;
141 this_parent
= this_parent
->d_parent
;
144 spin_unlock(&dcache_lock
);
149 static struct dentry
*autofs4_check_leaves(struct vfsmount
*mnt
,
150 struct dentry
*parent
,
151 unsigned long timeout
,
154 struct dentry
*this_parent
= parent
;
155 struct list_head
*next
;
157 DPRINTK("parent %p %.*s",
158 parent
, (int)parent
->d_name
.len
, parent
->d_name
.name
);
160 spin_lock(&dcache_lock
);
162 next
= this_parent
->d_subdirs
.next
;
164 while (next
!= &this_parent
->d_subdirs
) {
165 struct dentry
*dentry
= list_entry(next
, struct dentry
, d_child
);
167 /* Negative dentry - give up */
168 if (!simple_positive(dentry
)) {
173 DPRINTK("dentry %p %.*s",
174 dentry
, (int)dentry
->d_name
.len
, dentry
->d_name
.name
);
176 if (!list_empty(&dentry
->d_subdirs
)) {
177 this_parent
= dentry
;
181 dentry
= dget(dentry
);
182 spin_unlock(&dcache_lock
);
184 if (d_mountpoint(dentry
)) {
185 /* Can we expire this guy */
186 if (!autofs4_can_expire(dentry
, timeout
, do_now
))
189 /* Can we umount this guy */
190 if (autofs4_check_mount(mnt
, dentry
))
196 spin_lock(&dcache_lock
);
200 if (this_parent
!= parent
) {
201 next
= this_parent
->d_child
.next
;
202 this_parent
= this_parent
->d_parent
;
205 spin_unlock(&dcache_lock
);
211 * Find an eligible tree to time-out
212 * A tree is eligible if :-
213 * - it is unused by any user process
214 * - it has been unused for exp_timeout time
216 static struct dentry
*autofs4_expire(struct super_block
*sb
,
217 struct vfsmount
*mnt
,
218 struct autofs_sb_info
*sbi
,
221 unsigned long timeout
;
222 struct dentry
*root
= sb
->s_root
;
223 struct dentry
*expired
= NULL
;
224 struct list_head
*next
;
225 int do_now
= how
& AUTOFS_EXP_IMMEDIATE
;
226 int exp_leaves
= how
& AUTOFS_EXP_LEAVES
;
228 if ( !sbi
->exp_timeout
|| !root
)
232 timeout
= sbi
->exp_timeout
;
234 spin_lock(&dcache_lock
);
235 next
= root
->d_subdirs
.next
;
237 /* On exit from the loop expire is set to a dgot dentry
238 * to expire or it's NULL */
239 while ( next
!= &root
->d_subdirs
) {
240 struct dentry
*dentry
= list_entry(next
, struct dentry
, d_child
);
242 /* Negative dentry - give up */
243 if ( !simple_positive(dentry
) ) {
248 dentry
= dget(dentry
);
249 spin_unlock(&dcache_lock
);
251 /* Case 1: indirect mount or top level direct mount */
252 if (d_mountpoint(dentry
)) {
253 DPRINTK("checking mountpoint %p %.*s",
254 dentry
, (int)dentry
->d_name
.len
, dentry
->d_name
.name
);
256 /* Can we expire this guy */
257 if (!autofs4_can_expire(dentry
, timeout
, do_now
))
260 /* Can we umount this guy */
261 if (autofs4_check_mount(mnt
, dentry
)) {
268 if ( simple_empty(dentry
) )
271 /* Case 2: tree mount, expire iff entire tree is not busy */
273 if (autofs4_check_tree(mnt
, dentry
, timeout
, do_now
)) {
277 /* Case 3: direct mount, expire individual leaves */
279 expired
= autofs4_check_leaves(mnt
, dentry
, timeout
, do_now
);
287 spin_lock(&dcache_lock
);
292 DPRINTK("returning %p %.*s",
293 expired
, (int)expired
->d_name
.len
, expired
->d_name
.name
);
294 spin_lock(&dcache_lock
);
295 list_del(&expired
->d_parent
->d_subdirs
);
296 list_add(&expired
->d_parent
->d_subdirs
, &expired
->d_child
);
297 spin_unlock(&dcache_lock
);
300 spin_unlock(&dcache_lock
);
305 /* Perform an expiry operation */
306 int autofs4_expire_run(struct super_block
*sb
,
307 struct vfsmount
*mnt
,
308 struct autofs_sb_info
*sbi
,
309 struct autofs_packet_expire __user
*pkt_p
)
311 struct autofs_packet_expire pkt
;
312 struct dentry
*dentry
;
314 memset(&pkt
,0,sizeof pkt
);
316 pkt
.hdr
.proto_version
= sbi
->version
;
317 pkt
.hdr
.type
= autofs_ptype_expire
;
319 if ((dentry
= autofs4_expire(sb
, mnt
, sbi
, 0)) == NULL
)
322 pkt
.len
= dentry
->d_name
.len
;
323 memcpy(pkt
.name
, dentry
->d_name
.name
, pkt
.len
);
324 pkt
.name
[pkt
.len
] = '\0';
327 if ( copy_to_user(pkt_p
, &pkt
, sizeof(struct autofs_packet_expire
)) )
333 /* Call repeatedly until it returns -EAGAIN, meaning there's nothing
335 int autofs4_expire_multi(struct super_block
*sb
, struct vfsmount
*mnt
,
336 struct autofs_sb_info
*sbi
, int __user
*arg
)
338 struct dentry
*dentry
;
342 if (arg
&& get_user(do_now
, arg
))
345 if ((dentry
= autofs4_expire(sb
, mnt
, sbi
, do_now
)) != NULL
) {
346 struct autofs_info
*de_info
= autofs4_dentry_ino(dentry
);
348 /* This is synchronous because it makes the daemon a
350 de_info
->flags
|= AUTOFS_INF_EXPIRING
;
351 ret
= autofs4_wait(sbi
, dentry
, NFY_EXPIRE
);
352 de_info
->flags
&= ~AUTOFS_INF_EXPIRING
;