Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp722030ybt; Fri, 26 Jun 2020 09:58:08 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz3BXqg7xqAVCDfwAuMPouTrvXvpw14M87ZzbztlSIaGxdJ0BHyZiVYgW36tB9Xh936i0MJ X-Received: by 2002:a17:906:b6d1:: with SMTP id ec17mr3345800ejb.486.1593190687966; Fri, 26 Jun 2020 09:58:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1593190687; cv=none; d=google.com; s=arc-20160816; b=laQ88lN0t7UxA6iTU1mI5sJqEJD3OxKJU6JR2gUshfkIRPukNV1nqa7UiRedsEafTL Ax7lW6s1AhqogNoLNosVJXSTAoExTvqEqBx4V26nxkMab3xO3mOGGZr7vySqNJrZfk2t NMIoL952jDREIpUUP67NVgoQQuJ+EM1dQ7mp1b80+c5TEl3LPHkSmNw7bLsjDAhDUSJ3 Lirb3GZA84wJMm+gU3ND5lQ7YIGF0rVD4IDwZCk9xvvLmuFzxhGX3Z/T4e2usZQKNWwK uxfp5g1Q4Hrhx6soMGArQN00smCFpONDPC77HDtKIzhSD0okoRYyrijKwRS8Rm+Rkhs+ lNjg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:subject:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:cc:to:from :dkim-signature; bh=KLNaO9lK6UgdCJIP+OQpXj9iPqUBFHQpBytP4QLFdz4=; b=O6IVsi2V6OA0d3IG9cgw2ywhz4PMVzkkHL+j8Q3DEuU3GVqmzkkgHtYqZPDR1i/D76 WD4Z1RraypH1LvETgqgsZ67REWt40LJwI7Y9W+t8xyb9RL6JDK5GA9Isuh92uCLdJbRx O0UY+ttit2PDbmzq/FjGqq62gKK+GMyxWFp6tExW9a70OH3WBQKDRnCdBAqoYoL4wre7 GEHWa5c4f7HicbcS1Tw3ib94J9MtHijjQr1xWdZU9xaySfo6J+DcTM5i7mOKH9T6bHPb w5d7owRditT7Qf8roB7lGaLpjPWlT/WIRUZxOFn0rvzP4g1ZT2k4YUByQYZEXX1C3jSn XtjQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@deltatee.com header.s=20200525 header.b=QPKPApRd; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id i7si9911732ejc.325.2020.06.26.09.57.45; Fri, 26 Jun 2020 09:58:07 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=fail header.i=@deltatee.com header.s=20200525 header.b=QPKPApRd; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729770AbgFZPjl (ORCPT + 99 others); Fri, 26 Jun 2020 11:39:41 -0400 Received: from ale.deltatee.com ([207.54.116.67]:34862 "EHLO ale.deltatee.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729727AbgFZPji (ORCPT ); Fri, 26 Jun 2020 11:39:38 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=deltatee.com; s=20200525; h=Subject:Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=KLNaO9lK6UgdCJIP+OQpXj9iPqUBFHQpBytP4QLFdz4=; b=QPKPApRdBNqLnOOW23PkxiYhQA gdPltLzslki/rL0C+g/nFzRXXTrWsz7mVQh8mP+aP35iAzyBWGGcR8Ckd7lVcE/DTPC3g3PKC+B8K WyMTG62WZaBvHMeBJ4o60PH0bbJ/rLyQ6VFed3Uxg3soywER4008KbvmgJvhZGKZQjcGTn+4j9OHv lcAmqZxZVhwhxXbKGOba5C6bbkoq3ohpQor2GI9eKiMTCBGH/BS2fhG34yVggouKqdz/aFPJGR5BE yPIOvoDFEfGnEwHIOQm3M9LBOhdBlrrAHCygJNLWqslxc4PUIgXFsFiKbNE09CDPQXdKn+0iUslzC NDxZCJEA==; Received: from cgy1-donard.priv.deltatee.com ([172.16.1.31]) by ale.deltatee.com with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1joqRu-0000oX-43; Fri, 26 Jun 2020 09:39:35 -0600 Received: from gunthorp by cgy1-donard.priv.deltatee.com with local (Exim 4.92) (envelope-from ) id 1joqRn-0007Hl-OA; Fri, 26 Jun 2020 09:39:23 -0600 From: Logan Gunthorpe To: linux-kernel@vger.kernel.org, linux-nvme@lists.infradead.org Cc: Christoph Hellwig , Sagi Grimberg , Keith Busch , Jens Axboe , Chaitanya Kulkarni , Max Gurtovoy , Stephen Bates , Logan Gunthorpe Date: Fri, 26 Jun 2020 09:39:18 -0600 Message-Id: <20200626153918.27929-10-logang@deltatee.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200626153918.27929-1-logang@deltatee.com> References: <20200626153918.27929-1-logang@deltatee.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 172.16.1.31 X-SA-Exim-Rcpt-To: linux-kernel@vger.kernel.org, linux-nvme@lists.infradead.org, hch@lst.de, sagi@grimberg.me, kbusch@kernel.org, axboe@fb.com, Chaitanya.Kulkarni@wdc.com, maxg@mellanox.com, sbates@raithlin.com, logang@deltatee.com X-SA-Exim-Mail-From: gunthorp@deltatee.com X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on ale.deltatee.com X-Spam-Level: X-Spam-Status: No, score=-6.5 required=5.0 tests=ALL_TRUSTED,BAYES_00, MYRULES_FREE,MYRULES_NO_TEXT,URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.2 Subject: [PATCH v14 9/9] nvmet-configfs: Introduce passthru configfs interface X-SA-Exim-Version: 4.2.1 (built Wed, 08 May 2019 21:11:16 +0000) X-SA-Exim-Scanned: Yes (on ale.deltatee.com) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When CONFIG_NVME_TARGET_PASSTHRU as 'passthru' directory will be added to each subsystem. The directory is similar to a namespace and has two attributes: device_path and enable. The user must set the path to the nvme controller's char device and write '1' to enable the subsystem to use passthru. Any given subsystem is prevented from enabling both a regular namespace and the passthru device. If one is enabled, enabling the other will produce an error. Signed-off-by: Logan Gunthorpe Reviewed-by: Sagi Grimberg --- drivers/nvme/target/configfs.c | 99 ++++++++++++++++++++++++++++++++++ drivers/nvme/target/nvmet.h | 1 + 2 files changed, 100 insertions(+) diff --git a/drivers/nvme/target/configfs.c b/drivers/nvme/target/configfs.c index 61c258dea88a..74b2b61c773b 100644 --- a/drivers/nvme/target/configfs.c +++ b/drivers/nvme/target/configfs.c @@ -666,6 +666,103 @@ static const struct config_item_type nvmet_namespaces_type = { .ct_owner = THIS_MODULE, }; +#ifdef CONFIG_NVME_TARGET_PASSTHRU + +static ssize_t nvmet_passthru_device_path_show(struct config_item *item, + char *page) +{ + struct nvmet_subsys *subsys = to_subsys(item->ci_parent); + + return snprintf(page, PAGE_SIZE, "%s\n", subsys->passthru_ctrl_path); +} + +static ssize_t nvmet_passthru_device_path_store(struct config_item *item, + const char *page, size_t count) +{ + struct nvmet_subsys *subsys = to_subsys(item->ci_parent); + size_t len; + int ret; + + mutex_lock(&subsys->lock); + + ret = -EBUSY; + if (subsys->passthru_ctrl) + goto out_unlock; + + ret = -EINVAL; + len = strcspn(page, "\n"); + if (!len) + goto out_unlock; + + kfree(subsys->passthru_ctrl_path); + ret = -ENOMEM; + subsys->passthru_ctrl_path = kstrndup(page, len, GFP_KERNEL); + if (!subsys->passthru_ctrl_path) + goto out_unlock; + + mutex_unlock(&subsys->lock); + + return count; +out_unlock: + mutex_unlock(&subsys->lock); + return ret; +} +CONFIGFS_ATTR(nvmet_passthru_, device_path); + +static ssize_t nvmet_passthru_enable_show(struct config_item *item, + char *page) +{ + struct nvmet_subsys *subsys = to_subsys(item->ci_parent); + + return sprintf(page, "%d\n", subsys->passthru_ctrl ? 1 : 0); +} + +static ssize_t nvmet_passthru_enable_store(struct config_item *item, + const char *page, size_t count) +{ + struct nvmet_subsys *subsys = to_subsys(item->ci_parent); + bool enable; + int ret = 0; + + if (strtobool(page, &enable)) + return -EINVAL; + + if (enable) + ret = nvmet_passthru_ctrl_enable(subsys); + else + nvmet_passthru_ctrl_disable(subsys); + + return ret ? ret : count; +} +CONFIGFS_ATTR(nvmet_passthru_, enable); + +static struct configfs_attribute *nvmet_passthru_attrs[] = { + &nvmet_passthru_attr_device_path, + &nvmet_passthru_attr_enable, + NULL, +}; + +static const struct config_item_type nvmet_passthru_type = { + .ct_attrs = nvmet_passthru_attrs, + .ct_owner = THIS_MODULE, +}; + +static void nvmet_add_passthru_group(struct nvmet_subsys *subsys) +{ + config_group_init_type_name(&subsys->passthru_group, + "passthru", &nvmet_passthru_type); + configfs_add_default_group(&subsys->passthru_group, + &subsys->group); +} + +#else /* CONFIG_NVME_TARGET_PASSTHRU */ + +static void nvmet_add_passthru_group(struct nvmet_subsys *subsys) +{ +} + +#endif /* CONFIG_NVME_TARGET_PASSTHRU */ + static int nvmet_port_subsys_allow_link(struct config_item *parent, struct config_item *target) { @@ -1125,6 +1222,8 @@ static struct config_group *nvmet_subsys_make(struct config_group *group, configfs_add_default_group(&subsys->allowed_hosts_group, &subsys->group); + nvmet_add_passthru_group(subsys); + return &subsys->group; } diff --git a/drivers/nvme/target/nvmet.h b/drivers/nvme/target/nvmet.h index d8689744e0f7..deb3c52aae6d 100644 --- a/drivers/nvme/target/nvmet.h +++ b/drivers/nvme/target/nvmet.h @@ -249,6 +249,7 @@ struct nvmet_subsys { #ifdef CONFIG_NVME_TARGET_PASSTHRU struct nvme_ctrl *passthru_ctrl; char *passthru_ctrl_path; + struct config_group passthru_group; #endif /* CONFIG_NVME_TARGET_PASSTHRU */ }; -- 2.20.1