Skip to content

Commit

Permalink
take write_seqcount_invalidate() into __d_drop()
Browse files Browse the repository at this point in the history
... and reorder it with making d_unhashed() true.

Signed-off-by: Al Viro <[email protected]>
  • Loading branch information
Al Viro committed Mar 12, 2018
1 parent 8cc07c8 commit 0632a9a
Showing 1 changed file with 22 additions and 22 deletions.
44 changes: 22 additions & 22 deletions fs/dcache.c
Original file line number Diff line number Diff line change
Expand Up @@ -470,30 +470,29 @@ static void dentry_lru_add(struct dentry *dentry)
*/
static void ___d_drop(struct dentry *dentry)
{
if (!d_unhashed(dentry)) {
struct hlist_bl_head *b;
/*
* Hashed dentries are normally on the dentry hashtable,
* with the exception of those newly allocated by
* d_obtain_root, which are always IS_ROOT:
*/
if (unlikely(IS_ROOT(dentry)))
b = &dentry->d_sb->s_roots;
else
b = d_hash(dentry->d_name.hash);
struct hlist_bl_head *b;
/*
* Hashed dentries are normally on the dentry hashtable,
* with the exception of those newly allocated by
* d_obtain_root, which are always IS_ROOT:
*/
if (unlikely(IS_ROOT(dentry)))
b = &dentry->d_sb->s_roots;
else
b = d_hash(dentry->d_name.hash);

hlist_bl_lock(b);
__hlist_bl_del(&dentry->d_hash);
hlist_bl_unlock(b);
/* After this call, in-progress rcu-walk path lookup will fail. */
write_seqcount_invalidate(&dentry->d_seq);
}
hlist_bl_lock(b);
__hlist_bl_del(&dentry->d_hash);
hlist_bl_unlock(b);
}

void __d_drop(struct dentry *dentry)
{
___d_drop(dentry);
dentry->d_hash.pprev = NULL;
if (!d_unhashed(dentry)) {
___d_drop(dentry);
dentry->d_hash.pprev = NULL;
write_seqcount_invalidate(&dentry->d_seq);
}
}
EXPORT_SYMBOL(__d_drop);

Expand Down Expand Up @@ -2853,9 +2852,10 @@ static void __d_move(struct dentry *dentry, struct dentry *target,
write_seqcount_begin_nested(&target->d_seq, DENTRY_D_LOCK_NESTED);

/* unhash both */
/* ___d_drop does write_seqcount_barrier, but they're OK to nest. */
___d_drop(dentry);
___d_drop(target);
if (!d_unhashed(dentry))
___d_drop(dentry);
if (!d_unhashed(target))
___d_drop(target);

/* Switch the names.. */
if (exchange)
Expand Down

0 comments on commit 0632a9a

Please sign in to comment.