|| (write_fault && !is_write_protection(vcpu) && !user_fault)) {
                struct kvm_mmu_page *shadow;
 
+               if (largepage && has_wrprotected_page(vcpu->kvm, gfn)) {
+                       ret = 1;
+                       spte = shadow_trap_nonpresent_pte;
+                       goto set_pte;
+               }
+
                spte |= PT_WRITABLE_MASK;
 
                shadow = kvm_mmu_lookup_page(vcpu->kvm, gfn);
-               if (shadow ||
-                  (largepage && has_wrprotected_page(vcpu->kvm, gfn))) {
+               if (shadow) {
                        pgprintk("%s: found shadow page for %lx, marking ro\n",
                                 __func__, gfn);
                        ret = 1;
        if (pte_access & ACC_WRITE_MASK)
                mark_page_dirty(vcpu->kvm, gfn);
 
+set_pte:
        set_shadow_pte(shadow_pte, spte);
        return ret;
 }