sector_t sector = bio->bi_sector;
        unsigned int nr_sectors = bio_sectors(bio);
        unsigned int len;
+       int ret;
        struct page *page;
 
        if (sdkp->device->sector_size == 4096) {
        }
 
        blk_add_request_payload(rq, page, len);
-       return scsi_setup_blk_pc_cmnd(sdp, rq);
+       ret = scsi_setup_blk_pc_cmnd(sdp, rq);
+       rq->buffer = page_address(page);
+       return ret;
+}
+
+static void sd_unprep_fn(struct request_queue *q, struct request *rq)
+{
+       if (rq->cmd_flags & REQ_DISCARD)
+               __free_page(virt_to_page(rq->buffer));
 }
 
 /**
        sd_revalidate_disk(gd);
 
        blk_queue_prep_rq(sdp->request_queue, sd_prep_fn);
+       blk_queue_unprep_rq(sdp->request_queue, sd_unprep_fn);
 
        gd->driverfs_dev = &sdp->sdev_gendev;
        gd->flags = GENHD_FL_EXT_DEVT;