int kvm_arch_prepare_memory_region(struct kvm *kvm,
                                   struct kvm_memory_slot *memslot,
-                                  struct kvm_memory_slot old,
-                                  struct kvm_userspace_memory_region *mem)
+                                  struct kvm_userspace_memory_region *mem,
+                                  enum kvm_mr_change change)
 {
        return 0;
 }
 
 
 int kvm_arch_prepare_memory_region(struct kvm *kvm,
                struct kvm_memory_slot *memslot,
-               struct kvm_memory_slot old,
-               struct kvm_userspace_memory_region *mem)
+               struct kvm_userspace_memory_region *mem,
+               enum kvm_mr_change change)
 {
        unsigned long i;
        unsigned long pfn;
 
 
 int kvm_arch_prepare_memory_region(struct kvm *kvm,
                                   struct kvm_memory_slot *memslot,
-                                  struct kvm_memory_slot old,
-                                  struct kvm_userspace_memory_region *mem)
+                                  struct kvm_userspace_memory_region *mem,
+                                  enum kvm_mr_change change)
 {
        return kvmppc_core_prepare_memory_region(kvm, memslot, mem);
 }
 
 /* Section: memory related */
 int kvm_arch_prepare_memory_region(struct kvm *kvm,
                                   struct kvm_memory_slot *memslot,
-                                  struct kvm_memory_slot old,
-                                  struct kvm_userspace_memory_region *mem)
+                                  struct kvm_userspace_memory_region *mem,
+                                  enum kvm_mr_change change)
 {
        /* A few sanity checks. We can have exactly one memory slot which has
           to start at guest virtual zero and which has to be located at a
 
 
 int kvm_arch_prepare_memory_region(struct kvm *kvm,
                                struct kvm_memory_slot *memslot,
-                               struct kvm_memory_slot old,
-                               struct kvm_userspace_memory_region *mem)
+                               struct kvm_userspace_memory_region *mem,
+                               enum kvm_mr_change change)
 {
-       int npages = memslot->npages;
-
        /*
         * Only private memory slots need to be mapped here since
         * KVM_SET_MEMORY_REGION ioctl is no longer supported.
         */
-       if ((memslot->id >= KVM_USER_MEM_SLOTS) && npages && !old.npages) {
+       if ((memslot->id >= KVM_USER_MEM_SLOTS) && (change == KVM_MR_CREATE)) {
                unsigned long userspace_addr;
 
                /*
                 * MAP_SHARED to prevent internal slot pages from being moved
                 * by fork()/COW.
                 */
-               userspace_addr = vm_mmap(NULL, 0, npages * PAGE_SIZE,
+               userspace_addr = vm_mmap(NULL, 0, memslot->npages * PAGE_SIZE,
                                         PROT_READ | PROT_WRITE,
                                         MAP_SHARED | MAP_ANONYMOUS, 0);
 
 
 int kvm_arch_create_memslot(struct kvm_memory_slot *slot, unsigned long npages);
 int kvm_arch_prepare_memory_region(struct kvm *kvm,
                                struct kvm_memory_slot *memslot,
-                               struct kvm_memory_slot old,
-                               struct kvm_userspace_memory_region *mem);
+                               struct kvm_userspace_memory_region *mem,
+                               enum kvm_mr_change change);
 void kvm_arch_commit_memory_region(struct kvm *kvm,
                                struct kvm_userspace_memory_region *mem,
                                struct kvm_memory_slot old);
 
                slots = old_memslots;
        }
 
-       r = kvm_arch_prepare_memory_region(kvm, &new, old, mem);
+       r = kvm_arch_prepare_memory_region(kvm, &new, mem, change);
        if (r)
                goto out_slots;