From patchwork Wed May 25 07:55:01 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mike Christie X-Patchwork-Id: 9134935 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 91D966075C for ; Wed, 25 May 2016 07:55:23 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 84427282BB for ; Wed, 25 May 2016 07:55:23 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 794FE282D4; Wed, 25 May 2016 07:55:23 +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=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=unavailable 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 20A95282BB for ; Wed, 25 May 2016 07:55:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753328AbcEYHzQ (ORCPT ); Wed, 25 May 2016 03:55:16 -0400 Received: from mx1.redhat.com ([209.132.183.28]:47979 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753268AbcEYHzK (ORCPT ); Wed, 25 May 2016 03:55:10 -0400 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 641E5C04B31E; Wed, 25 May 2016 07:55:09 +0000 (UTC) Received: from rh2.redhat.com (vpn-61-39.rdu2.redhat.com [10.10.61.39]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u4P7t4FF009788; Wed, 25 May 2016 03:55:08 -0400 From: mchristi@redhat.com To: linux-scsi@vger.kernel.org, linux-block@vger.kernel.org, target-devel@vger.kernel.org Cc: Mike Christie Subject: [PATCH 3/5] target: call queue reset if supported Date: Wed, 25 May 2016 02:55:01 -0500 Message-Id: <1464162903-14735-4-git-send-email-mchristi@redhat.com> In-Reply-To: <1464162903-14735-1-git-send-email-mchristi@redhat.com> References: <1464162903-14735-1-git-send-email-mchristi@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Wed, 25 May 2016 07:55:09 +0000 (UTC) Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: Mike Christie Instead of waiting for commands, map the lun reset operation to a queue reset. We do not check the result of blk_reset_queue because if it works then we need to wait for the bio/request completions and if it failed we might as wait and hope like we did before. Signed-off-by: Mike Christie --- drivers/target/target_core_file.c | 12 ++++++++++++ drivers/target/target_core_iblock.c | 8 ++++++++ drivers/target/target_core_pscsi.c | 8 ++++++++ drivers/target/target_core_tmr.c | 3 +++ include/target/target_core_backend.h | 1 + 5 files changed, 32 insertions(+) diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c index 75f0f08..d6af1f2 100644 --- a/drivers/target/target_core_file.c +++ b/drivers/target/target_core_file.c @@ -97,6 +97,17 @@ static struct se_device *fd_alloc_device(struct se_hba *hba, const char *name) return &fd_dev->dev; } +static int fd_reset_device(struct se_device *dev) +{ + struct fd_dev *fd_dev = FD_DEV(dev); + struct inode *inode; + + inode = fd_dev->fd_file->f_mapping->host; + if (!S_ISBLK(inode->i_mode)) + return -EOPNOTSUPP; + return blk_reset_queue(bdev_get_queue(inode->i_bdev)); +} + static int fd_configure_device(struct se_device *dev) { struct fd_dev *fd_dev = FD_DEV(dev); @@ -813,6 +824,7 @@ static const struct target_backend_ops fileio_ops = { .attach_hba = fd_attach_hba, .detach_hba = fd_detach_hba, .alloc_device = fd_alloc_device, + .reset_device = fd_reset_device, .configure_device = fd_configure_device, .free_device = fd_free_device, .parse_cdb = fd_parse_cdb, diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c index 7c4efb4..0a7dd59 100644 --- a/drivers/target/target_core_iblock.c +++ b/drivers/target/target_core_iblock.c @@ -79,6 +79,13 @@ static struct se_device *iblock_alloc_device(struct se_hba *hba, const char *nam return &ib_dev->dev; } +static int iblock_reset_device(struct se_device *dev) +{ + struct iblock_dev *ib_dev = IBLOCK_DEV(dev); + + return blk_reset_queue(bdev_get_queue(ib_dev->ibd_bd)); +} + static int iblock_configure_device(struct se_device *dev) { struct iblock_dev *ib_dev = IBLOCK_DEV(dev); @@ -848,6 +855,7 @@ static const struct target_backend_ops iblock_ops = { .detach_hba = iblock_detach_hba, .alloc_device = iblock_alloc_device, .configure_device = iblock_configure_device, + .reset_device = iblock_reset_device, .free_device = iblock_free_device, .parse_cdb = iblock_parse_cdb, .set_configfs_dev_params = iblock_set_configfs_dev_params, diff --git a/drivers/target/target_core_pscsi.c b/drivers/target/target_core_pscsi.c index de18790..fa0505b 100644 --- a/drivers/target/target_core_pscsi.c +++ b/drivers/target/target_core_pscsi.c @@ -455,6 +455,13 @@ static int pscsi_create_type_other(struct se_device *dev, return 0; } +static int pscsi_reset_device(struct se_device *dev) +{ + struct pscsi_dev_virt *pdv = PSCSI_DEV(dev); + + return blk_reset_queue(pdv->pdv_sd->request_queue); +} + static int pscsi_configure_device(struct se_device *dev) { struct se_hba *hba = dev->se_hba; @@ -1131,6 +1138,7 @@ static const struct target_backend_ops pscsi_ops = { .detach_hba = pscsi_detach_hba, .pmode_enable_hba = pscsi_pmode_enable_hba, .alloc_device = pscsi_alloc_device, + .reset_device = pscsi_reset_device, .configure_device = pscsi_configure_device, .free_device = pscsi_free_device, .transport_complete = pscsi_transport_complete, diff --git a/drivers/target/target_core_tmr.c b/drivers/target/target_core_tmr.c index 4f229e7..609ec53 100644 --- a/drivers/target/target_core_tmr.c +++ b/drivers/target/target_core_tmr.c @@ -431,6 +431,9 @@ int core_tmr_lun_reset( (preempt_and_abort_list) ? "Preempt" : "TMR", dev->transport->name, tas); + if (dev->transport->reset_device(dev)) + dev->transport->reset_device(dev); + core_tmr_drain_tmr_list(dev, tmr, preempt_and_abort_list); core_tmr_drain_state_list(dev, prout_cmd, tmr_sess, tas, preempt_and_abort_list); diff --git a/include/target/target_core_backend.h b/include/target/target_core_backend.h index 28ee5c2..a055e4f 100644 --- a/include/target/target_core_backend.h +++ b/include/target/target_core_backend.h @@ -17,6 +17,7 @@ struct target_backend_ops { struct se_device *(*alloc_device)(struct se_hba *, const char *); int (*configure_device)(struct se_device *); + int (*reset_device)(struct se_device *); void (*free_device)(struct se_device *device); ssize_t (*set_configfs_dev_params)(struct se_device *,