From: Isaku Yamahata <isaku.yamahata@xxxxxxxxx> kvm_vm_ioctl_set_mem_attributes() discarded an error code of xa_err() unconditionally. If an error occurred at the beginning, return error. Fixes: 3779c214835b ("KVM: Introduce per-page memory attributes") Signed-off-by: Isaku Yamahata <isaku.yamahata@xxxxxxxxx> --- Changes v2 -> v3: - Newly added --- virt/kvm/kvm_main.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 422d49634c56..fdef56f85174 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -2423,6 +2423,7 @@ static int kvm_vm_ioctl_set_mem_attributes(struct kvm *kvm, gfn_t start, end; unsigned long i; void *entry; + int err = 0; /* flags is currently not used. */ if (attrs->flags) @@ -2447,14 +2448,17 @@ static int kvm_vm_ioctl_set_mem_attributes(struct kvm *kvm, KVM_MMU_UNLOCK(kvm); for (i = start; i < end; i++) { - if (xa_err(xa_store(&kvm->mem_attr_array, i, entry, - GFP_KERNEL_ACCOUNT))) + err = xa_err(xa_store(&kvm->mem_attr_array, i, entry, + GFP_KERNEL_ACCOUNT)); + if (err) break; } KVM_MMU_LOCK(kvm); - if (i > start) + if (i > start) { + err = 0; kvm_mem_attrs_changed(kvm, attrs->attributes, start, i); + } kvm_mmu_invalidate_end(kvm); KVM_MMU_UNLOCK(kvm); @@ -2463,7 +2467,7 @@ static int kvm_vm_ioctl_set_mem_attributes(struct kvm *kvm, attrs->address = i << PAGE_SHIFT; attrs->size = (end - i) << PAGE_SHIFT; - return 0; + return err; } #endif /* CONFIG_KVM_GENERIC_MEMORY_ATTRIBUTES */ -- 2.25.1