]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - fs/autofs/root.c
Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[linux.git] / fs / autofs / root.c
index 29abafc0ce31271c9684e83b383fca007198c669..5aaa1732bf1efe0032a05e1b21fde7747c47e09f 100644 (file)
@@ -569,10 +569,9 @@ static int autofs_dir_symlink(struct inode *dir,
        d_add(dentry, inode);
 
        dget(dentry);
-       atomic_inc(&ino->count);
+       ino->count++;
        p_ino = autofs_dentry_ino(dentry->d_parent);
-       if (p_ino && !IS_ROOT(dentry))
-               atomic_inc(&p_ino->count);
+       p_ino->count++;
 
        dir->i_mtime = current_time(dir);
 
@@ -610,11 +609,9 @@ static int autofs_dir_unlink(struct inode *dir, struct dentry *dentry)
        if (sbi->flags & AUTOFS_SBI_CATATONIC)
                return -EACCES;
 
-       if (atomic_dec_and_test(&ino->count)) {
-               p_ino = autofs_dentry_ino(dentry->d_parent);
-               if (p_ino && !IS_ROOT(dentry))
-                       atomic_dec(&p_ino->count);
-       }
+       ino->count--;
+       p_ino = autofs_dentry_ino(dentry->d_parent);
+       p_ino->count--;
        dput(ino->dentry);
 
        d_inode(dentry)->i_size = 0;
@@ -660,7 +657,6 @@ static void autofs_set_leaf_automount_flags(struct dentry *dentry)
 
 static void autofs_clear_leaf_automount_flags(struct dentry *dentry)
 {
-       struct list_head *d_child;
        struct dentry *parent;
 
        /* flags for dentrys in the root are handled elsewhere */
@@ -673,10 +669,7 @@ static void autofs_clear_leaf_automount_flags(struct dentry *dentry)
        /* only consider parents below dentrys in the root */
        if (IS_ROOT(parent->d_parent))
                return;
-       d_child = &dentry->d_child;
-       /* Set parent managed if it's becoming empty */
-       if (d_child->next == &parent->d_subdirs &&
-           d_child->prev == &parent->d_subdirs)
+       if (autofs_dentry_ino(parent)->count == 2)
                managed_dentry_set_managed(parent);
 }
 
@@ -698,11 +691,10 @@ static int autofs_dir_rmdir(struct inode *dir, struct dentry *dentry)
        if (sbi->flags & AUTOFS_SBI_CATATONIC)
                return -EACCES;
 
-       spin_lock(&sbi->lookup_lock);
-       if (!simple_empty(dentry)) {
-               spin_unlock(&sbi->lookup_lock);
+       if (ino->count != 1)
                return -ENOTEMPTY;
-       }
+
+       spin_lock(&sbi->lookup_lock);
        __autofs_add_expiring(dentry);
        d_drop(dentry);
        spin_unlock(&sbi->lookup_lock);
@@ -710,11 +702,9 @@ static int autofs_dir_rmdir(struct inode *dir, struct dentry *dentry)
        if (sbi->version < 5)
                autofs_clear_leaf_automount_flags(dentry);
 
-       if (atomic_dec_and_test(&ino->count)) {
-               p_ino = autofs_dentry_ino(dentry->d_parent);
-               if (p_ino && dentry->d_parent != dentry)
-                       atomic_dec(&p_ino->count);
-       }
+       ino->count--;
+       p_ino = autofs_dentry_ino(dentry->d_parent);
+       p_ino->count--;
        dput(ino->dentry);
        d_inode(dentry)->i_size = 0;
        clear_nlink(d_inode(dentry));
@@ -760,10 +750,9 @@ static int autofs_dir_mkdir(struct inode *dir,
                autofs_set_leaf_automount_flags(dentry);
 
        dget(dentry);
-       atomic_inc(&ino->count);
+       ino->count++;
        p_ino = autofs_dentry_ino(dentry->d_parent);
-       if (p_ino && !IS_ROOT(dentry))
-               atomic_inc(&p_ino->count);
+       p_ino->count++;
        inc_nlink(dir);
        dir->i_mtime = current_time(dir);