import PULS_20160108
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / block / xen-blkback / blkback.c
index dd5b2fed97e9ae2b7665f13ec3c42db6ee6fb462..879423011a40bcc73b8f54cabc38bd75219a6cbe 100644 (file)
@@ -399,6 +399,7 @@ int xen_blkif_schedule(void *arg)
        struct xen_vbd *vbd = &blkif->vbd;
 
        xen_blkif_get(blkif);
+       set_freezable();
 
        while (!kthread_should_stop()) {
                if (try_to_freeze())
@@ -647,10 +648,22 @@ 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;
+
+       xen_blkif_get(blkif);
 
+       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);
        secure = (blkif->vbd.discard_secure &&
                 (req->u.discard.flag & BLKIF_DISCARD_SECURE)) ?
                 BLKDEV_DISCARD_SECURE : 0;
@@ -658,7 +671,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;