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=-7.0 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 10C26C433E0 for ; Fri, 26 Jun 2020 06:18:16 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CD80520775 for ; Fri, 26 Jun 2020 06:18:15 +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="Q6u1kihS" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728328AbgFZGSP (ORCPT ); Fri, 26 Jun 2020 02:18:15 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52198 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728034AbgFZGSO (ORCPT ); Fri, 26 Jun 2020 02:18:14 -0400 Received: from mail-ed1-x543.google.com (mail-ed1-x543.google.com [IPv6:2a00:1450:4864:20::543]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7E4F9C08C5C1 for ; Thu, 25 Jun 2020 23:18:14 -0700 (PDT) Received: by mail-ed1-x543.google.com with SMTP id b15so6018438edy.7 for ; Thu, 25 Jun 2020 23:18:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=javigon-com.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to; bh=5bdfdKzWLVA53LirfO3NM/QJjRa/YkbkW1YF8mVU55o=; b=Q6u1kihSoDVoBEEPpZKJP/rpXiR3k8qhWSpcWVvn9GgMEkFD3wwc7gbQ9soYwTnDMX wk9LRmxYs6yARSN/nhaT2BStlw6ze7EwJ+Is1pkNplS53HXSpAhjQtR4AiyTvW+iY8xt 1UES+uiYMDqiqpq9X2RYUJc5M6BXU9Dnx0/nLmQlEAoyOEEt6mk+Af4b5OcYySeyptcH Ofw6bRt02rDUtyV9TQWg4mGC5HkoC2zyI0ji6AcS+l8wmbsPtjkCGXoSTBuE2toEuCx1 fWSY1MILeNyxIaxLtAmffl9MhyIB1YfUv/mRJDaD3R3ZjKHfTQLNDP9Ux4fMPZ8a3iza +oug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=5bdfdKzWLVA53LirfO3NM/QJjRa/YkbkW1YF8mVU55o=; b=L3jrYQeLeqjuhyRVsf+40tuJNijeZKZ2JudcFfuivtAYFdRss+Qv3p3s1E4eAxG6Wf grwuBPnwC8mczSQMxc9LJoxrUJ89wnns7QVnlP0VWStvftTcTWMFjRYEkoSuNz0Aph6o E+kuyTc+GMDcyNYfDv4PgaPJxcR4DlMDmq5I6prUfzYgBIR95TQSefsNIf2Gz6q199qF tImxGgJTEqfEEsPMYt2JuMyfhjyUYCxyh+g7cvPKYM/tVJeAxigFEMIfTjnFV8MdgwdZ 29iuXQZdQ2dWiVYsTyiqju/Ih6S/OTwgzEQr2RxgG5h+KBnbIjzJneQoDKL5V6qYp8BV bTEA== X-Gm-Message-State: AOAM532qaglV9DBC6XedLhnbZnqFvI+HF0/yiZDwfP8X6/rCsqURmsO+ ZnBB6dQ4u41urBWd873EqXaGFA== X-Google-Smtp-Source: ABdhPJxW60V/9PYPbVQcPRb7jbihPjVWjLI6w0C+nRD85ZGyMEZatr9mwY+UEXq+MQfYM+S+Vvq/UQ== X-Received: by 2002:aa7:d6cf:: with SMTP id x15mr1762531edr.164.1593152293018; Thu, 25 Jun 2020 23:18:13 -0700 (PDT) Received: from localhost (ip-5-186-127-235.cgn.fibianet.dk. [5.186.127.235]) by smtp.gmail.com with ESMTPSA id p4sm20704652edj.64.2020.06.25.23.18.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2020 23:18:12 -0700 (PDT) Date: Fri, 26 Jun 2020 08:18:11 +0200 From: Javier =?utf-8?B?R29uesOhbGV6?= To: Damien Le Moal Cc: Matias =?utf-8?B?QmrDuHJsaW5n?= , "linux-nvme@lists.infradead.org" , "linux-block@vger.kernel.org" , "hch@lst.de" , "kbusch@kernel.org" , "sagi@grimberg.me" , "axboe@kernel.dk" , SelvaKumar S , Kanchan Joshi , Nitesh Shetty Subject: Re: [PATCH 3/6] block: add support for zone offline transition Message-ID: <20200626061811.nygifelt4x66fpx3@mpHalley.localdomain> References: <20200625122152.17359-1-javier@javigon.com> <20200625122152.17359-4-javier@javigon.com> <20200625194835.5hojuvdwtjxtso2l@MacBook-Pro.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org On 26.06.2020 01:14, Damien Le Moal wrote: >On 2020/06/26 4:48, Javier González wrote: >> On 25.06.2020 16:12, Matias Bjørling wrote: >>> On 25/06/2020 14.21, Javier González wrote: >>>> From: Javier González >>>> >>>> Add support for offline transition on the zoned block device using the >>>> new zone management IOCTL >>>> >>>> Signed-off-by: Javier González >>>> Signed-off-by: SelvaKumar S >>>> Signed-off-by: Kanchan Joshi >>>> Signed-off-by: Nitesh Shetty >>>> --- >>>> block/blk-core.c | 2 ++ >>>> block/blk-zoned.c | 3 +++ >>>> drivers/nvme/host/core.c | 3 +++ >>>> include/linux/blk_types.h | 3 +++ >>>> include/linux/blkdev.h | 1 - >>>> include/uapi/linux/blkzoned.h | 1 + >>>> 6 files changed, 12 insertions(+), 1 deletion(-) >>>> >>>> diff --git a/block/blk-core.c b/block/blk-core.c >>>> index 03252af8c82c..589cbdacc5ec 100644 >>>> --- a/block/blk-core.c >>>> +++ b/block/blk-core.c >>>> @@ -140,6 +140,7 @@ static const char *const blk_op_name[] = { >>>> REQ_OP_NAME(ZONE_CLOSE), >>>> REQ_OP_NAME(ZONE_FINISH), >>>> REQ_OP_NAME(ZONE_APPEND), >>>> + REQ_OP_NAME(ZONE_OFFLINE), >>>> REQ_OP_NAME(WRITE_SAME), >>>> REQ_OP_NAME(WRITE_ZEROES), >>>> REQ_OP_NAME(SCSI_IN), >>>> @@ -1030,6 +1031,7 @@ generic_make_request_checks(struct bio *bio) >>>> case REQ_OP_ZONE_OPEN: >>>> case REQ_OP_ZONE_CLOSE: >>>> case REQ_OP_ZONE_FINISH: >>>> + case REQ_OP_ZONE_OFFLINE: >>>> if (!blk_queue_is_zoned(q)) >>>> goto not_supported; >>>> break; >>>> diff --git a/block/blk-zoned.c b/block/blk-zoned.c >>>> index 29194388a1bb..704fc15813d1 100644 >>>> --- a/block/blk-zoned.c >>>> +++ b/block/blk-zoned.c >>>> @@ -416,6 +416,9 @@ int blkdev_zone_mgmt_ioctl(struct block_device *bdev, fmode_t mode, >>>> case BLK_ZONE_MGMT_RESET: >>>> op = REQ_OP_ZONE_RESET; >>>> break; >>>> + case BLK_ZONE_MGMT_OFFLINE: >>>> + op = REQ_OP_ZONE_OFFLINE; >>>> + break; >>>> default: >>>> return -ENOTTY; >>>> } >>>> diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c >>>> index f1215523792b..5b95c81d2a2d 100644 >>>> --- a/drivers/nvme/host/core.c >>>> +++ b/drivers/nvme/host/core.c >>>> @@ -776,6 +776,9 @@ blk_status_t nvme_setup_cmd(struct nvme_ns *ns, struct request *req, >>>> case REQ_OP_ZONE_FINISH: >>>> ret = nvme_setup_zone_mgmt_send(ns, req, cmd, NVME_ZONE_FINISH); >>>> break; >>>> + case REQ_OP_ZONE_OFFLINE: >>>> + ret = nvme_setup_zone_mgmt_send(ns, req, cmd, NVME_ZONE_OFFLINE); >>>> + break; >>>> case REQ_OP_WRITE_ZEROES: >>>> ret = nvme_setup_write_zeroes(ns, req, cmd); >>>> break; >>>> diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h >>>> index 16b57fb2b99c..b3921263c3dd 100644 >>>> --- a/include/linux/blk_types.h >>>> +++ b/include/linux/blk_types.h >>>> @@ -316,6 +316,8 @@ enum req_opf { >>>> REQ_OP_ZONE_FINISH = 12, >>>> /* write data at the current zone write pointer */ >>>> REQ_OP_ZONE_APPEND = 13, >>>> + /* Transition a zone to offline */ >>>> + REQ_OP_ZONE_OFFLINE = 14, >>>> /* SCSI passthrough using struct scsi_request */ >>>> REQ_OP_SCSI_IN = 32, >>>> @@ -456,6 +458,7 @@ static inline bool op_is_zone_mgmt(enum req_opf op) >>>> case REQ_OP_ZONE_OPEN: >>>> case REQ_OP_ZONE_CLOSE: >>>> case REQ_OP_ZONE_FINISH: >>>> + case REQ_OP_ZONE_OFFLINE: >>>> return true; >>>> default: >>>> return false; >>>> diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h >>>> index bd8521f94dc4..8308d8a3720b 100644 >>>> --- a/include/linux/blkdev.h >>>> +++ b/include/linux/blkdev.h >>>> @@ -372,7 +372,6 @@ extern int blkdev_zone_ops_ioctl(struct block_device *bdev, fmode_t mode, >>>> unsigned int cmd, unsigned long arg); >>>> extern int blkdev_zone_mgmt_ioctl(struct block_device *bdev, fmode_t mode, >>>> unsigned int cmd, unsigned long arg); >>>> - >>>> #else /* CONFIG_BLK_DEV_ZONED */ >>>> static inline unsigned int blkdev_nr_zones(struct gendisk *disk) >>>> diff --git a/include/uapi/linux/blkzoned.h b/include/uapi/linux/blkzoned.h >>>> index a8c89fe58f97..d0978ee10fc7 100644 >>>> --- a/include/uapi/linux/blkzoned.h >>>> +++ b/include/uapi/linux/blkzoned.h >>>> @@ -155,6 +155,7 @@ enum blk_zone_action { >>>> BLK_ZONE_MGMT_FINISH = 0x2, >>>> BLK_ZONE_MGMT_OPEN = 0x3, >>>> BLK_ZONE_MGMT_RESET = 0x4, >>>> + BLK_ZONE_MGMT_OFFLINE = 0x5, >>>> }; >>>> /** >>> >>> I am not sure this makes sense to expose through the kernel zone api. >>> One of the goals of the kernel zone API is to be a layer that provides >>> an unified zone model across SMR HDDs and ZNS SSDs. The offline zone >>> operation, as defined in the ZNS specification, does not have an >>> equivalent in SMR HDDs (ZAC/ZBC). >>> >>> This is different from the Zone Capacity change, where the zone >>> capacity simply was zone size for SMR HDDs. Making it easy to support. >>> That is not the same for ZAC/ZBC, that does not offer the offline >>> operation to transition zones in read only state to offline state. >> >> I agree that an unified interface is desirable. However, the truth is >> that ZAC/ZBC are different, and will differ more and more and time goes >> by. We can deal with the differences at the driver level or with checks >> at the API level, but limiting ZNS with ZAC/ZBC is a hard constraint. > >As long as you keep ZNS namespace report itself as being "host-managed" like >ZBC/ZAC disks, we need the consistency and common interface. If you break that, >the meaning of the zoned model queue attribute disappears and an application or >in-kernel user cannot rely on this model anymore to know how the drive will behave. I agree. The API should be clean and common, but that should not prevent extensions to ZAC/ZBC or ZNS specifics. The suggestions you propose in the other patches make sense to do this properly. > >> Note too that I chose to only support this particular transition on the >> new management IOCTL to avoid confusion for existing ZAC/ZBC users. >> >> It would be good to clarify what is the plan for kernel APIs moving >> forward, as I believe there is a general desire to support new ZNS >> features, which will not necessarily be replicated in SMR drives. > >What the drive is supposed to support and its behavior is determined by the >zoned model. ZNS standard was written so that most things have an equivalent >with ZBC/ZAC, e.g. the zone state machine is nearly identical. Differences are >either emulated (e.g. zone append scsi emulation), or not supported (e.g. zone >capacity change) so that the kernel follows the same pattern and maintains a >coherent behavior between device protocols for the host-managed model. Yes. > >Think of a file system, or any other in-kernel user. If they have to change >their code based on the device type (NVMe vs SCSI), then the zoned block device >interface is broken. Right now, that is not the case, everything works equally >well on ZNS and SCSI, modulo the need by a user for conventional zones that ZNS >do not define. But that is still consistent with the host-managed model since >conventional zones are optional. I think this is a very nice goal, but I do believe we will not be able to keep a 100% consistent behavior. We will have new features on either of the specs that do not make sense on the other and we will have to deal with them. We can deal with this as generic optional features, but at the end of the day, applications will need to check whether the feature is selected or not. This said, I agree that we need a good way to communicate this, and the suggestions you made with sysfs parameters and flags make sense to me. > >For this particular patch, there is currently no in-kernel user, and it is not >clear how this will be useful to applications. At least please clarify this. And >most likely, similarly to discard etc operations that are optional, having a >sysfs attribute and in-kernel API indicating if the drive supports offlining >zones will be needed. Otherwise, the caller will have to play with error codes >to understand if the drive does not support the command or if it is supported >but the command failed. Not nice. Better to know before issuing the command. Makes sense. See the reply on the patch itself. Javier 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=-7.0 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 4A686C433DF for ; Fri, 26 Jun 2020 10:28:15 +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 0B9832070A for ; Fri, 26 Jun 2020 10:28:15 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="j4yIQIM1"; 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="Q6u1kihS" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0B9832070A 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-Type: Content-Transfer-Encoding:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References:Message-ID: Subject:To:From:Date:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=7Y57+3FR9i9MIQTrC38D2SrOv34CDIOSi3INwB61HRk=; b=j4yIQIM14fIA7lAK2JTBNM/3Y vrkE5+6xwHxJOIg335xafSoTdEtU5SoNa9pX8WcNyCgRWz072QWRqJAZaqLsFQtsHgFr3/6B+zJwE x/RCGLPyLbILj+KMW0ZNLS293BfVqr2EaEYjU94L9QILG6zZIABB4qgfrH6GF1C7rnvYLu8Ui+un/ 7h58BvN4Fdiy+FwdXGRzoGIwJeuda09F2BJHQAdZqzfNENH5a5TCO3PT2qIq4Bfa36p964SkrFazz kzazhyda6xyFAdp6k6qBxKsx/NC1WK7bU2qLyeAHL0/MHAsrdjbFyuVE7hJ03xuRCWlB0z98U5A08 skbL2uZYg==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jolab-0003iF-Qn; Fri, 26 Jun 2020 10:28:09 +0000 Received: from mail-wr1-x442.google.com ([2a00:1450:4864:20::442]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jolX9-00025K-BA for linux-nvme@lists.infradead.org; Fri, 26 Jun 2020 10:24:45 +0000 Received: by mail-wr1-x442.google.com with SMTP id f7so5967270wrw.1 for ; Fri, 26 Jun 2020 03:24:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=javigon-com.20150623.gappssmtp.com; s=20150623; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:content-transfer-encoding:in-reply-to; bh=5bdfdKzWLVA53LirfO3NM/QJjRa/YkbkW1YF8mVU55o=; b=Q6u1kihSoDVoBEEPpZKJP/rpXiR3k8qhWSpcWVvn9GgMEkFD3wwc7gbQ9soYwTnDMX wk9LRmxYs6yARSN/nhaT2BStlw6ze7EwJ+Is1pkNplS53HXSpAhjQtR4AiyTvW+iY8xt 1UES+uiYMDqiqpq9X2RYUJc5M6BXU9Dnx0/nLmQlEAoyOEEt6mk+Af4b5OcYySeyptcH Ofw6bRt02rDUtyV9TQWg4mGC5HkoC2zyI0ji6AcS+l8wmbsPtjkCGXoSTBuE2toEuCx1 fWSY1MILeNyxIaxLtAmffl9MhyIB1YfUv/mRJDaD3R3ZjKHfTQLNDP9Ux4fMPZ8a3iza +oug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=5bdfdKzWLVA53LirfO3NM/QJjRa/YkbkW1YF8mVU55o=; b=VXcVlk7Sh8p9SjALMjFO3OoJakEw9cBTzCv7sPGPfxAYfHhv+NdsOoZm7SMB8lF8rk FzgZAUE6R9NndoGlS0LZkx6l4KCiSHObCdJL76c096beuIkj/OFXz8lwiL6pzJRTmdrs gZlND43XQ5DmdjNRJG6FUZtmuqtAl9yYDzXS/8c/hCvY6WHMP9vMK47hOC97OgjP30mm BreOWWRR026JLRN4LJKxWfCZTgPtlx9z6PluzXSsRvYgsT29tXYyzoViUBSes85irUny vqWEadPuC/9OogfnixC1kEQKEE78EPL5RfnfpNT0f5EWrZeG6zq4+gL28hQKsdCTJZh2 1K9g== X-Gm-Message-State: AOAM532/5N+Q9OPy/tjNJkXU+4GtuaTeobA2C+gezBaF6FywCWleqKVU /I9pHuJwY3j7L9IaMmbF57ccKnnl96dlOQPjQhU= X-Google-Smtp-Source: ABdhPJxW60V/9PYPbVQcPRb7jbihPjVWjLI6w0C+nRD85ZGyMEZatr9mwY+UEXq+MQfYM+S+Vvq/UQ== X-Received: by 2002:aa7:d6cf:: with SMTP id x15mr1762531edr.164.1593152293018; Thu, 25 Jun 2020 23:18:13 -0700 (PDT) Received: from localhost (ip-5-186-127-235.cgn.fibianet.dk. [5.186.127.235]) by smtp.gmail.com with ESMTPSA id p4sm20704652edj.64.2020.06.25.23.18.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 25 Jun 2020 23:18:12 -0700 (PDT) Date: Fri, 26 Jun 2020 08:18:11 +0200 From: Javier =?utf-8?B?R29uesOhbGV6?= To: Damien Le Moal Subject: Re: [PATCH 3/6] block: add support for zone offline transition Message-ID: <20200626061811.nygifelt4x66fpx3@mpHalley.localdomain> References: <20200625122152.17359-1-javier@javigon.com> <20200625122152.17359-4-javier@javigon.com> <20200625194835.5hojuvdwtjxtso2l@MacBook-Pro.localdomain> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: 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: "axboe@kernel.dk" , SelvaKumar S , "sagi@grimberg.me" , Kanchan Joshi , "linux-nvme@lists.infradead.org" , Nitesh Shetty , "linux-block@vger.kernel.org" , "kbusch@kernel.org" , Matias =?utf-8?B?QmrDuHJsaW5n?= , "hch@lst.de" Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "Linux-nvme" Errors-To: linux-nvme-bounces+linux-nvme=archiver.kernel.org@lists.infradead.org T24gMjYuMDYuMjAyMCAwMToxNCwgRGFtaWVuIExlIE1vYWwgd3JvdGU6Cj5PbiAyMDIwLzA2LzI2 IDQ6NDgsIEphdmllciBHb256w6FsZXogd3JvdGU6Cj4+IE9uIDI1LjA2LjIwMjAgMTY6MTIsIE1h dGlhcyBCasO4cmxpbmcgd3JvdGU6Cj4+PiBPbiAyNS8wNi8yMDIwIDE0LjIxLCBKYXZpZXIgR29u esOhbGV6IHdyb3RlOgo+Pj4+IEZyb206IEphdmllciBHb256w6FsZXogPGphdmllci5nb256QHNh bXN1bmcuY29tPgo+Pj4+Cj4+Pj4gQWRkIHN1cHBvcnQgZm9yIG9mZmxpbmUgdHJhbnNpdGlvbiBv biB0aGUgem9uZWQgYmxvY2sgZGV2aWNlIHVzaW5nIHRoZQo+Pj4+IG5ldyB6b25lIG1hbmFnZW1l bnQgSU9DVEwKPj4+Pgo+Pj4+IFNpZ25lZC1vZmYtYnk6IEphdmllciBHb256w6FsZXogPGphdmll ci5nb256QHNhbXN1bmcuY29tPgo+Pj4+IFNpZ25lZC1vZmYtYnk6IFNlbHZhS3VtYXIgUyA8c2Vs dmFrdW1hLnMxQHNhbXN1bmcuY29tPgo+Pj4+IFNpZ25lZC1vZmYtYnk6IEthbmNoYW4gSm9zaGkg PGpvc2hpLmtAc2Ftc3VuZy5jb20+Cj4+Pj4gU2lnbmVkLW9mZi1ieTogTml0ZXNoIFNoZXR0eSA8 bmouc2hldHR5QHNhbXN1bmcuY29tPgo+Pj4+IC0tLQo+Pj4+ICBibG9jay9ibGstY29yZS5jICAg ICAgICAgICAgICB8IDIgKysKPj4+PiAgYmxvY2svYmxrLXpvbmVkLmMgICAgICAgICAgICAgfCAz ICsrKwo+Pj4+ICBkcml2ZXJzL252bWUvaG9zdC9jb3JlLmMgICAgICB8IDMgKysrCj4+Pj4gIGlu Y2x1ZGUvbGludXgvYmxrX3R5cGVzLmggICAgIHwgMyArKysKPj4+PiAgaW5jbHVkZS9saW51eC9i bGtkZXYuaCAgICAgICAgfCAxIC0KPj4+PiAgaW5jbHVkZS91YXBpL2xpbnV4L2Jsa3pvbmVkLmgg fCAxICsKPj4+PiAgNiBmaWxlcyBjaGFuZ2VkLCAxMiBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9u KC0pCj4+Pj4KPj4+PiBkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLWNvcmUuYyBiL2Jsb2NrL2Jsay1j b3JlLmMKPj4+PiBpbmRleCAwMzI1MmFmOGM4MmMuLjU4OWNiZGFjYzVlYyAxMDA2NDQKPj4+PiAt LS0gYS9ibG9jay9ibGstY29yZS5jCj4+Pj4gKysrIGIvYmxvY2svYmxrLWNvcmUuYwo+Pj4+IEBA IC0xNDAsNiArMTQwLDcgQEAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGJsa19vcF9uYW1lW10g PSB7Cj4+Pj4gIAlSRVFfT1BfTkFNRShaT05FX0NMT1NFKSwKPj4+PiAgCVJFUV9PUF9OQU1FKFpP TkVfRklOSVNIKSwKPj4+PiAgCVJFUV9PUF9OQU1FKFpPTkVfQVBQRU5EKSwKPj4+PiArCVJFUV9P UF9OQU1FKFpPTkVfT0ZGTElORSksCj4+Pj4gIAlSRVFfT1BfTkFNRShXUklURV9TQU1FKSwKPj4+ PiAgCVJFUV9PUF9OQU1FKFdSSVRFX1pFUk9FUyksCj4+Pj4gIAlSRVFfT1BfTkFNRShTQ1NJX0lO KSwKPj4+PiBAQCAtMTAzMCw2ICsxMDMxLDcgQEAgZ2VuZXJpY19tYWtlX3JlcXVlc3RfY2hlY2tz KHN0cnVjdCBiaW8gKmJpbykKPj4+PiAgCWNhc2UgUkVRX09QX1pPTkVfT1BFTjoKPj4+PiAgCWNh c2UgUkVRX09QX1pPTkVfQ0xPU0U6Cj4+Pj4gIAljYXNlIFJFUV9PUF9aT05FX0ZJTklTSDoKPj4+ PiArCWNhc2UgUkVRX09QX1pPTkVfT0ZGTElORToKPj4+PiAgCQlpZiAoIWJsa19xdWV1ZV9pc196 b25lZChxKSkKPj4+PiAgCQkJZ290byBub3Rfc3VwcG9ydGVkOwo+Pj4+ICAJCWJyZWFrOwo+Pj4+ IGRpZmYgLS1naXQgYS9ibG9jay9ibGstem9uZWQuYyBiL2Jsb2NrL2Jsay16b25lZC5jCj4+Pj4g aW5kZXggMjkxOTQzODhhMWJiLi43MDRmYzE1ODEzZDEgMTAwNjQ0Cj4+Pj4gLS0tIGEvYmxvY2sv YmxrLXpvbmVkLmMKPj4+PiArKysgYi9ibG9jay9ibGstem9uZWQuYwo+Pj4+IEBAIC00MTYsNiAr NDE2LDkgQEAgaW50IGJsa2Rldl96b25lX21nbXRfaW9jdGwoc3RydWN0IGJsb2NrX2RldmljZSAq YmRldiwgZm1vZGVfdCBtb2RlLAo+Pj4+ICAJY2FzZSBCTEtfWk9ORV9NR01UX1JFU0VUOgo+Pj4+ ICAJCW9wID0gUkVRX09QX1pPTkVfUkVTRVQ7Cj4+Pj4gIAkJYnJlYWs7Cj4+Pj4gKwljYXNlIEJM S19aT05FX01HTVRfT0ZGTElORToKPj4+PiArCQlvcCA9IFJFUV9PUF9aT05FX09GRkxJTkU7Cj4+ Pj4gKwkJYnJlYWs7Cj4+Pj4gIAlkZWZhdWx0Ogo+Pj4+ICAJCXJldHVybiAtRU5PVFRZOwo+Pj4+ ICAJfQo+Pj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL252bWUvaG9zdC9jb3JlLmMgYi9kcml2ZXJz L252bWUvaG9zdC9jb3JlLmMKPj4+PiBpbmRleCBmMTIxNTUyMzc5MmIuLjViOTVjODFkMmEyZCAx MDA2NDQKPj4+PiAtLS0gYS9kcml2ZXJzL252bWUvaG9zdC9jb3JlLmMKPj4+PiArKysgYi9kcml2 ZXJzL252bWUvaG9zdC9jb3JlLmMKPj4+PiBAQCAtNzc2LDYgKzc3Niw5IEBAIGJsa19zdGF0dXNf dCBudm1lX3NldHVwX2NtZChzdHJ1Y3QgbnZtZV9ucyAqbnMsIHN0cnVjdCByZXF1ZXN0ICpyZXEs Cj4+Pj4gIAljYXNlIFJFUV9PUF9aT05FX0ZJTklTSDoKPj4+PiAgCQlyZXQgPSBudm1lX3NldHVw X3pvbmVfbWdtdF9zZW5kKG5zLCByZXEsIGNtZCwgTlZNRV9aT05FX0ZJTklTSCk7Cj4+Pj4gIAkJ YnJlYWs7Cj4+Pj4gKwljYXNlIFJFUV9PUF9aT05FX09GRkxJTkU6Cj4+Pj4gKwkJcmV0ID0gbnZt ZV9zZXR1cF96b25lX21nbXRfc2VuZChucywgcmVxLCBjbWQsIE5WTUVfWk9ORV9PRkZMSU5FKTsK Pj4+PiArCQlicmVhazsKPj4+PiAgCWNhc2UgUkVRX09QX1dSSVRFX1pFUk9FUzoKPj4+PiAgCQly ZXQgPSBudm1lX3NldHVwX3dyaXRlX3plcm9lcyhucywgcmVxLCBjbWQpOwo+Pj4+ICAJCWJyZWFr Owo+Pj4+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa190eXBlcy5oIGIvaW5jbHVkZS9s aW51eC9ibGtfdHlwZXMuaAo+Pj4+IGluZGV4IDE2YjU3ZmIyYjk5Yy4uYjM5MjEyNjNjM2RkIDEw MDY0NAo+Pj4+IC0tLSBhL2luY2x1ZGUvbGludXgvYmxrX3R5cGVzLmgKPj4+PiArKysgYi9pbmNs dWRlL2xpbnV4L2Jsa190eXBlcy5oCj4+Pj4gQEAgLTMxNiw2ICszMTYsOCBAQCBlbnVtIHJlcV9v cGYgewo+Pj4+ICAJUkVRX09QX1pPTkVfRklOSVNICT0gMTIsCj4+Pj4gIAkvKiB3cml0ZSBkYXRh IGF0IHRoZSBjdXJyZW50IHpvbmUgd3JpdGUgcG9pbnRlciAqLwo+Pj4+ICAJUkVRX09QX1pPTkVf QVBQRU5ECT0gMTMsCj4+Pj4gKwkvKiBUcmFuc2l0aW9uIGEgem9uZSB0byBvZmZsaW5lICovCj4+ Pj4gKwlSRVFfT1BfWk9ORV9PRkZMSU5FCT0gMTQsCj4+Pj4gIAkvKiBTQ1NJIHBhc3N0aHJvdWdo IHVzaW5nIHN0cnVjdCBzY3NpX3JlcXVlc3QgKi8KPj4+PiAgCVJFUV9PUF9TQ1NJX0lOCQk9IDMy LAo+Pj4+IEBAIC00NTYsNiArNDU4LDcgQEAgc3RhdGljIGlubGluZSBib29sIG9wX2lzX3pvbmVf bWdtdChlbnVtIHJlcV9vcGYgb3ApCj4+Pj4gIAljYXNlIFJFUV9PUF9aT05FX09QRU46Cj4+Pj4g IAljYXNlIFJFUV9PUF9aT05FX0NMT1NFOgo+Pj4+ICAJY2FzZSBSRVFfT1BfWk9ORV9GSU5JU0g6 Cj4+Pj4gKwljYXNlIFJFUV9PUF9aT05FX09GRkxJTkU6Cj4+Pj4gIAkJcmV0dXJuIHRydWU7Cj4+ Pj4gIAlkZWZhdWx0Ogo+Pj4+ICAJCXJldHVybiBmYWxzZTsKPj4+PiBkaWZmIC0tZ2l0IGEvaW5j bHVkZS9saW51eC9ibGtkZXYuaCBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKPj4+PiBpbmRleCBi ZDg1MjFmOTRkYzQuLjgzMDhkOGEzNzIwYiAxMDA2NDQKPj4+PiAtLS0gYS9pbmNsdWRlL2xpbnV4 L2Jsa2Rldi5oCj4+Pj4gKysrIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaAo+Pj4+IEBAIC0zNzIs NyArMzcyLDYgQEAgZXh0ZXJuIGludCBibGtkZXZfem9uZV9vcHNfaW9jdGwoc3RydWN0IGJsb2Nr X2RldmljZSAqYmRldiwgZm1vZGVfdCBtb2RlLAo+Pj4+ICAJCQkJICB1bnNpZ25lZCBpbnQgY21k LCB1bnNpZ25lZCBsb25nIGFyZyk7Cj4+Pj4gIGV4dGVybiBpbnQgYmxrZGV2X3pvbmVfbWdtdF9p b2N0bChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUsCj4+Pj4gIAkJCQkg IHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKPj4+PiAtCj4+Pj4gICNlbHNl IC8qIENPTkZJR19CTEtfREVWX1pPTkVEICovCj4+Pj4gIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQg aW50IGJsa2Rldl9ucl96b25lcyhzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKPj4+PiBkaWZmIC0tZ2l0 IGEvaW5jbHVkZS91YXBpL2xpbnV4L2Jsa3pvbmVkLmggYi9pbmNsdWRlL3VhcGkvbGludXgvYmxr em9uZWQuaAo+Pj4+IGluZGV4IGE4Yzg5ZmU1OGY5Ny4uZDA5NzhlZTEwZmM3IDEwMDY0NAo+Pj4+ IC0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9ibGt6b25lZC5oCj4+Pj4gKysrIGIvaW5jbHVkZS91 YXBpL2xpbnV4L2Jsa3pvbmVkLmgKPj4+PiBAQCAtMTU1LDYgKzE1NSw3IEBAIGVudW0gYmxrX3pv bmVfYWN0aW9uIHsKPj4+PiAgCUJMS19aT05FX01HTVRfRklOSVNICT0gMHgyLAo+Pj4+ICAJQkxL X1pPTkVfTUdNVF9PUEVOCT0gMHgzLAo+Pj4+ICAJQkxLX1pPTkVfTUdNVF9SRVNFVAk9IDB4NCwK Pj4+PiArCUJMS19aT05FX01HTVRfT0ZGTElORQk9IDB4NSwKPj4+PiAgfTsKPj4+PiAgLyoqCj4+ Pgo+Pj4gSSBhbSBub3Qgc3VyZSB0aGlzIG1ha2VzIHNlbnNlIHRvIGV4cG9zZSB0aHJvdWdoIHRo ZSBrZXJuZWwgem9uZSBhcGkuCj4+PiBPbmUgb2YgdGhlIGdvYWxzIG9mIHRoZSBrZXJuZWwgem9u ZSBBUEkgaXMgdG8gYmUgYSBsYXllciB0aGF0IHByb3ZpZGVzCj4+PiBhbiB1bmlmaWVkIHpvbmUg bW9kZWwgYWNyb3NzIFNNUiBIRERzIGFuZCBaTlMgU1NEcy4gVGhlIG9mZmxpbmUgem9uZQo+Pj4g b3BlcmF0aW9uLCBhcyBkZWZpbmVkIGluIHRoZSBaTlMgc3BlY2lmaWNhdGlvbiwgZG9lcyBub3Qg aGF2ZSBhbgo+Pj4gZXF1aXZhbGVudCBpbiBTTVIgSEREcyAoWkFDL1pCQykuCj4+Pgo+Pj4gVGhp cyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgWm9uZSBDYXBhY2l0eSBjaGFuZ2UsIHdoZXJlIHRoZSB6 b25lCj4+PiBjYXBhY2l0eSBzaW1wbHkgd2FzIHpvbmUgc2l6ZSBmb3IgU01SIEhERHMuIE1ha2lu ZyBpdCBlYXN5IHRvIHN1cHBvcnQuCj4+PiBUaGF0IGlzIG5vdCB0aGUgc2FtZSBmb3IgWkFDL1pC QywgdGhhdCBkb2VzIG5vdCBvZmZlciB0aGUgb2ZmbGluZQo+Pj4gb3BlcmF0aW9uIHRvIHRyYW5z aXRpb24gem9uZXMgaW4gcmVhZCBvbmx5IHN0YXRlIHRvIG9mZmxpbmUgc3RhdGUuCj4+Cj4+IEkg YWdyZWUgdGhhdCBhbiB1bmlmaWVkIGludGVyZmFjZSBpcyBkZXNpcmFibGUuIEhvd2V2ZXIsIHRo ZSB0cnV0aCBpcwo+PiB0aGF0IFpBQy9aQkMgYXJlIGRpZmZlcmVudCwgYW5kIHdpbGwgZGlmZmVy IG1vcmUgYW5kIG1vcmUgYW5kIHRpbWUgZ29lcwo+PiBieS4gV2UgY2FuIGRlYWwgd2l0aCB0aGUg ZGlmZmVyZW5jZXMgYXQgdGhlIGRyaXZlciBsZXZlbCBvciB3aXRoIGNoZWNrcwo+PiBhdCB0aGUg QVBJIGxldmVsLCBidXQgbGltaXRpbmcgWk5TIHdpdGggWkFDL1pCQyBpcyBhIGhhcmQgY29uc3Ry YWludC4KPgo+QXMgbG9uZyBhcyB5b3Uga2VlcCBaTlMgbmFtZXNwYWNlIHJlcG9ydCBpdHNlbGYg YXMgYmVpbmcgImhvc3QtbWFuYWdlZCIgbGlrZQo+WkJDL1pBQyBkaXNrcywgd2UgbmVlZCB0aGUg Y29uc2lzdGVuY3kgYW5kIGNvbW1vbiBpbnRlcmZhY2UuIElmIHlvdSBicmVhayB0aGF0LAo+dGhl IG1lYW5pbmcgb2YgdGhlIHpvbmVkIG1vZGVsIHF1ZXVlIGF0dHJpYnV0ZSBkaXNhcHBlYXJzIGFu ZCBhbiBhcHBsaWNhdGlvbiBvcgo+aW4ta2VybmVsIHVzZXIgY2Fubm90IHJlbHkgb24gdGhpcyBt b2RlbCBhbnltb3JlIHRvIGtub3cgaG93IHRoZSBkcml2ZSB3aWxsIGJlaGF2ZS4KCkkgYWdyZWUu IFRoZSBBUEkgc2hvdWxkIGJlIGNsZWFuIGFuZCBjb21tb24sIGJ1dCB0aGF0IHNob3VsZCBub3Qg cHJldmVudApleHRlbnNpb25zIHRvIFpBQy9aQkMgb3IgWk5TIHNwZWNpZmljcy4gVGhlIHN1Z2dl c3Rpb25zIHlvdSBwcm9wb3NlIGluCnRoZSBvdGhlciBwYXRjaGVzIG1ha2Ugc2Vuc2UgdG8gZG8g dGhpcyBwcm9wZXJseS4KCj4KPj4gTm90ZSB0b28gdGhhdCBJIGNob3NlIHRvIG9ubHkgc3VwcG9y dCB0aGlzIHBhcnRpY3VsYXIgdHJhbnNpdGlvbiBvbiB0aGUKPj4gbmV3IG1hbmFnZW1lbnQgSU9D VEwgdG8gYXZvaWQgY29uZnVzaW9uIGZvciBleGlzdGluZyBaQUMvWkJDIHVzZXJzLgo+Pgo+PiBJ dCB3b3VsZCBiZSBnb29kIHRvIGNsYXJpZnkgd2hhdCBpcyB0aGUgcGxhbiBmb3Iga2VybmVsIEFQ SXMgbW92aW5nCj4+IGZvcndhcmQsIGFzIEkgYmVsaWV2ZSB0aGVyZSBpcyBhIGdlbmVyYWwgZGVz aXJlIHRvIHN1cHBvcnQgbmV3IFpOUwo+PiBmZWF0dXJlcywgd2hpY2ggd2lsbCBub3QgbmVjZXNz YXJpbHkgYmUgcmVwbGljYXRlZCBpbiBTTVIgZHJpdmVzLgo+Cj5XaGF0IHRoZSBkcml2ZSBpcyBz dXBwb3NlZCB0byBzdXBwb3J0IGFuZCBpdHMgYmVoYXZpb3IgaXMgZGV0ZXJtaW5lZCBieSB0aGUK PnpvbmVkIG1vZGVsLiBaTlMgc3RhbmRhcmQgd2FzIHdyaXR0ZW4gc28gdGhhdCBtb3N0IHRoaW5n cyBoYXZlIGFuIGVxdWl2YWxlbnQKPndpdGggWkJDL1pBQywgZS5nLiB0aGUgem9uZSBzdGF0ZSBt YWNoaW5lIGlzIG5lYXJseSBpZGVudGljYWwuIERpZmZlcmVuY2VzIGFyZQo+ZWl0aGVyIGVtdWxh dGVkIChlLmcuIHpvbmUgYXBwZW5kIHNjc2kgZW11bGF0aW9uKSwgb3Igbm90IHN1cHBvcnRlZCAo ZS5nLiB6b25lCj5jYXBhY2l0eSBjaGFuZ2UpIHNvIHRoYXQgdGhlIGtlcm5lbCBmb2xsb3dzIHRo ZSBzYW1lIHBhdHRlcm4gYW5kIG1haW50YWlucyBhCj5jb2hlcmVudCBiZWhhdmlvciBiZXR3ZWVu IGRldmljZSBwcm90b2NvbHMgZm9yIHRoZSBob3N0LW1hbmFnZWQgbW9kZWwuCgpZZXMuCgo+Cj5U aGluayBvZiBhIGZpbGUgc3lzdGVtLCBvciBhbnkgb3RoZXIgaW4ta2VybmVsIHVzZXIuIElmIHRo ZXkgaGF2ZSB0byBjaGFuZ2UKPnRoZWlyIGNvZGUgYmFzZWQgb24gdGhlIGRldmljZSB0eXBlIChO Vk1lIHZzIFNDU0kpLCB0aGVuIHRoZSB6b25lZCBibG9jayBkZXZpY2UKPmludGVyZmFjZSBpcyBi cm9rZW4uIFJpZ2h0IG5vdywgdGhhdCBpcyBub3QgdGhlIGNhc2UsIGV2ZXJ5dGhpbmcgd29ya3Mg ZXF1YWxseQo+d2VsbCBvbiBaTlMgYW5kIFNDU0ksIG1vZHVsbyB0aGUgbmVlZCBieSBhIHVzZXIg Zm9yIGNvbnZlbnRpb25hbCB6b25lcyB0aGF0IFpOUwo+ZG8gbm90IGRlZmluZS4gQnV0IHRoYXQg aXMgc3RpbGwgY29uc2lzdGVudCB3aXRoIHRoZSBob3N0LW1hbmFnZWQgbW9kZWwgc2luY2UKPmNv bnZlbnRpb25hbCB6b25lcyBhcmUgb3B0aW9uYWwuCgpJIHRoaW5rIHRoaXMgaXMgYSB2ZXJ5IG5p Y2UgZ29hbCwgYnV0IEkgZG8gYmVsaWV2ZSB3ZSB3aWxsIG5vdCBiZSBhYmxlCnRvIGtlZXAgYSAx MDAlIGNvbnNpc3RlbnQgYmVoYXZpb3IuIFdlIHdpbGwgaGF2ZSBuZXcgZmVhdHVyZXMgb24gZWl0 aGVyCm9mIHRoZSBzcGVjcyB0aGF0IGRvIG5vdCBtYWtlIHNlbnNlIG9uIHRoZSBvdGhlciBhbmQg d2Ugd2lsbCBoYXZlIHRvCmRlYWwgd2l0aCB0aGVtLiBXZSBjYW4gZGVhbCB3aXRoIHRoaXMgYXMg Z2VuZXJpYyBvcHRpb25hbCBmZWF0dXJlcywgYnV0CmF0IHRoZSBlbmQgb2YgdGhlIGRheSwgYXBw bGljYXRpb25zIHdpbGwgbmVlZCB0byBjaGVjayB3aGV0aGVyIHRoZQpmZWF0dXJlIGlzIHNlbGVj dGVkIG9yIG5vdC4KClRoaXMgc2FpZCwgSSBhZ3JlZSB0aGF0IHdlIG5lZWQgYSBnb29kIHdheSB0 byBjb21tdW5pY2F0ZSB0aGlzLCBhbmQgdGhlCnN1Z2dlc3Rpb25zIHlvdSBtYWRlIHdpdGggc3lz ZnMgcGFyYW1ldGVycyBhbmQgZmxhZ3MgbWFrZSBzZW5zZSB0byBtZS4KCj4KPkZvciB0aGlzIHBh cnRpY3VsYXIgcGF0Y2gsIHRoZXJlIGlzIGN1cnJlbnRseSBubyBpbi1rZXJuZWwgdXNlciwgYW5k IGl0IGlzIG5vdAo+Y2xlYXIgaG93IHRoaXMgd2lsbCBiZSB1c2VmdWwgdG8gYXBwbGljYXRpb25z LiBBdCBsZWFzdCBwbGVhc2UgY2xhcmlmeSB0aGlzLiBBbmQKPm1vc3QgbGlrZWx5LCBzaW1pbGFy bHkgdG8gZGlzY2FyZCBldGMgb3BlcmF0aW9ucyB0aGF0IGFyZSBvcHRpb25hbCwgaGF2aW5nIGEK PnN5c2ZzIGF0dHJpYnV0ZSBhbmQgaW4ta2VybmVsIEFQSSBpbmRpY2F0aW5nIGlmIHRoZSBkcml2 ZSBzdXBwb3J0cyBvZmZsaW5pbmcKPnpvbmVzIHdpbGwgYmUgbmVlZGVkLiBPdGhlcndpc2UsIHRo ZSBjYWxsZXIgd2lsbCBoYXZlIHRvIHBsYXkgd2l0aCBlcnJvciBjb2Rlcwo+dG8gdW5kZXJzdGFu ZCBpZiB0aGUgZHJpdmUgZG9lcyBub3Qgc3VwcG9ydCB0aGUgY29tbWFuZCBvciBpZiBpdCBpcyBz dXBwb3J0ZWQKPmJ1dCB0aGUgY29tbWFuZCBmYWlsZWQuIE5vdCBuaWNlLiBCZXR0ZXIgdG8ga25v dyBiZWZvcmUgaXNzdWluZyB0aGUgY29tbWFuZC4KCk1ha2VzIHNlbnNlLiBTZWUgdGhlIHJlcGx5 IG9uIHRoZSBwYXRjaCBpdHNlbGYuCgpKYXZpZXIKCl9fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fCkxpbnV4LW52bWUgbWFpbGluZyBsaXN0CkxpbnV4LW52bWVA bGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xp c3RpbmZvL2xpbnV4LW52bWUK