[PATCH] autofs4: tree race fix
For tree mount maps, a call to chdir or chroot, to a directory above the moint point directories at a certain time during the expire results in the expire incorrectly thinking the tree is not busy. This patch adds a check to see if the filesystem above the tree mount points is busy and also locks the filesystem during the tree mount expire to prevent the race. Signed-off-by: Ian Kent <raven@themaw.net> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
@@ -102,6 +102,7 @@ struct autofs_sb_info {
|
||||
int needs_reghost;
|
||||
struct super_block *sb;
|
||||
struct semaphore wq_sem;
|
||||
spinlock_t fs_lock;
|
||||
struct autofs_wait_queue *queues; /* Wait queue pointer */
|
||||
};
|
||||
|
||||
@@ -127,9 +128,18 @@ static inline int autofs4_oz_mode(struct autofs_sb_info *sbi) {
|
||||
static inline int autofs4_ispending(struct dentry *dentry)
|
||||
{
|
||||
struct autofs_info *inf = autofs4_dentry_ino(dentry);
|
||||
int pending = 0;
|
||||
|
||||
return (dentry->d_flags & DCACHE_AUTOFS_PENDING) ||
|
||||
(inf != NULL && inf->flags & AUTOFS_INF_EXPIRING);
|
||||
if (dentry->d_flags & DCACHE_AUTOFS_PENDING)
|
||||
return 1;
|
||||
|
||||
if (inf) {
|
||||
spin_lock(&inf->sbi->fs_lock);
|
||||
pending = inf->flags & AUTOFS_INF_EXPIRING;
|
||||
spin_unlock(&inf->sbi->fs_lock);
|
||||
}
|
||||
|
||||
return pending;
|
||||
}
|
||||
|
||||
static inline void autofs4_copy_atime(struct file *src, struct file *dst)
|
||||
|
Reference in New Issue
Block a user