|
@@ -876,7 +876,18 @@ static int dispatch_discard_io(struct xen_blkif *blkif,
|
|
|
int status = BLKIF_RSP_OKAY;
|
|
|
struct block_device *bdev = blkif->vbd.bdev;
|
|
|
unsigned long secure;
|
|
|
+ struct phys_req preq;
|
|
|
+
|
|
|
+ preq.sector_number = req->u.discard.sector_number;
|
|
|
+ preq.nr_sects = req->u.discard.nr_sectors;
|
|
|
|
|
|
+ err = xen_vbd_translate(&preq, blkif, WRITE);
|
|
|
+ if (err) {
|
|
|
+ pr_warn(DRV_PFX "access denied: DISCARD [%llu->%llu] on dev=%04x\n",
|
|
|
+ preq.sector_number,
|
|
|
+ preq.sector_number + preq.nr_sects, blkif->vbd.pdevice);
|
|
|
+ goto fail_response;
|
|
|
+ }
|
|
|
blkif->st_ds_req++;
|
|
|
|
|
|
xen_blkif_get(blkif);
|
|
@@ -887,7 +898,7 @@ static int dispatch_discard_io(struct xen_blkif *blkif,
|
|
|
err = blkdev_issue_discard(bdev, req->u.discard.sector_number,
|
|
|
req->u.discard.nr_sectors,
|
|
|
GFP_KERNEL, secure);
|
|
|
-
|
|
|
+fail_response:
|
|
|
if (err == -EOPNOTSUPP) {
|
|
|
pr_debug(DRV_PFX "discard op failed, not supported\n");
|
|
|
status = BLKIF_RSP_EOPNOTSUPP;
|