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

Commit ed782b5a authored by Al Viro's avatar Al Viro
Browse files

dcache.c: new helper: __d_add()



d_add() with inode->i_lock already held; common to d_add() and
d_splice_alias().  All ->lookup() instances that end up hashing
the dentry they are given will hash it here.

This almost completes the preparations to parallel lookups
proper - the only remaining bit is taking security_d_instantiate()
past d_rehash() and doing rehashing without dropping ->d_lock.

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent de689f5e
Loading
Loading
Loading
Loading
+17 −7
Original line number Diff line number Diff line
@@ -2360,6 +2360,19 @@ void d_rehash(struct dentry * entry)
}
EXPORT_SYMBOL(d_rehash);


/* inode->i_lock held if inode is non-NULL */

static inline void __d_add(struct dentry *dentry, struct inode *inode)
{
	if (inode) {
		__d_instantiate(dentry, inode);
		spin_unlock(&inode->i_lock);
	}
	security_d_instantiate(dentry, inode);
	d_rehash(dentry);
}

/**
 * d_add - add dentry to hash queues
 * @entry: dentry to add
@@ -2371,8 +2384,9 @@ EXPORT_SYMBOL(d_rehash);

void d_add(struct dentry *entry, struct inode *inode)
{
	d_instantiate(entry, inode);
	d_rehash(entry);
	if (inode)
		spin_lock(&inode->i_lock);
	__d_add(entry, inode);
}
EXPORT_SYMBOL(d_add);

@@ -2798,12 +2812,8 @@ struct dentry *d_splice_alias(struct inode *inode, struct dentry *dentry)
			return new;
		}
	}
	/* already taking inode->i_lock, so d_add() by hand */
	__d_instantiate(dentry, inode);
	spin_unlock(&inode->i_lock);
out:
	security_d_instantiate(dentry, inode);
	d_rehash(dentry);
	__d_add(dentry, inode);
	return NULL;
}
EXPORT_SYMBOL(d_splice_alias);