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 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3C954C433F5 for ; Tue, 28 Sep 2021 14:35:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 1E9486120D for ; Tue, 28 Sep 2021 14:35:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241289AbhI1OhE convert rfc822-to-8bit (ORCPT ); Tue, 28 Sep 2021 10:37:04 -0400 Received: from relay11.mail.gandi.net ([217.70.178.231]:53551 "EHLO relay11.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S241249AbhI1OhD (ORCPT ); Tue, 28 Sep 2021 10:37:03 -0400 Received: (Authenticated sender: miquel.raynal@bootlin.com) by relay11.mail.gandi.net (Postfix) with ESMTPSA id 553FE100012; Tue, 28 Sep 2021 14:35:20 +0000 (UTC) Date: Tue, 28 Sep 2021 16:35:19 +0200 From: Miquel Raynal To: Boris Brezillon Cc: =?UTF-8?B?TWljaGHFgiBLxJlwaWXFhA==?= , Richard Weinberger , Vignesh Raghavendra , linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org, Boris Brezillon Subject: Re: [PATCH] mtd: add MEMREAD ioctl Message-ID: <20210928163519.08cd1138@xps13> In-Reply-To: <20210928162402.6bb64fcf@collabora.com> References: <20210920070221.10173-1-kernel@kempniu.pl> <20210928155859.433844cb@xps13> <20210928162402.6bb64fcf@collabora.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.7 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Boris, boris.brezillon@collabora.com wrote on Tue, 28 Sep 2021 16:24:02 +0200: > Hi Miquel, Michal, > > On Tue, 28 Sep 2021 15:58:59 +0200 > Miquel Raynal wrote: > > > Hi Michał, > > > > + Boris just in case you have anything obvious that pops up in your > > head when reading the description, otherwise no need to thoroughfully > > review this ;) > > Couple of comment below. > > > > > Signed-off-by: Michał Kępień > > > --- > > > This patch is a shameless calque^W^W^Wheavily inspired by MEMWRITE code, > > > so quite a lot of copy-pasting happened. I guess it is somewhat > > > expected when adding a read-side counterpart of existing code which > > > takes care of writes, but please excuse me if I went too far. > > > > > > Note that "scripts/checkpatch.pl --strict" returns two alignment > > > warnings for this patch. Given that existing code triggers the same > > > warnings, I assumed that local consistency trumps checkpatch.pl's > > > complaints. > > > > > > drivers/mtd/mtdchar.c | 60 ++++++++++++++++++++++++++++++++++++++ > > > include/uapi/mtd/mtd-abi.h | 43 +++++++++++++++++++++++---- > > > 2 files changed, 98 insertions(+), 5 deletions(-) > > > > > > diff --git a/drivers/mtd/mtdchar.c b/drivers/mtd/mtdchar.c > > > index 155e991d9d75..92e0024bdcf7 100644 > > > --- a/drivers/mtd/mtdchar.c > > > +++ b/drivers/mtd/mtdchar.c > > > @@ -621,6 +621,58 @@ static int mtdchar_write_ioctl(struct mtd_info *mtd, > > > return ret; > > > } > > > > > > +static int mtdchar_read_ioctl(struct mtd_info *mtd, > > > + struct mtd_read_req __user *argp) > > > +{ > > > + struct mtd_info *master = mtd_get_master(mtd); > > > + struct mtd_read_req req; > > > + struct mtd_oob_ops ops = {}; > > > + void __user *usr_data, *usr_oob; > > > + int ret; > > > + > > > + if (copy_from_user(&req, argp, sizeof(req))) > > > + return -EFAULT; > > > + > > > + usr_data = (void __user *)(uintptr_t)req.usr_data; > > > + usr_oob = (void __user *)(uintptr_t)req.usr_oob; > > > + > > > + if (!master->_read_oob) > > > + return -EOPNOTSUPP; > > > + ops.mode = req.mode; > > > + ops.len = (size_t)req.len; > > > + ops.ooblen = (size_t)req.ooblen; > > > + ops.ooboffs = 0; > > > + > > > + if (usr_data) { > > > + ops.datbuf = kmalloc(ops.len, GFP_KERNEL); > > Hm, I know the write path does that, but I'm really not sure > kmalloc()-ing a buffer of the requested read length is a good > idea. Having a loop doing reads with an erasesize granularity would > avoid this unbounded allocation while keeping performance acceptable in > most cases. Right. > > > > + if (IS_ERR(ops.datbuf)) > > > + return PTR_ERR(ops.datbuf); > > > + } else { > > > + ops.datbuf = NULL; > > > + } > > > + > > > + if (usr_oob) { > > > + ops.oobbuf = kmalloc(ops.ooblen, GFP_KERNEL); > > > + if (IS_ERR(ops.oobbuf)) { > > > + kfree(ops.datbuf); > > > + return PTR_ERR(ops.oobbuf); > > > + } > > > + } else { > > > + ops.oobbuf = NULL; > > > + } > > > + > > > + ret = mtd_read_oob(mtd, (loff_t)req.start, &ops); > > > + > > > + if (copy_to_user(usr_data, ops.datbuf, ops.retlen) || > > > + copy_to_user(usr_oob, ops.oobbuf, ops.oobretlen)) > > > + ret = -EFAULT; > > > + > > > + kfree(ops.datbuf); > > > + kfree(ops.oobbuf); > > > + > > > + return ret; > > > +} > > > + > > > static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg) > > > { > > > struct mtd_file_info *mfi = file->private_data; > > > @@ -643,6 +695,7 @@ static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg) > > > case MEMGETINFO: > > > case MEMREADOOB: > > > case MEMREADOOB64: > > > + case MEMREAD: > > > case MEMISLOCKED: > > > case MEMGETOOBSEL: > > > case MEMGETBADBLOCK: > > > @@ -817,6 +870,13 @@ static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg) > > > break; > > > } > > > > > > + case MEMREAD: > > > + { > > > + ret = mtdchar_read_ioctl(mtd, > > > + (struct mtd_read_req __user *)arg); > > > + break; > > > + } > > > + > > > case MEMLOCK: > > > { > > > struct erase_info_user einfo; > > > diff --git a/include/uapi/mtd/mtd-abi.h b/include/uapi/mtd/mtd-abi.h > > > index b869990c2db2..337e6e597fad 100644 > > > --- a/include/uapi/mtd/mtd-abi.h > > > +++ b/include/uapi/mtd/mtd-abi.h > > > @@ -55,9 +55,9 @@ struct mtd_oob_buf64 { > > > * @MTD_OPS_RAW: data are transferred as-is, with no error correction; > > > * this mode implies %MTD_OPS_PLACE_OOB > > > * > > > - * These modes can be passed to ioctl(MEMWRITE) and are also used internally. > > > - * See notes on "MTD file modes" for discussion on %MTD_OPS_RAW vs. > > > - * %MTD_FILE_MODE_RAW. > > > + * These modes can be passed to ioctl(MEMWRITE) and ioctl(MEMREAD); they are > > > + * also used internally. See notes on "MTD file modes" for discussion on > > > + * %MTD_OPS_RAW vs. %MTD_FILE_MODE_RAW. > > > */ > > > enum { > > > MTD_OPS_PLACE_OOB = 0, > > > @@ -91,6 +91,32 @@ struct mtd_write_req { > > > __u8 padding[7]; > > > }; > > > > > > +/** > > > + * struct mtd_read_req - data structure for requesting a read operation > > > + * > > > + * @start: start address > > > + * @len: length of data buffer > > > + * @ooblen: length of OOB buffer > > > + * @usr_data: user-provided data buffer > > > + * @usr_oob: user-provided OOB buffer > > > + * @mode: MTD mode (see "MTD operation modes") > > > + * @padding: reserved, must be set to 0 > > > + * > > > + * This structure supports ioctl(MEMREAD) operations, allowing data and/or OOB > > > + * reads in various modes. To read from OOB-only, set @usr_data == NULL, and to > > > + * read data-only, set @usr_oob == NULL. However, setting both @usr_data and > > > + * @usr_oob to NULL is not allowed. > > > + */ > > > +struct mtd_read_req { > > > + __u64 start; > > > + __u64 len; > > > + __u64 ooblen; > > > + __u64 usr_data; > > > + __u64 usr_oob; > > > + __u8 mode; > > > + __u8 padding[7]; > > > +}; > > I do agree that a new interface is needed, but if we're adding a new > entry point, let's make sure it covers all possible use cases we have > now. At the very least, I think we're missing info about the maximum > number of corrected bits per ECC region on the portion being read. > Propagating EUCLEAN errors is nice, but it's not precise enough IMHO. > > I remember discussing search a new READ ioctl with Sascha Hauer a few > years back, but I can't find the discussion... We also discussed a mtd_io_op some time ago, which would equivalently replace mtd_oob_ops at some point, including more information such as the bitflips which happened on every chunk instead of the information regarding the maximum number of bitflips in one of the chunks only. IIRC the point was to get rid of the mtd_{read,write}{,_oob} hooks and structures in favor of a more robust and complete set of operations. 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 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B12EDC433F5 for ; Tue, 28 Sep 2021 14:36:04 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 2905661209 for ; Tue, 28 Sep 2021 14:36:04 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 2905661209 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=bootlin.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Subject:Cc: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=i4zKNgrMcaQ8Ratwa5zJ9IeUoKMLhUODvg1KMu+9L/A=; b=PCoTsh0r+BOYDe m30jajaaHhdX8LOH8tPkqxgtUlIv4upT8apuqKuwB4Yd/YlrNxhLvPAswnI7A9IWYdYDdk3hMHB6A yZYtZa6tk/iA9eleoekmu9IbuZcOLg5T5AnSQYlU4wSLMJB4VNUR6fX9H6JWUluNK+a2sizUr6JJG rD4Uyk1/i08PTPnb6kPBMXRAbqgTFPBSoqY3JSHwZ9+CmEhfpbHoK6BlUGGCcCvHY5WuhnbbcxvHJ QewgBMImnwImg92klcC0dKrs6MRXrJ3VcBmWZWofU+JBRJN3OVBvafw9HdoQXBvIcgr//5oRix/Es W+QbUQg+4GrnKYP1HQvw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mVECf-007cOB-En; Tue, 28 Sep 2021 14:35:29 +0000 Received: from relay11.mail.gandi.net ([217.70.178.231]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mVECc-007cMH-5L for linux-mtd@lists.infradead.org; Tue, 28 Sep 2021 14:35:28 +0000 Received: (Authenticated sender: miquel.raynal@bootlin.com) by relay11.mail.gandi.net (Postfix) with ESMTPSA id 553FE100012; Tue, 28 Sep 2021 14:35:20 +0000 (UTC) Date: Tue, 28 Sep 2021 16:35:19 +0200 From: Miquel Raynal To: Boris Brezillon Cc: =?UTF-8?B?TWljaGHFgiBLxJlwaWXFhA==?= , Richard Weinberger , Vignesh Raghavendra , linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org, Boris Brezillon Subject: Re: [PATCH] mtd: add MEMREAD ioctl Message-ID: <20210928163519.08cd1138@xps13> In-Reply-To: <20210928162402.6bb64fcf@collabora.com> References: <20210920070221.10173-1-kernel@kempniu.pl> <20210928155859.433844cb@xps13> <20210928162402.6bb64fcf@collabora.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.7 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210928_073526_505326_BF3C43FE X-CRM114-Status: GOOD ( 43.39 ) X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org SGkgQm9yaXMsCgpib3Jpcy5icmV6aWxsb25AY29sbGFib3JhLmNvbSB3cm90ZSBvbiBUdWUsIDI4 IFNlcCAyMDIxIDE2OjI0OjAyICswMjAwOgoKPiBIaSBNaXF1ZWwsIE1pY2hhbCwKPiAKPiBPbiBU dWUsIDI4IFNlcCAyMDIxIDE1OjU4OjU5ICswMjAwCj4gTWlxdWVsIFJheW5hbCA8bWlxdWVsLnJh eW5hbEBib290bGluLmNvbT4gd3JvdGU6Cj4gCj4gPiBIaSBNaWNoYcWCLAo+ID4gCj4gPiArIEJv cmlzIGp1c3QgaW4gY2FzZSB5b3UgaGF2ZSBhbnl0aGluZyBvYnZpb3VzIHRoYXQgcG9wcyB1cCBp biB5b3VyCj4gPiAgIGhlYWQgd2hlbiByZWFkaW5nIHRoZSBkZXNjcmlwdGlvbiwgb3RoZXJ3aXNl IG5vIG5lZWQgdG8gdGhvcm91Z2hmdWxseQo+ID4gICByZXZpZXcgdGhpcyA7KSAgCj4gCj4gQ291 cGxlIG9mIGNvbW1lbnQgYmVsb3cuCj4gCj4gCj4gPiA+IFNpZ25lZC1vZmYtYnk6IE1pY2hhxYIg S8SZcGllxYQgPGtlcm5lbEBrZW1wbml1LnBsPgo+ID4gPiAtLS0KPiA+ID4gVGhpcyBwYXRjaCBp cyBhIHNoYW1lbGVzcyBjYWxxdWVeV15XXldoZWF2aWx5IGluc3BpcmVkIGJ5IE1FTVdSSVRFIGNv ZGUsCj4gPiA+IHNvIHF1aXRlIGEgbG90IG9mIGNvcHktcGFzdGluZyBoYXBwZW5lZC4gIEkgZ3Vl c3MgaXQgaXMgc29tZXdoYXQKPiA+ID4gZXhwZWN0ZWQgd2hlbiBhZGRpbmcgYSByZWFkLXNpZGUg Y291bnRlcnBhcnQgb2YgZXhpc3RpbmcgY29kZSB3aGljaAo+ID4gPiB0YWtlcyBjYXJlIG9mIHdy aXRlcywgYnV0IHBsZWFzZSBleGN1c2UgbWUgaWYgSSB3ZW50IHRvbyBmYXIuCj4gPiA+IAo+ID4g PiBOb3RlIHRoYXQgInNjcmlwdHMvY2hlY2twYXRjaC5wbCAtLXN0cmljdCIgcmV0dXJucyB0d28g YWxpZ25tZW50Cj4gPiA+IHdhcm5pbmdzIGZvciB0aGlzIHBhdGNoLiAgR2l2ZW4gdGhhdCBleGlz dGluZyBjb2RlIHRyaWdnZXJzIHRoZSBzYW1lCj4gPiA+IHdhcm5pbmdzLCBJIGFzc3VtZWQgdGhh dCBsb2NhbCBjb25zaXN0ZW5jeSB0cnVtcHMgY2hlY2twYXRjaC5wbCdzCj4gPiA+IGNvbXBsYWlu dHMuCj4gPiA+IAo+ID4gPiAgZHJpdmVycy9tdGQvbXRkY2hhci5jICAgICAgfCA2MCArKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ID4gPiAgaW5jbHVkZS91YXBpL210ZC9t dGQtYWJpLmggfCA0MyArKysrKysrKysrKysrKysrKysrKysrKy0tLS0KPiA+ID4gIDIgZmlsZXMg Y2hhbmdlZCwgOTggaW5zZXJ0aW9ucygrKSwgNSBkZWxldGlvbnMoLSkKPiA+ID4gCj4gPiA+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL210ZC9tdGRjaGFyLmMgYi9kcml2ZXJzL210ZC9tdGRjaGFyLmMK PiA+ID4gaW5kZXggMTU1ZTk5MWQ5ZDc1Li45MmUwMDI0YmRjZjcgMTAwNjQ0Cj4gPiA+IC0tLSBh L2RyaXZlcnMvbXRkL210ZGNoYXIuYwo+ID4gPiArKysgYi9kcml2ZXJzL210ZC9tdGRjaGFyLmMK PiA+ID4gQEAgLTYyMSw2ICs2MjEsNTggQEAgc3RhdGljIGludCBtdGRjaGFyX3dyaXRlX2lvY3Rs KHN0cnVjdCBtdGRfaW5mbyAqbXRkLAo+ID4gPiAgCXJldHVybiByZXQ7Cj4gPiA+ICB9Cj4gPiA+ ICAKPiA+ID4gK3N0YXRpYyBpbnQgbXRkY2hhcl9yZWFkX2lvY3RsKHN0cnVjdCBtdGRfaW5mbyAq bXRkLAo+ID4gPiArCQlzdHJ1Y3QgbXRkX3JlYWRfcmVxIF9fdXNlciAqYXJncCkKPiA+ID4gK3sK PiA+ID4gKwlzdHJ1Y3QgbXRkX2luZm8gKm1hc3RlciA9IG10ZF9nZXRfbWFzdGVyKG10ZCk7Cj4g PiA+ICsJc3RydWN0IG10ZF9yZWFkX3JlcSByZXE7Cj4gPiA+ICsJc3RydWN0IG10ZF9vb2Jfb3Bz IG9wcyA9IHt9Owo+ID4gPiArCXZvaWQgX191c2VyICp1c3JfZGF0YSwgKnVzcl9vb2I7Cj4gPiA+ ICsJaW50IHJldDsKPiA+ID4gKwo+ID4gPiArCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxLCBhcmdw LCBzaXplb2YocmVxKSkpCj4gPiA+ICsJCXJldHVybiAtRUZBVUxUOwo+ID4gPiArCj4gPiA+ICsJ dXNyX2RhdGEgPSAodm9pZCBfX3VzZXIgKikodWludHB0cl90KXJlcS51c3JfZGF0YTsKPiA+ID4g Kwl1c3Jfb29iID0gKHZvaWQgX191c2VyICopKHVpbnRwdHJfdClyZXEudXNyX29vYjsKPiA+ID4g Kwo+ID4gPiArCWlmICghbWFzdGVyLT5fcmVhZF9vb2IpCj4gPiA+ICsJCXJldHVybiAtRU9QTk9U U1VQUDsKPiA+ID4gKwlvcHMubW9kZSA9IHJlcS5tb2RlOwo+ID4gPiArCW9wcy5sZW4gPSAoc2l6 ZV90KXJlcS5sZW47Cj4gPiA+ICsJb3BzLm9vYmxlbiA9IChzaXplX3QpcmVxLm9vYmxlbjsKPiA+ ID4gKwlvcHMub29ib2ZmcyA9IDA7Cj4gPiA+ICsKPiA+ID4gKwlpZiAodXNyX2RhdGEpIHsKPiA+ ID4gKwkJb3BzLmRhdGJ1ZiA9IGttYWxsb2Mob3BzLmxlbiwgR0ZQX0tFUk5FTCk7ICAKPiAKPiBI bSwgSSBrbm93IHRoZSB3cml0ZSBwYXRoIGRvZXMgdGhhdCwgYnV0IEknbSByZWFsbHkgbm90IHN1 cmUKPiBrbWFsbG9jKCktaW5nIGEgYnVmZmVyIG9mIHRoZSByZXF1ZXN0ZWQgcmVhZCBsZW5ndGgg aXMgYSBnb29kCj4gaWRlYS4gSGF2aW5nIGEgbG9vcCBkb2luZyByZWFkcyB3aXRoIGFuIGVyYXNl c2l6ZSBncmFudWxhcml0eSB3b3VsZAo+IGF2b2lkIHRoaXMgdW5ib3VuZGVkIGFsbG9jYXRpb24g d2hpbGUga2VlcGluZyBwZXJmb3JtYW5jZSBhY2NlcHRhYmxlIGluCj4gbW9zdCBjYXNlcy4KClJp Z2h0LgoKPiAKPiA+ID4gKwkJaWYgKElTX0VSUihvcHMuZGF0YnVmKSkKPiA+ID4gKwkJCXJldHVy biBQVFJfRVJSKG9wcy5kYXRidWYpOwo+ID4gPiArCX0gZWxzZSB7Cj4gPiA+ICsJCW9wcy5kYXRi dWYgPSBOVUxMOwo+ID4gPiArCX0KPiA+ID4gKwo+ID4gPiArCWlmICh1c3Jfb29iKSB7Cj4gPiA+ ICsJCW9wcy5vb2JidWYgPSBrbWFsbG9jKG9wcy5vb2JsZW4sIEdGUF9LRVJORUwpOwo+ID4gPiAr CQlpZiAoSVNfRVJSKG9wcy5vb2JidWYpKSB7Cj4gPiA+ICsJCQlrZnJlZShvcHMuZGF0YnVmKTsK PiA+ID4gKwkJCXJldHVybiBQVFJfRVJSKG9wcy5vb2JidWYpOwo+ID4gPiArCQl9Cj4gPiA+ICsJ fSBlbHNlIHsKPiA+ID4gKwkJb3BzLm9vYmJ1ZiA9IE5VTEw7Cj4gPiA+ICsJfQo+ID4gPiArCj4g PiA+ICsJcmV0ID0gbXRkX3JlYWRfb29iKG10ZCwgKGxvZmZfdClyZXEuc3RhcnQsICZvcHMpOwo+ ID4gPiArCj4gPiA+ICsJaWYgKGNvcHlfdG9fdXNlcih1c3JfZGF0YSwgb3BzLmRhdGJ1Ziwgb3Bz LnJldGxlbikgfHwKPiA+ID4gKwkgICAgY29weV90b191c2VyKHVzcl9vb2IsIG9wcy5vb2JidWYs IG9wcy5vb2JyZXRsZW4pKQo+ID4gPiArCQlyZXQgPSAtRUZBVUxUOwo+ID4gPiArCj4gPiA+ICsJ a2ZyZWUob3BzLmRhdGJ1Zik7Cj4gPiA+ICsJa2ZyZWUob3BzLm9vYmJ1Zik7Cj4gPiA+ICsKPiA+ ID4gKwlyZXR1cm4gcmV0Owo+ID4gPiArfQo+ID4gPiArCj4gPiA+ICBzdGF0aWMgaW50IG10ZGNo YXJfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVfaW50IGNtZCwgdV9sb25nIGFyZykKPiA+ID4g IHsKPiA+ID4gIAlzdHJ1Y3QgbXRkX2ZpbGVfaW5mbyAqbWZpID0gZmlsZS0+cHJpdmF0ZV9kYXRh Owo+ID4gPiBAQCAtNjQzLDYgKzY5NSw3IEBAIHN0YXRpYyBpbnQgbXRkY2hhcl9pb2N0bChzdHJ1 Y3QgZmlsZSAqZmlsZSwgdV9pbnQgY21kLCB1X2xvbmcgYXJnKQo+ID4gPiAgCWNhc2UgTUVNR0VU SU5GTzoKPiA+ID4gIAljYXNlIE1FTVJFQURPT0I6Cj4gPiA+ICAJY2FzZSBNRU1SRUFET09CNjQ6 Cj4gPiA+ICsJY2FzZSBNRU1SRUFEOgo+ID4gPiAgCWNhc2UgTUVNSVNMT0NLRUQ6Cj4gPiA+ICAJ Y2FzZSBNRU1HRVRPT0JTRUw6Cj4gPiA+ICAJY2FzZSBNRU1HRVRCQURCTE9DSzoKPiA+ID4gQEAg LTgxNyw2ICs4NzAsMTMgQEAgc3RhdGljIGludCBtdGRjaGFyX2lvY3RsKHN0cnVjdCBmaWxlICpm aWxlLCB1X2ludCBjbWQsIHVfbG9uZyBhcmcpCj4gPiA+ICAJCWJyZWFrOwo+ID4gPiAgCX0KPiA+ ID4gIAo+ID4gPiArCWNhc2UgTUVNUkVBRDoKPiA+ID4gKwl7Cj4gPiA+ICsJCXJldCA9IG10ZGNo YXJfcmVhZF9pb2N0bChtdGQsCj4gPiA+ICsJCSAgICAgIChzdHJ1Y3QgbXRkX3JlYWRfcmVxIF9f dXNlciAqKWFyZyk7Cj4gPiA+ICsJCWJyZWFrOwo+ID4gPiArCX0KPiA+ID4gKwo+ID4gPiAgCWNh c2UgTUVNTE9DSzoKPiA+ID4gIAl7Cj4gPiA+ICAJCXN0cnVjdCBlcmFzZV9pbmZvX3VzZXIgZWlu Zm87Cj4gPiA+IGRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbXRkL210ZC1hYmkuaCBiL2luY2x1 ZGUvdWFwaS9tdGQvbXRkLWFiaS5oCj4gPiA+IGluZGV4IGI4Njk5OTBjMmRiMi4uMzM3ZTZlNTk3 ZmFkIDEwMDY0NAo+ID4gPiAtLS0gYS9pbmNsdWRlL3VhcGkvbXRkL210ZC1hYmkuaAo+ID4gPiAr KysgYi9pbmNsdWRlL3VhcGkvbXRkL210ZC1hYmkuaAo+ID4gPiBAQCAtNTUsOSArNTUsOSBAQCBz dHJ1Y3QgbXRkX29vYl9idWY2NCB7Cj4gPiA+ICAgKiBATVREX09QU19SQVc6CWRhdGEgYXJlIHRy YW5zZmVycmVkIGFzLWlzLCB3aXRoIG5vIGVycm9yIGNvcnJlY3Rpb247Cj4gPiA+ICAgKgkJCXRo aXMgbW9kZSBpbXBsaWVzICVNVERfT1BTX1BMQUNFX09PQgo+ID4gPiAgICoKPiA+ID4gLSAqIFRo ZXNlIG1vZGVzIGNhbiBiZSBwYXNzZWQgdG8gaW9jdGwoTUVNV1JJVEUpIGFuZCBhcmUgYWxzbyB1 c2VkIGludGVybmFsbHkuCj4gPiA+IC0gKiBTZWUgbm90ZXMgb24gIk1URCBmaWxlIG1vZGVzIiBm b3IgZGlzY3Vzc2lvbiBvbiAlTVREX09QU19SQVcgdnMuCj4gPiA+IC0gKiAlTVREX0ZJTEVfTU9E RV9SQVcuCj4gPiA+ICsgKiBUaGVzZSBtb2RlcyBjYW4gYmUgcGFzc2VkIHRvIGlvY3RsKE1FTVdS SVRFKSBhbmQgaW9jdGwoTUVNUkVBRCk7IHRoZXkgYXJlCj4gPiA+ICsgKiBhbHNvIHVzZWQgaW50 ZXJuYWxseS4gU2VlIG5vdGVzIG9uICJNVEQgZmlsZSBtb2RlcyIgZm9yIGRpc2N1c3Npb24gb24K PiA+ID4gKyAqICVNVERfT1BTX1JBVyB2cy4gJU1URF9GSUxFX01PREVfUkFXLgo+ID4gPiAgICov Cj4gPiA+ICBlbnVtIHsKPiA+ID4gIAlNVERfT1BTX1BMQUNFX09PQiA9IDAsCj4gPiA+IEBAIC05 MSw2ICs5MSwzMiBAQCBzdHJ1Y3QgbXRkX3dyaXRlX3JlcSB7Cj4gPiA+ICAJX191OCBwYWRkaW5n WzddOwo+ID4gPiAgfTsKPiA+ID4gIAo+ID4gPiArLyoqCj4gPiA+ICsgKiBzdHJ1Y3QgbXRkX3Jl YWRfcmVxIC0gZGF0YSBzdHJ1Y3R1cmUgZm9yIHJlcXVlc3RpbmcgYSByZWFkIG9wZXJhdGlvbgo+ ID4gPiArICoKPiA+ID4gKyAqIEBzdGFydDoJc3RhcnQgYWRkcmVzcwo+ID4gPiArICogQGxlbjoJ bGVuZ3RoIG9mIGRhdGEgYnVmZmVyCj4gPiA+ICsgKiBAb29ibGVuOglsZW5ndGggb2YgT09CIGJ1 ZmZlcgo+ID4gPiArICogQHVzcl9kYXRhOgl1c2VyLXByb3ZpZGVkIGRhdGEgYnVmZmVyCj4gPiA+ ICsgKiBAdXNyX29vYjoJdXNlci1wcm92aWRlZCBPT0IgYnVmZmVyCj4gPiA+ICsgKiBAbW9kZToJ TVREIG1vZGUgKHNlZSAiTVREIG9wZXJhdGlvbiBtb2RlcyIpCj4gPiA+ICsgKiBAcGFkZGluZzoJ cmVzZXJ2ZWQsIG11c3QgYmUgc2V0IHRvIDAKPiA+ID4gKyAqCj4gPiA+ICsgKiBUaGlzIHN0cnVj dHVyZSBzdXBwb3J0cyBpb2N0bChNRU1SRUFEKSBvcGVyYXRpb25zLCBhbGxvd2luZyBkYXRhIGFu ZC9vciBPT0IKPiA+ID4gKyAqIHJlYWRzIGluIHZhcmlvdXMgbW9kZXMuIFRvIHJlYWQgZnJvbSBP T0Itb25seSwgc2V0IEB1c3JfZGF0YSA9PSBOVUxMLCBhbmQgdG8KPiA+ID4gKyAqIHJlYWQgZGF0 YS1vbmx5LCBzZXQgQHVzcl9vb2IgPT0gTlVMTC4gSG93ZXZlciwgc2V0dGluZyBib3RoIEB1c3Jf ZGF0YSBhbmQKPiA+ID4gKyAqIEB1c3Jfb29iIHRvIE5VTEwgaXMgbm90IGFsbG93ZWQuCj4gPiA+ ICsgKi8KPiA+ID4gK3N0cnVjdCBtdGRfcmVhZF9yZXEgewo+ID4gPiArCV9fdTY0IHN0YXJ0Owo+ ID4gPiArCV9fdTY0IGxlbjsKPiA+ID4gKwlfX3U2NCBvb2JsZW47Cj4gPiA+ICsJX191NjQgdXNy X2RhdGE7Cj4gPiA+ICsJX191NjQgdXNyX29vYjsKPiA+ID4gKwlfX3U4IG1vZGU7Cj4gPiA+ICsJ X191OCBwYWRkaW5nWzddOwo+ID4gPiArfTsgIAo+IAo+IEkgZG8gYWdyZWUgdGhhdCBhIG5ldyBp bnRlcmZhY2UgaXMgbmVlZGVkLCBidXQgaWYgd2UncmUgYWRkaW5nIGEgbmV3Cj4gZW50cnkgcG9p bnQsIGxldCdzIG1ha2Ugc3VyZSBpdCBjb3ZlcnMgYWxsIHBvc3NpYmxlIHVzZSBjYXNlcyB3ZSBo YXZlCj4gbm93LiBBdCB0aGUgdmVyeSBsZWFzdCwgSSB0aGluayB3ZSdyZSBtaXNzaW5nIGluZm8g YWJvdXQgdGhlIG1heGltdW0KPiBudW1iZXIgb2YgY29ycmVjdGVkIGJpdHMgcGVyIEVDQyByZWdp b24gb24gdGhlIHBvcnRpb24gYmVpbmcgcmVhZC4KPiBQcm9wYWdhdGluZyBFVUNMRUFOIGVycm9y cyBpcyBuaWNlLCBidXQgaXQncyBub3QgcHJlY2lzZSBlbm91Z2ggSU1ITy4KPiAKPiBJIHJlbWVt YmVyIGRpc2N1c3Npbmcgc2VhcmNoIGEgbmV3IFJFQUQgaW9jdGwgd2l0aCBTYXNjaGEgSGF1ZXIg YSBmZXcKPiB5ZWFycyBiYWNrLCBidXQgSSBjYW4ndCBmaW5kIHRoZSBkaXNjdXNzaW9uLi4uCgpX ZSBhbHNvIGRpc2N1c3NlZCBhIG10ZF9pb19vcCBzb21lIHRpbWUgYWdvLCB3aGljaCB3b3VsZCBl cXVpdmFsZW50bHkKcmVwbGFjZSBtdGRfb29iX29wcyBhdCBzb21lIHBvaW50LCBpbmNsdWRpbmcg bW9yZSBpbmZvcm1hdGlvbiBzdWNoIGFzCnRoZSBiaXRmbGlwcyB3aGljaCBoYXBwZW5lZCBvbiBl dmVyeSBjaHVuayBpbnN0ZWFkIG9mIHRoZSBpbmZvcm1hdGlvbgpyZWdhcmRpbmcgdGhlIG1heGlt dW0gbnVtYmVyIG9mIGJpdGZsaXBzIGluIG9uZSBvZiB0aGUgY2h1bmtzIG9ubHkuCklJUkMgdGhl IHBvaW50IHdhcyB0byBnZXQgcmlkIG9mIHRoZSBtdGRfe3JlYWQsd3JpdGV9eyxfb29ifSBob29r cyBhbmQKc3RydWN0dXJlcyBpbiBmYXZvciBvZiBhIG1vcmUgcm9idXN0IGFuZCBjb21wbGV0ZSBz ZXQgb2Ygb3BlcmF0aW9ucy4KCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KTGludXggTVREIGRpc2N1c3Npb24gbWFpbGluZyBsaXN0Cmh0dHA6 Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtbXRkLwo=