Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 64252c75 authored by Sage Weil's avatar Sage Weil Committed by Al Viro
Browse files

vfs: remove dget() from dentry_unhash()



This serves no useful purpose that I can discern.  All callers (rename,
rmdir) hold their own reference to the dentry.

A quick audit of all file systems showed no relevant checks on the value
of d_count in vfs_rmdir/vfs_rename_dir paths.

Signed-off-by: default avatarSage Weil <sage@newdream.net>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 48293699
Loading
Loading
Loading
Loading
+0 −3
Original line number Diff line number Diff line
@@ -414,7 +414,6 @@ static int hpfs_unlink(struct inode *dir, struct dentry *dentry)
		mutex_unlock(&hpfs_i(inode)->i_parent_mutex);
		dentry_unhash(dentry);
		if (!d_unhashed(dentry)) {
			dput(dentry);
			hpfs_unlock(dir->i_sb);
			return -ENOSPC;
		}
@@ -422,7 +421,6 @@ static int hpfs_unlink(struct inode *dir, struct dentry *dentry)
		    !S_ISREG(inode->i_mode) ||
		    get_write_access(inode)) {
			d_rehash(dentry);
			dput(dentry);
		} else {
			struct iattr newattrs;
			/*printk("HPFS: truncating file before delete.\n");*/
@@ -430,7 +428,6 @@ static int hpfs_unlink(struct inode *dir, struct dentry *dentry)
			newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
			err = notify_change(dentry, &newattrs);
			put_write_access(inode);
			dput(dentry);
			if (!err)
				goto again;
		}
+1 −4
Original line number Diff line number Diff line
@@ -2545,10 +2545,9 @@ SYSCALL_DEFINE2(mkdir, const char __user *, pathname, int, mode)
 */
void dentry_unhash(struct dentry *dentry)
{
	dget(dentry);
	shrink_dcache_parent(dentry);
	spin_lock(&dentry->d_lock);
	if (dentry->d_count == 2)
	if (dentry->d_count == 1)
		__d_drop(dentry);
	spin_unlock(&dentry->d_lock);
}
@@ -2575,7 +2574,6 @@ int vfs_rmdir(struct inode *dir, struct dentry *dentry)
				dentry->d_inode->i_flags |= S_DEAD;
				dont_mount(dentry);
			}
			dput(dentry);
		}
	}
	mutex_unlock(&dentry->d_inode->i_mutex);
@@ -3002,7 +3000,6 @@ static int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry,
		mutex_unlock(&target->i_mutex);
		if (d_unhashed(new_dentry))
			d_rehash(new_dentry);
		dput(new_dentry);
	}
	if (!error)
		if (!(old_dir->i_sb->s_type->fs_flags & FS_RENAME_DOES_D_MOVE))
+0 −1
Original line number Diff line number Diff line
@@ -105,7 +105,6 @@ static int xattr_rmdir(struct inode *dir, struct dentry *dentry)
	mutex_unlock(&dentry->d_inode->i_mutex);
	if (!error)
		d_delete(dentry);
	dput(dentry);

	return error;
}