Pull xen fixes from Juergen Gross: - a double free fix in the Xen pvcalls backend driver - a fix for a regression causing the MSI related sysfs entries to not being created in Xen PV guests - a fix in the Xen blkfront driver for handling insane input data better * tag 'for-linus-6.4-rc4-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip: x86/pci/xen: populate MSI sysfs entries xen/pvcalls-back: fix double frees with pvcalls_new_active_socket() xen/blkfront: Only check REQ_FUA for writes
Unified · Split
| @@ -198,7 +198,7 @@ static int xen_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) · 197 unmodified lines | ||
| 198 | 198 | i++; |
| 199 | 199 | } |
| 200 | 200 | kfree(v); |
| 201 | − return 0; | |
| 201 | + return msi_device_populate_sysfs(&dev->dev); | |
| 202 | 202 | |
| 203 | 203 | error: |
| 204 | 204 | if (ret == -ENOSYS) |
| @@ -254,7 +254,7 @@ static int xen_hvm_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) · 49 unmodified lines | ||
| 254 | 254 | dev_dbg(&dev->dev, |
| 255 | 255 | "xen: msi --> pirq=%d --> irq=%d\n", pirq, irq); |
| 256 | 256 | } |
| 257 | − return 0; | |
| 257 | + return msi_device_populate_sysfs(&dev->dev); | |
| 258 | 258 | |
| 259 | 259 | error: |
| 260 | 260 | dev_err(&dev->dev, "Failed to create MSI%s! ret=%d!\n", |
| @@ -346,7 +346,7 @@ static int xen_initdom_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) · 85 unmodified lines | ||
| 346 | 346 | if (ret < 0) |
| 347 | 347 | goto out; |
| 348 | 348 | } |
| 349 | − ret = 0; | |
| 349 | + ret = msi_device_populate_sysfs(&dev->dev); | |
| 350 | 350 | out: |
| 351 | 351 | return ret; |
| 352 | 352 | } |
| @@ -394,6 +394,8 @@ static void xen_teardown_msi_irqs(struct pci_dev *dev) · 41 unmodified lines | ||
| 394 | 394 | xen_destroy_irq(msidesc->irq + i); |
| 395 | 395 | msidesc->irq = 0; |
| 396 | 396 | } |
| 397 | + | |
| 398 | + msi_device_destroy_sysfs(&dev->dev); | |
| 397 | 399 | } |
| 398 | 400 | |
| 399 | 401 | static void xen_pv_teardown_msi_irqs(struct pci_dev *dev) |
| @@ -780,7 +780,8 @@ static int blkif_queue_rw_req(struct request *req, struct blkfront_ring_info *ri · 779 unmodified lines | ||
| 780 | 780 | ring_req->u.rw.handle = info->handle; |
| 781 | 781 | ring_req->operation = rq_data_dir(req) ? |
| 782 | 782 | BLKIF_OP_WRITE : BLKIF_OP_READ; |
| 783 | − if (req_op(req) == REQ_OP_FLUSH || req->cmd_flags & REQ_FUA) { | |
| 783 | + if (req_op(req) == REQ_OP_FLUSH || | |
| 784 | + (req_op(req) == REQ_OP_WRITE && (req->cmd_flags & REQ_FUA))) { | |
| 784 | 785 | /* |
| 785 | 786 | * Ideally we can do an unordered flush-to-disk. |
| 786 | 787 | * In case the backend onlysupports barriers, use that. |
| @@ -325,8 +325,10 @@ static struct sock_mapping *pvcalls_new_active_socket( · 324 unmodified lines | ||
| 325 | 325 | void *page; |
| 326 | 326 | |
| 327 | 327 | map = kzalloc(sizeof(*map), GFP_KERNEL); |
| 328 | − if (map == NULL) | |
| 328 | + if (map == NULL) { | |
| 329 | + sock_release(sock); | |
| 329 | 330 | return NULL; |
| 331 | + } | |
| 330 | 332 | |
| 331 | 333 | map->fedata = fedata; |
| 332 | 334 | map->sock = sock; |
| @@ -418,10 +420,8 @@ static int pvcalls_back_connect(struct xenbus_device *dev, · 85 unmodified lines | ||
| 418 | 420 | req->u.connect.ref, |
| 419 | 421 | req->u.connect.evtchn, |
| 420 | 422 | sock); |
| 421 | − if (!map) { | |
| 423 | + if (!map) | |
| 422 | 424 | ret = -EFAULT; |
| 423 | − sock_release(sock); | |
| 424 | − } | |
| 425 | 425 | |
| 426 | 426 | out: |
| 427 | 427 | rsp = RING_GET_RESPONSE(&fedata->ring, fedata->ring.rsp_prod_pvt++); |
| @@ -561,7 +561,6 @@ static void __pvcalls_back_accept(struct work_struct *work) · 133 unmodified lines | ||
| 561 | 561 | sock); |
| 562 | 562 | if (!map) { |
| 563 | 563 | ret = -EFAULT; |
| 564 | − sock_release(sock); | |
| 565 | 564 | goto out_error; |
| 566 | 565 | } |
| 567 | 566 | |
| @@ -383,6 +383,13 @@ int arch_setup_msi_irq(struct pci_dev *dev, struct msi_desc *desc); · 382 unmodified lines | ||
| 383 | 383 | void arch_teardown_msi_irq(unsigned int irq); |
| 384 | 384 | int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type); |
| 385 | 385 | void arch_teardown_msi_irqs(struct pci_dev *dev); |
| 386 | +#endif /* CONFIG_PCI_MSI_ARCH_FALLBACKS */ | |
| 387 | + | |
| 388 | +/* | |
| 389 | + * Xen uses non-default msi_domain_ops and hence needs a way to populate sysfs | |
| 390 | + * entries of MSI IRQs. | |
| 391 | + */ | |
| 392 | +#if defined(CONFIG_PCI_XEN) || defined(CONFIG_PCI_MSI_ARCH_FALLBACKS) | |
| 386 | 393 | #ifdef CONFIG_SYSFS |
| 387 | 394 | int msi_device_populate_sysfs(struct device *dev); |
| 388 | 395 | void msi_device_destroy_sysfs(struct device *dev); |
| @@ -390,7 +397,7 @@ void msi_device_destroy_sysfs(struct device *dev); · 1 unmodified line | ||
| 390 | 397 | static inline int msi_device_populate_sysfs(struct device *dev) { return 0; } |
| 391 | 398 | static inline void msi_device_destroy_sysfs(struct device *dev) { } |
| 392 | 399 | #endif /* !CONFIG_SYSFS */ |
| 393 | −#endif /* CONFIG_PCI_MSI_ARCH_FALLBACKS */ | |
| 400 | +#endif /* CONFIG_PCI_XEN || CONFIG_PCI_MSI_ARCH_FALLBACKS */ | |
| 394 | 401 | |
| 395 | 402 | /* |
| 396 | 403 | * The restore hook is still available even for fully irq domain based |
| @@ -542,7 +542,7 @@ fail: · 541 unmodified lines | ||
| 542 | 542 | return ret; |
| 543 | 543 | } |
| 544 | 544 | |
| 545 | −#ifdef CONFIG_PCI_MSI_ARCH_FALLBACKS | |
| 545 | +#if defined(CONFIG_PCI_MSI_ARCH_FALLBACKS) || defined(CONFIG_PCI_XEN) | |
| 546 | 546 | /** |
| 547 | 547 | * msi_device_populate_sysfs - Populate msi_irqs sysfs entries for a device |
| 548 | 548 | * @dev: The device (PCI, platform etc) which will get sysfs entries |
| @@ -574,7 +574,7 @@ void msi_device_destroy_sysfs(struct device *dev) · 25 unmodified lines | ||
| 574 | 574 | msi_for_each_desc(desc, dev, MSI_DESC_ALL) |
| 575 | 575 | msi_sysfs_remove_desc(dev, desc); |
| 576 | 576 | } |
| 577 | −#endif /* CONFIG_PCI_MSI_ARCH_FALLBACK */ | |
| 577 | +#endif /* CONFIG_PCI_MSI_ARCH_FALLBACK || CONFIG_PCI_XEN */ | |
| 578 | 578 | #else /* CONFIG_SYSFS */ |
| 579 | 579 | static inline int msi_sysfs_create_group(struct device *dev) { return 0; } |
| 580 | 580 | static inline int msi_sysfs_populate_desc(struct device *dev, struct msi_desc *desc) { return 0; } |