Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

skd: remove broken discard support

Simply creating a file system on an skd device, followed by mount and
fstrim will result in errors in the logs and then a BUG(). Let's remove
discard support from that driver. As far as I can tell, it hasn't
worked right since it was merged. This patch also has a side-effect of
cleaning up an unintentional shadowed declaration inside of
skd_end_request.

I tested to ensure that I can still do I/O to the device using xfstests
./check -g quick. I didn't do anything more extensive than that,
though.

Signed-off-by: Jeff Moyer <jmoyer@redhat.com>
Signed-off-by: Jens Axboe <axboe@fb.com>

authored by

Jeff Moyer and committed by
Jens Axboe
49bdedb3 c888a8f9

+1 -58
+1 -58
drivers/block/skd_main.c
··· 133 133 #define SKD_TIMER_MINUTES(minutes) ((minutes) * (60)) 134 134 135 135 #define INQ_STD_NBYTES 36 136 - #define SKD_DISCARD_CDB_LENGTH 24 137 136 138 137 enum skd_drvr_state { 139 138 SKD_DRVR_STATE_LOAD, ··· 211 212 212 213 struct request *req; 213 214 u8 flush_cmd; 214 - u8 discard_page; 215 215 216 216 u32 timeout_stamp; 217 217 u8 sg_data_dir; ··· 228 230 }; 229 231 #define SKD_DATA_DIR_HOST_TO_CARD 1 230 232 #define SKD_DATA_DIR_CARD_TO_HOST 2 231 - #define SKD_DATA_DIR_NONE 3 /* especially for DISCARD requests. */ 232 233 233 234 struct skd_special_context { 234 235 struct skd_request_context req; ··· 537 540 scsi_req->cdb[9] = 0; 538 541 } 539 542 540 - static void 541 - skd_prep_discard_cdb(struct skd_scsi_request *scsi_req, 542 - struct skd_request_context *skreq, 543 - struct page *page, 544 - u32 lba, u32 count) 545 - { 546 - char *buf; 547 - unsigned long len; 548 - struct request *req; 549 - 550 - buf = page_address(page); 551 - len = SKD_DISCARD_CDB_LENGTH; 552 - 553 - scsi_req->cdb[0] = UNMAP; 554 - scsi_req->cdb[8] = len; 555 - 556 - put_unaligned_be16(6 + 16, &buf[0]); 557 - put_unaligned_be16(16, &buf[2]); 558 - put_unaligned_be64(lba, &buf[8]); 559 - put_unaligned_be32(count, &buf[16]); 560 - 561 - req = skreq->req; 562 - blk_add_request_payload(req, page, 0, len); 563 - } 564 - 565 543 static void skd_request_fn_not_online(struct request_queue *q); 566 544 567 545 static void skd_request_fn(struct request_queue *q) ··· 547 575 struct skd_request_context *skreq; 548 576 struct request *req = NULL; 549 577 struct skd_scsi_request *scsi_req; 550 - struct page *page; 551 578 unsigned long io_flags; 552 579 int error; 553 580 u32 lba; ··· 640 669 skreq->flush_cmd = 0; 641 670 skreq->n_sg = 0; 642 671 skreq->sg_byte_count = 0; 643 - skreq->discard_page = 0; 644 672 645 673 /* 646 674 * OK to now dequeue request from q. ··· 705 735 else 706 736 skreq->sg_data_dir = SKD_DATA_DIR_HOST_TO_CARD; 707 737 708 - if (io_flags & REQ_DISCARD) { 709 - page = alloc_page(GFP_ATOMIC | __GFP_ZERO); 710 - if (!page) { 711 - pr_err("request_fn:Page allocation failed.\n"); 712 - skd_end_request(skdev, skreq, -ENOMEM); 713 - break; 714 - } 715 - skreq->discard_page = 1; 716 - req->completion_data = page; 717 - skd_prep_discard_cdb(scsi_req, skreq, page, lba, count); 718 - 719 - } else if (flush == SKD_FLUSH_ZERO_SIZE_FIRST) { 738 + if (flush == SKD_FLUSH_ZERO_SIZE_FIRST) { 720 739 skd_prep_zerosize_flush_cdb(scsi_req, skreq); 721 740 SKD_ASSERT(skreq->flush_cmd == 1); 722 741 ··· 810 851 static void skd_end_request(struct skd_device *skdev, 811 852 struct skd_request_context *skreq, int error) 812 853 { 813 - struct request *req = skreq->req; 814 - unsigned int io_flags = req->cmd_flags; 815 - 816 - if ((io_flags & REQ_DISCARD) && 817 - (skreq->discard_page == 1)) { 818 - pr_debug("%s:%s:%d, free the page!", 819 - skdev->name, __func__, __LINE__); 820 - __free_page(req->completion_data); 821 - } 822 - 823 854 if (unlikely(error)) { 824 855 struct request *req = skreq->req; 825 856 char *cmd = (rq_data_dir(req) == READ) ? "read" : "write"; ··· 4368 4419 /* set sysfs ptimal_io_size to 8K */ 4369 4420 blk_queue_io_opt(q, 8192); 4370 4421 4371 - /* DISCARD Flag initialization. */ 4372 - q->limits.discard_granularity = 8192; 4373 - q->limits.discard_alignment = 0; 4374 - blk_queue_max_discard_sectors(q, UINT_MAX >> 9); 4375 - q->limits.discard_zeroes_data = 1; 4376 - queue_flag_set_unlocked(QUEUE_FLAG_DISCARD, q); 4377 4422 queue_flag_set_unlocked(QUEUE_FLAG_NONROT, q); 4378 4423 queue_flag_clear_unlocked(QUEUE_FLAG_ADD_RANDOM, q); 4379 4424