if (kvm_pte_young(changed))
                        kvm_set_pfn_accessed(pfn);
 
-               if (kvm_pte_dirty(changed)) {
-                       mark_page_dirty(kvm, gfn);
-                       kvm_set_pfn_dirty(pfn);
-               }
                if (page)
                        put_page(page);
        }
+
+       if (kvm_pte_dirty(changed))
+               mark_page_dirty(kvm, gfn);
+
        return ret;
 out:
        spin_unlock(&kvm->mmu_lock);
        else
                ++kvm->stat.pages;
        kvm_set_pte(ptep, new_pte);
+
+       if (writeable)
+               kvm_set_pfn_dirty(pfn);
+
        spin_unlock(&kvm->mmu_lock);
 
-       if (prot_bits & _PAGE_DIRTY) {
+       if (prot_bits & _PAGE_DIRTY)
                mark_page_dirty_in_slot(kvm, memslot, gfn);
-               kvm_set_pfn_dirty(pfn);
-       }
 
        kvm_release_pfn_clean(pfn);
 out: