diff --git a/fs/dcache.c b/fs/dcache.c index 8b984183727431d42f31745b62b4cb95956e63c9..a0793f96a9e85ee58d4770f8407b66fea0a8b127 100644 --- a/fs/dcache.c +++ b/fs/dcache.c @@ -891,17 +891,19 @@ struct dentry *dget_parent(struct dentry *dentry) { int gotref; struct dentry *ret; + unsigned seq; /* * Do optimistic parent lookup without any * locking. */ rcu_read_lock(); + seq = raw_seqcount_begin(&dentry->d_seq); ret = READ_ONCE(dentry->d_parent); gotref = lockref_get_not_zero(&ret->d_lockref); rcu_read_unlock(); if (likely(gotref)) { - if (likely(ret == READ_ONCE(dentry->d_parent))) + if (!read_seqcount_retry(&dentry->d_seq, seq)) return ret; dput(ret); }