From: Paolo Bonzini Date: Thu, 20 Jun 2024 21:29:06 +0000 (-0400) Subject: Merge branch 'kvm-6.10-fixes' into HEAD X-Git-Tag: v6.11-rc1~89^2~24 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=02b0d3b9d4dd1ef76b3e8c63175f1ae9ff392313;p=thirdparty%2Flinux.git Merge branch 'kvm-6.10-fixes' into HEAD --- 02b0d3b9d4dd1ef76b3e8c63175f1ae9ff392313 diff --cc virt/kvm/guest_memfd.c index 3bfe1824ec2d8,747fe251e445b..9148b9679bb12 --- a/virt/kvm/guest_memfd.c +++ b/virt/kvm/guest_memfd.c @@@ -542,33 -482,38 +542,34 @@@ void kvm_gmem_unbind(struct kvm_memory_ fput(file); } -int kvm_gmem_get_pfn(struct kvm *kvm, struct kvm_memory_slot *slot, - gfn_t gfn, kvm_pfn_t *pfn, int *max_order) +static int __kvm_gmem_get_pfn(struct file *file, struct kvm_memory_slot *slot, + gfn_t gfn, kvm_pfn_t *pfn, int *max_order, bool prepare) { pgoff_t index = gfn - slot->base_gfn + slot->gmem.pgoff; - struct kvm_gmem *gmem; + struct kvm_gmem *gmem = file->private_data; struct folio *folio; struct page *page; - struct file *file; int r; - file = kvm_gmem_get_file(slot); - if (!file) + if (file != slot->gmem.file) { + WARN_ON_ONCE(slot->gmem.file); return -EFAULT; + } gmem = file->private_data; - - if (WARN_ON_ONCE(xa_load(&gmem->bindings, index) != slot)) { - r = -EIO; - goto out_fput; + if (xa_load(&gmem->bindings, index) != slot) { + WARN_ON_ONCE(xa_load(&gmem->bindings, index)); + return -EIO; } - folio = kvm_gmem_get_folio(file_inode(file), index); - if (!folio) { - r = -ENOMEM; - goto out_fput; - } + folio = kvm_gmem_get_folio(file_inode(file), index, prepare); + if (IS_ERR(folio)) + return PTR_ERR(folio); if (folio_test_hwpoison(folio)) { - r = -EHWPOISON; - goto out_unlock; + folio_unlock(folio); + folio_put(folio); - r = -EHWPOISON; - goto out_fput; ++ return -EHWPOISON; } page = folio_file_page(folio, index); @@@ -579,8 -524,9 +580,7 @@@ r = 0; - out_unlock: folio_unlock(folio); -out_fput: - fput(file); return r; }