/* If the kernfs parent node has changed discard and
                 * proceed to ->lookup.
+                *
+                * There's nothing special needed here when getting the
+                * dentry parent, even if a concurrent rename is in
+                * progress. That's because the dentry is negative so
+                * it can only be the target of the rename and it will
+                * be doing a d_move() not a replace. Consequently the
+                * dentry d_parent won't change over the d_move().
+                *
+                * Also kernfs negative dentries transitioning from
+                * negative to positive during revalidate won't happen
+                * because they are invalidated on containing directory
+                * changes and the lookup re-done so that a new positive
+                * dentry can be properly created.
                 */
-               spin_lock(&dentry->d_lock);
+               root = kernfs_root_from_sb(dentry->d_sb);
+               down_read(&root->kernfs_rwsem);
                parent = kernfs_dentry_node(dentry->d_parent);
                if (parent) {
-                       spin_unlock(&dentry->d_lock);
-                       root = kernfs_root(parent);
-                       down_read(&root->kernfs_rwsem);
                        if (kernfs_dir_changed(parent, dentry)) {
                                up_read(&root->kernfs_rwsem);
                                return 0;
                        }
-                       up_read(&root->kernfs_rwsem);
-               } else
-                       spin_unlock(&dentry->d_lock);
+               }
+               up_read(&root->kernfs_rwsem);
 
                /* The kernfs parent node hasn't changed, leave the
                 * dentry negative and return success.