Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dc4a9307 authored by Jens Axboe's avatar Jens Axboe
Browse files

sd/skd: stuff discard page in request->completion_data



Store the pointer to the page there, so we can always safely
reference it from end_io context where ->bio may have been
cleared.

Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent fb1be433
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -743,6 +743,7 @@ static void skd_request_fn(struct request_queue *q)
				break;
			}
			skreq->discard_page = 1;
			req->completion_data = page;
			skd_prep_discard_cdb(scsi_req, skreq, page, lba, count);

		} else if (flush == SKD_FLUSH_ZERO_SIZE_FIRST) {
@@ -855,10 +856,9 @@ static void skd_end_request(struct skd_device *skdev,

	if ((io_flags & REQ_DISCARD) &&
		(skreq->discard_page == 1)) {
		struct bio *bio = req->bio;
		pr_debug("%s:%s:%d, free the page!",
			 skdev->name, __func__, __LINE__);
		__free_page(bio->bi_io_vec->bv_page);
		__free_page(req->completion_data);
	}

	if (unlikely(error)) {
+3 −4
Original line number Diff line number Diff line
@@ -737,6 +737,7 @@ static int sd_setup_discard_cmnd(struct scsi_device *sdp, struct request *rq)
		goto out;
	}

	rq->completion_data = page;
	blk_add_request_payload(rq, page, len);
	ret = scsi_setup_blk_pc_cmnd(sdp, rq);
	rq->__data_len = nr_bytes;
@@ -839,11 +840,9 @@ static void sd_unprep_fn(struct request_queue *q, struct request *rq)
{
	struct scsi_cmnd *SCpnt = rq->special;

	if (rq->cmd_flags & REQ_DISCARD) {
		struct bio *bio = rq->bio;
	if (rq->cmd_flags & REQ_DISCARD)
		__free_page(rq->completion_data);

		__free_page(bio->bi_io_vec->bv_page);
	}
	if (SCpnt->cmnd != rq->cmd) {
		mempool_free(SCpnt->cmnd, sd_cdb_pool);
		SCpnt->cmnd = NULL;