bool allow_parent1, allow_parent2;
        access_mask_t access_request_parent1, access_request_parent2;
        struct path mnt_dir;
+       struct dentry *old_parent;
        layer_mask_t layer_masks_parent1[LANDLOCK_NUM_ACCESS_FS] = {},
                     layer_masks_parent2[LANDLOCK_NUM_ACCESS_FS] = {};
 
        mnt_dir.mnt = new_dir->mnt;
        mnt_dir.dentry = new_dir->mnt->mnt_root;
 
+       /*
+        * old_dentry may be the root of the common mount point and
+        * !IS_ROOT(old_dentry) at the same time (e.g. with open_tree() and
+        * OPEN_TREE_CLONE).  We do not need to call dget(old_parent) because
+        * we keep a reference to old_dentry.
+        */
+       old_parent = (old_dentry == mnt_dir.dentry) ? old_dentry :
+                                                     old_dentry->d_parent;
+
        /* new_dir->dentry is equal to new_dentry->d_parent */
-       allow_parent1 = collect_domain_accesses(dom, mnt_dir.dentry,
-                                               old_dentry->d_parent,
+       allow_parent1 = collect_domain_accesses(dom, mnt_dir.dentry, old_parent,
                                                &layer_masks_parent1);
        allow_parent2 = collect_domain_accesses(
                dom, mnt_dir.dentry, new_dir->dentry, &layer_masks_parent2);