|
@@ -72,6 +72,38 @@ const struct inode_operations autofs4_dir_inode_operations = {
|
|
|
.rmdir = autofs4_dir_rmdir,
|
|
|
};
|
|
|
|
|
|
+static void autofs4_add_active(struct dentry *dentry)
|
|
|
+{
|
|
|
+ struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
|
|
|
+ struct autofs_info *ino = autofs4_dentry_ino(dentry);
|
|
|
+ if (ino) {
|
|
|
+ spin_lock(&sbi->lookup_lock);
|
|
|
+ if (!ino->active_count) {
|
|
|
+ if (list_empty(&ino->active))
|
|
|
+ list_add(&ino->active, &sbi->active_list);
|
|
|
+ }
|
|
|
+ ino->active_count++;
|
|
|
+ spin_unlock(&sbi->lookup_lock);
|
|
|
+ }
|
|
|
+ return;
|
|
|
+}
|
|
|
+
|
|
|
+static void autofs4_del_active(struct dentry *dentry)
|
|
|
+{
|
|
|
+ struct autofs_sb_info *sbi = autofs4_sbi(dentry->d_sb);
|
|
|
+ struct autofs_info *ino = autofs4_dentry_ino(dentry);
|
|
|
+ if (ino) {
|
|
|
+ spin_lock(&sbi->lookup_lock);
|
|
|
+ ino->active_count--;
|
|
|
+ if (!ino->active_count) {
|
|
|
+ if (!list_empty(&ino->active))
|
|
|
+ list_del_init(&ino->active);
|
|
|
+ }
|
|
|
+ spin_unlock(&sbi->lookup_lock);
|
|
|
+ }
|
|
|
+ return;
|
|
|
+}
|
|
|
+
|
|
|
static int autofs4_dir_open(struct inode *inode, struct file *file)
|
|
|
{
|
|
|
struct dentry *dentry = file->f_path.dentry;
|
|
@@ -513,9 +545,7 @@ static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, s
|
|
|
dentry->d_fsdata = ino;
|
|
|
ino->dentry = dentry;
|
|
|
|
|
|
- spin_lock(&sbi->lookup_lock);
|
|
|
- list_add(&ino->active, &sbi->active_list);
|
|
|
- spin_unlock(&sbi->lookup_lock);
|
|
|
+ autofs4_add_active(dentry);
|
|
|
|
|
|
d_instantiate(dentry, NULL);
|
|
|
}
|
|
@@ -624,10 +654,7 @@ static int autofs4_dir_symlink(struct inode *dir,
|
|
|
if (!ino)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- spin_lock(&sbi->lookup_lock);
|
|
|
- if (!list_empty(&ino->active))
|
|
|
- list_del_init(&ino->active);
|
|
|
- spin_unlock(&sbi->lookup_lock);
|
|
|
+ autofs4_del_active(dentry);
|
|
|
|
|
|
ino->size = strlen(symname);
|
|
|
cp = kmalloc(ino->size + 1, GFP_KERNEL);
|
|
@@ -775,10 +802,7 @@ static int autofs4_dir_mkdir(struct inode *dir, struct dentry *dentry, int mode)
|
|
|
if (!ino)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
- spin_lock(&sbi->lookup_lock);
|
|
|
- if (!list_empty(&ino->active))
|
|
|
- list_del_init(&ino->active);
|
|
|
- spin_unlock(&sbi->lookup_lock);
|
|
|
+ autofs4_del_active(dentry);
|
|
|
|
|
|
inode = autofs4_get_inode(dir->i_sb, ino);
|
|
|
if (!inode) {
|