diff options
Diffstat (limited to 'fs/autofs/root.c')
| -rw-r--r-- | fs/autofs/root.c | 39 | 
1 files changed, 14 insertions, 25 deletions
diff --git a/fs/autofs/root.c b/fs/autofs/root.c index 29abafc0ce31..5aaa1732bf1e 100644 --- a/fs/autofs/root.c +++ b/fs/autofs/root.c @@ -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);  |