Commit 65eea2c0 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'for-linus-6.0-rc4-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip

Pull xen fixes from Juergen Gross:

 - a minor fix for the Xen grant driver

 - a small series fixing a recently introduced problem in the Xen
   blkfront/blkback drivers with negotiation of feature usage

* tag 'for-linus-6.0-rc4-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/xen/tip:
  xen/grants: prevent integer overflow in gnttab_dma_alloc_pages()
  xen-blkfront: Cache feature_persistent value before advertisement
  xen-blkfront: Advertise feature-persistent as user requested
  xen-blkback: Advertise feature-persistent as user requested
parents f0c5f7ea e9ea0b30
...@@ -226,6 +226,9 @@ struct xen_vbd { ...@@ -226,6 +226,9 @@ struct xen_vbd {
sector_t size; sector_t size;
unsigned int flush_support:1; unsigned int flush_support:1;
unsigned int discard_secure:1; unsigned int discard_secure:1;
/* Connect-time cached feature_persistent parameter value */
unsigned int feature_gnt_persistent_parm:1;
/* Persistent grants feature negotiation result */
unsigned int feature_gnt_persistent:1; unsigned int feature_gnt_persistent:1;
unsigned int overflow_max_grants:1; unsigned int overflow_max_grants:1;
}; };
......
...@@ -907,7 +907,7 @@ static void connect(struct backend_info *be) ...@@ -907,7 +907,7 @@ static void connect(struct backend_info *be)
xen_blkbk_barrier(xbt, be, be->blkif->vbd.flush_support); xen_blkbk_barrier(xbt, be, be->blkif->vbd.flush_support);
err = xenbus_printf(xbt, dev->nodename, "feature-persistent", "%u", err = xenbus_printf(xbt, dev->nodename, "feature-persistent", "%u",
be->blkif->vbd.feature_gnt_persistent); be->blkif->vbd.feature_gnt_persistent_parm);
if (err) { if (err) {
xenbus_dev_fatal(dev, err, "writing %s/feature-persistent", xenbus_dev_fatal(dev, err, "writing %s/feature-persistent",
dev->nodename); dev->nodename);
...@@ -1085,7 +1085,9 @@ static int connect_ring(struct backend_info *be) ...@@ -1085,7 +1085,9 @@ static int connect_ring(struct backend_info *be)
return -ENOSYS; return -ENOSYS;
} }
blkif->vbd.feature_gnt_persistent = feature_persistent && blkif->vbd.feature_gnt_persistent_parm = feature_persistent;
blkif->vbd.feature_gnt_persistent =
blkif->vbd.feature_gnt_persistent_parm &&
xenbus_read_unsigned(dev->otherend, "feature-persistent", 0); xenbus_read_unsigned(dev->otherend, "feature-persistent", 0);
blkif->vbd.overflow_max_grants = 0; blkif->vbd.overflow_max_grants = 0;
......
...@@ -213,6 +213,9 @@ struct blkfront_info ...@@ -213,6 +213,9 @@ struct blkfront_info
unsigned int feature_fua:1; unsigned int feature_fua:1;
unsigned int feature_discard:1; unsigned int feature_discard:1;
unsigned int feature_secdiscard:1; unsigned int feature_secdiscard:1;
/* Connect-time cached feature_persistent parameter */
unsigned int feature_persistent_parm:1;
/* Persistent grants feature negotiation result */
unsigned int feature_persistent:1; unsigned int feature_persistent:1;
unsigned int bounce:1; unsigned int bounce:1;
unsigned int discard_granularity; unsigned int discard_granularity;
...@@ -1756,6 +1759,12 @@ static int write_per_ring_nodes(struct xenbus_transaction xbt, ...@@ -1756,6 +1759,12 @@ static int write_per_ring_nodes(struct xenbus_transaction xbt,
return err; return err;
} }
/* Enable the persistent grants feature. */
static bool feature_persistent = true;
module_param(feature_persistent, bool, 0644);
MODULE_PARM_DESC(feature_persistent,
"Enables the persistent grants feature");
/* Common code used when first setting up, and when resuming. */ /* Common code used when first setting up, and when resuming. */
static int talk_to_blkback(struct xenbus_device *dev, static int talk_to_blkback(struct xenbus_device *dev,
struct blkfront_info *info) struct blkfront_info *info)
...@@ -1847,8 +1856,9 @@ static int talk_to_blkback(struct xenbus_device *dev, ...@@ -1847,8 +1856,9 @@ static int talk_to_blkback(struct xenbus_device *dev,
message = "writing protocol"; message = "writing protocol";
goto abort_transaction; goto abort_transaction;
} }
info->feature_persistent_parm = feature_persistent;
err = xenbus_printf(xbt, dev->nodename, "feature-persistent", "%u", err = xenbus_printf(xbt, dev->nodename, "feature-persistent", "%u",
info->feature_persistent); info->feature_persistent_parm);
if (err) if (err)
dev_warn(&dev->dev, dev_warn(&dev->dev,
"writing persistent grants feature to xenbus"); "writing persistent grants feature to xenbus");
...@@ -1916,12 +1926,6 @@ static int negotiate_mq(struct blkfront_info *info) ...@@ -1916,12 +1926,6 @@ static int negotiate_mq(struct blkfront_info *info)
return 0; return 0;
} }
/* Enable the persistent grants feature. */
static bool feature_persistent = true;
module_param(feature_persistent, bool, 0644);
MODULE_PARM_DESC(feature_persistent,
"Enables the persistent grants feature");
/* /*
* Entry point to this code when a new device is created. Allocate the basic * Entry point to this code when a new device is created. Allocate the basic
* structures and the ring buffer for communication with the backend, and * structures and the ring buffer for communication with the backend, and
...@@ -2281,7 +2285,7 @@ static void blkfront_gather_backend_features(struct blkfront_info *info) ...@@ -2281,7 +2285,7 @@ static void blkfront_gather_backend_features(struct blkfront_info *info)
if (xenbus_read_unsigned(info->xbdev->otherend, "feature-discard", 0)) if (xenbus_read_unsigned(info->xbdev->otherend, "feature-discard", 0))
blkfront_setup_discard(info); blkfront_setup_discard(info);
if (feature_persistent) if (info->feature_persistent_parm)
info->feature_persistent = info->feature_persistent =
!!xenbus_read_unsigned(info->xbdev->otherend, !!xenbus_read_unsigned(info->xbdev->otherend,
"feature-persistent", 0); "feature-persistent", 0);
......
...@@ -1047,6 +1047,9 @@ int gnttab_dma_alloc_pages(struct gnttab_dma_alloc_args *args) ...@@ -1047,6 +1047,9 @@ int gnttab_dma_alloc_pages(struct gnttab_dma_alloc_args *args)
size_t size; size_t size;
int i, ret; int i, ret;
if (args->nr_pages < 0 || args->nr_pages > (INT_MAX >> PAGE_SHIFT))
return -ENOMEM;
size = args->nr_pages << PAGE_SHIFT; size = args->nr_pages << PAGE_SHIFT;
if (args->coherent) if (args->coherent)
args->vaddr = dma_alloc_coherent(args->dev, size, args->vaddr = dma_alloc_coherent(args->dev, size,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment