From patchwork Tue Jun 7 04:12:40 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Nicholas A. Bellinger" X-Patchwork-Id: 9159813 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id AF79D60467 for ; Tue, 7 Jun 2016 04:13:56 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A30212834A for ; Tue, 7 Jun 2016 04:13:56 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 97DDD2834F; Tue, 7 Jun 2016 04:13:56 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.1 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI, T_DKIM_INVALID, URIBL_BLACK autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1A4A92834C for ; Tue, 7 Jun 2016 04:13:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753334AbcFGENz (ORCPT ); Tue, 7 Jun 2016 00:13:55 -0400 Received: from mail.linux-iscsi.org ([67.23.28.174]:56052 "EHLO linux-iscsi.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753256AbcFGENq (ORCPT ); Tue, 7 Jun 2016 00:13:46 -0400 Received: from linux-iscsi.org (localhost [127.0.0.1]) by linux-iscsi.org (Postfix) with ESMTP id B873C22D9A6; Tue, 7 Jun 2016 04:12:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=linux-iscsi.org; s=default.private; t=1465272779; bh=YNoY2GzmntJl3sbkCPUDS0FYJFK50sY kvSziW/sEBk8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To: References; b=ZlQV8hkKrJmZwQLNxHX50o8/fqpv+dnTAZ17Ro25slQZWsmcpNjM KZE9FOAXXsWJt32qx2+uxJnnGV+EF76niYL5BtPjA4Wi9xsfM8Kl5/h0e335KOuTv8W 9dfjRwPS20K/VEnPgeAV9o4k+SOWO3Y2nqeALSAocCjQlEU98lgU= From: "Nicholas A. Bellinger" To: target-devel Cc: linux-scsi , Jens Axboe , Christoph Hellwig , Martin Petersen , Sagi Grimberg , Hannes Reinecke , Mike Christie , Dave B Minturn , Nicholas Bellinger Subject: [PATCH-v2 15/16] target/sbc: Convert ->execute_unmap to __blkdev_issue_discard Date: Tue, 7 Jun 2016 04:12:40 +0000 Message-Id: <1465272761-26045-16-git-send-email-nab@linux-iscsi.org> X-Mailer: git-send-email 1.7.2.5 In-Reply-To: <1465272761-26045-1-git-send-email-nab@linux-iscsi.org> References: <1465272761-26045-1-git-send-email-nab@linux-iscsi.org> Sender: linux-scsi-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-scsi@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Nicholas Bellinger As prep for nvme-target, this patch converts sbc_ops->execute_unmap() usage in existing target_core_sbc.c, IBLOCK and FILEIO backend drivers to use __blkdev_issue_discard() with async completion. Also, propigate struct bio ** as a new sbc_ops->execute_unmap() parameter. Cc: Jens Axboe Cc: Christoph Hellwig Cc: Martin Petersen Cc: Sagi Grimberg Cc: Hannes Reinecke Cc: Mike Christie Signed-off-by: Nicholas Bellinger --- drivers/target/target_core_file.c | 8 +++--- drivers/target/target_core_iblock.c | 8 +++--- drivers/target/target_core_sbc.c | 47 ++++++++++++++++++++++++++++++------ include/target/target_core_backend.h | 2 +- 4 files changed, 51 insertions(+), 14 deletions(-) diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c index 6f0064e..81882ef 100644 --- a/drivers/target/target_core_file.c +++ b/drivers/target/target_core_file.c @@ -462,7 +462,8 @@ fd_do_prot_unmap(struct se_device *dev, sector_t lba, sector_t nolb) } static sense_reason_t -fd_execute_unmap(struct target_iostate *ios, sector_t lba, sector_t nolb) +fd_execute_unmap(struct target_iostate *ios, sector_t lba, sector_t nolb, + struct bio **bio) { struct se_device *dev = ios->se_dev; struct file *file = FD_DEV(dev)->fd_file; @@ -479,10 +480,11 @@ fd_execute_unmap(struct target_iostate *ios, sector_t lba, sector_t nolb) /* The backend is block device, use discard */ struct block_device *bdev = inode->i_bdev; - ret = blkdev_issue_discard(bdev, + ret = __blkdev_issue_discard(bdev, target_to_linux_sector(dev, lba), target_to_linux_sector(dev, nolb), - GFP_KERNEL, 0); + GFP_KERNEL, REQ_WRITE | REQ_DISCARD, + bio); if (ret < 0) { pr_warn("FILEIO: blkdev_issue_discard() failed: %d\n", ret); diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c index 29d3167..b898dd7 100644 --- a/drivers/target/target_core_iblock.c +++ b/drivers/target/target_core_iblock.c @@ -393,16 +393,18 @@ iblock_execute_sync_cache(struct target_iostate *ios, bool immed) } static sense_reason_t -iblock_execute_unmap(struct target_iostate *ios, sector_t lba, sector_t nolb) +iblock_execute_unmap(struct target_iostate *ios, sector_t lba, sector_t nolb, + struct bio **bio) { struct block_device *bdev = IBLOCK_DEV(ios->se_dev)->ibd_bd; struct se_device *dev = ios->se_dev; int ret; - ret = blkdev_issue_discard(bdev, + ret = __blkdev_issue_discard(bdev, target_to_linux_sector(dev, lba), target_to_linux_sector(dev, nolb), - GFP_KERNEL, 0); + GFP_KERNEL, REQ_WRITE | REQ_DISCARD, + bio); if (ret < 0) { pr_err("blkdev_issue_discard() failed: %d\n", ret); return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; diff --git a/drivers/target/target_core_sbc.c b/drivers/target/target_core_sbc.c index 4fcbe8c..2ea656d 100644 --- a/drivers/target/target_core_sbc.c +++ b/drivers/target/target_core_sbc.c @@ -221,22 +221,54 @@ sector_t sbc_get_write_same_sectors(struct target_iostate *ios) } EXPORT_SYMBOL(sbc_get_write_same_sectors); +static void sbc_discard_bio_done(struct bio *bio) +{ + struct se_cmd *cmd = bio->bi_private; + int err = bio->bi_error; + + bio_put(bio); + target_complete_cmd(cmd, (err) ? SAM_STAT_CHECK_CONDITION : + SAM_STAT_GOOD); +} + +static void +sbc_execute_discard_bio(struct se_cmd *cmd, struct bio *bio, + sense_reason_t *status) +{ + if (bio) { + bio->bi_private = cmd; + bio->bi_end_io = sbc_discard_bio_done; + if (status) { + bio->bi_error = -EIO; + bio_endio(bio); + } else { + submit_bio(REQ_WRITE | REQ_DISCARD, bio); + } + } else { + if (!status) + target_complete_cmd(cmd, GOOD); + } +} + static sense_reason_t sbc_execute_write_same_unmap(struct target_iostate *ios) { struct se_cmd *cmd = container_of(ios, struct se_cmd, t_iostate); struct sbc_ops *ops = cmd->protocol_data; + struct bio *bio = NULL; sector_t nolb = sbc_get_write_same_sectors(ios); - sense_reason_t ret; + sense_reason_t ret = TCM_NO_SENSE; if (nolb) { - ret = ops->execute_unmap(&cmd->t_iostate, cmd->t_iostate.t_task_lba, nolb); + ret = ops->execute_unmap(&cmd->t_iostate, cmd->t_iostate.t_task_lba, + nolb, &bio); if (ret) return ret; } - target_complete_cmd(cmd, GOOD); - return 0; + + sbc_execute_discard_bio(cmd, bio, &ret); + return ret; } static sense_reason_t @@ -1198,6 +1230,7 @@ sbc_execute_unmap(struct target_iostate *ios) struct se_cmd *cmd = container_of(ios, struct se_cmd, t_iostate); struct sbc_ops *ops = cmd->protocol_data; struct se_device *dev = cmd->se_dev; + struct bio *bio = NULL; unsigned char *buf, *ptr = NULL; sector_t lba; int size; @@ -1260,7 +1293,7 @@ sbc_execute_unmap(struct target_iostate *ios) goto err; } - ret = ops->execute_unmap(ios, lba, range); + ret = ops->execute_unmap(ios, lba, range, &bio); if (ret) goto err; @@ -1270,8 +1303,8 @@ sbc_execute_unmap(struct target_iostate *ios) err: transport_kunmap_data_sg(cmd); - if (!ret) - target_complete_cmd(cmd, GOOD); + + sbc_execute_discard_bio(cmd, bio, &ret); return ret; } diff --git a/include/target/target_core_backend.h b/include/target/target_core_backend.h index 15f731f..4a9aca6 100644 --- a/include/target/target_core_backend.h +++ b/include/target/target_core_backend.h @@ -56,7 +56,7 @@ struct sbc_ops { sense_reason_t (*execute_write_same)(struct target_iostate *ios, sector_t (*get_sectors)(struct target_iostate *)); sense_reason_t (*execute_unmap)(struct target_iostate *ios, - sector_t lba, sector_t nolb); + sector_t lba, sector_t nolb, struct bio **bio); }; int transport_backend_register(const struct target_backend_ops *);