From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 28282C64E90 for ; Tue, 1 Dec 2020 12:57:36 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A76BB20857 for ; Tue, 1 Dec 2020 12:57:35 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=javigon-com.20150623.gappssmtp.com header.i=@javigon-com.20150623.gappssmtp.com header.b="NLwwJ4wN" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388140AbgLAM5D (ORCPT ); Tue, 1 Dec 2020 07:57:03 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59872 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726166AbgLAM5A (ORCPT ); Tue, 1 Dec 2020 07:57:00 -0500 Received: from mail-ed1-x541.google.com (mail-ed1-x541.google.com [IPv6:2a00:1450:4864:20::541]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BE399C0617A7 for ; Tue, 1 Dec 2020 04:56:19 -0800 (PST) Received: by mail-ed1-x541.google.com with SMTP id l5so3036036edq.11 for ; Tue, 01 Dec 2020 04:56:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=javigon-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Nu4i8+4GBsk/a/34aUwhlUNnDlkBrmJ8PlbnA/APAJM=; b=NLwwJ4wNWpFfJoYT8pcQU9oRaFmgRg+uvhSds5tb1IgB+Btv8/ottAfmxeJrjOTfzm XEKqElhFHeQCSElDcYHR11MVZ1VuebXwE24p5vO/9hioBdPUfqNbLke6DmM3oE2jSVVh 897VDTZYDiJFG66/nndkTE1nLr2UelsDQqulTsJlv+r/CS/h3WGs6gtCXUB7AsjmGLo3 NV/xIE0meVP7hrttfgqjxp7NSUEW8eUytksxuFrZDFXQMoNQnyobPuaSM3OFaJqwj5p0 HBte6Z4MJnbmIpPRka7YSxJegE3DF1nBN2m0n8kpj2CNxN/i9mbisouIezac7BC7VbA1 7tUg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Nu4i8+4GBsk/a/34aUwhlUNnDlkBrmJ8PlbnA/APAJM=; b=rBcwbGQxWkDX5S7siXA7qJDyQE3nKrPDk6Wh9Zsu7mg9652zrWIy4eK7lnQtDtXJkx P/zUohnPR9HfIek3g3ocg9jLNHWlipn4V42V/sBuR8mBcW8srfpuuMVNEpcqq8m0Xkgy mOxWekDvdNWqE1Jm9Z2LRS2S/mSZ8Yz7uAZU0KE8ahy8DWRepLuJTqIvIV77tLWzfBFz 0HSVaX+3DO/+V1Vj1WINZ0vqQBfN6DtLbQIic33/EnidNFm9qVf+SJ55twKb3Ucj4PVg yGSnPLtmEHPxejpE7+Rlzdg9thn7CYl/PgUVgtu8fDHkDp3KQZ8tYz0JCeWXkSETBIVm KRJg== X-Gm-Message-State: AOAM531cTZUWJNPNQA7yAGkMLt+4o/6ybUz0aAdgDMj1+KD85pVVIf1a 8hMvGM5Q/h30FPxNL73eI1eCvg== X-Google-Smtp-Source: ABdhPJzz5pTwzbu1PD5aW260CIbDPs9e9M5OJnQFulQoh0G5riZg3GLIIR0aTuao5F0EbRz2XtZAAw== X-Received: by 2002:aa7:d456:: with SMTP id q22mr3032586edr.206.1606827378485; Tue, 01 Dec 2020 04:56:18 -0800 (PST) Received: from ch-wrk-javier.localdomain (5.186.124.214.cgn.fibianet.dk. [5.186.124.214]) by smtp.gmail.com with ESMTPSA id be6sm796864edb.29.2020.12.01.04.56.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 01 Dec 2020 04:56:17 -0800 (PST) From: javier@javigon.com X-Google-Original-From: javier.gonz@samsung.com To: linux-nvme@lists.infradead.org Cc: linux-block@vger.kernel.org, hch@lst.de, kbusch@kernel.org, sagi@grimberg.me, =?UTF-8?q?Javier=20Gonz=C3=A1lez?= Subject: [PATCH 4/4] nvme: enable char device per namespace Date: Tue, 1 Dec 2020 13:56:10 +0100 Message-Id: <20201201125610.17138-5-javier.gonz@samsung.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201201125610.17138-1-javier.gonz@samsung.com> References: <20201201125610.17138-1-javier.gonz@samsung.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org From: Javier González Create a char device per NVMe namespace. This char device is always initialized, independently of whether thedeatures implemented by the device are supported by the kernel. User-space can therefore always issue IOCTLs to the NVMe driver using this char device. The char device is presented as /dev/nvmeXcYnZ to follow the hidden block device. This naming also aligns with nvme-cli filters, so the char device should be usable without tool changes. Signed-off-by: Javier González --- drivers/nvme/host/core.c | 144 +++++++++++++++++++++++++++++++++++---- drivers/nvme/host/nvme.h | 3 + 2 files changed, 132 insertions(+), 15 deletions(-) diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 2c23ea6dc296..9c4acf2725f3 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -86,7 +86,9 @@ static DEFINE_MUTEX(nvme_subsystems_lock); static DEFINE_IDA(nvme_instance_ida); static dev_t nvme_ctrl_base_chr_devt; +static dev_t nvme_ns_base_chr_devt; static struct class *nvme_class; +static struct class *nvme_ns_class; static struct class *nvme_subsys_class; static void nvme_put_subsystem(struct nvme_subsystem *subsys); @@ -497,6 +499,7 @@ static void nvme_free_ns(struct kref *kref) if (ns->ndev) nvme_nvm_unregister(ns); + cdev_device_del(&ns->cdev, &ns->cdev_device); put_disk(ns->disk); nvme_put_ns_head(ns->head); nvme_put_ctrl(ns->ctrl); @@ -1696,15 +1699,15 @@ static int nvme_handle_ctrl_ioctl(struct nvme_ns *ns, unsigned int cmd, return ret; } -static int nvme_ioctl(struct block_device *bdev, fmode_t mode, - unsigned int cmd, unsigned long arg) +static int __nvme_ns_ioctl(struct gendisk *disk, unsigned int cmd, + unsigned long arg) { struct nvme_ns_head *head = NULL; void __user *argp = (void __user *)arg; struct nvme_ns *ns; int srcu_idx, ret; - ns = nvme_get_ns_from_disk(bdev->bd_disk, &head, &srcu_idx); + ns = nvme_get_ns_from_disk(disk, &head, &srcu_idx); if (unlikely(!ns)) return -EWOULDBLOCK; @@ -1741,6 +1744,18 @@ static int nvme_ioctl(struct block_device *bdev, fmode_t mode, return ret; } +static int nvme_ioctl(struct block_device *bdev, fmode_t mode, + unsigned int cmd, unsigned long arg) +{ + return __nvme_ns_ioctl(bdev->bd_disk, cmd, arg); +} + +static long nvme_cdev_ioctl(struct file *file, unsigned int cmd, + unsigned long arg) +{ + return __nvme_ns_ioctl((struct gendisk *)file->private_data, cmd, arg); +} + #ifdef CONFIG_COMPAT struct nvme_user_io32 { __u8 opcode; @@ -1782,10 +1797,8 @@ static int nvme_compat_ioctl(struct block_device *bdev, fmode_t mode, #define nvme_compat_ioctl NULL #endif /* CONFIG_COMPAT */ -static int nvme_open(struct block_device *bdev, fmode_t mode) +static int __nvme_open(struct nvme_ns *ns) { - struct nvme_ns *ns = bdev->bd_disk->private_data; - #ifdef CONFIG_NVME_MULTIPATH /* should never be called due to GENHD_FL_HIDDEN */ if (WARN_ON_ONCE(ns->head->disk)) @@ -1804,12 +1817,24 @@ static int nvme_open(struct block_device *bdev, fmode_t mode) return -ENXIO; } +static void __nvme_release(struct nvme_ns *ns) +{ + module_put(ns->ctrl->ops->module); + nvme_put_ns(ns); +} + +static int nvme_open(struct block_device *bdev, fmode_t mode) +{ + struct nvme_ns *ns = bdev->bd_disk->private_data; + + return __nvme_open(ns); +} + static void nvme_release(struct gendisk *disk, fmode_t mode) { struct nvme_ns *ns = disk->private_data; - module_put(ns->ctrl->ops->module); - nvme_put_ns(ns); + __nvme_release(ns); } static int nvme_getgeo(struct block_device *bdev, struct hd_geometry *geo) @@ -1821,6 +1846,26 @@ static int nvme_getgeo(struct block_device *bdev, struct hd_geometry *geo) return 0; } +static int nvme_cdev_open(struct inode *inode, struct file *file) +{ + struct nvme_ns *ns = container_of(inode->i_cdev, struct nvme_ns, cdev); + int ret; + + ret = __nvme_open(ns); + if (!ret) + file->private_data = ns->disk; + + return ret; +} + +static int nvme_cdev_release(struct inode *inode, struct file *file) +{ + struct nvme_ns *ns = container_of(inode->i_cdev, struct nvme_ns, cdev); + + __nvme_release(ns); + return 0; +} + #ifdef CONFIG_BLK_DEV_INTEGRITY static void nvme_init_integrity(struct gendisk *disk, u16 ms, u8 pi_type, u32 max_integrity_segments) @@ -2303,6 +2348,14 @@ static const struct block_device_operations nvme_bdev_ops = { .pr_ops = &nvme_pr_ops, }; +static const struct file_operations nvme_cdev_fops = { + .owner = THIS_MODULE, + .open = nvme_cdev_open, + .release = nvme_cdev_release, + .unlocked_ioctl = nvme_cdev_ioctl, + .compat_ioctl = compat_ptr_ioctl, +}; + #ifdef CONFIG_NVME_MULTIPATH static int nvme_ns_head_open(struct block_device *bdev, fmode_t mode) { @@ -3301,6 +3354,9 @@ static inline struct nvme_ns_head *dev_to_ns_head(struct device *dev) { struct gendisk *disk = dev_to_disk(dev); + if (dev->class == nvme_ns_class) + return ((struct nvme_ns *)dev_get_drvdata(dev))->head; + if (disk->fops == &nvme_bdev_ops) return nvme_get_ns_from_dev(dev)->head; else @@ -3390,7 +3446,7 @@ static struct attribute *nvme_ns_id_attrs[] = { }; static umode_t nvme_ns_id_attrs_are_visible(struct kobject *kobj, - struct attribute *a, int n) + struct attribute *a, int n) { struct device *dev = container_of(kobj, struct device, kobj); struct nvme_ns_ids *ids = &dev_to_ns_head(dev)->ids; @@ -3432,6 +3488,11 @@ const struct attribute_group *nvme_ns_id_attr_groups[] = { NULL, }; +const struct attribute_group *nvme_ns_char_id_attr_groups[] = { + &nvme_ns_id_attr_group, + NULL, +}; + #define nvme_show_str_function(field) \ static ssize_t field##_show(struct device *dev, \ struct device_attribute *attr, char *buf) \ @@ -3824,6 +3885,36 @@ struct nvme_ns *nvme_find_get_ns(struct nvme_ctrl *ctrl, unsigned nsid) } EXPORT_SYMBOL_NS_GPL(nvme_find_get_ns, NVME_TARGET_PASSTHRU); +static int nvme_alloc_chardev_ns(struct nvme_ctrl *ctrl, struct nvme_ns *ns) +{ + char cdisk_name[DISK_NAME_LEN]; + int ret = 0; + + device_initialize(&ns->cdev_device); + ns->cdev_device.devt = MKDEV(MAJOR(nvme_ns_base_chr_devt), + ns->head->instance); + ns->cdev_device.class = nvme_ns_class; + ns->cdev_device.parent = ctrl->device; + ns->cdev_device.groups = nvme_ns_char_id_attr_groups; + dev_set_drvdata(&ns->cdev_device, ns); + + sprintf(cdisk_name, "nvme%dc%dn%d", ctrl->subsys->instance, + ctrl->instance, ns->head->instance); + + ret = dev_set_name(&ns->cdev_device, "%s", cdisk_name); + if (ret) + return ret; + + cdev_init(&ns->cdev, &nvme_cdev_fops); + ns->cdev.owner = ctrl->ops->module; + + ret = cdev_device_add(&ns->cdev, &ns->cdev_device); + if (ret) + kfree_const(ns->cdev_device.kobj.name); + + return ret; +} + static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid, struct nvme_ns_ids *ids) { @@ -3870,8 +3961,12 @@ static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid, memcpy(disk->disk_name, disk_name, DISK_NAME_LEN); ns->disk = disk; + /* When the device does not support any of the features required by the + * kernel (or viceversa), hide the block device. We can still rely on + * the namespace char device for submitting IOCTLs + */ if (nvme_update_ns_info(ns, id)) - goto out_put_disk; + disk->flags |= GENHD_FL_HIDDEN; if ((ctrl->quirks & NVME_QUIRK_LIGHTNVM) && id->vs[0] == 0x1) { if (nvme_nvm_register(ns, disk_name, node)) { @@ -3887,9 +3982,12 @@ static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid, nvme_get_ctrl(ctrl); device_add_disk(ctrl->device, ns->disk, nvme_ns_id_attr_groups); - nvme_mpath_add_disk(ns, id); nvme_fault_inject_init(&ns->fault_inject, ns->disk->disk_name); + + if (nvme_alloc_chardev_ns(ctrl, ns)) + goto out_put_disk; + kfree(id); return; @@ -4685,23 +4783,38 @@ static int __init nvme_core_init(void) if (result < 0) goto destroy_delete_wq; + result = alloc_chrdev_region(&nvme_ns_base_chr_devt, 0, + NVME_MINORS, "nvmec"); + if (result < 0) + goto unregister_dev_chrdev; + nvme_class = class_create(THIS_MODULE, "nvme"); if (IS_ERR(nvme_class)) { result = PTR_ERR(nvme_class); - goto unregister_chrdev; + goto unregister_ns_chrdev; } nvme_class->dev_uevent = nvme_class_uevent; + nvme_ns_class = class_create(THIS_MODULE, "nvme-ns"); + if (IS_ERR(nvme_ns_class)) { + result = PTR_ERR(nvme_ns_class); + goto destroy_dev_class; + } + nvme_subsys_class = class_create(THIS_MODULE, "nvme-subsystem"); if (IS_ERR(nvme_subsys_class)) { result = PTR_ERR(nvme_subsys_class); - goto destroy_class; + goto destroy_ns_class; } return 0; -destroy_class: +destroy_ns_class: + class_destroy(nvme_ns_class); +destroy_dev_class: class_destroy(nvme_class); -unregister_chrdev: +unregister_ns_chrdev: + unregister_chrdev_region(nvme_ns_base_chr_devt, NVME_MINORS); +unregister_dev_chrdev: unregister_chrdev_region(nvme_ctrl_base_chr_devt, NVME_MINORS); destroy_delete_wq: destroy_workqueue(nvme_delete_wq); @@ -4717,6 +4830,7 @@ static void __exit nvme_core_exit(void) { class_destroy(nvme_subsys_class); class_destroy(nvme_class); + unregister_chrdev_region(nvme_ns_base_chr_devt, NVME_MINORS); unregister_chrdev_region(nvme_ctrl_base_chr_devt, NVME_MINORS); destroy_workqueue(nvme_delete_wq); destroy_workqueue(nvme_reset_wq); diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index cdfce7250da0..533bd54f9194 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -436,6 +436,9 @@ struct nvme_ns { struct kref kref; struct nvme_ns_head *head; + struct device cdev_device; /* char device */ + struct cdev cdev; + int lba_shift; u16 ms; u16 sgs; -- 2.17.1 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 355BCC83013 for ; Tue, 1 Dec 2020 12:56:27 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 9A3FB207FF for ; Tue, 1 Dec 2020 12:56:26 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="lEQbmAis"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=javigon-com.20150623.gappssmtp.com header.i=@javigon-com.20150623.gappssmtp.com header.b="NLwwJ4wN" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9A3FB207FF Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=javigon.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-nvme-bounces+linux-nvme=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Transfer-Encoding: Content-Type:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:Message-Id:Date: Subject:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=uzQiSqOWAYHqh4epXQPuS3DVpQE9SJ4BQ7E+3e7NP/Y=; b=lEQbmAis7Ilf1syOD6GlLO681 MaPQoURKdWLQ4UHSBf4m11nReVr4oR5JAwSiFZE0IvuLu02NuXPvrb9SDzYQavP4y92Diqcflb0Dr zWfxRiL6S+tzgLBvh0Xd6yga5P27al65Ve5G3Z94g3B+6Ek9xTs4ylCd91k8wjSVGN/1cpi7c5XW+ wiRAAuJUTELmB5TiO5F7O6vr/cRJ9QSvKiCFQs1bKB3P0Nh/cuycAEc/kQEk+fkCOJnfP1+AvOsL9 UVeTW5ZTkfA7v9BlL/ubNE0O+++hUhkF42YEF1z0KGLFA/+UF/6G4xWxf2a4F0kD9vurNoAa8Ea1k AnpIR3LWg==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kk5Ci-0005Ss-3I; Tue, 01 Dec 2020 12:56:24 +0000 Received: from mail-ed1-x543.google.com ([2a00:1450:4864:20::543]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1kk5Cd-0005RS-R3 for linux-nvme@lists.infradead.org; Tue, 01 Dec 2020 12:56:21 +0000 Received: by mail-ed1-x543.google.com with SMTP id n24so3082137edb.4 for ; Tue, 01 Dec 2020 04:56:19 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=javigon-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Nu4i8+4GBsk/a/34aUwhlUNnDlkBrmJ8PlbnA/APAJM=; b=NLwwJ4wNWpFfJoYT8pcQU9oRaFmgRg+uvhSds5tb1IgB+Btv8/ottAfmxeJrjOTfzm XEKqElhFHeQCSElDcYHR11MVZ1VuebXwE24p5vO/9hioBdPUfqNbLke6DmM3oE2jSVVh 897VDTZYDiJFG66/nndkTE1nLr2UelsDQqulTsJlv+r/CS/h3WGs6gtCXUB7AsjmGLo3 NV/xIE0meVP7hrttfgqjxp7NSUEW8eUytksxuFrZDFXQMoNQnyobPuaSM3OFaJqwj5p0 HBte6Z4MJnbmIpPRka7YSxJegE3DF1nBN2m0n8kpj2CNxN/i9mbisouIezac7BC7VbA1 7tUg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=Nu4i8+4GBsk/a/34aUwhlUNnDlkBrmJ8PlbnA/APAJM=; b=bNP7I+OItcqOvz0Dg5G2Ax2IH9hV4OcnCYCPlu9GOHNeqMSs0MvTLNLdwQj7RIHtB3 OqwEtP5pJB51k8i5/Jpv8RLCkpiR6+GJk86Ql8ixDv+OZ7yzHViSVzKtml3FyFZxT84M 2DrE7fy+8gFTvLOs5MVhV+H6JRIro7hE4T7Iu1qpQzFbXdXfJNvmgZbPTC71v/LpPqOM ACY8QuORjk6VP7WnSAQIH5NnJjV5PyE09GCYZ8yFqoKRoXnmh3/aH+9XSoI+71YK3+Q5 acOtPcnlvPxy9xr4X5KmAhZNL3l70ruKGP7Q7jgVirasBIMFf0pQajGyK70f3jMIdPcI y5Rg== X-Gm-Message-State: AOAM533IRlWiWT328mmzzu8BYElnSPVt78qanMyf1ZhFJ5oqotzqAHcX gaOKBdwqhiGeFf8xMYufU0EaNbNErb3eul5KIjs= X-Google-Smtp-Source: ABdhPJzz5pTwzbu1PD5aW260CIbDPs9e9M5OJnQFulQoh0G5riZg3GLIIR0aTuao5F0EbRz2XtZAAw== X-Received: by 2002:aa7:d456:: with SMTP id q22mr3032586edr.206.1606827378485; Tue, 01 Dec 2020 04:56:18 -0800 (PST) Received: from ch-wrk-javier.localdomain (5.186.124.214.cgn.fibianet.dk. [5.186.124.214]) by smtp.gmail.com with ESMTPSA id be6sm796864edb.29.2020.12.01.04.56.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 01 Dec 2020 04:56:17 -0800 (PST) From: javier@javigon.com X-Google-Original-From: javier.gonz@samsung.com To: linux-nvme@lists.infradead.org Subject: [PATCH 4/4] nvme: enable char device per namespace Date: Tue, 1 Dec 2020 13:56:10 +0100 Message-Id: <20201201125610.17138-5-javier.gonz@samsung.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201201125610.17138-1-javier.gonz@samsung.com> References: <20201201125610.17138-1-javier.gonz@samsung.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20201201_075620_016410_83F44FC2 X-CRM114-Status: GOOD ( 25.51 ) X-BeenThere: linux-nvme@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-block@vger.kernel.org, kbusch@kernel.org, =?UTF-8?q?Javier=20Gonz=C3=A1lez?= , hch@lst.de, sagi@grimberg.me Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-nvme" Errors-To: linux-nvme-bounces+linux-nvme=archiver.kernel.org@lists.infradead.org RnJvbTogSmF2aWVyIEdvbnrDoWxleiA8amF2aWVyLmdvbnpAc2Ftc3VuZy5jb20+CgpDcmVhdGUg YSBjaGFyIGRldmljZSBwZXIgTlZNZSBuYW1lc3BhY2UuIFRoaXMgY2hhciBkZXZpY2UgaXMgYWx3 YXlzCmluaXRpYWxpemVkLCBpbmRlcGVuZGVudGx5IG9mIHdoZXRoZXIgdGhlZGVhdHVyZXMgaW1w bGVtZW50ZWQgYnkgdGhlCmRldmljZSBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBrZXJuZWwuIFVzZXIt c3BhY2UgY2FuIHRoZXJlZm9yZSBhbHdheXMKaXNzdWUgSU9DVExzIHRvIHRoZSBOVk1lIGRyaXZl ciB1c2luZyB0aGlzIGNoYXIgZGV2aWNlLgoKVGhlIGNoYXIgZGV2aWNlIGlzIHByZXNlbnRlZCBh cyAvZGV2L252bWVYY1luWiB0byBmb2xsb3cgdGhlIGhpZGRlbgpibG9jayBkZXZpY2UuIFRoaXMg bmFtaW5nIGFsc28gYWxpZ25zIHdpdGggbnZtZS1jbGkgZmlsdGVycywgc28gdGhlIGNoYXIKZGV2 aWNlIHNob3VsZCBiZSB1c2FibGUgd2l0aG91dCB0b29sIGNoYW5nZXMuCgpTaWduZWQtb2ZmLWJ5 OiBKYXZpZXIgR29uesOhbGV6IDxqYXZpZXIuZ29uekBzYW1zdW5nLmNvbT4KLS0tCiBkcml2ZXJz L252bWUvaG9zdC9jb3JlLmMgfCAxNDQgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KystLS0tCiBkcml2ZXJzL252bWUvaG9zdC9udm1lLmggfCAgIDMgKwogMiBmaWxlcyBjaGFuZ2Vk LCAxMzIgaW5zZXJ0aW9ucygrKSwgMTUgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVy cy9udm1lL2hvc3QvY29yZS5jIGIvZHJpdmVycy9udm1lL2hvc3QvY29yZS5jCmluZGV4IDJjMjNl YTZkYzI5Ni4uOWM0YWNmMjcyNWYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL252bWUvaG9zdC9jb3Jl LmMKKysrIGIvZHJpdmVycy9udm1lL2hvc3QvY29yZS5jCkBAIC04Niw3ICs4Niw5IEBAIHN0YXRp YyBERUZJTkVfTVVURVgobnZtZV9zdWJzeXN0ZW1zX2xvY2spOwogCiBzdGF0aWMgREVGSU5FX0lE QShudm1lX2luc3RhbmNlX2lkYSk7CiBzdGF0aWMgZGV2X3QgbnZtZV9jdHJsX2Jhc2VfY2hyX2Rl dnQ7CitzdGF0aWMgZGV2X3QgbnZtZV9uc19iYXNlX2Nocl9kZXZ0Owogc3RhdGljIHN0cnVjdCBj bGFzcyAqbnZtZV9jbGFzczsKK3N0YXRpYyBzdHJ1Y3QgY2xhc3MgKm52bWVfbnNfY2xhc3M7CiBz dGF0aWMgc3RydWN0IGNsYXNzICpudm1lX3N1YnN5c19jbGFzczsKIAogc3RhdGljIHZvaWQgbnZt ZV9wdXRfc3Vic3lzdGVtKHN0cnVjdCBudm1lX3N1YnN5c3RlbSAqc3Vic3lzKTsKQEAgLTQ5Nyw2 ICs0OTksNyBAQCBzdGF0aWMgdm9pZCBudm1lX2ZyZWVfbnMoc3RydWN0IGtyZWYgKmtyZWYpCiAJ aWYgKG5zLT5uZGV2KQogCQludm1lX252bV91bnJlZ2lzdGVyKG5zKTsKIAorCWNkZXZfZGV2aWNl X2RlbCgmbnMtPmNkZXYsICZucy0+Y2Rldl9kZXZpY2UpOwogCXB1dF9kaXNrKG5zLT5kaXNrKTsK IAludm1lX3B1dF9uc19oZWFkKG5zLT5oZWFkKTsKIAludm1lX3B1dF9jdHJsKG5zLT5jdHJsKTsK QEAgLTE2OTYsMTUgKzE2OTksMTUgQEAgc3RhdGljIGludCBudm1lX2hhbmRsZV9jdHJsX2lvY3Rs KHN0cnVjdCBudm1lX25zICpucywgdW5zaWduZWQgaW50IGNtZCwKIAlyZXR1cm4gcmV0OwogfQog Ci1zdGF0aWMgaW50IG52bWVfaW9jdGwoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgZm1vZGVf dCBtb2RlLAotCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBp bnQgX19udm1lX25zX2lvY3RsKHN0cnVjdCBnZW5kaXNrICpkaXNrLCB1bnNpZ25lZCBpbnQgY21k LAorCQkJICAgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IG52bWVfbnNfaGVhZCAqaGVh ZCA9IE5VTEw7CiAJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CiAJc3Ry dWN0IG52bWVfbnMgKm5zOwogCWludCBzcmN1X2lkeCwgcmV0OwogCi0JbnMgPSBudm1lX2dldF9u c19mcm9tX2Rpc2soYmRldi0+YmRfZGlzaywgJmhlYWQsICZzcmN1X2lkeCk7CisJbnMgPSBudm1l X2dldF9uc19mcm9tX2Rpc2soZGlzaywgJmhlYWQsICZzcmN1X2lkeCk7CiAJaWYgKHVubGlrZWx5 KCFucykpCiAJCXJldHVybiAtRVdPVUxEQkxPQ0s7CiAKQEAgLTE3NDEsNiArMTc0NCwxOCBAQCBz dGF0aWMgaW50IG52bWVfaW9jdGwoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgZm1vZGVfdCBt b2RlLAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgbnZtZV9pb2N0bChzdHJ1Y3QgYmxv Y2tfZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUsCisJCSAgICAgIHVuc2lnbmVkIGludCBjbWQs IHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiBfX252bWVfbnNfaW9jdGwoYmRldi0+YmRf ZGlzaywgY21kLCBhcmcpOworfQorCitzdGF0aWMgbG9uZyBudm1lX2NkZXZfaW9jdGwoc3RydWN0 IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkgICAgdW5zaWduZWQgbG9uZyBhcmcp Cit7CisJcmV0dXJuIF9fbnZtZV9uc19pb2N0bCgoc3RydWN0IGdlbmRpc2sgKilmaWxlLT5wcml2 YXRlX2RhdGEsIGNtZCwgYXJnKTsKK30KKwogI2lmZGVmIENPTkZJR19DT01QQVQKIHN0cnVjdCBu dm1lX3VzZXJfaW8zMiB7CiAJX191OAlvcGNvZGU7CkBAIC0xNzgyLDEwICsxNzk3LDggQEAgc3Rh dGljIGludCBudm1lX2NvbXBhdF9pb2N0bChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBmbW9k ZV90IG1vZGUsCiAjZGVmaW5lIG52bWVfY29tcGF0X2lvY3RsCU5VTEwKICNlbmRpZiAvKiBDT05G SUdfQ09NUEFUICovCiAKLXN0YXRpYyBpbnQgbnZtZV9vcGVuKHN0cnVjdCBibG9ja19kZXZpY2Ug KmJkZXYsIGZtb2RlX3QgbW9kZSkKK3N0YXRpYyBpbnQgX19udm1lX29wZW4oc3RydWN0IG52bWVf bnMgKm5zKQogewotCXN0cnVjdCBudm1lX25zICpucyA9IGJkZXYtPmJkX2Rpc2stPnByaXZhdGVf ZGF0YTsKLQogI2lmZGVmIENPTkZJR19OVk1FX01VTFRJUEFUSAogCS8qIHNob3VsZCBuZXZlciBi ZSBjYWxsZWQgZHVlIHRvIEdFTkhEX0ZMX0hJRERFTiAqLwogCWlmIChXQVJOX09OX09OQ0UobnMt PmhlYWQtPmRpc2spKQpAQCAtMTgwNCwxMiArMTgxNywyNCBAQCBzdGF0aWMgaW50IG52bWVfb3Bl bihzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUpCiAJcmV0dXJuIC1FTlhJ TzsKIH0KIAorc3RhdGljIHZvaWQgX19udm1lX3JlbGVhc2Uoc3RydWN0IG52bWVfbnMgKm5zKQor eworCW1vZHVsZV9wdXQobnMtPmN0cmwtPm9wcy0+bW9kdWxlKTsKKwludm1lX3B1dF9ucyhucyk7 Cit9CisKK3N0YXRpYyBpbnQgbnZtZV9vcGVuKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGZt b2RlX3QgbW9kZSkKK3sKKwlzdHJ1Y3QgbnZtZV9ucyAqbnMgPSBiZGV2LT5iZF9kaXNrLT5wcml2 YXRlX2RhdGE7CisKKwlyZXR1cm4gX19udm1lX29wZW4obnMpOworfQorCiBzdGF0aWMgdm9pZCBu dm1lX3JlbGVhc2Uoc3RydWN0IGdlbmRpc2sgKmRpc2ssIGZtb2RlX3QgbW9kZSkKIHsKIAlzdHJ1 Y3QgbnZtZV9ucyAqbnMgPSBkaXNrLT5wcml2YXRlX2RhdGE7CiAKLQltb2R1bGVfcHV0KG5zLT5j dHJsLT5vcHMtPm1vZHVsZSk7Ci0JbnZtZV9wdXRfbnMobnMpOworCV9fbnZtZV9yZWxlYXNlKG5z KTsKIH0KIAogc3RhdGljIGludCBudm1lX2dldGdlbyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2 LCBzdHJ1Y3QgaGRfZ2VvbWV0cnkgKmdlbykKQEAgLTE4MjEsNiArMTg0NiwyNiBAQCBzdGF0aWMg aW50IG52bWVfZ2V0Z2VvKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHN0cnVjdCBoZF9nZW9t ZXRyeSAqZ2VvKQogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG52bWVfY2Rldl9vcGVuKHN0 cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBudm1lX25z ICpucyA9IGNvbnRhaW5lcl9vZihpbm9kZS0+aV9jZGV2LCBzdHJ1Y3QgbnZtZV9ucywgY2Rldik7 CisJaW50IHJldDsKKworCXJldCA9IF9fbnZtZV9vcGVuKG5zKTsKKwlpZiAoIXJldCkKKwkJZmls ZS0+cHJpdmF0ZV9kYXRhID0gbnMtPmRpc2s7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMg aW50IG52bWVfY2Rldl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpm aWxlKQoreworCXN0cnVjdCBudm1lX25zICpucyA9IGNvbnRhaW5lcl9vZihpbm9kZS0+aV9jZGV2 LCBzdHJ1Y3QgbnZtZV9ucywgY2Rldik7CisKKwlfX252bWVfcmVsZWFzZShucyk7CisJcmV0dXJu IDA7Cit9CisKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTlRFR1JJVFkKIHN0YXRpYyB2b2lkIG52 bWVfaW5pdF9pbnRlZ3JpdHkoc3RydWN0IGdlbmRpc2sgKmRpc2ssIHUxNiBtcywgdTggcGlfdHlw ZSwKIAkJCQl1MzIgbWF4X2ludGVncml0eV9zZWdtZW50cykKQEAgLTIzMDMsNiArMjM0OCwxNCBA QCBzdGF0aWMgY29uc3Qgc3RydWN0IGJsb2NrX2RldmljZV9vcGVyYXRpb25zIG52bWVfYmRldl9v cHMgPSB7CiAJLnByX29wcwkJPSAmbnZtZV9wcl9vcHMsCiB9OwogCitzdGF0aWMgY29uc3Qgc3Ry dWN0IGZpbGVfb3BlcmF0aW9ucyBudm1lX2NkZXZfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19N T0RVTEUsCisJLm9wZW4JCT0gbnZtZV9jZGV2X29wZW4sCisJLnJlbGVhc2UJPSBudm1lX2NkZXZf cmVsZWFzZSwKKwkudW5sb2NrZWRfaW9jdGwJPSBudm1lX2NkZXZfaW9jdGwsCisJLmNvbXBhdF9p b2N0bAk9IGNvbXBhdF9wdHJfaW9jdGwsCit9OworCiAjaWZkZWYgQ09ORklHX05WTUVfTVVMVElQ QVRICiBzdGF0aWMgaW50IG52bWVfbnNfaGVhZF9vcGVuKHN0cnVjdCBibG9ja19kZXZpY2UgKmJk ZXYsIGZtb2RlX3QgbW9kZSkKIHsKQEAgLTMzMDEsNiArMzM1NCw5IEBAIHN0YXRpYyBpbmxpbmUg c3RydWN0IG52bWVfbnNfaGVhZCAqZGV2X3RvX25zX2hlYWQoc3RydWN0IGRldmljZSAqZGV2KQog ewogCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gZGV2X3RvX2Rpc2soZGV2KTsKIAorCWlmIChkZXYt PmNsYXNzID09IG52bWVfbnNfY2xhc3MpCisJCXJldHVybiAoKHN0cnVjdCBudm1lX25zICopZGV2 X2dldF9kcnZkYXRhKGRldikpLT5oZWFkOworCiAJaWYgKGRpc2stPmZvcHMgPT0gJm52bWVfYmRl dl9vcHMpCiAJCXJldHVybiBudm1lX2dldF9uc19mcm9tX2RldihkZXYpLT5oZWFkOwogCWVsc2UK QEAgLTMzOTAsNyArMzQ0Niw3IEBAIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpudm1lX25zX2lk X2F0dHJzW10gPSB7CiB9OwogCiBzdGF0aWMgdW1vZGVfdCBudm1lX25zX2lkX2F0dHJzX2FyZV92 aXNpYmxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQlzdHJ1Y3QgYXR0cmlidXRlICphLCBpbnQg bikKKwkgICAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYSwgaW50IG4pCiB7CiAJc3RydWN0IGRldmlj ZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOwogCXN0cnVj dCBudm1lX25zX2lkcyAqaWRzID0gJmRldl90b19uc19oZWFkKGRldiktPmlkczsKQEAgLTM0MzIs NiArMzQ4OCwxMSBAQCBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpudm1lX25zX2lkX2F0 dHJfZ3JvdXBzW10gPSB7CiAJTlVMTCwKIH07CiAKK2NvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3Jv dXAgKm52bWVfbnNfY2hhcl9pZF9hdHRyX2dyb3Vwc1tdID0geworCSZudm1lX25zX2lkX2F0dHJf Z3JvdXAsCisJTlVMTCwKK307CisKICNkZWZpbmUgbnZtZV9zaG93X3N0cl9mdW5jdGlvbihmaWVs ZCkJCQkJCQlcCiBzdGF0aWMgc3NpemVfdCAgZmllbGQjI19zaG93KHN0cnVjdCBkZXZpY2UgKmRl diwJCQkJXAogCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYp CQlcCkBAIC0zODI0LDYgKzM4ODUsMzYgQEAgc3RydWN0IG52bWVfbnMgKm52bWVfZmluZF9nZXRf bnMoc3RydWN0IG52bWVfY3RybCAqY3RybCwgdW5zaWduZWQgbnNpZCkKIH0KIEVYUE9SVF9TWU1C T0xfTlNfR1BMKG52bWVfZmluZF9nZXRfbnMsIE5WTUVfVEFSR0VUX1BBU1NUSFJVKTsKIAorc3Rh dGljIGludCBudm1lX2FsbG9jX2NoYXJkZXZfbnMoc3RydWN0IG52bWVfY3RybCAqY3RybCwgc3Ry dWN0IG52bWVfbnMgKm5zKQoreworCWNoYXIgY2Rpc2tfbmFtZVtESVNLX05BTUVfTEVOXTsKKwlp bnQgcmV0ID0gMDsKKworCWRldmljZV9pbml0aWFsaXplKCZucy0+Y2Rldl9kZXZpY2UpOworCW5z LT5jZGV2X2RldmljZS5kZXZ0ID0gTUtERVYoTUFKT1IobnZtZV9uc19iYXNlX2Nocl9kZXZ0KSwK KwkJCQkgICAgIG5zLT5oZWFkLT5pbnN0YW5jZSk7CisJbnMtPmNkZXZfZGV2aWNlLmNsYXNzID0g bnZtZV9uc19jbGFzczsKKwlucy0+Y2Rldl9kZXZpY2UucGFyZW50ID0gY3RybC0+ZGV2aWNlOwor CW5zLT5jZGV2X2RldmljZS5ncm91cHMgPSBudm1lX25zX2NoYXJfaWRfYXR0cl9ncm91cHM7CisJ ZGV2X3NldF9kcnZkYXRhKCZucy0+Y2Rldl9kZXZpY2UsIG5zKTsKKworCXNwcmludGYoY2Rpc2tf bmFtZSwgIm52bWUlZGMlZG4lZCIsIGN0cmwtPnN1YnN5cy0+aW5zdGFuY2UsCisJCQljdHJsLT5p bnN0YW5jZSwgbnMtPmhlYWQtPmluc3RhbmNlKTsKKworCXJldCA9IGRldl9zZXRfbmFtZSgmbnMt PmNkZXZfZGV2aWNlLCAiJXMiLCBjZGlza19uYW1lKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0 OworCisJY2Rldl9pbml0KCZucy0+Y2RldiwgJm52bWVfY2Rldl9mb3BzKTsKKwlucy0+Y2Rldi5v d25lciA9IGN0cmwtPm9wcy0+bW9kdWxlOworCisJcmV0ID0gY2Rldl9kZXZpY2VfYWRkKCZucy0+ Y2RldiwgJm5zLT5jZGV2X2RldmljZSk7CisJaWYgKHJldCkKKwkJa2ZyZWVfY29uc3QobnMtPmNk ZXZfZGV2aWNlLmtvYmoubmFtZSk7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgdm9pZCBu dm1lX2FsbG9jX25zKHN0cnVjdCBudm1lX2N0cmwgKmN0cmwsIHVuc2lnbmVkIG5zaWQsCiAJCXN0 cnVjdCBudm1lX25zX2lkcyAqaWRzKQogewpAQCAtMzg3MCw4ICszOTYxLDEyIEBAIHN0YXRpYyB2 b2lkIG52bWVfYWxsb2NfbnMoc3RydWN0IG52bWVfY3RybCAqY3RybCwgdW5zaWduZWQgbnNpZCwK IAltZW1jcHkoZGlzay0+ZGlza19uYW1lLCBkaXNrX25hbWUsIERJU0tfTkFNRV9MRU4pOwogCW5z LT5kaXNrID0gZGlzazsKIAorCS8qIFdoZW4gdGhlIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IGFu eSBvZiB0aGUgZmVhdHVyZXMgcmVxdWlyZWQgYnkgdGhlCisJICoga2VybmVsIChvciB2aWNldmVy c2EpLCBoaWRlIHRoZSBibG9jayBkZXZpY2UuIFdlIGNhbiBzdGlsbCByZWx5IG9uCisJICogdGhl IG5hbWVzcGFjZSBjaGFyIGRldmljZSBmb3Igc3VibWl0dGluZyBJT0NUTHMKKwkgKi8KIAlpZiAo bnZtZV91cGRhdGVfbnNfaW5mbyhucywgaWQpKQotCQlnb3RvIG91dF9wdXRfZGlzazsKKwkJZGlz ay0+ZmxhZ3MgfD0gR0VOSERfRkxfSElEREVOOwogCiAJaWYgKChjdHJsLT5xdWlya3MgJiBOVk1F X1FVSVJLX0xJR0hUTlZNKSAmJiBpZC0+dnNbMF0gPT0gMHgxKSB7CiAJCWlmIChudm1lX252bV9y ZWdpc3RlcihucywgZGlza19uYW1lLCBub2RlKSkgewpAQCAtMzg4Nyw5ICszOTgyLDEyIEBAIHN0 YXRpYyB2b2lkIG52bWVfYWxsb2NfbnMoc3RydWN0IG52bWVfY3RybCAqY3RybCwgdW5zaWduZWQg bnNpZCwKIAludm1lX2dldF9jdHJsKGN0cmwpOwogCiAJZGV2aWNlX2FkZF9kaXNrKGN0cmwtPmRl dmljZSwgbnMtPmRpc2ssIG52bWVfbnNfaWRfYXR0cl9ncm91cHMpOwotCiAJbnZtZV9tcGF0aF9h ZGRfZGlzayhucywgaWQpOwogCW52bWVfZmF1bHRfaW5qZWN0X2luaXQoJm5zLT5mYXVsdF9pbmpl Y3QsIG5zLT5kaXNrLT5kaXNrX25hbWUpOworCisJaWYgKG52bWVfYWxsb2NfY2hhcmRldl9ucyhj dHJsLCBucykpCisJCWdvdG8gb3V0X3B1dF9kaXNrOworCiAJa2ZyZWUoaWQpOwogCiAJcmV0dXJu OwpAQCAtNDY4NSwyMyArNDc4MywzOCBAQCBzdGF0aWMgaW50IF9faW5pdCBudm1lX2NvcmVfaW5p dCh2b2lkKQogCWlmIChyZXN1bHQgPCAwKQogCQlnb3RvIGRlc3Ryb3lfZGVsZXRlX3dxOwogCisJ cmVzdWx0ID0gYWxsb2NfY2hyZGV2X3JlZ2lvbigmbnZtZV9uc19iYXNlX2Nocl9kZXZ0LCAwLAor CQkJTlZNRV9NSU5PUlMsICJudm1lYyIpOworCWlmIChyZXN1bHQgPCAwKQorCQlnb3RvIHVucmVn aXN0ZXJfZGV2X2NocmRldjsKKwogCW52bWVfY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RV TEUsICJudm1lIik7CiAJaWYgKElTX0VSUihudm1lX2NsYXNzKSkgewogCQlyZXN1bHQgPSBQVFJf RVJSKG52bWVfY2xhc3MpOwotCQlnb3RvIHVucmVnaXN0ZXJfY2hyZGV2OworCQlnb3RvIHVucmVn aXN0ZXJfbnNfY2hyZGV2OwogCX0KIAludm1lX2NsYXNzLT5kZXZfdWV2ZW50ID0gbnZtZV9jbGFz c191ZXZlbnQ7CiAKKwludm1lX25zX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAi bnZtZS1ucyIpOworCWlmIChJU19FUlIobnZtZV9uc19jbGFzcykpIHsKKwkJcmVzdWx0ID0gUFRS X0VSUihudm1lX25zX2NsYXNzKTsKKwkJZ290byBkZXN0cm95X2Rldl9jbGFzczsKKwl9CisKIAlu dm1lX3N1YnN5c19jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgIm52bWUtc3Vic3lz dGVtIik7CiAJaWYgKElTX0VSUihudm1lX3N1YnN5c19jbGFzcykpIHsKIAkJcmVzdWx0ID0gUFRS X0VSUihudm1lX3N1YnN5c19jbGFzcyk7Ci0JCWdvdG8gZGVzdHJveV9jbGFzczsKKwkJZ290byBk ZXN0cm95X25zX2NsYXNzOwogCX0KIAlyZXR1cm4gMDsKIAotZGVzdHJveV9jbGFzczoKK2Rlc3Ry b3lfbnNfY2xhc3M6CisJY2xhc3NfZGVzdHJveShudm1lX25zX2NsYXNzKTsKK2Rlc3Ryb3lfZGV2 X2NsYXNzOgogCWNsYXNzX2Rlc3Ryb3kobnZtZV9jbGFzcyk7Ci11bnJlZ2lzdGVyX2NocmRldjoK K3VucmVnaXN0ZXJfbnNfY2hyZGV2OgorCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihudm1lX25z X2Jhc2VfY2hyX2RldnQsIE5WTUVfTUlOT1JTKTsKK3VucmVnaXN0ZXJfZGV2X2NocmRldjoKIAl1 bnJlZ2lzdGVyX2NocmRldl9yZWdpb24obnZtZV9jdHJsX2Jhc2VfY2hyX2RldnQsIE5WTUVfTUlO T1JTKTsKIGRlc3Ryb3lfZGVsZXRlX3dxOgogCWRlc3Ryb3lfd29ya3F1ZXVlKG52bWVfZGVsZXRl X3dxKTsKQEAgLTQ3MTcsNiArNDgzMCw3IEBAIHN0YXRpYyB2b2lkIF9fZXhpdCBudm1lX2NvcmVf ZXhpdCh2b2lkKQogewogCWNsYXNzX2Rlc3Ryb3kobnZtZV9zdWJzeXNfY2xhc3MpOwogCWNsYXNz X2Rlc3Ryb3kobnZtZV9jbGFzcyk7CisJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKG52bWVfbnNf YmFzZV9jaHJfZGV2dCwgTlZNRV9NSU5PUlMpOwogCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihu dm1lX2N0cmxfYmFzZV9jaHJfZGV2dCwgTlZNRV9NSU5PUlMpOwogCWRlc3Ryb3lfd29ya3F1ZXVl KG52bWVfZGVsZXRlX3dxKTsKIAlkZXN0cm95X3dvcmtxdWV1ZShudm1lX3Jlc2V0X3dxKTsKZGlm ZiAtLWdpdCBhL2RyaXZlcnMvbnZtZS9ob3N0L252bWUuaCBiL2RyaXZlcnMvbnZtZS9ob3N0L252 bWUuaAppbmRleCBjZGZjZTcyNTBkYTAuLjUzM2JkNTRmOTE5NCAxMDA2NDQKLS0tIGEvZHJpdmVy cy9udm1lL2hvc3QvbnZtZS5oCisrKyBiL2RyaXZlcnMvbnZtZS9ob3N0L252bWUuaApAQCAtNDM2 LDYgKzQzNiw5IEBAIHN0cnVjdCBudm1lX25zIHsKIAlzdHJ1Y3Qga3JlZiBrcmVmOwogCXN0cnVj dCBudm1lX25zX2hlYWQgKmhlYWQ7CiAKKwlzdHJ1Y3QgZGV2aWNlIGNkZXZfZGV2aWNlOwkvKiBj aGFyIGRldmljZSAqLworCXN0cnVjdCBjZGV2IGNkZXY7CisKIAlpbnQgbGJhX3NoaWZ0OwogCXUx NiBtczsKIAl1MTYgc2dzOwotLSAKMi4xNy4xCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KTGludXgtbnZtZSBtYWlsaW5nIGxpc3QKTGludXgtbnZtZUBs aXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlz dGluZm8vbGludXgtbnZtZQo=