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 lists.sourceforge.net (lists.sourceforge.net [216.105.38.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 6EFB4C55184 for ; Tue, 4 Aug 2026 00:42:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.sourceforge.net; s=beta; h=Content-Type:Content-Transfer-Encoding:Cc: Reply-To:From:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:Subject:In-Reply-To:References:To:MIME-Version:Date: Message-ID:Sender:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=thyCvK5cu5oE/SHhxEqpSRcz9Dx1baUKE7nVNSXwNHI=; b=R3zYP8fbU18nGHRGkkHpzCQga0 eKQHDg9sOAvOMnnF8ATkW+B0uj5AwdPwJ5uh4lc7GtESuAnE9W9CvqH8r2S8lBg7AvsaYbHEKBmEr JKuxO0jxP9aswEyC8PnjF5lkftpWIkoV4z6QOKuIvMfml1GRqmNJQUbTH+u+aR8AbQPc=; Received: from [127.0.0.1] (helo=sfs-ml-1.v29.lw.sourceforge.com) by sfs-ml-1.v29.lw.sourceforge.com with esmtp (Exim 4.95) (envelope-from ) id 1wr3Ea-00024C-Sr; Tue, 04 Aug 2026 00:42:18 +0000 Received: from [172.30.29.66] (helo=mx.sourceforge.net) by sfs-ml-1.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1wr3Ea-000246-2P for linux-f2fs-devel@lists.sourceforge.net; Tue, 04 Aug 2026 00:42:17 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=Content-Transfer-Encoding:Content-Type:In-Reply-To: From:References:To:Subject:Cc:MIME-Version:Date:Message-ID:Sender:Reply-To: 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=0nEWma6foP+NyI8kMkYdMIaAGtIWqlJtNaz8S3IOKXI=; b=QRCH7HrzQCREsUoTD7M1DuTz3d 67XC6mI5el2rv5Gh+1y0GWP3IAiZv+5XeHeC2MnsTpNZDLB9sXwp9fdz6NWnROyT1SK0bikqW9xjd EFhihreOl7BZ/nd+Q9SeL/C3zb1tTo+xZqE1OEEHOJuIUX4y+5ZonZz/IcKElVAQnu2Y=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=Content-Transfer-Encoding:Content-Type:In-Reply-To:From:References:To: Subject:Cc:MIME-Version:Date:Message-ID:Sender:Reply-To: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=0nEWma6foP+NyI8kMkYdMIaAGtIWqlJtNaz8S3IOKXI=; b=i9llGWaudxELX0AAD7scjaZail NWOHRUYBIlkSjzO9gvCq4/RwMXcwnx2VUgkqhOKvR3bJ9qMPnyWd7H4WkUn90ctWGIZxlIF+t0KrW UF1GsKt238ht/g4PixqxrvL+xXlMlyNSPUG8xvjP5IU+/ZgiduY9bYie4o/OdtbhAnDQ=; Received: from sea.source.kernel.org ([172.234.252.31]) by sfi-mx-1.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.95) id 1wr3EY-00021O-IX for linux-f2fs-devel@lists.sourceforge.net; Tue, 04 Aug 2026 00:42:17 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by sea.source.kernel.org (Postfix) with ESMTP id 5FE3B43BAC; Tue, 4 Aug 2026 00:42:09 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id C9D7D1F000E9; Tue, 4 Aug 2026 00:42:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785804129; bh=0nEWma6foP+NyI8kMkYdMIaAGtIWqlJtNaz8S3IOKXI=; h=Date:Cc:Subject:To:References:From:In-Reply-To; b=mysof7iBoye5EAVOqz3HtDadHrn6wMZH0aTkVvDlsaVfr/Kpep6DWIRTlWd9vh9jU waQ5tKhD/MiOLfOfBrldYh1xj55QuuXGpDg55NUc8U7YiuicZAtkOPp5ltpSrEyxO6 U6QbItcgjcch0p+sDbxAk8oyJlfNT2BV1bSrZwhrSj63gCX+Ke6zalp7eFFt8cP5E/ ixGtEhmkLMmcqemB6jhDQRZQbWt3LV1ySD1CQw3U6XkeOcAfObMm9npYcTvK4C5mcL n1UKTPK7pRqE70+b7d4xFe1AZmdEsp2PUHgZD3X8zF5kg3dwk2FoDpzP2f5m8+0nC5 MS4ebEBewx/+g== Message-ID: <2412b0d4-727e-44a5-a4e3-709dd0d527f9@kernel.org> Date: Tue, 4 Aug 2026 08:42:06 +0800 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird To: Daeho Jeong References: <20260730154618.2166947-1-daeho43@gmail.com> Content-Language: en-US In-Reply-To: X-Headers-End: 1wr3EY-00021O-IX Subject: Re: [f2fs-dev] [PATCH v6] f2fs: support dynamic reserve/release for device aliasing X-BeenThere: linux-f2fs-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Chao Yu via Linux-f2fs-devel Reply-To: Chao Yu Cc: Daeho Jeong , kernel-team@android.com, linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net T24gOC80LzI2IDAwOjE4LCBEYWVobyBKZW9uZyB3cm90ZToKPiBPbiBTdW4sIEF1ZyAyLCAyMDI2 IGF0IDc6MDDigK9QTSBDaGFvIFl1IDxjaGFvQGtlcm5lbC5vcmc+IHdyb3RlOgo+Pgo+PiBPbiA3 LzMwLzI2IDIzOjQ2LCBEYWVobyBKZW9uZyB3cm90ZToKPj4+IEZyb206IERhZWhvIEplb25nIDxk YWVob2plb25nQGdvb2dsZS5jb20+Cj4+Pgo+Pj4gVGhpcyBwYXRjaCBhZGRzIGEgZHluYW1pYyBt YW5hZ2VtZW50IGZlYXR1cmUgdG8gdGhlIGV4aXN0aW5nIGRldmljZQo+Pj4gYWxpYXNpbmcgZnVu Y3Rpb25hbGl0eS4gSXQgYWxsb3dzIHVzZXJzIHRvIGR5bmFtaWNhbGx5IHJlc2VydmUgb3IKPj4+ IHJlbGVhc2Ugc3BlY2lmaWMgZGV2aWNlcyBmcm9tIHRoZSBmaWxlc3lzdGVtJ3MgZnJlZSBwb29s IGF0IHJ1bnRpbWUKPj4+IHRocm91Z2ggbmV3IGlvY3Rscy4KPj4+Cj4+PiBUbyBzdXBwb3J0IHRo aXMsIHRocmVlIG5ldyBpb2N0bHMgYXJlIGludHJvZHVjZWQ6Cj4+PiAtIEYyRlNfSU9DX1JFU0VS VkVfREVWX0FMSUFTOiBUaGlzIHJlY2xhaW1zIHRoZSBzcGFjZSBvY2N1cGllZCBieSBhCj4+PiAg ICAgZGV2aWNlIGFsaWFzaW5nIGZpbGUuIEl0IGZpcnN0IHBlcmZvcm1zIGEgY2FwYWNpdHkgY2hl Y2ssIHJlc2V0cyBHQwo+Pj4gICAgIHZpY3RpbSBpbmZvcm1hdGlvbiBmb3IgdGhlIHRhcmdldCBy YW5nZSwgbWFya3MgdGhlIHNlZ21lbnRzIGFzIGluLXVzZQo+Pj4gICAgIHRvIHByZXZlbnQgbmV3 IGFsbG9jYXRpb25zLCBhbmQgdGhlbiB0cmlnZ2VycyBHQyB0byBtaWdyYXRlIGV4aXN0aW5nCj4+ PiAgICAgdmFsaWQgZGF0YSBvdXQgb2YgdGhlIHJhbmdlLiBGaW5hbGx5LCBpdCByZXNlcnZlcyB0 aGVzZSBibG9ja3MgaW4gdGhlCj4+PiAgICAgU0lUIHRvIGVmZmVjdGl2ZWx5IGV4Y2x1ZGUgdGhl IGRldmljZSBmcm9tIHRoZSB1c2FibGUgY2FwYWNpdHkuCj4+Pgo+Pj4gLSBGMkZTX0lPQ19SRUxF QVNFX0RFVl9BTElBUzogVGhpcyByZWxlYXNlcyB0aGUgcmVzZXJ2ZWQgc3BhY2Ugb2YgYQo+Pj4g ICAgIHByZXZpb3VzbHkgcmVzZXJ2ZWQgZGV2aWNlIGFsaWFzaW5nIGZpbGUuIEl0IHRydW5jYXRl cyB0aGUgYmxvY2tzCj4+PiAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlLCB3aGljaCBtYWtl cyB0aGVtIGF2YWlsYWJsZSBmb3IgZ2VuZXJhbAo+Pj4gICAgIGZpbGVzeXN0ZW0gYWxsb2NhdGlv biBhZ2Fpbi4KPj4+Cj4+PiAtIEYyRlNfSU9DX0dFVF9ERVZfQUxJQVNfU1RBVFVTOiBUaGlzIHJl dHJpZXZlcyB0aGUgY3VycmVudCBhbGlhc2luZwo+Pj4gICAgIHN0YXR1cyBvZiBhIGRldmljZSBh bGlhc2luZyBmaWxlLCByZXR1cm5pbmcgd2hldGhlciB0aGUgZmlsZSBpcwo+Pj4gICAgIHJlbGVh c2VkIChpbmFjdGl2ZSBhbGlhcykgb3IgcmVzZXJ2ZWQgKGFjdGl2ZSBhbGlhcywgd2l0aCBibG9j a3MKPj4+ICAgICBmdWxseSBhbGxvY2F0ZWQgb24gdGhlIGRldmljZSkuCj4+Pgo+Pj4gU2lnbmVk LW9mZi1ieTogRGFlaG8gSmVvbmcgPGRhZWhvamVvbmdAZ29vZ2xlLmNvbT4KPj4+IC0tLQo+Pj4g djY6IGZpeGVkIGR1cGxpY2F0ZWQgYmxvY2sgcmVzZXJ2YXRpb25zIGFuZCByYWNpbmcgdy8gbW1h cC4KPj4+ICAgICAgIGFkZGVkIHRoZSBleHRlbnQgYWxpZ25tZW50IGNoZWNrIGZvciBkZXZpY2Ug YWxpYXNpbmcgYXJlYXMuCj4+PiB2NTogcHJldmVudGVkIG5ldyBzZWdtZW50IGFsbG9jYXRpb24g b24gZGV2aWNlcyB1bmRlcmdvaW5nIHJlc2VydmF0aW9uCj4+PiAgICAgICBvciB3aXRoIGFjdGl2 ZSBhbGlhc2VzLgo+Pj4gICAgICAgdXNlZCBpbi1tZW1vcnkgc3RydWN0IHRvIHJlc2VydmUgYmxv Y2tzIGZvciBkZXZpY2UgYWxpYXNpbmcuCj4+PiAgICAgICBjbGVhcmVkIHByZWZyZWUgKFBSRSkg ZGlydHkgc2VnbWVudCBiaXRtYXAuCj4+PiB2NDogcmVuYW1lZCBpbnRlcmZhY2VzLgo+Pj4gICAg ICAgZml4ZWQgcmFjZSBjb25kaXRpb25zIGJldHdlZW4gY2hlY2twb2ludD1kaXNhYmxlIG1vdW50 IGFuZCBpb2N0bHMuCj4+PiAgICAgICByZWZhY3RvcmVkIHNlZ21lbnQgcmVzZXJ2YXRpb24gcGFy dC4KPj4+ICAgICAgIG1vZGlmaWVkIGxvY2sgdXNhZ2UuCj4+PiB2MzogYWRkIENBUF9TWVNfQURN SU4gYW5kIGNoZWNrcG9pbnQ9ZGlzYWJsZWQgY2hlY2suCj4+PiAgICAgICByZW1vdmUgYSBmMmZz IHNwZWNpZmljIGZsYWcgZXhwb3NlZCB3aXRoIGdldGZsYWdzLgo+Pj4gdjI6IHByZXZlbnQgb3Bl cmF0aW9ucyBkdXJpbmcgY2hlY2twb2ludD1kaXNhYmxlZC4KPj4+IC0tLQo+Pj4gLS0tCj4+PiAg ICBEb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2YyZnMucnN0IHwgIDM1ICsrKysKPj4+ICAgIGZz L2YyZnMvZGF0YS5jICAgICAgICAgICAgICAgICAgICAgfCAgIDQgKy0KPj4+ICAgIGZzL2YyZnMv ZXh0ZW50X2NhY2hlLmMgICAgICAgICAgICAgfCAgIDcgKwo+Pj4gICAgZnMvZjJmcy9mMmZzLmgg ICAgICAgICAgICAgICAgICAgICB8ICAxOSArLQo+Pj4gICAgZnMvZjJmcy9maWxlLmMgICAgICAg ICAgICAgICAgICAgICB8IDI3MyArKysrKysrKysrKysrKysrKysrKysrKysrKysrLQo+Pj4gICAg ZnMvZjJmcy9nYy5jICAgICAgICAgICAgICAgICAgICAgICB8ICAzMCArKy0tCj4+PiAgICBmcy9m MmZzL25hbWVpLmMgICAgICAgICAgICAgICAgICAgIHwgIDE0ICsrCj4+PiAgICBmcy9mMmZzL3Nl Z21lbnQuYyAgICAgICAgICAgICAgICAgIHwgMTc2ICsrKysrKysrKysrKystLS0tLS0KPj4+ICAg IGZzL2YyZnMvc2VnbWVudC5oICAgICAgICAgICAgICAgICAgfCAgMjIgKysrCj4+PiAgICBmcy9m MmZzL3N1cGVyLmMgICAgICAgICAgICAgICAgICAgIHwgIDM2ICsrKysKPj4+ICAgIGluY2x1ZGUv dWFwaS9saW51eC9mMmZzLmggICAgICAgICAgfCAgIDcgKwo+Pj4gICAgMTEgZmlsZXMgY2hhbmdl ZCwgNTU1IGluc2VydGlvbnMoKyksIDY4IGRlbGV0aW9ucygtKQo+Pj4KPj4+IGRpZmYgLS1naXQg YS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2YyZnMucnN0IGIvRG9jdW1lbnRhdGlvbi9maWxl c3lzdGVtcy9mMmZzLnJzdAo+Pj4gaW5kZXggOGM0YTE0YWU0NDRmLi4xYTVmZDRhZmU2MDkgMTAw NjQ0Cj4+PiAtLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2YyZnMucnN0Cj4+PiArKysg Yi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL2YyZnMucnN0Cj4+PiBAQCAtMTA0NSw2ICsxMDQ1 LDQxIEBAIFNvLCB0aGUga2V5IGlkZWEgaXMsIHVzZXIgY2FuIGRvIGFueSBmaWxlIG9wZXJhdGlv bnMgb24gL2Rldi92ZGMsIGFuZAo+Pj4gICAgcmVjbGFpbSB0aGUgc3BhY2UgYWZ0ZXIgdGhlIHVz ZSwgd2hpbGUgdGhlIHNwYWNlIGlzIGNvdW50ZWQgYXMgL2RhdGEuCj4+PiAgICBUaGF0IGRvZXNu J3QgcmVxdWlyZSBtb2RpZnlpbmcgcGFydGl0aW9uIHNpemUgYW5kIGZpbGVzeXN0ZW0gZm9ybWF0 Lgo+Pj4KPj4+ICtEeW5hbWljIERldmljZSBBbGlhc2luZyBNYW5hZ2VtZW50Cj4+PiArLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo+Pj4gKwo+Pj4gK0luIGFkZGl0aW9uIHRvIHN0 YXRpYyBkZXZpY2UgYWxpYXNpbmcgYnkgZGVsZXRpbmcgdGhlIGFsaWFzaW5nIGZpbGUsIEYyRlMK Pj4+ICtzdXBwb3J0cyBkeW5hbWljIG1hbmFnZW1lbnQgb2YgZGV2aWNlIGFsaWFzaW5nLiBUaGlz IG1lY2hhbmlzbSBhbGxvd3MgdGhlIHN5c3RlbQo+Pj4gK3RvIGR5bmFtaWNhbGx5IHRyYW5zaXRp b24gcGFydGl0aW9uIG93bmVyc2hpcCBiZXR3ZWVuIEYyRlMgdXNlcmRhdGEgYW5kIGV4dGVybmFs Cj4+PiArZW50aXRpZXMgKGUuZy4sIHpSQU0sIHJhdyBwYXJ0aXRpb24pIGJhc2VkIG9uIHN5c3Rl bSByZXF1aXJlbWVudHMgd2l0aG91dAo+Pj4gK2RlbGV0aW5nIHRoZSBtYXN0ZXIgYWxpYXNpbmcg ZmlsZSBvciByZXF1aXJpbmcgdW5tb3VudC9yZW1vdW50Lgo+Pj4gKwo+Pj4gK1RoZSBtYXN0ZXIg YWxpYXNpbmcgZmlsZSBpcyBjcmVhdGVkIGR1cmluZyB0aGUgaW5pdGlhbCBmb3JtYXQgb2YgdGhl IGZpbGUgc3lzdGVtCj4+PiArYW5kIHJlbWFpbnMgYXMgYSBwZXJzaXN0ZW50IGNvbnRyb2wgZW50 aXR5IChpb2N0bCBnYXRld2F5KSBpbiB0aGUgcm9vdCBkaXJlY3RvcnkuCj4+PiArCj4+PiArLSBQ YXJ0aXRpb24gUmVzZXJ2YXRpb24gKEluLXNlcnZpY2UgdG8gQWxpYXNlZCkKPj4+ICsgIFdoZW4g YSBzcGVjaWZpYyBwYXJ0aXRpb24gbmVlZHMgdG8gYmUgZGVkaWNhdGVkIHRvIGV4dGVybmFsIHNl cnZpY2VzIChlLmcuLCB6UkFNKSwKPj4+ICsgIGEgdXNlciBjYW4gcmVzZXJ2ZSB0aGUgZGV2aWNl IGFsaWFzIHJhbmdlIHZpYSBpb2N0bC4gVGhlIGtlcm5lbCByZXNldHMgR0MgdmljdGltCj4+PiAr ICBpbmZvcm1hdGlvbiBmb3IgdGhlIHRhcmdldCByYW5nZSwgbWFya3Mgc2VnbWVudHMgYXMgaW4t dXNlIHRvIHByZXZlbnQgbmV3Cj4+PiArICBhbGxvY2F0aW9ucywgYW5kIHRyaWdnZXJzIGZvcmNl ZCBHQyB0byBtaWdyYXRlIGV4aXN0aW5nIHZhbGlkIGRhdGEgb3V0IG9mIHRoZQo+Pj4gKyAgcmFu Z2UuIEZpbmFsbHksIGl0IHJlc2VydmVzIHRoZXNlIGJsb2NrcyBpbiB0aGUgU0lUIHRvIGVmZmVj dGl2ZWx5IGV4Y2x1ZGUgdGhlCj4+PiArICBkZXZpY2UgZnJvbSB0aGUgdXNhYmxlIGNhcGFjaXR5 Lgo+Pj4gKwo+Pj4gKy0gUGFydGl0aW9uIFJlbGVhc2UgKEFsaWFzZWQgdG8gSW4tc2VydmljZSkK Pj4+ICsgIFdoZW4gZXh0ZXJuYWwgdXNhZ2UgY29uY2x1ZGVzLCB0aGUgc3BhY2UgaXMgcmVjbGFp bWVkIG5vdCBieSBkZWxldGluZyB0aGUgZmlsZSwKPj4+ICsgIGJ1dCB0aHJvdWdoIHRoZSByZWxl YXNlIGlvY3RsLiBUaGUga2VybmVsIHRydW5jYXRlcyBibG9ja3MgYXNzb2NpYXRlZCB3aXRoCj4+ PiArICB0aGUgZmlsZSwgcmVsZWFzaW5nIHRoZW0gYmFjayB0byBnZW5lcmFsIGZpbGVzeXN0ZW0g YWxsb2NhdGlvbi4KPj4+ICsKPj4+ICsuLiBjb2RlLWJsb2NrOjoKPj4+ICsKPj4+ICsgICAjIGYy ZnNfaW8gZGV2X2FsaWFzIHJlbGVhc2UgL21udC9mMmZzL3ZkYy5maWxlCj4+PiArICAgIyBkZiAt aAo+Pj4gKyAgIC9kZXYvdmRiICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0RyAgNzUzTSAg IDY0RyAgIDIlIC9tbnQvZjJmcwo+Pj4gKwo+Pj4gKyAgICMgZjJmc19pbyBkZXZfYWxpYXMgcmVz ZXJ2ZSAvbW50L2YyZnMvdmRjLmZpbGUKPj4+ICsgICAjIGRmIC1oCj4+PiArICAgL2Rldi92ZGIg ICAgICAgICAgICAgICAgICAgICAgICAgICAgNjRHICAgMzNHICAgMzJHICA1MiUgL21udC9mMmZz Cj4+PiArCj4+PiAgICBQZXItZmlsZSBSZWFkLU9ubHkgTGFyZ2UgRm9saW8gU3VwcG9ydAo+Pj4g ICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPj4+Cj4+PiBkaWZmIC0t Z2l0IGEvZnMvZjJmcy9kYXRhLmMgYi9mcy9mMmZzL2RhdGEuYwo+Pj4gaW5kZXggYWMxY2Y0ZGUz ZDYyLi44OTJkNTk0MDQ4YjcgMTAwNjQ0Cj4+PiAtLS0gYS9mcy9mMmZzL2RhdGEuYwo+Pj4gKysr IGIvZnMvZjJmcy9kYXRhLmMKPj4+IEBAIC0xMjcwLDcgKzEyNzAsNyBAQCBpbnQgZjJmc19yZXNl cnZlX25ld19ibG9ja3Moc3RydWN0IGRub2RlX29mX2RhdGEgKmRuLCBibGtjbnRfdCBjb3VudCkK Pj4+Cj4+PiAgICAgICAgaWYgKHVubGlrZWx5KGlzX2lub2RlX2ZsYWdfc2V0KGRuLT5pbm9kZSwg RklfTk9fQUxMT0MpKSkKPj4+ICAgICAgICAgICAgICAgIHJldHVybiAtRVBFUk07Cj4+PiAtICAg ICBlcnIgPSBpbmNfdmFsaWRfYmxvY2tfY291bnQoc2JpLCBkbi0+aW5vZGUsICZjb3VudCwgdHJ1 ZSk7Cj4+PiArICAgICBlcnIgPSBpbmNfdmFsaWRfYmxvY2tfY291bnQoc2JpLCBkbi0+aW5vZGUs ICZjb3VudCwgdHJ1ZSwgZmFsc2UpOwo+Pj4gICAgICAgIGlmICh1bmxpa2VseShlcnIpKQo+Pj4g ICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKPj4+Cj4+PiBAQCAtMTU0Miw3ICsxNTQyLDcgQEAg c3RhdGljIGludCBfX2FsbG9jYXRlX2RhdGFfYmxvY2soc3RydWN0IGRub2RlX29mX2RhdGEgKmRu LCBpbnQgc2VnX3R5cGUpCj4+Pgo+Pj4gICAgICAgIGRuLT5kYXRhX2Jsa2FkZHIgPSBmMmZzX2Rh dGFfYmxrYWRkcihkbik7Cj4+PiAgICAgICAgaWYgKGRuLT5kYXRhX2Jsa2FkZHIgPT0gTlVMTF9B RERSKSB7Cj4+PiAtICAgICAgICAgICAgIGVyciA9IGluY192YWxpZF9ibG9ja19jb3VudChzYmks IGRuLT5pbm9kZSwgJmNvdW50LCB0cnVlKTsKPj4+ICsgICAgICAgICAgICAgZXJyID0gaW5jX3Zh bGlkX2Jsb2NrX2NvdW50KHNiaSwgZG4tPmlub2RlLCAmY291bnQsIHRydWUsIGZhbHNlKTsKPj4+ ICAgICAgICAgICAgICAgIGlmICh1bmxpa2VseShlcnIpKQo+Pj4gICAgICAgICAgICAgICAgICAg ICAgICByZXR1cm4gZXJyOwo+Pj4gICAgICAgIH0KPj4+IGRpZmYgLS1naXQgYS9mcy9mMmZzL2V4 dGVudF9jYWNoZS5jIGIvZnMvZjJmcy9leHRlbnRfY2FjaGUuYwo+Pj4gaW5kZXggNjFmNmI5NzE0 MzY2Li4zYTczN2RiMGM5ZTEgMTAwNjQ0Cj4+PiAtLS0gYS9mcy9mMmZzL2V4dGVudF9jYWNoZS5j Cj4+PiArKysgYi9mcy9mMmZzL2V4dGVudF9jYWNoZS5jCj4+PiBAQCAtNjIsNiArNjIsMTMgQEAg Ym9vbCBzYW5pdHlfY2hlY2tfZXh0ZW50X2NhY2hlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVj dCBmb2xpbyAqaWZvbGlvKQo+Pj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18s IGlub2RlLT5pX2lubywgZWkuYmxrLCBlaS5mb2ZzLCBlaS5sZW4pOwo+Pj4gICAgICAgICAgICAg ICAgICAgICAgICByZXR1cm4gZmFsc2U7Cj4+PiAgICAgICAgICAgICAgICB9Cj4+PiArCj4+PiAr ICAgICAgICAgICAgIGlmICgoZWkuYmxrICUgQkxLU19QRVJfU0VDKHNiaSkpIHx8IChlaS5sZW4g JSBCTEtTX1BFUl9TRUMoc2JpKSkpIHsKPj4+ICsgICAgICAgICAgICAgICAgICAgICBmMmZzX3dh cm4oc2JpLCAiJXM6IGRldmljZSBhbGlhcyBpbm9kZSAoaW5vPSVsbHgpJ3MgZXh0ZW50IGluZm8g WyV1LCAldSwgJXVdIGlzIG5vdCBhbGlnbmVkIHRvIHNlY3Rpb24gc2l6ZSAldSIsCj4+PiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBpbm9kZS0+aV9pbm8sIGVpLmJs aywgZWkuZm9mcywgZWkubGVuLAo+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBC TEtTX1BFUl9TRUMoc2JpKSk7Cj4+PiArICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl Owo+Pj4gKyAgICAgICAgICAgICB9Cj4+PiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKPj4+ ICAgICAgICB9Cj4+Pgo+Pj4gZGlmZiAtLWdpdCBhL2ZzL2YyZnMvZjJmcy5oIGIvZnMvZjJmcy9m MmZzLmgKPj4+IGluZGV4IGYxNzc0ZDRlMThkMi4uZjI0ZTMwYmI1YzNkIDEwMDY0NAo+Pj4gLS0t IGEvZnMvZjJmcy9mMmZzLmgKPj4+ICsrKyBiL2ZzL2YyZnMvZjJmcy5oCj4+PiBAQCAtMTQwNCw2 ICsxNDA0LDggQEAgc3RydWN0IGYyZnNfZGV2X2luZm8gewo+Pj4gICAgICAgIHVuc2lnbmVkIGlu dCB0b3RhbF9zZWdtZW50czsKPj4+ICAgICAgICBibG9ja190IHN0YXJ0X2JsazsKPj4+ICAgICAg ICBibG9ja190IGVuZF9ibGs7Cj4+PiArICAgICBib29sIGhhc19hbGlhczsKPj4+ICsgICAgIGJv b2wgaXNfcmVzZXJ2aW5nOwo+Pj4gICAgI2lmZGVmIENPTkZJR19CTEtfREVWX1pPTkVECj4+PiAg ICAgICAgdW5zaWduZWQgaW50IG5yX2Jsa3o7ICAgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2Yg em9uZXMgKi8KPj4+ICAgICAgICB1bnNpZ25lZCBsb25nICpibGt6X3NlcTsgICAgICAgIC8qIEJp dG1hcCBpbmRpY2F0aW5nIHNlcXVlbnRpYWwgem9uZXMgKi8KPj4+IEBAIC0xODU3LDYgKzE4NTks NyBAQCBzdHJ1Y3QgZjJmc19zYl9pbmZvIHsKPj4+ICAgICAgICBibG9ja190IGxhc3RfdmFsaWRf YmxvY2tfY291bnQ7ICAgICAgICAgLyogZm9yIHJlY292ZXJ5ICovCj4+PiAgICAgICAgYmxvY2tf dCByZXNlcnZlZF9ibG9ja3M7ICAgICAgICAgICAgICAgIC8qIGNvbmZpZ3VyYWJsZSByZXNlcnZl ZCBibG9ja3MgKi8KPj4+ICAgICAgICBibG9ja190IGN1cnJlbnRfcmVzZXJ2ZWRfYmxvY2tzOyAg ICAgICAgLyogY3VycmVudCByZXNlcnZlZCBibG9ja3MgKi8KPj4+ICsgICAgIGJsb2NrX3QgYWxp YXNfcmVzZXJ2ZWRfYmxvY2tzOyAgICAgICAgICAvKiByZXNlcnZlZCBibG9ja3MgZm9yIGRldmlj ZSBhbGlhcyAqLwo+Pj4KPj4+ICAgICAgICAvKiBBZGRpdGlvbmFsIHRyYWNraW5nIGZvciBubyBj aGVja3BvaW50IG1vZGUgKi8KPj4+ICAgICAgICBibG9ja190IHVudXNhYmxlX2Jsb2NrX2NvdW50 OyAgICAgICAgICAgLyogIyBvZiBibG9ja3Mgc2F2ZWQgYnkgbGFzdCBjcCAqLwo+Pj4gQEAgLTI1 NTksNyArMjU2Miw4IEBAIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldF9hdmFpbGFibGVf YmxvY2tfY291bnQoc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLAo+Pj4gICAgICAgIGJsb2NrX3Qg YXZhaWxfdXNlcl9ibG9ja19jb3VudDsKPj4+Cj4+PiAgICAgICAgYXZhaWxfdXNlcl9ibG9ja19j b3VudCA9IHNiaS0+dXNlcl9ibG9ja19jb3VudCAtCj4+PiAtICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHNiaS0+Y3VycmVudF9yZXNlcnZlZF9ibG9ja3M7Cj4+PiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiaS0+Y3VycmVudF9yZXNlcnZlZF9ibG9j a3MgLQo+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYmktPmFsaWFz X3Jlc2VydmVkX2Jsb2NrczsKPj4+Cj4+PiAgICAgICAgaWYgKHRlc3Rfb3B0KHNiaSwgUkVTRVJW RV9ST09UKSAmJiAhX19hbGxvd19yZXNlcnZlZF9yb290KHNiaSwgaW5vZGUsIGNhcCkpCj4+PiAg ICAgICAgICAgICAgICBhdmFpbF91c2VyX2Jsb2NrX2NvdW50IC09IEYyRlNfT1BUSU9OKHNiaSku cm9vdF9yZXNlcnZlZF9ibG9ja3M7Cj4+PiBAQCAtMjU3Niw3ICsyNTgwLDggQEAgc3RhdGljIGlu bGluZSB1bnNpZ25lZCBpbnQgZ2V0X2F2YWlsYWJsZV9ibG9ja19jb3VudChzdHJ1Y3QgZjJmc19z Yl9pbmZvICpzYmksCj4+Pgo+Pj4gICAgc3RhdGljIGlubGluZSB2b2lkIGYyZnNfaV9ibG9ja3Nf d3JpdGUoc3RydWN0IGlub2RlICosIGJsb2NrX3QsIGJvb2wsIGJvb2wpOwo+Pj4gICAgc3RhdGlj IGlubGluZSBpbnQgaW5jX3ZhbGlkX2Jsb2NrX2NvdW50KHN0cnVjdCBmMmZzX3NiX2luZm8gKnNi aSwKPj4+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2Rl LCBibGtjbnRfdCAqY291bnQsIGJvb2wgcGFydGlhbCkKPj4+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBibGtjbnRfdCAqY291bnQsCj4+PiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwYXJ0aWFsLCBib29sIGFsaWFzX3Jlc2Vy dmVkKQo+Pj4gICAgewo+Pj4gICAgICAgIGxvbmcgbG9uZyBkaWZmID0gMCwgcmVsZWFzZSA9IDA7 Cj4+PiAgICAgICAgYmxvY2tfdCBhdmFpbF91c2VyX2Jsb2NrX2NvdW50Owo+Pj4gQEAgLTI1OTks MTAgKzI2MDQsMTYgQEAgc3RhdGljIGlubGluZSBpbnQgaW5jX3ZhbGlkX2Jsb2NrX2NvdW50KHN0 cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwKPj4+Cj4+PiAgICAgICAgc3Bpbl9sb2NrKCZzYmktPnN0 YXRfbG9jayk7Cj4+Pgo+Pj4gKyAgICAgaWYgKGFsaWFzX3Jlc2VydmVkKQo+Pj4gKyAgICAgICAg ICAgICBzYmktPmFsaWFzX3Jlc2VydmVkX2Jsb2NrcyAtPSAqY291bnQ7Cj4+PiArCj4+PiAgICAg ICAgYXZhaWxfdXNlcl9ibG9ja19jb3VudCA9IGdldF9hdmFpbGFibGVfYmxvY2tfY291bnQoc2Jp LCBpbm9kZSwgdHJ1ZSk7Cj4+PiAgICAgICAgZGlmZiA9IChsb25nIGxvbmcpc2JpLT50b3RhbF92 YWxpZF9ibG9ja19jb3VudCArICpjb3VudCAtCj4+PiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGF2YWlsX3VzZXJfYmxvY2tfY291bnQ7Cj4+PiAgICAgICAg aWYgKHVubGlrZWx5KGRpZmYgPiAwKSkgewo+Pj4gKyAgICAgICAgICAgICBpZiAoYWxpYXNfcmVz ZXJ2ZWQpCj4+PiArICAgICAgICAgICAgICAgICAgICAgc2JpLT5hbGlhc19yZXNlcnZlZF9ibG9j a3MgKz0gKmNvdW50Owo+Pj4gKwo+Pj4gICAgICAgICAgICAgICAgaWYgKCFwYXJ0aWFsKSB7Cj4+ PiAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrKCZzYmktPnN0YXRfbG9jayk7Cj4+ PiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2UgPSAqY291bnQ7Cj4+PiBAQCAtNDAxMCw2 ICs0MDIxLDggQEAgaW50IGYyZnNfZmx1c2hfZGV2aWNlX2NhY2hlKHN0cnVjdCBmMmZzX3NiX2lu Zm8gKnNiaSk7Cj4+PiAgICB2b2lkIGYyZnNfZGVzdHJveV9mbHVzaF9jbWRfY29udHJvbChzdHJ1 Y3QgZjJmc19zYl9pbmZvICpzYmksIGJvb2wgZnJlZSk7Cj4+PiAgICB2b2lkIGYyZnNfaW52YWxp ZGF0ZV9ibG9ja3Moc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLCBibG9ja190IGFkZHIsCj4+PiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGlu dCBsZW4pOwo+Pj4gK3ZvaWQgZjJmc19yZXNlcnZlX2RldmljZV9hbGlhcyhzdHJ1Y3QgZjJmc19z Yl9pbmZvICpzYmksIGJsb2NrX3QgYWRkciwKPj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGVuKTsKPj4+ICAgIGJvb2wgZjJmc19p c19jaGVja3BvaW50ZWRfZGF0YShzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksIGJsb2NrX3QgYmxr YWRkcik7Cj4+PiAgICBpbnQgZjJmc19zdGFydF9kaXNjYXJkX3RocmVhZChzdHJ1Y3QgZjJmc19z Yl9pbmZvICpzYmkpOwo+Pj4gICAgdm9pZCBmMmZzX2Ryb3BfZGlzY2FyZF9jbWQoc3RydWN0IGYy ZnNfc2JfaW5mbyAqc2JpKTsKPj4+IEBAIC00MjMxLDYgKzQyNDQsOCBAQCB2b2lkIGYyZnNfYnVp bGRfZ2NfbWFuYWdlcihzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmkpOwo+Pj4gICAgaW50IGYyZnNf Z2NfcmFuZ2Uoc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLAo+Pj4gICAgICAgICAgICAgICAgdW5z aWduZWQgaW50IHN0YXJ0X3NlZywgdW5zaWduZWQgaW50IGVuZF9zZWcsCj4+PiAgICAgICAgICAg ICAgICBib29sIGRyeV9ydW4sIHVuc2lnbmVkIGludCBkcnlfcnVuX3NlY3Rpb25zKTsKPj4+ICt2 b2lkIGYyZnNfcmVzZXRfZ2NfdmljdGltX3Jlc291cmNlKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNi aSwKPj4+ICsgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN0YXJ0LCB1bnNpZ25lZCBpbnQgZW5k KTsKPj4+ICAgIGludCBmMmZzX3Jlc2l6ZV9mcyhzdHJ1Y3QgZmlsZSAqZmlscCwgX191NjQgYmxv Y2tfY291bnQpOwo+Pj4gICAgaW50IF9faW5pdCBmMmZzX2NyZWF0ZV9nYXJiYWdlX2NvbGxlY3Rp b25fY2FjaGUodm9pZCk7Cj4+PiAgICB2b2lkIGYyZnNfZGVzdHJveV9nYXJiYWdlX2NvbGxlY3Rp b25fY2FjaGUodm9pZCk7Cj4+PiBkaWZmIC0tZ2l0IGEvZnMvZjJmcy9maWxlLmMgYi9mcy9mMmZz L2ZpbGUuYwo+Pj4gaW5kZXggNGI1MmM1NmQ3MWYwLi44MzVmMTBiYzU5YjUgMTAwNjQ0Cj4+PiAt LS0gYS9mcy9mMmZzL2ZpbGUuYwo+Pj4gKysrIGIvZnMvZjJmcy9maWxlLmMKPj4+IEBAIC04MTMs MTMgKzgxMywxOSBAQCBpbnQgZjJmc19kb190cnVuY2F0ZV9ibG9ja3Moc3RydWN0IGlub2RlICpp bm9kZSwgdTY0IGZyb20sIGJvb2wgbG9jaykKPj4+Cj4+PiAgICAgICAgaWYgKElTX0RFVklDRV9B TElBU0lORyhpbm9kZSkpIHsKPj4+ICAgICAgICAgICAgICAgIHN0cnVjdCBleHRlbnRfdHJlZSAq ZXQgPSBGMkZTX0koaW5vZGUpLT5leHRlbnRfdHJlZVtFWF9SRUFEXTsKPj4+IC0gICAgICAgICAg ICAgc3RydWN0IGV4dGVudF9pbmZvIGVpID0gZXQtPmxhcmdlc3Q7Cj4+PiArICAgICAgICAgICAg IHN0cnVjdCBleHRlbnRfaW5mbyBlaTsKPj4+ICsKPj4+ICsgICAgICAgICAgICAgcmVhZF9sb2Nr KCZldC0+bG9jayk7Cj4+PiArICAgICAgICAgICAgIGVpID0gZXQtPmxhcmdlc3Q7Cj4+PiArICAg ICAgICAgICAgIHJlYWRfdW5sb2NrKCZldC0+bG9jayk7Cj4+Pgo+Pj4gICAgICAgICAgICAgICAg ZjJmc19pbnZhbGlkYXRlX2Jsb2NrcyhzYmksIGVpLmJsaywgZWkubGVuKTsKPj4+Cj4+PiAgICAg ICAgICAgICAgICBkZWNfdmFsaWRfYmxvY2tfY291bnQoc2JpLCBpbm9kZSwgZWkubGVuKTsKPj4+ ICAgICAgICAgICAgICAgIGYyZnNfdXBkYXRlX3RpbWUoc2JpLCBSRVFfVElNRSk7Cj4+Pgo+Pj4g KyAgICAgICAgICAgICBmMmZzX2Ryb3BfZXh0ZW50X3RyZWUoaW5vZGUpOwo+Pj4gKwo+Pj4gICAg ICAgICAgICAgICAgZjJmc19mb2xpb19wdXQoaWZvbGlvLCB0cnVlKTsKPj4+ICAgICAgICAgICAg ICAgIGdvdG8gb3V0Owo+Pj4gICAgICAgIH0KPj4+IEBAIC0xMTAwLDggKzExMDYsOSBAQCBpbnQg ZjJmc19zZXRhdHRyKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgZGVudHJ5ICpkZW50 cnksCj4+PiAgICAgICAgaWYgKChhdHRyLT5pYV92YWxpZCAmIEFUVFJfU0laRSkpIHsKPj4+ICAg ICAgICAgICAgICAgIGlmIChtYXBwaW5nX2xhcmdlX2ZvbGlvX3N1cHBvcnQoaW5vZGUtPmlfbWFw cGluZykpCj4+PiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKPj4+ IC0gICAgICAgICAgICAgaWYgKCFmMmZzX2lzX2NvbXByZXNzX2JhY2tlbmRfcmVhZHkoaW5vZGUp IHx8Cj4+PiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU19ERVZJQ0VfQUxJQVNJTkco aW5vZGUpKQo+Pj4gKyAgICAgICAgICAgICBpZiAoSVNfREVWSUNFX0FMSUFTSU5HKGlub2RlKSkK Pj4+ICsgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVQRVJNOwo+Pj4gKyAgICAgICAgICAg ICBpZiAoIWYyZnNfaXNfY29tcHJlc3NfYmFja2VuZF9yZWFkeShpbm9kZSkpCj4+PiAgICAgICAg ICAgICAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKPj4+ICAgICAgICAgICAgICAgIGlm IChpc19pbm9kZV9mbGFnX3NldChpbm9kZSwgRklfQ09NUFJFU1NfUkVMRUFTRUQpICYmCj4+PiAg ICAgICAgICAgICAgICAgICAgICAgICFJU19BTElHTkVEKGF0dHItPmlhX3NpemUsCj4+PiBAQCAt MjEzMCw2ICsyMTM3LDkgQEAgc3RhdGljIGludCBmMmZzX3NldGZsYWdzX2NvbW1vbihzdHJ1Y3Qg aW5vZGUgKmlub2RlLCB1MzIgaWZsYWdzLCB1MzIgbWFzaykKPj4+ICAgICAgICBpZiAoSVNfTk9R VU9UQShpbm9kZSkpCj4+PiAgICAgICAgICAgICAgICByZXR1cm4gLUVQRVJNOwo+Pj4KPj4+ICsg ICAgIGlmIChJU19ERVZJQ0VfQUxJQVNJTkcoaW5vZGUpKQo+Pj4gKyAgICAgICAgICAgICByZXR1 cm4gLUVQRVJNOwo+Pj4gKwo+Pj4gICAgICAgIGlmICgoaWZsYWdzIF4gbWFza2VkX2ZsYWdzKSAm IEYyRlNfQ0FTRUZPTERfRkwpIHsKPj4+ICAgICAgICAgICAgICAgIGlmICghZjJmc19zYl9oYXNf Y2FzZWZvbGQoRjJGU19JX1NCKGlub2RlKSkpCj4+PiAgICAgICAgICAgICAgICAgICAgICAgIHJl dHVybiAtRU9QTk9UU1VQUDsKPj4+IEBAIC0yNjc4LDYgKzI2ODgsMTcgQEAgc3RhdGljIGludCBm MmZzX2lvY19nZXRfZW5jcnlwdGlvbl9wb2xpY3koc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVk IGxvbmcgYXJnKQo+Pj4gICAgICAgIHJldHVybiBmc2NyeXB0X2lvY3RsX2dldF9wb2xpY3koZmls cCwgKHZvaWQgX191c2VyICopYXJnKTsKPj4+ICAgIH0KPj4+Cj4+PiArc3RhdGljIGludCBmMmZz X2lvY19nZXRfZGV2X2FsaWFzX3N0YXR1cyhzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgbG9u ZyBhcmcpCj4+PiArewo+Pj4gKyAgICAgc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUo ZmlscCk7Cj4+PiArCj4+PiArICAgICBpZiAoIUlTX0RFVklDRV9BTElBU0lORyhpbm9kZSkpCj4+ PiArICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+Pj4gKwo+Pj4gKyAgICAgcmV0dXJuIHB1 dF91c2VyKEYyRlNfSEFTX0JMT0NLUyhpbm9kZSkgPyBGMkZTX0RFVl9BTElBU19TVEFUVVNfUkVT RVJWRUQgOgo+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRjJGU19ERVZfQUxJQVNf U1RBVFVTX1JFTEVBU0VELCAodTMyIF9fdXNlciAqKWFyZyk7Cj4+PiArfQo+Pj4gKwo+Pj4gICAg c3RhdGljIGludCBmMmZzX2lvY19nZXRfZW5jcnlwdGlvbl9wd3NhbHQoc3RydWN0IGZpbGUgKmZp bHAsIHVuc2lnbmVkIGxvbmcgYXJnKQo+Pj4gICAgewo+Pj4gICAgICAgIHN0cnVjdCBpbm9kZSAq aW5vZGUgPSBmaWxlX2lub2RlKGZpbHApOwo+Pj4gQEAgLTM2MTYsNiArMzYzNywyNDEgQEAgc3Rh dGljIGludCBmMmZzX2lvY19nZXRfZGV2X2FsaWFzX2ZpbGUoc3RydWN0IGZpbGUgKmZpbHAsIHVu c2lnbmVkIGxvbmcgYXJnKQo+Pj4gICAgICAgICAgICAgICAgICAgICAgICAodTMyIF9fdXNlciAq KWFyZyk7Cj4+PiAgICB9Cj4+Pgo+Pj4gK3N0YXRpYyBib29sIGYyZnNfZ2V0X2Rldl9hbGlhc19l eHRlbnQoc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLAo+Pj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSwKPj4+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXh0ZW50X2luZm8gKmVpKQo+Pj4gK3sKPj4+ ICsgICAgIGludCBpOwo+Pj4gKwo+Pj4gKyAgICAgZm9yIChpID0gMTsgaSA8IHNiaS0+c19uZGV2 czsgaSsrKSB7Cj4+PiArICAgICAgICAgICAgIGNoYXIgKm5hbWUgPSBzdHJyY2hyKEZERVYoaSku cGF0aCwgJy8nKTsKPj4+ICsKPj4+ICsgICAgICAgICAgICAgbmFtZSA9IG5hbWUgPyBuYW1lICsg MSA6IEZERVYoaSkucGF0aDsKPj4+ICsgICAgICAgICAgICAgaWYgKHN0cmNtcChuYW1lLCBkZW50 cnktPmRfbmFtZS5uYW1lKSkKPj4+ICsgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKPj4+ ICsKPj4+ICsgICAgICAgICAgICAgZWktPmJsayA9IEZERVYoaSkuc3RhcnRfYmxrOwo+Pj4gKyAg ICAgICAgICAgICBlaS0+bGVuID0gRkRFVihpKS50b3RhbF9zZWdtZW50cyA8PCBzYmktPmxvZ19i bG9ja3NfcGVyX3NlZzsKPj4+ICsgICAgICAgICAgICAgZWktPmZvZnMgPSAwOwo+Pj4gKyAgICAg ICAgICAgICByZXR1cm4gdHJ1ZTsKPj4+ICsgICAgIH0KPj4+ICsgICAgIHJldHVybiBmYWxzZTsK Pj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIGludCBmMmZzX2lvY19yZXNlcnZlX2Rldl9hbGlhcyhz dHJ1Y3QgZmlsZSAqZmlscCkKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0g ZmlsZV9pbm9kZShmaWxwKTsKPj4+ICsgICAgIHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSA9IEYy RlNfSV9TQihpbm9kZSk7Cj4+PiArICAgICBzdHJ1Y3QgZXh0ZW50X3RyZWUgKmV0ID0gRjJGU19J KGlub2RlKS0+ZXh0ZW50X3RyZWVbRVhfUkVBRF07Cj4+PiArICAgICBzdHJ1Y3QgZXh0ZW50X2lu Zm8gZWk7Cj4+PiArICAgICBzdHJ1Y3QgY3BfY29udHJvbCBjcGMgPSB7IENQX1NZTkMsIDAsIDAs IDAgfTsKPj4+ICsgICAgIHN0cnVjdCBmMmZzX2xvY2tfY29udGV4dCBsYywgZ2xjOwo+Pj4gKyAg ICAgYmxrY250X3QgY291bnQ7Cj4+PiArICAgICB1bnNpZ25lZCBpbnQgc3RhcnQsIGVuZDsKPj4+ ICsgICAgIGludCB0eXBlLCBlcnI7Cj4+PiArCj4+PiArICAgICBpZiAoIWNhcGFibGUoQ0FQX1NZ U19BRE1JTikpCj4+PiArICAgICAgICAgICAgIHJldHVybiAtRVBFUk07Cj4+PiArCj4+PiArICAg ICBpZiAodW5saWtlbHkoaXNfc2JpX2ZsYWdfc2V0KHNiaSwgU0JJX0NQX0RJU0FCTEVEKSkpCj4+ PiArICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+Pj4gKwo+Pj4gKyAgICAgZXJyID0gbW50 X3dhbnRfd3JpdGVfZmlsZShmaWxwKTsKPj4+ICsgICAgIGlmIChlcnIpCj4+PiArICAgICAgICAg ICAgIHJldHVybiBlcnI7Cj4+PiArCj4+PiArICAgICBpbm9kZV9sb2NrKGlub2RlKTsKPj4+ICsK Pj4+ICsgICAgIGlmICghSVNfREVWSUNFX0FMSUFTSU5HKGlub2RlKSkgewo+Pj4gKyAgICAgICAg ICAgICBlcnIgPSAtRUlOVkFMOwo+Pj4gKyAgICAgICAgICAgICBnb3RvIG91dF9pbm9kZV91bmxv Y2s7Cj4+PiArICAgICB9Cj4+PiArCj4+PiArICAgICBpZiAoRjJGU19IQVNfQkxPQ0tTKGlub2Rl KSkgewo+Pj4gKyAgICAgICAgICAgICBlcnIgPSAwOwo+Pj4gKyAgICAgICAgICAgICBnb3RvIG91 dF9pbm9kZV91bmxvY2s7Cj4+PiArICAgICB9Cj4+PiArCj4+PiArICAgICBpZiAoIWYyZnNfZ2V0 X2Rldl9hbGlhc19leHRlbnQoc2JpLCBmaWxwLT5mX3BhdGguZGVudHJ5LCAmZWkpKSB7Cj4+PiAr ICAgICAgICAgICAgIGYyZnNfd2FybihzYmksICJkZXZpY2UgYWxpYXMgZmlsZSAoJXMsIGlubz0l bGx1KSBoYXMgbm8gbWF0Y2hpbmcgZGV2aWNlIiwKPj4+ICsgICAgICAgICAgICAgICAgICAgICAg IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lLAo+Pj4gKyAgICAgICAgICAgICAgICAg ICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylpbm9kZS0+aV9pbm8pOwo+Pj4gKyAgICAgICAgICAg ICBzZXRfc2JpX2ZsYWcoc2JpLCBTQklfTkVFRF9GU0NLKTsKPj4+ICsgICAgICAgICAgICAgZjJm c19oYW5kbGVfZXJyb3Ioc2JpLCBFUlJPUl9DT1JSVVBURURfSU5PREUpOwo+Pj4gKyAgICAgICAg ICAgICBlcnIgPSAtRUZTQ09SUlVQVEVEOwo+Pj4gKyAgICAgICAgICAgICBnb3RvIG91dF9pbm9k ZV91bmxvY2s7Cj4+PiArICAgICB9Cj4+PiArCj4+PiArICAgICBzcGluX2xvY2soJnNiaS0+c3Rh dF9sb2NrKTsKPj4+ICsgICAgIGlmIChzYmktPnRvdGFsX3ZhbGlkX2Jsb2NrX2NvdW50ICsgZWku bGVuID4KPj4+ICsgICAgICAgICAgICAgICAgICAgICBnZXRfYXZhaWxhYmxlX2Jsb2NrX2NvdW50 KHNiaSwgaW5vZGUsIHRydWUpKSB7Cj4+PiArICAgICAgICAgICAgIHNwaW5fdW5sb2NrKCZzYmkt PnN0YXRfbG9jayk7Cj4+PiArICAgICAgICAgICAgIGVyciA9IC1FTk9TUEM7Cj4+PiArICAgICAg ICAgICAgIGdvdG8gb3V0X2lub2RlX3VubG9jazsKPj4+ICsgICAgIH0KPj4+ICsgICAgIHNiaS0+ YWxpYXNfcmVzZXJ2ZWRfYmxvY2tzICs9IGVpLmxlbjsKPj4+ICsgICAgIHNwaW5fdW5sb2NrKCZz YmktPnN0YXRfbG9jayk7Cj4+PiArCj4+PiArICAgICBzcGluX2xvY2soJkZSRUVfSShzYmkpLT5z ZWdtYXBfbG9jayk7Cj4+PiArICAgICBGREVWKGYyZnNfdGFyZ2V0X2RldmljZV9pbmRleChzYmks IGVpLmJsaykpLmlzX3Jlc2VydmluZyA9IHRydWU7Cj4+PiArICAgICBzcGluX3VubG9jaygmRlJF RV9JKHNiaSktPnNlZ21hcF9sb2NrKTsKPj4+ICsKPj4+ICsgICAgIHN0YXJ0ID0gR0VUX1NFR05P KHNiaSwgZWkuYmxrKTsKPj4+ICsgICAgIGVuZCA9IEdFVF9TRUdOTyhzYmksIGVpLmJsayArIGVp LmxlbiAtIDEpOwo+Pj4gKwo+Pj4gKyAgICAgLyogQWNxdWlyZSBnY19sb2NrIGZvciB2aWN0aW0g cmVzZXQsIGN1cnNlZyByZXNpemUsIGFuZCByYW5nZSBHQyAqLwo+Pj4gKyAgICAgZjJmc19kb3du X3dyaXRlX3RyYWNlKCZzYmktPmdjX2xvY2ssICZnbGMpOwo+Pj4gKwo+Pj4gKyAgICAgLyogUmVz ZXQgdGhlIHZpY3RpbSBpbmZvcm1hdGlvbiB0byBwcmV2ZW50IEdDIGZyb20gdGFyZ2V0aW5nIHRo ZSByYW5nZSAqLwo+Pj4gKyAgICAgZjJmc19yZXNldF9nY192aWN0aW1fcmVzb3VyY2Uoc2JpLCBz dGFydCwgZW5kKTsKPj4+ICsKPj4+ICsgICAgIC8qIE1vdmUgb3V0IGN1cnNlZ3MgZnJvbSB0aGUg dGFyZ2V0IHJhbmdlICovCj4+PiArICAgICBmb3IgKHR5cGUgPSBDVVJTRUdfSE9UX0RBVEE7IHR5 cGUgPCBOUl9DVVJTRUdfUEVSU0lTVF9UWVBFOyB0eXBlKyspIHsKPj4+ICsgICAgICAgICAgICAg ZXJyID0gZjJmc19hbGxvY2F0ZV9zZWdtZW50X2Zvcl9yZXNpemUoc2JpLCB0eXBlLCBzdGFydCwg ZW5kKTsKPj4+ICsgICAgICAgICAgICAgaWYgKGVycikKPj4+ICsgICAgICAgICAgICAgICAgICAg ICBnb3RvIG91dF9nY191bmxvY2s7Cj4+PiArICAgICB9Cj4+PiArCj4+PiArICAgICBmMmZzX2xv Y2tfb3Aoc2JpLCAmbGMpOwo+Pj4gKwo+Pj4gKyAgICAgaWYgKHVubGlrZWx5KGlzX3NiaV9mbGFn X3NldChzYmksIFNCSV9DUF9ESVNBQkxFRCkpKSB7Cj4+PiArICAgICAgICAgICAgIGVyciA9IC1F SU5WQUw7Cj4+PiArICAgICAgICAgICAgIGYyZnNfdW5sb2NrX29wKHNiaSwgJmxjKTsKPj4+ICsg ICAgICAgICAgICAgZ290byBvdXRfZ2NfdW5sb2NrOwo+Pj4gKyAgICAgfQo+Pj4gKwo+Pj4gKyAg ICAgLyogZG8gR0MgdG8gbW92ZSBvdXQgdmFsaWQgYmxvY2tzIGluIHRoZSByYW5nZSBhbGwgYXQg b25jZSEgKi8KPj4+ICsgICAgIGVyciA9IGYyZnNfZ2NfcmFuZ2Uoc2JpLCBzdGFydCwgZW5kLCBm YWxzZSwgMCk7Cj4+PiArICAgICBpZiAoZXJyKSB7Cj4+PiArICAgICAgICAgICAgIGYyZnNfdW5s b2NrX29wKHNiaSwgJmxjKTsKPj4+ICsgICAgICAgICAgICAgZ290byBvdXRfZ2NfdW5sb2NrOwo+ Pj4gKyAgICAgfQo+Pj4gKwo+Pj4gKyAgICAgY291bnQgPSBlaS5sZW47Cj4+PiArICAgICBlcnIg PSBpbmNfdmFsaWRfYmxvY2tfY291bnQoc2JpLCBpbm9kZSwgJmNvdW50LCBmYWxzZSwgdHJ1ZSk7 Cj4+PiArICAgICBpZiAoZXJyKSB7Cj4+PiArICAgICAgICAgICAgIGYyZnNfdW5sb2NrX29wKHNi aSwgJmxjKTsKPj4+ICsgICAgICAgICAgICAgZ290byBvdXRfZ2NfdW5sb2NrOwo+Pj4gKyAgICAg fQo+Pj4gKwo+Pj4gKyAgICAgd3JpdGVfbG9jaygmZXQtPmxvY2spOwo+Pj4gKyAgICAgZXQtPmxh cmdlc3QgPSBlaTsKPj4+ICsgICAgIHdyaXRlX3VubG9jaygmZXQtPmxvY2spOwo+Pj4gKyAgICAg Y2xlYXJfaW5vZGVfZmxhZyhpbm9kZSwgRklfTk9fRVhURU5UKTsKPj4+ICsKPj4+ICsgICAgIGYy ZnNfcmVzZXJ2ZV9kZXZpY2VfYWxpYXMoc2JpLCBlaS5ibGssIGVpLmxlbik7Cj4+PiArCj4+PiAr ICAgICBpX3NpemVfd3JpdGUoaW5vZGUsIChsb2ZmX3QpZWkubGVuIDw8IHNiaS0+bG9nX2Jsb2Nr c2l6ZSk7Cj4+PiArICAgICBmMmZzX3VwZGF0ZV9pbm9kZV9wYWdlKGlub2RlKTsKPj4+ICsKPj4+ ICsgICAgIHNwaW5fbG9jaygmRlJFRV9JKHNiaSktPnNlZ21hcF9sb2NrKTsKPj4+ICsgICAgIEZE RVYoZjJmc190YXJnZXRfZGV2aWNlX2luZGV4KHNiaSwgZWkuYmxrKSkuaXNfcmVzZXJ2aW5nID0g ZmFsc2U7Cj4+PiArICAgICBzcGluX3VubG9jaygmRlJFRV9JKHNiaSktPnNlZ21hcF9sb2NrKTsK Pj4+ICsKPj4+ICsgICAgIGYyZnNfdW5sb2NrX29wKHNiaSwgJmxjKTsKPj4+ICsgICAgIGYyZnNf dXBfd3JpdGVfdHJhY2UoJnNiaS0+Z2NfbG9jaywgJmdsYyk7Cj4+Cj4+IERvIHdlIG5lZWQgdG8g Y2FsbCBmMmZzX3dyaXRlX2NoZWNrcG9pbnQoc2JpLCAmY3BjKSBoZXJlIHRvIG1ha2Ugc3VyZSBw ZXJzaXN0Cj4+IGRldmljZSBhbGlhcyBmaWxlIGZpcnN0PyB0byBhdm9pZCBmb2xsb3dpbmcgZjJm c19pb2NfcmVsZWFzZV9kZXZfYWxpYXMoKSByYWNpbgo+PiAgICB3LyBmMmZzX2lvY19yZXNlcnZl X2Rldl9hbGlhcygpPwo+Pgo+PiAtIGYyZnNfaW9jX3Jlc2VydmVfZGV2X2FsaWFzICAgICAgICAg ICAgLSBmMmZzX2lvY19yZWxlYXNlX2Rldl9hbGlhcwo+PiAuLi4KPj4gICAgLSBmMmZzX3VubG9j a19vcAo+PiAgICAtIGYyZnNfdXBfd3JpdGVfdHJhY2UoZ2NfbG9jaykKPj4gICAgLSBpbm9kZV91 bmxvY2sKPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBpbm9k ZV9sb2NrCj4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgo+ PiAgICAtIGYyZnNfd3JpdGVfY2hlY2twb2ludAo+IAo+IEhpIENoYW8sCj4gCj4gSSBjb3VsZG4n dCBnZXQgeW91ciBwb2ludC4gQ291bGQgeW91IGVsYWJvcmF0ZSBtb3JlLCBpZiBJIG1pc3NlZCBp dD8KCkhpIERhZWhvLAoKQWN0dWFsbHksIHdoYXQgSSBtZWFuIGlzIGlmIGYyZnNfd3JpdGVfY2hl Y2twb2ludCgpIGlzIG5vdCBjb3ZlcmVkIGJ5Cmlub2RlIGxvY2ssIGluIHJhY2UgY29uZGl0aW9u IHRoZXJlIHdpbGwgYmUgYmVsb3cgaW52b2tpbmcgc2VyaWFsOgoKQXNzdW1lOgpmMmZzX2lvY19y ZXNlcnZlX2Rldl9hbGlhcyA6PSByZXNlcnZlX2Rldl9hbGlhcyArIGYyZnNfd3JpdGVfY2hlY2tw b2ludApmMmZzX2lvY19yZWxlYXNlX2Rldl9hbGlhcyA6PSByZWxlYXNlX2Rldl9hbGlhcyArIGYy ZnNfd3JpdGVfY2hlY2twb2ludAoKMSkgVGhyZWFkIEE6IHJlc2VydmVfZGV2X2FsaWFzCjIpIFRo cmVhZCBCOiByZWxlYXNlX2Rldl9hbGlhcwozKSBUaHJlYWQgQzogcmVzZXJ2ZV9kZXZfYWxpYXMK NCkgVGhyZWFkIEI6IGYyZnNfd3JpdGVfY2hlY2twb2ludAo1KSBUaHJlYWQgQTogZjJmc193cml0 ZV9jaGVja3BvaW50CjYpIFRocmVhZCBDOiBmMmZzX3dyaXRlX2NoZWNrcG9pbnQKCkFmdGVyIDEp IGFsbCBkYXRhIGFmdGVyIHJlc2VydmVfZGV2X2FsaWFzKCkgYXJlIG5vdCBjaGVja3BvaW50ZWQs IHRoZW4gdGhlCmZvbGxvd2luZyByZWxlYXNlX2Rldl9hbGlhcyBpbiAyKSB3b24ndCBlbmNvdW50 ZXIgYW55IGlzc3VlLCByaWdodD8gYW5kIHRoZQpzYW1lIHF1ZXRpb25zIGZvciAzKS4KCklPVywg cmVzZXJ2ZV9kZXZfYWxpYXMvcmVsZWFzZV9kZXZfYWxpYXMgZG9lc24ndCBuZWVkIHRvIHJlbHkg b24gY2hlY2twb2ludGVkCnN0YXRlIG9mIGVhY2ggb3RoZXIsIGFtIEkgdW5kZXJzdGFuZCBpdCBj b3JyZWN0bHk/IGlmIHNvIHRoZXJlIHdvbid0IGJlIGFueQppc3N1ZS4KCj4gCj4gMS4gSW4tbWVt b3J5IHN0YXRlIGlzIGFscmVhZHkgYXRvbWljIChObyBSYWNlKToKPiAgICAgIEJlZm9yZSBpbm9k ZV91bmxvY2soKSwgYWxsIGluLW1lbW9yeSBtZXRhZGF0YSAoZXh0ZW50X3RyZWUsIFNJVAo+IHNl Z21lbnQgYml0bWFwcywgaV9zaXplLCBhbmQgZGlydHkgaW5vZGUgcGFnZSkgYXJlIGZ1bGx5IHVw ZGF0ZWQgdW5kZXIKPiBpbm9kZV9sb2NrICsgZjJmc19sb2NrX29wLiBBIHN1YnNlcXVlbnQgZjJm c19pb2NfcmVsZWFzZV9kZXZfYWxpYXMoKQo+IHdpbGwgb2JzZXJ2ZSBhIGNvbXBsZXRlLCBjb25z aXN0ZW50IHN0YXRlLgo+IAo+IDIuIE9uLWRpc2sgY29uc2lzdGVuY3kgJiBjcmFzaCBzYWZldHk6 Cj4gICAgICBDaGVja3BvaW50cyBhcmUgc2VyaWFsaXplZCBpbnRlcm5hbGx5IHZpYSBjcF9tdXRl eCAvCj4gZjJmc19sb2NrX2FsbCgpLiBSZWdhcmRsZXNzIG9mIHRoZSBjaGVja3BvaW50IGV4ZWN1 dGlvbiB0aW1pbmcgb3IgYW55Cj4gc3VkZGVuIHBvd2VyLW9mZiAoU1BPKSBiZXR3ZWVuIHRoZSB0 d28gaW9jdGxzLCB0aGUgZmlsZXN5c3RlbSBhbHdheXMKPiByZWNvdmVycyB0byB0aGUgbGFzdCBj b21taXR0ZWQgYXRvbWljIGNoZWNrcG9pbnQgd2l0aG91dCBtZXRhZGF0YQo+IGNvcnJ1cHRpb24u CgpUaGFua3MgZm9yIHRoZSBleHBsYW5hdGlvbi4KClRoYW5rcywKCj4gCj4gVGhhbmtzLAo+IAo+ Pgo+Pj4gKwo+Pj4gKyAgICAgaW5vZGVfdW5sb2NrKGlub2RlKTsKPj4+ICsgICAgIG1udF9kcm9w X3dyaXRlX2ZpbGUoZmlscCk7Cj4+PiArCj4+PiArICAgICByZXR1cm4gZjJmc193cml0ZV9jaGVj a3BvaW50KHNiaSwgJmNwYyk7Cj4+PiArCj4+PiArb3V0X2djX3VubG9jazoKPj4+ICsgICAgIHNw aW5fbG9jaygmc2JpLT5zdGF0X2xvY2spOwo+Pj4gKyAgICAgc2JpLT5hbGlhc19yZXNlcnZlZF9i bG9ja3MgLT0gZWkubGVuOwo+Pj4gKyAgICAgc3Bpbl91bmxvY2soJnNiaS0+c3RhdF9sb2NrKTsK Pj4+ICsKPj4+ICsgICAgIHNwaW5fbG9jaygmRlJFRV9JKHNiaSktPnNlZ21hcF9sb2NrKTsKPj4+ ICsgICAgIEZERVYoZjJmc190YXJnZXRfZGV2aWNlX2luZGV4KHNiaSwgZWkuYmxrKSkuaXNfcmVz ZXJ2aW5nID0gZmFsc2U7Cj4+PiArICAgICBzcGluX3VubG9jaygmRlJFRV9JKHNiaSktPnNlZ21h cF9sb2NrKTsKPj4+ICsgICAgIGYyZnNfdXBfd3JpdGVfdHJhY2UoJnNiaS0+Z2NfbG9jaywgJmds Yyk7Cj4+PiArCj4+PiArb3V0X2lub2RlX3VubG9jazoKPj4+ICsgICAgIGlub2RlX3VubG9jayhp bm9kZSk7Cj4+PiArICAgICBtbnRfZHJvcF93cml0ZV9maWxlKGZpbHApOwo+Pj4gKyAgICAgcmV0 dXJuIGVycjsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIGludCBmMmZzX2lvY19yZWxlYXNlX2Rl dl9hbGlhcyhzdHJ1Y3QgZmlsZSAqZmlscCkKPj4+ICt7Cj4+PiArICAgICBzdHJ1Y3QgaW5vZGUg Kmlub2RlID0gZmlsZV9pbm9kZShmaWxwKTsKPj4+ICsgICAgIHN0cnVjdCBmMmZzX3NiX2luZm8g KnNiaSA9IEYyRlNfSV9TQihpbm9kZSk7Cj4+PiArICAgICBzdHJ1Y3QgZXh0ZW50X3RyZWUgKmV0 ID0gRjJGU19JKGlub2RlKS0+ZXh0ZW50X3RyZWVbRVhfUkVBRF07Cj4+PiArICAgICBzdHJ1Y3Qg ZXh0ZW50X2luZm8gZWkgPSB7MCwgfTsKPj4+ICsgICAgIHN0cnVjdCBjcF9jb250cm9sIGNwYyA9 IHsgQ1BfU1lOQywgMCwgMCwgMCB9Owo+Pj4gKyAgICAgc3RydWN0IGYyZnNfbG9ja19jb250ZXh0 IGxjLCBnbGM7Cj4+PiArICAgICBpbnQgZXJyOwo+Pj4gKwo+Pj4gKyAgICAgaWYgKCFjYXBhYmxl KENBUF9TWVNfQURNSU4pKQo+Pj4gKyAgICAgICAgICAgICByZXR1cm4gLUVQRVJNOwo+Pj4gKwo+ Pj4gKyAgICAgaWYgKHVubGlrZWx5KGlzX3NiaV9mbGFnX3NldChzYmksIFNCSV9DUF9ESVNBQkxF RCkpKQo+Pj4gKyAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKPj4+ICsKPj4+ICsgICAgIGVy ciA9IG1udF93YW50X3dyaXRlX2ZpbGUoZmlscCk7Cj4+PiArICAgICBpZiAoZXJyKQo+Pj4gKyAg ICAgICAgICAgICByZXR1cm4gZXJyOwo+Pj4gKwo+Pj4gKyAgICAgaW5vZGVfbG9jayhpbm9kZSk7 Cj4+PiArCj4+PiArICAgICBpZiAoIUlTX0RFVklDRV9BTElBU0lORyhpbm9kZSkpIHsKPj4+ICsg ICAgICAgICAgICAgZXJyID0gLUVJTlZBTDsKPj4+ICsgICAgICAgICAgICAgZ290byBvdXRfaW5v ZGVfdW5sb2NrOwo+Pj4gKyAgICAgfQo+Pj4gKwo+Pj4gKyAgICAgaWYgKCFGMkZTX0hBU19CTE9D S1MoaW5vZGUpKSB7Cj4+PiArICAgICAgICAgICAgIGVyciA9IDA7Cj4+PiArICAgICAgICAgICAg IGdvdG8gb3V0X2lub2RlX3VubG9jazsKPj4+ICsgICAgIH0KPj4+ICsKPj4+ICsgICAgIGVyciA9 IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXQoaW5vZGUtPmlfbWFwcGluZyk7Cj4+PiArICAgICBpZiAo ZXJyKQo+Pj4gKyAgICAgICAgICAgICBnb3RvIG91dF9pbm9kZV91bmxvY2s7Cj4+PiArCj4+PiAr ICAgICByZWFkX2xvY2soJmV0LT5sb2NrKTsKPj4+ICsgICAgIGVpID0gZXQtPmxhcmdlc3Q7Cj4+ PiArICAgICByZWFkX3VubG9jaygmZXQtPmxvY2spOwo+Pj4gKwo+Pj4gKyAgICAgZjJmc19kb3du X3dyaXRlX3RyYWNlKCZzYmktPmdjX2xvY2ssICZnbGMpOwo+Pj4gKyAgICAgZjJmc19sb2NrX29w KHNiaSwgJmxjKTsKPj4+ICsKPj4+ICsgICAgIGlmICh1bmxpa2VseShpc19zYmlfZmxhZ19zZXQo c2JpLCBTQklfQ1BfRElTQUJMRUQpKSkgewo+Pj4gKyAgICAgICAgICAgICBlcnIgPSAtRUlOVkFM Owo+Pj4gKyAgICAgICAgICAgICBmMmZzX3VubG9ja19vcChzYmksICZsYyk7Cj4+PiArICAgICAg ICAgICAgIGYyZnNfdXBfd3JpdGVfdHJhY2UoJnNiaS0+Z2NfbG9jaywgJmdsYyk7Cj4+PiArICAg ICAgICAgICAgIGdvdG8gb3V0X2lub2RlX3VubG9jazsKPj4+ICsgICAgIH0KPj4+ICsKPj4+ICsg ICAgIGZpbGVtYXBfaW52YWxpZGF0ZV9sb2NrKGlub2RlLT5pX21hcHBpbmcpOwo+Pj4gKyAgICAg dHJ1bmNhdGVfc2V0c2l6ZShpbm9kZSwgMCk7Cj4+PiArCj4+PiArICAgICBlcnIgPSBmMmZzX3Ry dW5jYXRlX2Jsb2Nrcyhpbm9kZSwgMCwgZmFsc2UpOwo+Pj4gKyAgICAgaWYgKGVycikKPj4+ICsg ICAgICAgICAgICAgaV9zaXplX3dyaXRlKGlub2RlLCAobG9mZl90KWVpLmxlbiA8PCBzYmktPmxv Z19ibG9ja3NpemUpOwo+Pj4gKyAgICAgZmlsZW1hcF9pbnZhbGlkYXRlX3VubG9jayhpbm9kZS0+ aV9tYXBwaW5nKTsKPj4+ICsKPj4+ICsgICAgIGlmIChlcnIpIHsKPj4+ICsgICAgICAgICAgICAg ZjJmc191bmxvY2tfb3Aoc2JpLCAmbGMpOwo+Pj4gKyAgICAgICAgICAgICBmMmZzX3VwX3dyaXRl X3RyYWNlKCZzYmktPmdjX2xvY2ssICZnbGMpOwo+Pj4gKyAgICAgICAgICAgICBnb3RvIG91dF9p bm9kZV91bmxvY2s7Cj4+PiArICAgICB9Cj4+PiArCj4+PiArICAgICBmMmZzX3VwZGF0ZV9pbm9k ZV9wYWdlKGlub2RlKTsKPj4+ICsKPj4+ICsgICAgIGYyZnNfdW5sb2NrX29wKHNiaSwgJmxjKTsK Pj4+ICsgICAgIGYyZnNfdXBfd3JpdGVfdHJhY2UoJnNiaS0+Z2NfbG9jaywgJmdsYyk7Cj4+Cj4+ ICAgICAgICAgIGVyciA9IGYyZnNfd3JpdGVfY2hlY2twb2ludChzYmksICZjcGMpOwo+Pgo+PiBU aGFua3MsCj4+Cj4+PiArCj4+PiArICAgICBpbm9kZV91bmxvY2soaW5vZGUpOwo+Pj4gKyAgICAg bW50X2Ryb3Bfd3JpdGVfZmlsZShmaWxwKTsKPj4+ICsKPj4+ICsgICAgIHJldHVybiBmMmZzX3dy aXRlX2NoZWNrcG9pbnQoc2JpLCAmY3BjKTsKPj4+ICsKPj4+ICtvdXRfaW5vZGVfdW5sb2NrOgo+ Pj4gKyAgICAgaW5vZGVfdW5sb2NrKGlub2RlKTsKPj4+ICsgICAgIG1udF9kcm9wX3dyaXRlX2Zp bGUoZmlscCk7Cj4+PiArICAgICByZXR1cm4gZXJyOwo+Pj4gK30KPj4+ICsKPj4+ICAgIHN0YXRp YyBpbnQgZjJmc19pb2NfaW9fcHJpbyhzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgbG9uZyBh cmcpCj4+PiAgICB7Cj4+PiAgICAgICAgc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUo ZmlscCk7Cj4+PiBAQCAtNDA0MSw3ICs0Mjk3LDcgQEAgc3RhdGljIGludCByZXNlcnZlX2NvbXBy ZXNzX2Jsb2NrcyhzdHJ1Y3QgZG5vZGVfb2ZfZGF0YSAqZG4sIHBnb2ZmX3QgY291bnQsCj4+PiAg ICAgICAgICAgICAgICB9Cj4+Pgo+Pj4gICAgICAgICAgICAgICAgcmV0ID0gaW5jX3ZhbGlkX2Js b2NrX2NvdW50KHNiaSwgZG4tPmlub2RlLAo+Pj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICZ0b19yZXNlcnZlZCwgZmFsc2UpOwo+Pj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0b19yZXNlcnZlZCwgZmFsc2UsIGZh bHNlKTsKPj4+ICAgICAgICAgICAgICAgIGlmICh1bmxpa2VseShyZXQpKQo+Pj4gICAgICAgICAg ICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+Pj4KPj4+IEBAIC00NzQyLDggKzQ5OTgsMTQgQEAg c3RhdGljIGxvbmcgX19mMmZzX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQg Y21kLCB1bnNpZ25lZCBsb25nIGFyZykKPj4+ICAgICAgICAgICAgICAgIHJldHVybiBmMmZzX2lv Y19jb21wcmVzc19maWxlKGZpbHApOwo+Pj4gICAgICAgIGNhc2UgRjJGU19JT0NfR0VUX0RFVl9B TElBU19GSUxFOgo+Pj4gICAgICAgICAgICAgICAgcmV0dXJuIGYyZnNfaW9jX2dldF9kZXZfYWxp YXNfZmlsZShmaWxwLCBhcmcpOwo+Pj4gKyAgICAgY2FzZSBGMkZTX0lPQ19HRVRfREVWX0FMSUFT X1NUQVRVUzoKPj4+ICsgICAgICAgICAgICAgcmV0dXJuIGYyZnNfaW9jX2dldF9kZXZfYWxpYXNf c3RhdHVzKGZpbHAsIGFyZyk7Cj4+PiAgICAgICAgY2FzZSBGMkZTX0lPQ19JT19QUklPOgo+Pj4g ICAgICAgICAgICAgICAgcmV0dXJuIGYyZnNfaW9jX2lvX3ByaW8oZmlscCwgYXJnKTsKPj4+ICsg ICAgIGNhc2UgRjJGU19JT0NfUkVTRVJWRV9ERVZfQUxJQVM6Cj4+PiArICAgICAgICAgICAgIHJl dHVybiBmMmZzX2lvY19yZXNlcnZlX2Rldl9hbGlhcyhmaWxwKTsKPj4+ICsgICAgIGNhc2UgRjJG U19JT0NfUkVMRUFTRV9ERVZfQUxJQVM6Cj4+PiArICAgICAgICAgICAgIHJldHVybiBmMmZzX2lv Y19yZWxlYXNlX2Rldl9hbGlhcyhmaWxwKTsKPj4+ICAgICAgICBkZWZhdWx0Ogo+Pj4gICAgICAg ICAgICAgICAgcmV0dXJuIC1FTk9UVFk7Cj4+PiAgICAgICAgfQo+Pj4gQEAgLTU1MzAsNyArNTc5 MiwxMCBAQCBsb25nIGYyZnNfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25l ZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKPj4+ICAgICAgICBjYXNlIEYyRlNfSU9DX0RF Q09NUFJFU1NfRklMRToKPj4+ICAgICAgICBjYXNlIEYyRlNfSU9DX0NPTVBSRVNTX0ZJTEU6Cj4+ PiAgICAgICAgY2FzZSBGMkZTX0lPQ19HRVRfREVWX0FMSUFTX0ZJTEU6Cj4+PiArICAgICBjYXNl IEYyRlNfSU9DX0dFVF9ERVZfQUxJQVNfU1RBVFVTOgo+Pj4gICAgICAgIGNhc2UgRjJGU19JT0Nf SU9fUFJJTzoKPj4+ICsgICAgIGNhc2UgRjJGU19JT0NfUkVTRVJWRV9ERVZfQUxJQVM6Cj4+PiAr ICAgICBjYXNlIEYyRlNfSU9DX1JFTEVBU0VfREVWX0FMSUFTOgo+Pj4gICAgICAgICAgICAgICAg YnJlYWs7Cj4+PiAgICAgICAgZGVmYXVsdDoKPj4+ICAgICAgICAgICAgICAgIHJldHVybiAtRU5P SU9DVExDTUQ7Cj4+PiBkaWZmIC0tZ2l0IGEvZnMvZjJmcy9nYy5jIGIvZnMvZjJmcy9nYy5jCj4+ PiBpbmRleCBmZmFhN2JhNzZhMWIuLjkzYmNiMzVhNWI1ZCAxMDA2NDQKPj4+IC0tLSBhL2ZzL2Yy ZnMvZ2MuYwo+Pj4gKysrIGIvZnMvZjJmcy9nYy5jCj4+PiBAQCAtMjE5NywyOSArMjE5NywzNyBA QCBpbnQgZjJmc19nY19yYW5nZShzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksCj4+PiAgICAgICAg cmV0dXJuIDA7Cj4+PiAgICB9Cj4+Pgo+Pj4gK3ZvaWQgZjJmc19yZXNldF9nY192aWN0aW1fcmVz b3VyY2Uoc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLAo+Pj4gKyAgICAgICAgICAgICAgICAgICAg IHVuc2lnbmVkIGludCBzdGFydCwgdW5zaWduZWQgaW50IGVuZCkKPj4+ICt7Cj4+PiArICAgICBp bnQgaTsKPj4+ICsKPj4+ICsgICAgIG11dGV4X2xvY2soJkRJUlRZX0koc2JpKS0+c2VnbGlzdF9s b2NrKTsKPj4+ICsgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfR0NfUE9MSUNZOyBpKyspCj4+PiAr ICAgICAgICAgICAgIGlmIChTSVRfSShzYmkpLT5sYXN0X3ZpY3RpbVtpXSA+PSBzdGFydCAmJgo+ Pj4gKyAgICAgICAgICAgICAgICAgICAgIFNJVF9JKHNiaSktPmxhc3RfdmljdGltW2ldIDw9IGVu ZCkKPj4+ICsgICAgICAgICAgICAgICAgICAgICBTSVRfSShzYmkpLT5sYXN0X3ZpY3RpbVtpXSA9 IDA7Cj4+PiArCj4+PiArICAgICBmb3IgKGkgPSBCR19HQzsgaSA8PSBGR19HQzsgaSsrKQo+Pj4g KyAgICAgICAgICAgICBpZiAoc2JpLT5uZXh0X3ZpY3RpbV9zZWdbaV0gPj0gc3RhcnQgJiYKPj4+ ICsgICAgICAgICAgICAgICAgICAgICBzYmktPm5leHRfdmljdGltX3NlZ1tpXSA8PSBlbmQpCj4+ PiArICAgICAgICAgICAgICAgICAgICAgc2JpLT5uZXh0X3ZpY3RpbV9zZWdbaV0gPSBOVUxMX1NF R05POwo+Pj4gKyAgICAgbXV0ZXhfdW5sb2NrKCZESVJUWV9JKHNiaSktPnNlZ2xpc3RfbG9jayk7 Cj4+PiArfQo+Pj4gKwo+Pj4gICAgc3RhdGljIGludCBmcmVlX3NlZ21lbnRfcmFuZ2Uoc3RydWN0 IGYyZnNfc2JfaW5mbyAqc2JpLAo+Pj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVu c2lnbmVkIGludCBzZWNzLCBib29sIGRyeV9ydW4pCj4+PiAgICB7Cj4+PiAgICAgICAgdW5zaWdu ZWQgaW50IG5leHRfaW51c2UsIHN0YXJ0LCBlbmQ7Cj4+PiAgICAgICAgc3RydWN0IGNwX2NvbnRy b2wgY3BjID0geyBDUF9SRVNJWkUsIDAsIDAsIDAgfTsKPj4+IC0gICAgIGludCBnY19tb2RlLCBn Y190eXBlOwo+Pj4gICAgICAgIGludCBlcnIgPSAwOwo+Pj4gICAgICAgIGludCB0eXBlOwo+Pj4K Pj4+IC0gICAgIC8qIEZvcmNlIGJsb2NrIGFsbG9jYXRpb24gZm9yIEdDICovCj4+PiAgICAgICAg TUFJTl9TRUNTKHNiaSkgLT0gc2VjczsKPj4+ICAgICAgICBzdGFydCA9IE1BSU5fU0VDUyhzYmkp ICogU0VHU19QRVJfU0VDKHNiaSk7Cj4+PiAgICAgICAgZW5kID0gTUFJTl9TRUdTKHNiaSkgLSAx Owo+Pj4KPj4+IC0gICAgIG11dGV4X2xvY2soJkRJUlRZX0koc2JpKS0+c2VnbGlzdF9sb2NrKTsK Pj4+IC0gICAgIGZvciAoZ2NfbW9kZSA9IDA7IGdjX21vZGUgPCBNQVhfR0NfUE9MSUNZOyBnY19t b2RlKyspCj4+PiAtICAgICAgICAgICAgIGlmIChTSVRfSShzYmkpLT5sYXN0X3ZpY3RpbVtnY19t b2RlXSA+PSBzdGFydCkKPj4+IC0gICAgICAgICAgICAgICAgICAgICBTSVRfSShzYmkpLT5sYXN0 X3ZpY3RpbVtnY19tb2RlXSA9IDA7Cj4+PiAtCj4+PiAtICAgICBmb3IgKGdjX3R5cGUgPSBCR19H QzsgZ2NfdHlwZSA8PSBGR19HQzsgZ2NfdHlwZSsrKQo+Pj4gLSAgICAgICAgICAgICBpZiAoc2Jp LT5uZXh0X3ZpY3RpbV9zZWdbZ2NfdHlwZV0gPj0gc3RhcnQpCj4+PiAtICAgICAgICAgICAgICAg ICAgICAgc2JpLT5uZXh0X3ZpY3RpbV9zZWdbZ2NfdHlwZV0gPSBOVUxMX1NFR05POwo+Pj4gLSAg ICAgbXV0ZXhfdW5sb2NrKCZESVJUWV9JKHNiaSktPnNlZ2xpc3RfbG9jayk7Cj4+PiArICAgICBm MmZzX3Jlc2V0X2djX3ZpY3RpbV9yZXNvdXJjZShzYmksIHN0YXJ0LCBlbmQpOwo+Pj4KPj4+ICAg ICAgICAvKiBNb3ZlIG91dCBjdXJzZWdzIGZyb20gdGhlIHRhcmdldCByYW5nZSAqLwo+Pj4gICAg ICAgIGZvciAodHlwZSA9IENVUlNFR19IT1RfREFUQTsgdHlwZSA8IE5SX0NVUlNFR19QRVJTSVNU X1RZUEU7IHR5cGUrKykgewo+Pj4gZGlmZiAtLWdpdCBhL2ZzL2YyZnMvbmFtZWkuYyBiL2ZzL2Yy ZnMvbmFtZWkuYwo+Pj4gaW5kZXggY2FjMDNiOGU5MWExLi44YzNiNTc5ODdmNmMgMTAwNjQ0Cj4+ PiAtLS0gYS9mcy9mMmZzL25hbWVpLmMKPj4+ICsrKyBiL2ZzL2YyZnMvbmFtZWkuYwo+Pj4gQEAg LTQyNSw2ICs0MjUsOSBAQCBzdGF0aWMgaW50IGYyZnNfbGluayhzdHJ1Y3QgZGVudHJ5ICpvbGRf ZGVudHJ5LCBzdHJ1Y3QgaW5vZGUgKmRpciwKPj4+ICAgICAgICBpZiAoIWYyZnNfaXNfY2hlY2tw b2ludF9yZWFkeShzYmkpKQo+Pj4gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9TUEM7Cj4+Pgo+ Pj4gKyAgICAgaWYgKElTX0RFVklDRV9BTElBU0lORyhpbm9kZSkpCj4+PiArICAgICAgICAgICAg IHJldHVybiAtRVBFUk07Cj4+PiArCj4+PiAgICAgICAgZXJyID0gZnNjcnlwdF9wcmVwYXJlX2xp bmsob2xkX2RlbnRyeSwgZGlyLCBkZW50cnkpOwo+Pj4gICAgICAgIGlmIChlcnIpCj4+PiAgICAg ICAgICAgICAgICByZXR1cm4gZXJyOwo+Pj4gQEAgLTU2OCw2ICs1NzEsOSBAQCBzdGF0aWMgaW50 IGYyZnNfdW5saW5rKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCj4+ Pgo+Pj4gICAgICAgIHRyYWNlX2YyZnNfdW5saW5rX2VudGVyKGRpciwgZGVudHJ5KTsKPj4+Cj4+ PiArICAgICBpZiAoSVNfREVWSUNFX0FMSUFTSU5HKGlub2RlKSkKPj4+ICsgICAgICAgICAgICAg cmV0dXJuIC1FUEVSTTsKPj4+ICsKPj4+ICAgICAgICBpZiAodW5saWtlbHkoZjJmc19jcF9lcnJv cihzYmkpKSkgewo+Pj4gICAgICAgICAgICAgICAgZXJyID0gLUVJTzsKPj4+ICAgICAgICAgICAg ICAgIGdvdG8gb3V0Owo+Pj4gQEAgLTk0Niw2ICs5NTIsOSBAQCBzdGF0aWMgaW50IGYyZnNfcmVu YW1lKHN0cnVjdCBtbnRfaWRtYXAgKmlkbWFwLCBzdHJ1Y3QgaW5vZGUgKm9sZF9kaXIsCj4+PiAg ICAgICAgYm9vbCBvbGRfaXNfZGlyID0gU19JU0RJUihvbGRfaW5vZGUtPmlfbW9kZSk7Cj4+PiAg ICAgICAgaW50IGVycjsKPj4+Cj4+PiArICAgICBpZiAoSVNfREVWSUNFX0FMSUFTSU5HKG9sZF9p bm9kZSkpCj4+PiArICAgICAgICAgICAgIHJldHVybiAtRVBFUk07Cj4+PiArCj4+PiAgICAgICAg aWYgKHVubGlrZWx5KGYyZnNfY3BfZXJyb3Ioc2JpKSkpCj4+PiAgICAgICAgICAgICAgICByZXR1 cm4gLUVJTzsKPj4+ICAgICAgICBpZiAoIWYyZnNfaXNfY2hlY2twb2ludF9yZWFkeShzYmkpKQo+ Pj4gQEAgLTEwMTYsNiArMTAyNSw4IEBAIHN0YXRpYyBpbnQgZjJmc19yZW5hbWUoc3RydWN0IG1u dF9pZG1hcCAqaWRtYXAsIHN0cnVjdCBpbm9kZSAqb2xkX2RpciwKPj4+ICAgICAgICB9Cj4+Pgo+ Pj4gICAgICAgIGlmIChuZXdfaW5vZGUpIHsKPj4+ICsgICAgICAgICAgICAgaWYgKElTX0RFVklD RV9BTElBU0lORyhuZXdfaW5vZGUpKQo+Pj4gKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiAt RVBFUk07Cj4+Pgo+Pj4gICAgICAgICAgICAgICAgZXJyID0gLUVOT1RFTVBUWTsKPj4+ICAgICAg ICAgICAgICAgIGlmIChvbGRfaXNfZGlyICYmICFmMmZzX2VtcHR5X2RpcihuZXdfaW5vZGUpKQo+ Pj4gQEAgLTExNDMsNiArMTE1NCw5IEBAIHN0YXRpYyBpbnQgZjJmc19jcm9zc19yZW5hbWUoc3Ry dWN0IGlub2RlICpvbGRfZGlyLCBzdHJ1Y3QgZGVudHJ5ICpvbGRfZGVudHJ5LAo+Pj4gICAgICAg IGludCBvbGRfbmxpbmsgPSAwLCBuZXdfbmxpbmsgPSAwOwo+Pj4gICAgICAgIGludCBlcnI7Cj4+ Pgo+Pj4gKyAgICAgaWYgKElTX0RFVklDRV9BTElBU0lORyhvbGRfaW5vZGUpIHx8IElTX0RFVklD RV9BTElBU0lORyhuZXdfaW5vZGUpKQo+Pj4gKyAgICAgICAgICAgICByZXR1cm4gLUVQRVJNOwo+ Pj4gKwo+Pj4gICAgICAgIGlmICh1bmxpa2VseShmMmZzX2NwX2Vycm9yKHNiaSkpKQo+Pj4gICAg ICAgICAgICAgICAgcmV0dXJuIC1FSU87Cj4+PiAgICAgICAgaWYgKCFmMmZzX2lzX2NoZWNrcG9p bnRfcmVhZHkoc2JpKSkKPj4+IGRpZmYgLS1naXQgYS9mcy9mMmZzL3NlZ21lbnQuYyBiL2ZzL2Yy ZnMvc2VnbWVudC5jCj4+PiBpbmRleCBkNzFkZGIzZWU5MTguLmQ3MGRjNWVmM2RlNCAxMDA2NDQK Pj4+IC0tLSBhL2ZzL2YyZnMvc2VnbWVudC5jCj4+PiArKysgYi9mcy9mMmZzL3NlZ21lbnQuYwo+ Pj4gQEAgLTI2MSw3ICsyNjEsNyBAQCBzdGF0aWMgaW50IF9fcmVwbGFjZV9hdG9taWNfd3JpdGVf YmxvY2soc3RydWN0IGlub2RlICppbm9kZSwgcGdvZmZfdCBpbmRleCwKPj4+ICAgICAgICB9IGVs c2Ugewo+Pj4gICAgICAgICAgICAgICAgYmxrY250X3QgY291bnQgPSAxOwo+Pj4KPj4+IC0gICAg ICAgICAgICAgZXJyID0gaW5jX3ZhbGlkX2Jsb2NrX2NvdW50KHNiaSwgaW5vZGUsICZjb3VudCwg dHJ1ZSk7Cj4+PiArICAgICAgICAgICAgIGVyciA9IGluY192YWxpZF9ibG9ja19jb3VudChzYmks IGlub2RlLCAmY291bnQsIHRydWUsIGZhbHNlKTsKPj4+ICAgICAgICAgICAgICAgIGlmIChlcnIp IHsKPj4+ICAgICAgICAgICAgICAgICAgICAgICAgZjJmc19wdXRfZG5vZGUoJmRuKTsKPj4+ICAg ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKPj4+IEBAIC0yNTAyLDM1ICsyNTAyLDQy IEBAIHN0YXRpYyBpbnQgdXBkYXRlX3NpdF9lbnRyeV9mb3JfYWxsb2Moc3RydWN0IGYyZnNfc2Jf aW5mbyAqc2JpLCBzdHJ1Y3Qgc2VnX2VudHJ5Cj4+PiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgdW5zaWduZWQgaW50IHNlZ25vLCBibG9ja190IGJsa2FkZHIsIHVuc2lnbmVkIGludCBv ZmZzZXQsIGludCBkZWwpCj4+PiAgICB7Cj4+PiAgICAgICAgYm9vbCBleGlzdDsKPj4+ICsgICAg IGludCBkZWxfY291bnQgPSBkZWw7Cj4+PiArICAgICBpbnQgaTsKPj4+Cj4+PiAtICAgICBleGlz dCA9IGYyZnNfdGVzdF9hbmRfc2V0X2JpdChvZmZzZXQsIHNlLT5jdXJfdmFsaWRfbWFwKTsKPj4+ IC0gICAgIGlmICh1bmxpa2VseShleGlzdCkpIHsKPj4+IC0gICAgICAgICAgICAgZjJmc19lcnIo c2JpLCAiQml0bWFwIHdhcyB3cm9uZ2x5IHNldCwgYmxrOiV1IiwgYmxrYWRkcik7Cj4+PiAtICAg ICAgICAgICAgIGYyZnNfYnVnX29uKHNiaSwgMSk7Cj4+PiAtICAgICAgICAgICAgIHNlLT52YWxp ZF9ibG9ja3MtLTsKPj4+IC0gICAgICAgICAgICAgZGVsID0gMDsKPj4+IC0gICAgIH0KPj4+ICsg ICAgIGYyZnNfYnVnX29uKHNiaSwgR0VUX1NFR05PKHNiaSwgYmxrYWRkcikgIT0gR0VUX1NFR05P KHNiaSwgYmxrYWRkciArIGRlbF9jb3VudCAtIDEpKTsKPj4+Cj4+PiAtICAgICBpZiAoZjJmc19i bG9ja191bml0X2Rpc2NhcmQoc2JpKSAmJgo+Pj4gLSAgICAgICAgICAgICAgICAgICAgICFmMmZz X3Rlc3RfYW5kX3NldF9iaXQob2Zmc2V0LCBzZS0+ZGlzY2FyZF9tYXApKQo+Pj4gLSAgICAgICAg ICAgICBzYmktPmRpc2NhcmRfYmxrcy0tOwo+Pj4gKyAgICAgZm9yIChpID0gMDsgaSA8IGRlbF9j b3VudDsgaSsrKSB7Cj4+PiArICAgICAgICAgICAgIGV4aXN0ID0gZjJmc190ZXN0X2FuZF9zZXRf Yml0KG9mZnNldCArIGksIHNlLT5jdXJfdmFsaWRfbWFwKTsKPj4+ICsgICAgICAgICAgICAgaWYg KHVubGlrZWx5KGV4aXN0KSkgewo+Pj4gKyAgICAgICAgICAgICAgICAgICAgIGYyZnNfZXJyKHNi aSwgIkJpdG1hcCB3YXMgd3JvbmdseSBzZXQsIGJsazoldSIsIGJsa2FkZHIgKyBpKTsKPj4+ICsg ICAgICAgICAgICAgICAgICAgICBmMmZzX2J1Z19vbihzYmksIDEpOwo+Pj4gKyAgICAgICAgICAg ICAgICAgICAgIHNlLT52YWxpZF9ibG9ja3MtLTsKPj4+ICsgICAgICAgICAgICAgICAgICAgICBk ZWwgLT0gMTsKPj4+ICsgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKPj4+ICsgICAgICAg ICAgICAgfQo+Pj4KPj4+IC0gICAgIC8qCj4+PiAtICAgICAgKiBTU1Igc2hvdWxkIG5ldmVyIHJl dXNlIGJsb2NrIHdoaWNoIGlzIGNoZWNrcG9pbnRlZAo+Pj4gLSAgICAgICogb3IgbmV3bHkgaW52 YWxpZGF0ZWQuCj4+PiAtICAgICAgKi8KPj4+IC0gICAgIGlmICghaXNfc2JpX2ZsYWdfc2V0KHNi aSwgU0JJX0NQX0RJU0FCTEVEKSkgewo+Pj4gLSAgICAgICAgICAgICBpZiAoIWYyZnNfdGVzdF9h bmRfc2V0X2JpdChvZmZzZXQsIHNlLT5ja3B0X3ZhbGlkX21hcCkpIHsKPj4+IC0gICAgICAgICAg ICAgICAgICAgICBzZS0+Y2twdF92YWxpZF9ibG9ja3MrKzsKPj4+IC0gICAgICAgICAgICAgICAg ICAgICBpZiAoX19pc19sYXJnZV9zZWN0aW9uKHNiaSkpCj4+PiAtICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBnZXRfc2VjX2VudHJ5KHNiaSwgc2Vnbm8pLT5ja3B0X3ZhbGlkX2Jsb2Nrcysr Owo+Pj4gKyAgICAgICAgICAgICBpZiAoZjJmc19ibG9ja191bml0X2Rpc2NhcmQoc2JpKSAmJgo+ Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWYyZnNfdGVzdF9hbmRfc2V0X2JpdChv ZmZzZXQgKyBpLCBzZS0+ZGlzY2FyZF9tYXApKQo+Pj4gKyAgICAgICAgICAgICAgICAgICAgIHNi aS0+ZGlzY2FyZF9ibGtzLS07Cj4+PiArCj4+PiArICAgICAgICAgICAgIC8qCj4+PiArICAgICAg ICAgICAgICAqIFNTUiBzaG91bGQgbmV2ZXIgcmV1c2UgYmxvY2sgd2hpY2ggaXMgY2hlY2twb2lu dGVkCj4+PiArICAgICAgICAgICAgICAqIG9yIG5ld2x5IGludmFsaWRhdGVkLgo+Pj4gKyAgICAg ICAgICAgICAgKi8KPj4+ICsgICAgICAgICAgICAgaWYgKCFpc19zYmlfZmxhZ19zZXQoc2JpLCBT QklfQ1BfRElTQUJMRUQpKSB7Cj4+PiArICAgICAgICAgICAgICAgICAgICAgaWYgKCFmMmZzX3Rl c3RfYW5kX3NldF9iaXQob2Zmc2V0ICsgaSwgc2UtPmNrcHRfdmFsaWRfbWFwKSkgewo+Pj4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgc2UtPmNrcHRfdmFsaWRfYmxvY2tzKys7Cj4+PiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX19pc19sYXJnZV9zZWN0aW9uKHNiaSkp Cj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9zZWNfZW50cnko c2JpLCBzZWdubyktPmNrcHRfdmFsaWRfYmxvY2tzKys7Cj4+PiArICAgICAgICAgICAgICAgICAg ICAgfQo+Pj4gICAgICAgICAgICAgICAgfQo+Pj4gLSAgICAgfQo+Pj4KPj4+IC0gICAgIGlmICgh ZjJmc190ZXN0X2JpdChvZmZzZXQsIHNlLT5ja3B0X3ZhbGlkX21hcCkpIHsKPj4+IC0gICAgICAg ICAgICAgc2UtPmNrcHRfdmFsaWRfYmxvY2tzICs9IGRlbDsKPj4+IC0gICAgICAgICAgICAgaWYg KF9faXNfbGFyZ2Vfc2VjdGlvbihzYmkpKQo+Pj4gLSAgICAgICAgICAgICAgICAgICAgIGdldF9z ZWNfZW50cnkoc2JpLCBzZWdubyktPmNrcHRfdmFsaWRfYmxvY2tzICs9IGRlbDsKPj4+ICsgICAg ICAgICAgICAgaWYgKCFmMmZzX3Rlc3RfYml0KG9mZnNldCArIGksIHNlLT5ja3B0X3ZhbGlkX21h cCkpIHsKPj4+ICsgICAgICAgICAgICAgICAgICAgICBzZS0+Y2twdF92YWxpZF9ibG9ja3MgKz0g MTsKPj4+ICsgICAgICAgICAgICAgICAgICAgICBpZiAoX19pc19sYXJnZV9zZWN0aW9uKHNiaSkp Cj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfc2VjX2VudHJ5KHNiaSwgc2Vn bm8pLT5ja3B0X3ZhbGlkX2Jsb2NrcyArPSAxOwo+Pj4gKyAgICAgICAgICAgICB9Cj4+PiAgICAg ICAgfQo+Pj4KPj4+ICAgICAgICBpZiAoX19pc19sYXJnZV9zZWN0aW9uKHNiaSkpCj4+PiBAQCAt MjU4NSw5ICsyNTkyLDE0IEBAIHZvaWQgZjJmc19pbnZhbGlkYXRlX2Jsb2NrcyhzdHJ1Y3QgZjJm c19zYl9pbmZvICpzYmksIGJsb2NrX3QgYWRkciwKPj4+ICAgICAgICB1bnNpZ25lZCBpbnQgc2Vn bm8gPSBHRVRfU0VHTk8oc2JpLCBhZGRyKTsKPj4+ICAgICAgICBzdHJ1Y3Qgc2l0X2luZm8gKnNp dF9pID0gU0lUX0koc2JpKTsKPj4+ICAgICAgICBibG9ja190IGFkZHJfc3RhcnQgPSBhZGRyLCBh ZGRyX2VuZCA9IGFkZHIgKyBsZW4gLSAxOwo+Pj4gLSAgICAgdW5zaWduZWQgaW50IHNlZ19udW0g PSBHRVRfU0VHTk8oc2JpLCBhZGRyX2VuZCkgLSBzZWdubyArIDE7Cj4+PiArICAgICB1bnNpZ25l ZCBpbnQgc2VnX251bTsKPj4+ICAgICAgICB1bnNpZ25lZCBpbnQgaSA9IDEsIG1heF9ibG9ja3Mg PSBzYmktPmJsb2Nrc19wZXJfc2VnLCBjbnQ7Cj4+Pgo+Pj4gKyAgICAgaWYgKGxlbiA9PSAwKQo+ Pj4gKyAgICAgICAgICAgICByZXR1cm47Cj4+PiArCj4+PiArICAgICBzZWdfbnVtID0gR0VUX1NF R05PKHNiaSwgYWRkcl9lbmQpIC0gc2Vnbm8gKyAxOwo+Pj4gKwo+Pj4gICAgICAgIGYyZnNfYnVn X29uKHNiaSwgYWRkciA9PSBOVUxMX0FERFIpOwo+Pj4gICAgICAgIGlmIChhZGRyID09IE5FV19B RERSIHx8IGFkZHIgPT0gQ09NUFJFU1NfQUREUikKPj4+ICAgICAgICAgICAgICAgIHJldHVybjsK Pj4+IEBAIC0yNjIwLDYgKzI2MzIsNTIgQEAgdm9pZCBmMmZzX2ludmFsaWRhdGVfYmxvY2tzKHN0 cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwgYmxvY2tfdCBhZGRyLAo+Pj4gICAgICAgIHVwX3dyaXRl KCZzaXRfaS0+c2VudHJ5X2xvY2spOwo+Pj4gICAgfQo+Pj4KPj4+ICt2b2lkIGYyZnNfcmVzZXJ2 ZV9kZXZpY2VfYWxpYXMoc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLCBibG9ja190IGFkZHIsCj4+ PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGVuKQo+Pj4gK3sK Pj4+ICsgICAgIHVuc2lnbmVkIGludCBzZWdubyA9IEdFVF9TRUdOTyhzYmksIGFkZHIpOwo+Pj4g KyAgICAgc3RydWN0IHNpdF9pbmZvICpzaXRfaSA9IFNJVF9JKHNiaSk7Cj4+PiArICAgICBibG9j a190IGFkZHJfc3RhcnQgPSBhZGRyLCBhZGRyX2VuZCA9IGFkZHIgKyBsZW4gLSAxOwo+Pj4gKyAg ICAgdW5zaWduZWQgaW50IHNlZ19udW07Cj4+PiArICAgICB1bnNpZ25lZCBpbnQgaSA9IDEsIG1h eF9ibG9ja3MgPSBzYmktPmJsb2Nrc19wZXJfc2VnLCBjbnQ7Cj4+PiArCj4+PiArICAgICBpZiAo bGVuID09IDApCj4+PiArICAgICAgICAgICAgIHJldHVybjsKPj4+ICsKPj4+ICsgICAgIHNlZ19u dW0gPSBHRVRfU0VHTk8oc2JpLCBhZGRyX2VuZCkgLSBzZWdubyArIDE7Cj4+PiArCj4+PiArICAg ICBkb3duX3dyaXRlKCZzaXRfaS0+c2VudHJ5X2xvY2spOwo+Pj4gKwo+Pj4gKyAgICAgaWYgKHNl Z19udW0gPT0gMSkKPj4+ICsgICAgICAgICAgICAgY250ID0gbGVuOwo+Pj4gKyAgICAgZWxzZQo+ Pj4gKyAgICAgICAgICAgICBjbnQgPSBtYXhfYmxvY2tzIC0gR0VUX0JMS09GRl9GUk9NX1NFRzAo c2JpLCBhZGRyKTsKPj4+ICsKPj4+ICsgICAgIGRvIHsKPj4+ICsgICAgICAgICAgICAgdXBkYXRl X3NlZ21lbnRfbXRpbWUoc2JpLCBhZGRyX3N0YXJ0LCAwKTsKPj4+ICsgICAgICAgICAgICAgdXBk YXRlX3NpdF9lbnRyeShzYmksIGFkZHJfc3RhcnQsIGNudCk7Cj4+PiArICAgICAgICAgICAgIF9f c2V0X3Rlc3RfYW5kX2ludXNlKHNiaSwgc2Vnbm8pOwo+Pj4gKwo+Pj4gKyAgICAgICAgICAgICAv KiBSZW1vdmUgdGhlIHNlZ21lbnQgZnJvbSBQUkUgKHByZWZyZWUpIHRvIHByZXZlbnQgY2hlY2tw b2ludCBmcm9tIGZyZWVpbmcgaXQhICovCj4+PiArICAgICAgICAgICAgIG11dGV4X2xvY2soJkRJ UlRZX0koc2JpKS0+c2VnbGlzdF9sb2NrKTsKPj4+ICsgICAgICAgICAgICAgaWYgKHRlc3RfYW5k X2NsZWFyX2JpdChzZWdubywgRElSVFlfSShzYmkpLT5kaXJ0eV9zZWdtYXBbUFJFXSkpCj4+PiAr ICAgICAgICAgICAgICAgICAgICAgRElSVFlfSShzYmkpLT5ucl9kaXJ0eVtQUkVdLS07Cj4+PiAr ICAgICAgICAgICAgIG11dGV4X3VubG9jaygmRElSVFlfSShzYmkpLT5zZWdsaXN0X2xvY2spOwo+ Pj4gKwo+Pj4gKyAgICAgICAgICAgICAvKiBhZGQgaXQgaW50byBkaXJ0eSBzZWdsaXN0ICovCj4+ PiArICAgICAgICAgICAgIGxvY2F0ZV9kaXJ0eV9zZWdtZW50KHNiaSwgc2Vnbm8pOwo+Pj4gKwo+ Pj4gKyAgICAgICAgICAgICAvKiB1cGRhdGUgQGFkZHJfc3RhcnQgYW5kIEBjbnQgYW5kIEBzZWdu byAqLwo+Pj4gKyAgICAgICAgICAgICBhZGRyX3N0YXJ0ID0gU1RBUlRfQkxPQ0soc2JpLCArK3Nl Z25vKTsKPj4+ICsgICAgICAgICAgICAgaWYgKCsraSA9PSBzZWdfbnVtKQo+Pj4gKyAgICAgICAg ICAgICAgICAgICAgIGNudCA9IEdFVF9CTEtPRkZfRlJPTV9TRUcwKHNiaSwgYWRkcl9lbmQpICsg MTsKPj4+ICsgICAgICAgICAgICAgZWxzZQo+Pj4gKyAgICAgICAgICAgICAgICAgICAgIGNudCA9 IG1heF9ibG9ja3M7Cj4+PiArICAgICB9IHdoaWxlIChpIDw9IHNlZ19udW0pOwo+Pj4gKwo+Pj4g KyAgICAgdXBfd3JpdGUoJnNpdF9pLT5zZW50cnlfbG9jayk7Cj4+PiArfQo+Pj4gKwo+Pj4gICAg Ym9vbCBmMmZzX2lzX2NoZWNrcG9pbnRlZF9kYXRhKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwg YmxvY2tfdCBibGthZGRyKQo+Pj4gICAgewo+Pj4gICAgICAgIHN0cnVjdCBzaXRfaW5mbyAqc2l0 X2kgPSBTSVRfSShzYmkpOwo+Pj4gQEAgLTI3NTgsOCArMjgxNiwxMyBAQCBzdGF0aWMgaW50IGlz X25leHRfc2VnbWVudF9mcmVlKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwKPj4+ICAgICAgICB1 bnNpZ25lZCBpbnQgc2Vnbm8gPSBjdXJzZWctPnNlZ25vICsgMTsKPj4+ICAgICAgICBzdHJ1Y3Qg ZnJlZV9zZWdtYXBfaW5mbyAqZnJlZV9pID0gRlJFRV9JKHNiaSk7Cj4+Pgo+Pj4gLSAgICAgaWYg KHNlZ25vIDwgTUFJTl9TRUdTKHNiaSkgJiYgc2Vnbm8gJSBTRUdTX1BFUl9TRUMoc2JpKSkKPj4+ ICsgICAgIGlmIChzZWdubyA8IE1BSU5fU0VHUyhzYmkpICYmIHNlZ25vICUgU0VHU19QRVJfU0VD KHNiaSkpIHsKPj4+ICsgICAgICAgICAgICAgaW50IGRldmkgPSBmMmZzX3RhcmdldF9kZXZpY2Vf aW5kZXgoc2JpLCBTVEFSVF9CTE9DSyhzYmksIHNlZ25vKSk7Cj4+PiArCj4+PiArICAgICAgICAg ICAgIGlmIChmMmZzX2Rldl9pc19yZXNlcnZpbmcoc2JpLCBkZXZpKSkKPj4+ICsgICAgICAgICAg ICAgICAgICAgICByZXR1cm4gMDsKPj4+ICAgICAgICAgICAgICAgIHJldHVybiAhdGVzdF9iaXQo c2Vnbm8sIGZyZWVfaS0+ZnJlZV9zZWdtYXApOwo+Pj4gKyAgICAgfQo+Pj4gICAgICAgIHJldHVy biAwOwo+Pj4gICAgfQo+Pj4KPj4+IEBAIC0yNzc4LDcgKzI4NDEsOCBAQCBzdGF0aWMgaW50IGdl dF9uZXdfc2VnbWVudChzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksCj4+PiAgICAgICAgdW5zaWdu ZWQgaW50IGFsbG9jX3BvbGljeSA9IHNiaS0+YWxsb2NhdGVfc2VjdGlvbl9wb2xpY3k7Cj4+PiAg ICAgICAgdW5zaWduZWQgaW50IGFsbG9jX2hpbnQgPSBzYmktPmFsbG9jYXRlX3NlY3Rpb25faGlu dDsKPj4+ICAgICAgICBib29sIGluaXQgPSB0cnVlOwo+Pj4gLSAgICAgaW50IGk7Cj4+PiArICAg ICBib29sIGxvb3BlZCA9IGZhbHNlOwo+Pj4gKyAgICAgaW50IGksIGRldmk7Cj4+PiAgICAgICAg aW50IHJldCA9IDA7Cj4+Pgo+Pj4gICAgICAgIHNwaW5fbG9jaygmZnJlZV9pLT5zZWdtYXBfbG9j ayk7Cj4+PiBAQCAtMjc5MSw4ICsyODU1LDEzIEBAIHN0YXRpYyBpbnQgZ2V0X25ld19zZWdtZW50 KHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwKPj4+ICAgICAgICBpZiAoIW5ld19zZWMgJiYgKCgq bmV3c2VnICsgMSkgJSBTRUdTX1BFUl9TRUMoc2JpKSkpIHsKPj4+ICAgICAgICAgICAgICAgIHNl Z25vID0gZmluZF9uZXh0X3plcm9fYml0KGZyZWVfaS0+ZnJlZV9zZWdtYXAsCj4+PiAgICAgICAg ICAgICAgICAgICAgICAgIEdFVF9TRUdfRlJPTV9TRUMoc2JpLCBoaW50ICsgMSksICpuZXdzZWcg KyAxKTsKPj4+IC0gICAgICAgICAgICAgaWYgKHNlZ25vIDwgR0VUX1NFR19GUk9NX1NFQyhzYmks IGhpbnQgKyAxKSkKPj4+ICsgICAgICAgICAgICAgaWYgKHNlZ25vIDwgR0VUX1NFR19GUk9NX1NF QyhzYmksIGhpbnQgKyAxKSkgewo+Pj4gKyAgICAgICAgICAgICAgICAgICAgIGRldmkgPSBmMmZz X3RhcmdldF9kZXZpY2VfaW5kZXgoc2JpLCBTVEFSVF9CTE9DSyhzYmksIHNlZ25vKSk7Cj4+PiAr Cj4+PiArICAgICAgICAgICAgICAgICAgICAgaWYgKGYyZnNfZGV2X2lzX2FsbG9jX2Jsb2NrZWQo c2JpLCBkZXZpLCBwaW5uaW5nKSkKPj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdv dG8gZmluZF9vdGhlcl96b25lOwo+Pj4gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGdvdF9p dDsKPj4+ICsgICAgICAgICAgICAgfQo+Pj4gICAgICAgIH0KPj4+Cj4+PiAgICAjaWZkZWYgQ09O RklHX0JMS19ERVZfWk9ORUQKPj4+IEBAIC0yODI4LDMzICsyODk3LDQyIEBAIHN0YXRpYyBpbnQg Z2V0X25ld19zZWdtZW50KHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwKPj4+ICAgIGZpbmRfb3Ro ZXJfem9uZToKPj4+ICAgICAgICBzZWNubyA9IGZpbmRfbmV4dF96ZXJvX2JpdChmcmVlX2ktPmZy ZWVfc2VjbWFwLCBNQUlOX1NFQ1Moc2JpKSwgaGludCk7Cj4+Pgo+Pj4gLSNpZmRlZiBDT05GSUdf QkxLX0RFVl9aT05FRAo+Pj4gLSAgICAgaWYgKHNlY25vID49IE1BSU5fU0VDUyhzYmkpICYmIGYy ZnNfc2JfaGFzX2Jsa3pvbmVkKHNiaSkpIHsKPj4+IC0gICAgICAgICAgICAgLyogV3JpdGUgb25s eSB0byBzZXF1ZW50aWFsIHpvbmVzICovCj4+PiAtICAgICAgICAgICAgIGlmIChzYmktPmJsa3pv bmVfYWxsb2NfcG9saWN5ID09IEJMS1pPTkVfQUxMT0NfT05MWV9TRVEpIHsKPj4+IC0gICAgICAg ICAgICAgICAgICAgICBoaW50ID0gR0VUX1NFQ19GUk9NX1NFRyhzYmksIHNiaS0+Zmlyc3Rfc2Vx X3pvbmVfc2Vnbm8pOwo+Pj4gLSAgICAgICAgICAgICAgICAgICAgIHNlY25vID0gZmluZF9uZXh0 X3plcm9fYml0KGZyZWVfaS0+ZnJlZV9zZWNtYXAsIE1BSU5fU0VDUyhzYmkpLCBoaW50KTsKPj4+ IC0gICAgICAgICAgICAgfSBlbHNlCj4+PiAtICAgICAgICAgICAgICAgICAgICAgc2Vjbm8gPSBm aW5kX2ZpcnN0X3plcm9fYml0KGZyZWVfaS0+ZnJlZV9zZWNtYXAsCj4+PiAtICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BSU5fU0VD UyhzYmkpKTsKPj4+IC0gICAgICAgICAgICAgaWYgKHNlY25vID49IE1BSU5fU0VDUyhzYmkpKSB7 Cj4+PiAtICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVOT1NQQzsKPj4+IC0gICAgICAgICAg ICAgICAgICAgICBmMmZzX2J1Z19vbihzYmksIDEpOwo+Pj4gLSAgICAgICAgICAgICAgICAgICAg IGdvdG8gb3V0X3VubG9jazsKPj4+IC0gICAgICAgICAgICAgfQo+Pj4gLSAgICAgfQo+Pj4gLSNl bmRpZgo+Pj4gLQo+Pj4gICAgICAgIGlmIChzZWNubyA+PSBNQUlOX1NFQ1Moc2JpKSkgewo+Pj4g LSAgICAgICAgICAgICBzZWNubyA9IGZpbmRfZmlyc3RfemVyb19iaXQoZnJlZV9pLT5mcmVlX3Nl Y21hcCwKPj4+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIE1BSU5fU0VDUyhzYmkpKTsKPj4+IC0gICAgICAgICAgICAgaWYgKHNlY25vID49IE1B SU5fU0VDUyhzYmkpKSB7Cj4+PiArICAgICAgICAgICAgIGlmIChsb29wZWQpIHsKPj4+ICAgICAg ICAgICAgICAgICAgICAgICAgcmV0ID0gLUVOT1NQQzsKPj4+ICAgICAgICAgICAgICAgICAgICAg ICAgZjJmc19idWdfb24oc2JpLCAhcGlubmluZyk7Cj4+PiAgICAgICAgICAgICAgICAgICAgICAg IGdvdG8gb3V0X3VubG9jazsKPj4+ICAgICAgICAgICAgICAgIH0KPj4+ICsgICAgICAgICAgICAg aGludCA9IDA7Cj4+PiArI2lmZGVmIENPTkZJR19CTEtfREVWX1pPTkVECj4+PiArICAgICAgICAg ICAgIC8qIFdyaXRlIG9ubHkgdG8gc2VxdWVudGlhbCB6b25lcyAqLwo+Pj4gKyAgICAgICAgICAg ICBpZiAoZjJmc19zYl9oYXNfYmxrem9uZWQoc2JpKSAmJgo+Pj4gKyAgICAgICAgICAgICAgICAg ICAgIHNiaS0+Ymxrem9uZV9hbGxvY19wb2xpY3kgPT0gQkxLWk9ORV9BTExPQ19PTkxZX1NFUSkK Pj4+ICsgICAgICAgICAgICAgICAgICAgICBoaW50ID0gR0VUX1NFQ19GUk9NX1NFRyhzYmksIHNi aS0+Zmlyc3Rfc2VxX3pvbmVfc2Vnbm8pOwo+Pj4gKyNlbmRpZgo+Pj4gKyAgICAgICAgICAgICBs b29wZWQgPSB0cnVlOwo+Pj4gKyAgICAgICAgICAgICBnb3RvIGZpbmRfb3RoZXJfem9uZTsKPj4+ ICAgICAgICB9Cj4+PiArCj4+PiAgICAgICAgc2Vnbm8gPSBHRVRfU0VHX0ZST01fU0VDKHNiaSwg c2Vjbm8pOwo+Pj4gKwo+Pj4gKyAgICAgZGV2aSA9IGYyZnNfdGFyZ2V0X2RldmljZV9pbmRleChz YmksIFNUQVJUX0JMT0NLKHNiaSwgc2Vnbm8pKTsKPj4+ICsKPj4+ICsgICAgIGlmIChmMmZzX2Rl dl9pc19hbGxvY19ibG9ja2VkKHNiaSwgZGV2aSwgcGlubmluZykpIHsKPj4+ICsgICAgICAgICAg ICAgd2hpbGUgKGRldmkgPCBzYmktPnNfbmRldnMgJiYKPj4+ICsgICAgICAgICAgICAgICAgICAg ICBmMmZzX2Rldl9pc19hbGxvY19ibG9ja2VkKHNiaSwgZGV2aSwgcGlubmluZykpIHsKPj4+ICsg ICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZW5kX3NlZ25vID0gR0VUX1NFR05PKHNi aSwgRkRFVihkZXZpKS5lbmRfYmxrKTsKPj4+ICsKPj4+ICsgICAgICAgICAgICAgICAgICAgICBo aW50ID0gR0VUX1NFQ19GUk9NX1NFRyhzYmksIGVuZF9zZWdubykgKyAxOwo+Pj4gKyAgICAgICAg ICAgICAgICAgICAgIGRldmkrKzsKPj4+ICsgICAgICAgICAgICAgfQo+Pj4gKyAgICAgICAgICAg ICBnb3RvIGZpbmRfb3RoZXJfem9uZTsKPj4+ICsgICAgIH0KPj4+ICsKPj4+ICsgICAgIGlmIChz ZWNfdXNhZ2VfY2hlY2soc2JpLCBzZWNubykpIHsKPj4+ICsgICAgICAgICAgICAgaGludCA9IHNl Y25vICsgMTsKPj4+ICsgICAgICAgICAgICAgZ290byBmaW5kX290aGVyX3pvbmU7Cj4+PiArICAg ICB9Cj4+PiAgICAgICAgem9uZW5vID0gR0VUX1pPTkVfRlJPTV9TRUMoc2JpLCBzZWNubyk7Cj4+ Pgo+Pj4gICAgICAgIC8qIGdpdmUgdXAgb24gZmluZGluZyBhbm90aGVyIHpvbmUgKi8KPj4+IGRp ZmYgLS1naXQgYS9mcy9mMmZzL3NlZ21lbnQuaCBiL2ZzL2YyZnMvc2VnbWVudC5oCj4+PiBpbmRl eCBiMGMwNmIzNTgwYjQuLjEwNzUwOGFlN2ViMyAxMDA2NDQKPj4+IC0tLSBhL2ZzL2YyZnMvc2Vn bWVudC5oCj4+PiArKysgYi9mcy9mMmZzL3NlZ21lbnQuaAo+Pj4gQEAgLTk1NCwxMCArOTU0LDMy IEBAIHN0YXRpYyBpbmxpbmUgYmxvY2tfdCBzdW1fYmxrX2FkZHIoc3RydWN0IGYyZnNfc2JfaW5m byAqc2JpLCBpbnQgYmFzZSwgaW50IHR5cGUpCj4+PiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgLSAoYmFzZSArIDEpICsgdHlwZTsKPj4+ICAgIH0KPj4+Cj4+PiArc3RhdGljIGlubGlu ZSBib29sIGYyZnNfZGV2X2lzX3Jlc2VydmluZyhzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksIGlu dCBkZXZpKQo+Pj4gK3sKPj4+ICsgICAgIGlmICghZjJmc19zYl9oYXNfZGV2aWNlX2FsaWFzKHNi aSkpCj4+PiArICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKPj4+ICsgICAgIHJldHVybiBGREVW KGRldmkpLmlzX3Jlc2VydmluZzsKPj4+ICt9Cj4+PiArCj4+PiArc3RhdGljIGlubGluZSBib29s IGYyZnNfZGV2X2lzX2FsbG9jX2Jsb2NrZWQoc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLAo+Pj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGV2aSwgYm9vbCBwaW5u aW5nKQo+Pj4gK3sKPj4+ICsgICAgIGlmICghZjJmc19zYl9oYXNfZGV2aWNlX2FsaWFzKHNiaSkp Cj4+PiArICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKPj4+ICsgICAgIHJldHVybiAocGlubmlu ZyAmJiBGREVWKGRldmkpLmhhc19hbGlhcykgfHwgRkRFVihkZXZpKS5pc19yZXNlcnZpbmc7Cj4+ PiArfQo+Pj4gKwo+Pj4gICAgc3RhdGljIGlubGluZSBib29sIHNlY191c2FnZV9jaGVjayhzdHJ1 Y3QgZjJmc19zYl9pbmZvICpzYmksIHVuc2lnbmVkIGludCBzZWNubykKPj4+ICAgIHsKPj4+ICAg ICAgICBpZiAoaXNfY3Vyc2VjKHNiaSwgc2Vjbm8pIHx8IChzYmktPmN1cl92aWN0aW1fc2VjID09 IHNlY25vKSkKPj4+ICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwo+Pj4gKyAgICAgaWYgKGYy ZnNfc2JfaGFzX2RldmljZV9hbGlhcyhzYmkpKSB7Cj4+PiArICAgICAgICAgICAgIGJsb2NrX3Qg c3RhcnRfYmxrID0gU1RBUlRfQkxPQ0soc2JpLCBHRVRfU0VHX0ZST01fU0VDKHNiaSwgc2Vjbm8p KTsKPj4+ICsgICAgICAgICAgICAgaW50IGRldmkgPSBmMmZzX3RhcmdldF9kZXZpY2VfaW5kZXgo c2JpLCBzdGFydF9ibGspOwo+Pj4gKwo+Pj4gKyAgICAgICAgICAgICBpZiAoZjJmc19kZXZfaXNf cmVzZXJ2aW5nKHNiaSwgZGV2aSkpCj4+PiArICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRy dWU7Cj4+PiArICAgICB9Cj4+PiAgICAgICAgcmV0dXJuIGZhbHNlOwo+Pj4gICAgfQo+Pj4KPj4+ IGRpZmYgLS1naXQgYS9mcy9mMmZzL3N1cGVyLmMgYi9mcy9mMmZzL3N1cGVyLmMKPj4+IGluZGV4 IGM0NDhkOTkyZmYyYS4uZDVkYzgzZTYxM2UyIDEwMDY0NAo+Pj4gLS0tIGEvZnMvZjJmcy9zdXBl ci5jCj4+PiArKysgYi9mcy9mMmZzL3N1cGVyLmMKPj4+IEBAIC01MDAxLDYgKzUwMDEsMzkgQEAg c3RhdGljIHZvaWQgZjJmc190dW5pbmdfcGFyYW1ldGVycyhzdHJ1Y3QgZjJmc19zYl9pbmZvICpz YmkpCj4+PiAgICAgICAgc2JpLT5yZWFkZGlyX3JhID0gdHJ1ZTsKPj4+ICAgIH0KPj4+Cj4+PiAr c3RhdGljIHZvaWQgZjJmc19yZXN0b3JlX2RldmljZV9hbGlhcyhzdHJ1Y3QgZjJmc19zYl9pbmZv ICpzYmkpCj4+PiArewo+Pj4gKyAgICAgc3RydWN0IGlub2RlICpyb290ID0gZF9pbm9kZShzYmkt PnNiLT5zX3Jvb3QpOwo+Pj4gKyAgICAgc3RydWN0IGYyZnNfZGlyX2VudHJ5ICpkZTsKPj4+ICsg ICAgIHN0cnVjdCBmb2xpbyAqZm9saW87Cj4+PiArICAgICBpbnQgaTsKPj4+ICsKPj4+ICsgICAg IGlmICghZjJmc19zYl9oYXNfZGV2aWNlX2FsaWFzKHNiaSkpCj4+PiArICAgICAgICAgICAgIHJl dHVybjsKPj4+ICsKPj4+ICsgICAgIGZvciAoaSA9IDE7IGkgPCBzYmktPnNfbmRldnM7IGkrKykg ewo+Pj4gKyAgICAgICAgICAgICBjaGFyICpuYW1lID0gc3RycmNocihGREVWKGkpLnBhdGgsICcv Jyk7Cj4+PiArICAgICAgICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGU7Cj4+PiArICAgICAgICAg ICAgIHN0cnVjdCBxc3RyIHFzdHI7Cj4+PiArCj4+PiArICAgICAgICAgICAgIG5hbWUgPSBuYW1l ID8gbmFtZSArIDEgOiBGREVWKGkpLnBhdGg7Cj4+PiArICAgICAgICAgICAgIHFzdHIubmFtZSA9 IG5hbWU7Cj4+PiArICAgICAgICAgICAgIHFzdHIubGVuID0gc3RybGVuKG5hbWUpOwo+Pj4gKwo+ Pj4gKyAgICAgICAgICAgICBkZSA9IGYyZnNfZmluZF9lbnRyeShyb290LCAmcXN0ciwgJmZvbGlv KTsKPj4+ICsgICAgICAgICAgICAgaWYgKCFkZSkKPj4+ICsgICAgICAgICAgICAgICAgICAgICBj b250aW51ZTsKPj4+ICsKPj4+ICsgICAgICAgICAgICAgaW5vZGUgPSBmMmZzX2lnZXQoc2JpLT5z YiwgbGUzMl90b19jcHUoZGUtPmlubykpOwo+Pj4gKyAgICAgICAgICAgICBpZiAoIUlTX0VSUihp bm9kZSkpIHsKPj4+ICsgICAgICAgICAgICAgICAgICAgICBpZiAoSVNfREVWSUNFX0FMSUFTSU5H KGlub2RlKSkKPj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERVYoaSkuaGFzX2Fs aWFzID0gdHJ1ZTsKPj4+ICsgICAgICAgICAgICAgICAgICAgICBpcHV0KGlub2RlKTsKPj4+ICsg ICAgICAgICAgICAgfQo+Pj4gKyAgICAgICAgICAgICBmMmZzX2ZvbGlvX3B1dChmb2xpbywgMCk7 Cj4+PiArICAgICB9Cj4+PiArfQo+Pj4gKwo+Pj4gICAgc3RhdGljIGludCBmMmZzX2ZpbGxfc3Vw ZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc3RydWN0IGZzX2NvbnRleHQgKmZjKQo+Pj4gICAg ewo+Pj4gICAgICAgIHN0cnVjdCBmMmZzX2ZzX2NvbnRleHQgKmN0eCA9IGZjLT5mc19wcml2YXRl Owo+Pj4gQEAgLTUyMDksNiArNTI0Miw3IEBAIHN0YXRpYyBpbnQgZjJmc19maWxsX3N1cGVyKHN0 cnVjdCBzdXBlcl9ibG9jayAqc2IsIHN0cnVjdCBmc19jb250ZXh0ICpmYykKPj4+ICAgICAgICBz YmktPmxhc3RfdmFsaWRfYmxvY2tfY291bnQgPSBzYmktPnRvdGFsX3ZhbGlkX2Jsb2NrX2NvdW50 Owo+Pj4gICAgICAgIHNiaS0+cmVzZXJ2ZWRfYmxvY2tzID0gMDsKPj4+ICAgICAgICBzYmktPmN1 cnJlbnRfcmVzZXJ2ZWRfYmxvY2tzID0gMDsKPj4+ICsgICAgIHNiaS0+YWxpYXNfcmVzZXJ2ZWRf YmxvY2tzID0gMDsKPj4+ICAgICAgICBsaW1pdF9yZXNlcnZlX3Jvb3Qoc2JpKTsKPj4+ICAgICAg ICBhZGp1c3RfdW51c2FibGVfY2FwX3BlcmMoc2JpKTsKPj4+Cj4+PiBAQCAtNTQzNiw2ICs1NDcw LDggQEAgc3RhdGljIGludCBmMmZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwg c3RydWN0IGZzX2NvbnRleHQgKmZjKQo+Pj4gICAgICAgIGYyZnNfdXBkYXRlX3RpbWUoc2JpLCBS RVFfVElNRSk7Cj4+PiAgICAgICAgY2xlYXJfc2JpX2ZsYWcoc2JpLCBTQklfQ1BfRElTQUJMRURf UVVJQ0spOwo+Pj4KPj4+ICsgICAgIGYyZnNfcmVzdG9yZV9kZXZpY2VfYWxpYXMoc2JpKTsKPj4+ ICsKPj4+ICAgICAgICBzYmktPnVtb3VudF9sb2NrX2hvbGRlciA9IE5VTEw7Cj4+PiAgICAgICAg cmV0dXJuIDA7Cj4+Pgo+Pj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9mMmZzLmgg Yi9pbmNsdWRlL3VhcGkvbGludXgvZjJmcy5oCj4+PiBpbmRleCA3OTVlMjYyNTgzNTUuLjQ0MDlh ZGEyZmVjYiAxMDA2NDQKPj4+IC0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9mMmZzLmgKPj4+ICsr KyBiL2luY2x1ZGUvdWFwaS9saW51eC9mMmZzLmgKPj4+IEBAIC00NSw2ICs0NSw5IEBACj4+PiAg ICAjZGVmaW5lIEYyRlNfSU9DX1NUQVJUX0FUT01JQ19SRVBMQUNFICAgICAgIF9JTyhGMkZTX0lP Q1RMX01BR0lDLCAyNSkKPj4+ICAgICNkZWZpbmUgRjJGU19JT0NfR0VUX0RFVl9BTElBU19GSUxF IF9JT1IoRjJGU19JT0NUTF9NQUdJQywgMjYsIF9fdTMyKQo+Pj4gICAgI2RlZmluZSBGMkZTX0lP Q19JT19QUklPICAgICAgICAgICAgX0lPVyhGMkZTX0lPQ1RMX01BR0lDLCAyNywgX191MzIpCj4+ PiArI2RlZmluZSBGMkZTX0lPQ19SRVNFUlZFX0RFVl9BTElBUyAgIF9JTyhGMkZTX0lPQ1RMX01B R0lDLCAyOCkKPj4+ICsjZGVmaW5lIEYyRlNfSU9DX1JFTEVBU0VfREVWX0FMSUFTICAgX0lPKEYy RlNfSU9DVExfTUFHSUMsIDI5KQo+Pj4gKyNkZWZpbmUgRjJGU19JT0NfR0VUX0RFVl9BTElBU19T VEFUVVMgICAgICAgIF9JT1IoRjJGU19JT0NUTF9NQUdJQywgMzAsIF9fdTMyKQo+Pj4KPj4+ICAg IC8qCj4+PiAgICAgKiBzaG91bGQgYmUgc2FtZSBhcyBYRlNfSU9DX0dPSU5HRE9XTi4KPj4+IEBA IC03MCw2ICs3MywxMCBAQCBlbnVtIHsKPj4+ICAgICAgICBGMkZTX0lPUFJJT19NQVgsCj4+PiAg ICB9Owo+Pj4KPj4+ICsvKiBmb3IgRjJGU19JT0NfR0VUX0RFVl9BTElBU19TVEFUVVMgKi8KPj4+ ICsjZGVmaW5lIEYyRlNfREVWX0FMSUFTX1NUQVRVU19SRUxFQVNFRCAgICAgICAwCj4+PiArI2Rl ZmluZSBGMkZTX0RFVl9BTElBU19TVEFUVVNfUkVTRVJWRUQgICAgICAgMQo+Pj4gKwo+Pj4gICAg c3RydWN0IGYyZnNfZ2NfcmFuZ2Ugewo+Pj4gICAgICAgIF9fdTMyIHN5bmM7Cj4+PiAgICAgICAg X191NjQgc3RhcnQ7Cj4+CgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fCkxpbnV4LWYyZnMtZGV2ZWwgbWFpbGluZyBsaXN0CkxpbnV4LWYyZnMtZGV2ZWxA bGlzdHMuc291cmNlZm9yZ2UubmV0Cmh0dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3Rz L2xpc3RpbmZvL2xpbnV4LWYyZnMtZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A312E380FEC for ; Tue, 4 Aug 2026 00:42:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785804132; cv=none; b=MYuAHc4aiL94TuRidUwSPraCF5nO1dckML+Vsmy6ikQ9GF6sUXmjQuNs7PeoMOQkqiwRNtzmfHnBn9Maqz89Ay1BBW0hqb2XdxudzwrlcIrsjONr2Wqn+sHXqdoSB9Mtqsr8Sgvn1CO2/XkftTo2xcHvgQuYCpyRRr8RGSCup8g= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785804132; c=relaxed/simple; bh=hIRCHSWJ05otwlPTg6FETGUpiKKp+2RlH/6xNqBhK5Q=; h=Message-ID:Date:MIME-Version:Cc:Subject:To:References:From: In-Reply-To:Content-Type; b=dRBxKiPJMgt42m5lPJu51IjeATNkxafMsUF6V/hU0vITmIQ5MXc57FVFctS9xpMu6KMw7gcAhY/Z0tHes2Y4zkymFLCczlrrt1wIUwuUOqdzJTLgPZLNaA77AHUpIP7AvzDk5NW0Ctc/KYTVGNZQFEc1SYNuuS7X1QfQzigAhZc= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=mysof7iB; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="mysof7iB" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C9D7D1F000E9; Tue, 4 Aug 2026 00:42:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1785804129; bh=0nEWma6foP+NyI8kMkYdMIaAGtIWqlJtNaz8S3IOKXI=; h=Date:Cc:Subject:To:References:From:In-Reply-To; b=mysof7iBoye5EAVOqz3HtDadHrn6wMZH0aTkVvDlsaVfr/Kpep6DWIRTlWd9vh9jU waQ5tKhD/MiOLfOfBrldYh1xj55QuuXGpDg55NUc8U7YiuicZAtkOPp5ltpSrEyxO6 U6QbItcgjcch0p+sDbxAk8oyJlfNT2BV1bSrZwhrSj63gCX+Ke6zalp7eFFt8cP5E/ ixGtEhmkLMmcqemB6jhDQRZQbWt3LV1ySD1CQw3U6XkeOcAfObMm9npYcTvK4C5mcL n1UKTPK7pRqE70+b7d4xFe1AZmdEsp2PUHgZD3X8zF5kg3dwk2FoDpzP2f5m8+0nC5 MS4ebEBewx/+g== Message-ID: <2412b0d4-727e-44a5-a4e3-709dd0d527f9@kernel.org> Date: Tue, 4 Aug 2026 08:42:06 +0800 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Cc: chao@kernel.org, linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, kernel-team@android.com, Daeho Jeong Subject: Re: [f2fs-dev] [PATCH v6] f2fs: support dynamic reserve/release for device aliasing To: Daeho Jeong References: <20260730154618.2166947-1-daeho43@gmail.com> Content-Language: en-US From: Chao Yu In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 8/4/26 00:18, Daeho Jeong wrote: > On Sun, Aug 2, 2026 at 7:00 PM Chao Yu wrote: >> >> On 7/30/26 23:46, Daeho Jeong wrote: >>> From: Daeho Jeong >>> >>> This patch adds a dynamic management feature to the existing device >>> aliasing functionality. It allows users to dynamically reserve or >>> release specific devices from the filesystem's free pool at runtime >>> through new ioctls. >>> >>> To support this, three new ioctls are introduced: >>> - F2FS_IOC_RESERVE_DEV_ALIAS: This reclaims the space occupied by a >>> device aliasing file. It first performs a capacity check, resets GC >>> victim information for the target range, marks the segments as in-use >>> to prevent new allocations, and then triggers GC to migrate existing >>> valid data out of the range. Finally, it reserves these blocks in the >>> SIT to effectively exclude the device from the usable capacity. >>> >>> - F2FS_IOC_RELEASE_DEV_ALIAS: This releases the reserved space of a >>> previously reserved device aliasing file. It truncates the blocks >>> associated with the file, which makes them available for general >>> filesystem allocation again. >>> >>> - F2FS_IOC_GET_DEV_ALIAS_STATUS: This retrieves the current aliasing >>> status of a device aliasing file, returning whether the file is >>> released (inactive alias) or reserved (active alias, with blocks >>> fully allocated on the device). >>> >>> Signed-off-by: Daeho Jeong >>> --- >>> v6: fixed duplicated block reservations and racing w/ mmap. >>> added the extent alignment check for device aliasing areas. >>> v5: prevented new segment allocation on devices undergoing reservation >>> or with active aliases. >>> used in-memory struct to reserve blocks for device aliasing. >>> cleared prefree (PRE) dirty segment bitmap. >>> v4: renamed interfaces. >>> fixed race conditions between checkpoint=disable mount and ioctls. >>> refactored segment reservation part. >>> modified lock usage. >>> v3: add CAP_SYS_ADMIN and checkpoint=disabled check. >>> remove a f2fs specific flag exposed with getflags. >>> v2: prevent operations during checkpoint=disabled. >>> --- >>> --- >>> Documentation/filesystems/f2fs.rst | 35 ++++ >>> fs/f2fs/data.c | 4 +- >>> fs/f2fs/extent_cache.c | 7 + >>> fs/f2fs/f2fs.h | 19 +- >>> fs/f2fs/file.c | 273 ++++++++++++++++++++++++++++- >>> fs/f2fs/gc.c | 30 ++-- >>> fs/f2fs/namei.c | 14 ++ >>> fs/f2fs/segment.c | 176 +++++++++++++------ >>> fs/f2fs/segment.h | 22 +++ >>> fs/f2fs/super.c | 36 ++++ >>> include/uapi/linux/f2fs.h | 7 + >>> 11 files changed, 555 insertions(+), 68 deletions(-) >>> >>> diff --git a/Documentation/filesystems/f2fs.rst b/Documentation/filesystems/f2fs.rst >>> index 8c4a14ae444f..1a5fd4afe609 100644 >>> --- a/Documentation/filesystems/f2fs.rst >>> +++ b/Documentation/filesystems/f2fs.rst >>> @@ -1045,6 +1045,41 @@ So, the key idea is, user can do any file operations on /dev/vdc, and >>> reclaim the space after the use, while the space is counted as /data. >>> That doesn't require modifying partition size and filesystem format. >>> >>> +Dynamic Device Aliasing Management >>> +---------------------------------- >>> + >>> +In addition to static device aliasing by deleting the aliasing file, F2FS >>> +supports dynamic management of device aliasing. This mechanism allows the system >>> +to dynamically transition partition ownership between F2FS userdata and external >>> +entities (e.g., zRAM, raw partition) based on system requirements without >>> +deleting the master aliasing file or requiring unmount/remount. >>> + >>> +The master aliasing file is created during the initial format of the file system >>> +and remains as a persistent control entity (ioctl gateway) in the root directory. >>> + >>> +- Partition Reservation (In-service to Aliased) >>> + When a specific partition needs to be dedicated to external services (e.g., zRAM), >>> + a user can reserve the device alias range via ioctl. The kernel resets GC victim >>> + information for the target range, marks segments as in-use to prevent new >>> + allocations, and triggers forced GC to migrate existing valid data out of the >>> + range. Finally, it reserves these blocks in the SIT to effectively exclude the >>> + device from the usable capacity. >>> + >>> +- Partition Release (Aliased to In-service) >>> + When external usage concludes, the space is reclaimed not by deleting the file, >>> + but through the release ioctl. The kernel truncates blocks associated with >>> + the file, releasing them back to general filesystem allocation. >>> + >>> +.. code-block:: >>> + >>> + # f2fs_io dev_alias release /mnt/f2fs/vdc.file >>> + # df -h >>> + /dev/vdb 64G 753M 64G 2% /mnt/f2fs >>> + >>> + # f2fs_io dev_alias reserve /mnt/f2fs/vdc.file >>> + # df -h >>> + /dev/vdb 64G 33G 32G 52% /mnt/f2fs >>> + >>> Per-file Read-Only Large Folio Support >>> -------------------------------------- >>> >>> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c >>> index ac1cf4de3d62..892d594048b7 100644 >>> --- a/fs/f2fs/data.c >>> +++ b/fs/f2fs/data.c >>> @@ -1270,7 +1270,7 @@ int f2fs_reserve_new_blocks(struct dnode_of_data *dn, blkcnt_t count) >>> >>> if (unlikely(is_inode_flag_set(dn->inode, FI_NO_ALLOC))) >>> return -EPERM; >>> - err = inc_valid_block_count(sbi, dn->inode, &count, true); >>> + err = inc_valid_block_count(sbi, dn->inode, &count, true, false); >>> if (unlikely(err)) >>> return err; >>> >>> @@ -1542,7 +1542,7 @@ static int __allocate_data_block(struct dnode_of_data *dn, int seg_type) >>> >>> dn->data_blkaddr = f2fs_data_blkaddr(dn); >>> if (dn->data_blkaddr == NULL_ADDR) { >>> - err = inc_valid_block_count(sbi, dn->inode, &count, true); >>> + err = inc_valid_block_count(sbi, dn->inode, &count, true, false); >>> if (unlikely(err)) >>> return err; >>> } >>> diff --git a/fs/f2fs/extent_cache.c b/fs/f2fs/extent_cache.c >>> index 61f6b9714366..3a737db0c9e1 100644 >>> --- a/fs/f2fs/extent_cache.c >>> +++ b/fs/f2fs/extent_cache.c >>> @@ -62,6 +62,13 @@ bool sanity_check_extent_cache(struct inode *inode, struct folio *ifolio) >>> __func__, inode->i_ino, ei.blk, ei.fofs, ei.len); >>> return false; >>> } >>> + >>> + if ((ei.blk % BLKS_PER_SEC(sbi)) || (ei.len % BLKS_PER_SEC(sbi))) { >>> + f2fs_warn(sbi, "%s: device alias inode (ino=%llx)'s extent info [%u, %u, %u] is not aligned to section size %u", >>> + __func__, inode->i_ino, ei.blk, ei.fofs, ei.len, >>> + BLKS_PER_SEC(sbi)); >>> + return false; >>> + } >>> return true; >>> } >>> >>> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h >>> index f1774d4e18d2..f24e30bb5c3d 100644 >>> --- a/fs/f2fs/f2fs.h >>> +++ b/fs/f2fs/f2fs.h >>> @@ -1404,6 +1404,8 @@ struct f2fs_dev_info { >>> unsigned int total_segments; >>> block_t start_blk; >>> block_t end_blk; >>> + bool has_alias; >>> + bool is_reserving; >>> #ifdef CONFIG_BLK_DEV_ZONED >>> unsigned int nr_blkz; /* Total number of zones */ >>> unsigned long *blkz_seq; /* Bitmap indicating sequential zones */ >>> @@ -1857,6 +1859,7 @@ struct f2fs_sb_info { >>> block_t last_valid_block_count; /* for recovery */ >>> block_t reserved_blocks; /* configurable reserved blocks */ >>> block_t current_reserved_blocks; /* current reserved blocks */ >>> + block_t alias_reserved_blocks; /* reserved blocks for device alias */ >>> >>> /* Additional tracking for no checkpoint mode */ >>> block_t unusable_block_count; /* # of blocks saved by last cp */ >>> @@ -2559,7 +2562,8 @@ static inline unsigned int get_available_block_count(struct f2fs_sb_info *sbi, >>> block_t avail_user_block_count; >>> >>> avail_user_block_count = sbi->user_block_count - >>> - sbi->current_reserved_blocks; >>> + sbi->current_reserved_blocks - >>> + sbi->alias_reserved_blocks; >>> >>> if (test_opt(sbi, RESERVE_ROOT) && !__allow_reserved_root(sbi, inode, cap)) >>> avail_user_block_count -= F2FS_OPTION(sbi).root_reserved_blocks; >>> @@ -2576,7 +2580,8 @@ static inline unsigned int get_available_block_count(struct f2fs_sb_info *sbi, >>> >>> static inline void f2fs_i_blocks_write(struct inode *, block_t, bool, bool); >>> static inline int inc_valid_block_count(struct f2fs_sb_info *sbi, >>> - struct inode *inode, blkcnt_t *count, bool partial) >>> + struct inode *inode, blkcnt_t *count, >>> + bool partial, bool alias_reserved) >>> { >>> long long diff = 0, release = 0; >>> block_t avail_user_block_count; >>> @@ -2599,10 +2604,16 @@ static inline int inc_valid_block_count(struct f2fs_sb_info *sbi, >>> >>> spin_lock(&sbi->stat_lock); >>> >>> + if (alias_reserved) >>> + sbi->alias_reserved_blocks -= *count; >>> + >>> avail_user_block_count = get_available_block_count(sbi, inode, true); >>> diff = (long long)sbi->total_valid_block_count + *count - >>> avail_user_block_count; >>> if (unlikely(diff > 0)) { >>> + if (alias_reserved) >>> + sbi->alias_reserved_blocks += *count; >>> + >>> if (!partial) { >>> spin_unlock(&sbi->stat_lock); >>> release = *count; >>> @@ -4010,6 +4021,8 @@ int f2fs_flush_device_cache(struct f2fs_sb_info *sbi); >>> void f2fs_destroy_flush_cmd_control(struct f2fs_sb_info *sbi, bool free); >>> void f2fs_invalidate_blocks(struct f2fs_sb_info *sbi, block_t addr, >>> unsigned int len); >>> +void f2fs_reserve_device_alias(struct f2fs_sb_info *sbi, block_t addr, >>> + unsigned int len); >>> bool f2fs_is_checkpointed_data(struct f2fs_sb_info *sbi, block_t blkaddr); >>> int f2fs_start_discard_thread(struct f2fs_sb_info *sbi); >>> void f2fs_drop_discard_cmd(struct f2fs_sb_info *sbi); >>> @@ -4231,6 +4244,8 @@ void f2fs_build_gc_manager(struct f2fs_sb_info *sbi); >>> int f2fs_gc_range(struct f2fs_sb_info *sbi, >>> unsigned int start_seg, unsigned int end_seg, >>> bool dry_run, unsigned int dry_run_sections); >>> +void f2fs_reset_gc_victim_resource(struct f2fs_sb_info *sbi, >>> + unsigned int start, unsigned int end); >>> int f2fs_resize_fs(struct file *filp, __u64 block_count); >>> int __init f2fs_create_garbage_collection_cache(void); >>> void f2fs_destroy_garbage_collection_cache(void); >>> diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c >>> index 4b52c56d71f0..835f10bc59b5 100644 >>> --- a/fs/f2fs/file.c >>> +++ b/fs/f2fs/file.c >>> @@ -813,13 +813,19 @@ int f2fs_do_truncate_blocks(struct inode *inode, u64 from, bool lock) >>> >>> if (IS_DEVICE_ALIASING(inode)) { >>> struct extent_tree *et = F2FS_I(inode)->extent_tree[EX_READ]; >>> - struct extent_info ei = et->largest; >>> + struct extent_info ei; >>> + >>> + read_lock(&et->lock); >>> + ei = et->largest; >>> + read_unlock(&et->lock); >>> >>> f2fs_invalidate_blocks(sbi, ei.blk, ei.len); >>> >>> dec_valid_block_count(sbi, inode, ei.len); >>> f2fs_update_time(sbi, REQ_TIME); >>> >>> + f2fs_drop_extent_tree(inode); >>> + >>> f2fs_folio_put(ifolio, true); >>> goto out; >>> } >>> @@ -1100,8 +1106,9 @@ int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry, >>> if ((attr->ia_valid & ATTR_SIZE)) { >>> if (mapping_large_folio_support(inode->i_mapping)) >>> return -EOPNOTSUPP; >>> - if (!f2fs_is_compress_backend_ready(inode) || >>> - IS_DEVICE_ALIASING(inode)) >>> + if (IS_DEVICE_ALIASING(inode)) >>> + return -EPERM; >>> + if (!f2fs_is_compress_backend_ready(inode)) >>> return -EOPNOTSUPP; >>> if (is_inode_flag_set(inode, FI_COMPRESS_RELEASED) && >>> !IS_ALIGNED(attr->ia_size, >>> @@ -2130,6 +2137,9 @@ static int f2fs_setflags_common(struct inode *inode, u32 iflags, u32 mask) >>> if (IS_NOQUOTA(inode)) >>> return -EPERM; >>> >>> + if (IS_DEVICE_ALIASING(inode)) >>> + return -EPERM; >>> + >>> if ((iflags ^ masked_flags) & F2FS_CASEFOLD_FL) { >>> if (!f2fs_sb_has_casefold(F2FS_I_SB(inode))) >>> return -EOPNOTSUPP; >>> @@ -2678,6 +2688,17 @@ static int f2fs_ioc_get_encryption_policy(struct file *filp, unsigned long arg) >>> return fscrypt_ioctl_get_policy(filp, (void __user *)arg); >>> } >>> >>> +static int f2fs_ioc_get_dev_alias_status(struct file *filp, unsigned long arg) >>> +{ >>> + struct inode *inode = file_inode(filp); >>> + >>> + if (!IS_DEVICE_ALIASING(inode)) >>> + return -EINVAL; >>> + >>> + return put_user(F2FS_HAS_BLOCKS(inode) ? F2FS_DEV_ALIAS_STATUS_RESERVED : >>> + F2FS_DEV_ALIAS_STATUS_RELEASED, (u32 __user *)arg); >>> +} >>> + >>> static int f2fs_ioc_get_encryption_pwsalt(struct file *filp, unsigned long arg) >>> { >>> struct inode *inode = file_inode(filp); >>> @@ -3616,6 +3637,241 @@ static int f2fs_ioc_get_dev_alias_file(struct file *filp, unsigned long arg) >>> (u32 __user *)arg); >>> } >>> >>> +static bool f2fs_get_dev_alias_extent(struct f2fs_sb_info *sbi, >>> + struct dentry *dentry, >>> + struct extent_info *ei) >>> +{ >>> + int i; >>> + >>> + for (i = 1; i < sbi->s_ndevs; i++) { >>> + char *name = strrchr(FDEV(i).path, '/'); >>> + >>> + name = name ? name + 1 : FDEV(i).path; >>> + if (strcmp(name, dentry->d_name.name)) >>> + continue; >>> + >>> + ei->blk = FDEV(i).start_blk; >>> + ei->len = FDEV(i).total_segments << sbi->log_blocks_per_seg; >>> + ei->fofs = 0; >>> + return true; >>> + } >>> + return false; >>> +} >>> + >>> +static int f2fs_ioc_reserve_dev_alias(struct file *filp) >>> +{ >>> + struct inode *inode = file_inode(filp); >>> + struct f2fs_sb_info *sbi = F2FS_I_SB(inode); >>> + struct extent_tree *et = F2FS_I(inode)->extent_tree[EX_READ]; >>> + struct extent_info ei; >>> + struct cp_control cpc = { CP_SYNC, 0, 0, 0 }; >>> + struct f2fs_lock_context lc, glc; >>> + blkcnt_t count; >>> + unsigned int start, end; >>> + int type, err; >>> + >>> + if (!capable(CAP_SYS_ADMIN)) >>> + return -EPERM; >>> + >>> + if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) >>> + return -EINVAL; >>> + >>> + err = mnt_want_write_file(filp); >>> + if (err) >>> + return err; >>> + >>> + inode_lock(inode); >>> + >>> + if (!IS_DEVICE_ALIASING(inode)) { >>> + err = -EINVAL; >>> + goto out_inode_unlock; >>> + } >>> + >>> + if (F2FS_HAS_BLOCKS(inode)) { >>> + err = 0; >>> + goto out_inode_unlock; >>> + } >>> + >>> + if (!f2fs_get_dev_alias_extent(sbi, filp->f_path.dentry, &ei)) { >>> + f2fs_warn(sbi, "device alias file (%s, ino=%llu) has no matching device", >>> + filp->f_path.dentry->d_name.name, >>> + (unsigned long long)inode->i_ino); >>> + set_sbi_flag(sbi, SBI_NEED_FSCK); >>> + f2fs_handle_error(sbi, ERROR_CORRUPTED_INODE); >>> + err = -EFSCORRUPTED; >>> + goto out_inode_unlock; >>> + } >>> + >>> + spin_lock(&sbi->stat_lock); >>> + if (sbi->total_valid_block_count + ei.len > >>> + get_available_block_count(sbi, inode, true)) { >>> + spin_unlock(&sbi->stat_lock); >>> + err = -ENOSPC; >>> + goto out_inode_unlock; >>> + } >>> + sbi->alias_reserved_blocks += ei.len; >>> + spin_unlock(&sbi->stat_lock); >>> + >>> + spin_lock(&FREE_I(sbi)->segmap_lock); >>> + FDEV(f2fs_target_device_index(sbi, ei.blk)).is_reserving = true; >>> + spin_unlock(&FREE_I(sbi)->segmap_lock); >>> + >>> + start = GET_SEGNO(sbi, ei.blk); >>> + end = GET_SEGNO(sbi, ei.blk + ei.len - 1); >>> + >>> + /* Acquire gc_lock for victim reset, curseg resize, and range GC */ >>> + f2fs_down_write_trace(&sbi->gc_lock, &glc); >>> + >>> + /* Reset the victim information to prevent GC from targeting the range */ >>> + f2fs_reset_gc_victim_resource(sbi, start, end); >>> + >>> + /* Move out cursegs from the target range */ >>> + for (type = CURSEG_HOT_DATA; type < NR_CURSEG_PERSIST_TYPE; type++) { >>> + err = f2fs_allocate_segment_for_resize(sbi, type, start, end); >>> + if (err) >>> + goto out_gc_unlock; >>> + } >>> + >>> + f2fs_lock_op(sbi, &lc); >>> + >>> + if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) { >>> + err = -EINVAL; >>> + f2fs_unlock_op(sbi, &lc); >>> + goto out_gc_unlock; >>> + } >>> + >>> + /* do GC to move out valid blocks in the range all at once! */ >>> + err = f2fs_gc_range(sbi, start, end, false, 0); >>> + if (err) { >>> + f2fs_unlock_op(sbi, &lc); >>> + goto out_gc_unlock; >>> + } >>> + >>> + count = ei.len; >>> + err = inc_valid_block_count(sbi, inode, &count, false, true); >>> + if (err) { >>> + f2fs_unlock_op(sbi, &lc); >>> + goto out_gc_unlock; >>> + } >>> + >>> + write_lock(&et->lock); >>> + et->largest = ei; >>> + write_unlock(&et->lock); >>> + clear_inode_flag(inode, FI_NO_EXTENT); >>> + >>> + f2fs_reserve_device_alias(sbi, ei.blk, ei.len); >>> + >>> + i_size_write(inode, (loff_t)ei.len << sbi->log_blocksize); >>> + f2fs_update_inode_page(inode); >>> + >>> + spin_lock(&FREE_I(sbi)->segmap_lock); >>> + FDEV(f2fs_target_device_index(sbi, ei.blk)).is_reserving = false; >>> + spin_unlock(&FREE_I(sbi)->segmap_lock); >>> + >>> + f2fs_unlock_op(sbi, &lc); >>> + f2fs_up_write_trace(&sbi->gc_lock, &glc); >> >> Do we need to call f2fs_write_checkpoint(sbi, &cpc) here to make sure persist >> device alias file first? to avoid following f2fs_ioc_release_dev_alias() racin >> w/ f2fs_ioc_reserve_dev_alias()? >> >> - f2fs_ioc_reserve_dev_alias - f2fs_ioc_release_dev_alias >> ... >> - f2fs_unlock_op >> - f2fs_up_write_trace(gc_lock) >> - inode_unlock >> - inode_lock >> ... >> - f2fs_write_checkpoint > > Hi Chao, > > I couldn't get your point. Could you elaborate more, if I missed it? Hi Daeho, Actually, what I mean is if f2fs_write_checkpoint() is not covered by inode lock, in race condition there will be below invoking serial: Assume: f2fs_ioc_reserve_dev_alias := reserve_dev_alias + f2fs_write_checkpoint f2fs_ioc_release_dev_alias := release_dev_alias + f2fs_write_checkpoint 1) Thread A: reserve_dev_alias 2) Thread B: release_dev_alias 3) Thread C: reserve_dev_alias 4) Thread B: f2fs_write_checkpoint 5) Thread A: f2fs_write_checkpoint 6) Thread C: f2fs_write_checkpoint After 1) all data after reserve_dev_alias() are not checkpointed, then the following release_dev_alias in 2) won't encounter any issue, right? and the same quetions for 3). IOW, reserve_dev_alias/release_dev_alias doesn't need to rely on checkpointed state of each other, am I understand it correctly? if so there won't be any issue. > > 1. In-memory state is already atomic (No Race): > Before inode_unlock(), all in-memory metadata (extent_tree, SIT > segment bitmaps, i_size, and dirty inode page) are fully updated under > inode_lock + f2fs_lock_op. A subsequent f2fs_ioc_release_dev_alias() > will observe a complete, consistent state. > > 2. On-disk consistency & crash safety: > Checkpoints are serialized internally via cp_mutex / > f2fs_lock_all(). Regardless of the checkpoint execution timing or any > sudden power-off (SPO) between the two ioctls, the filesystem always > recovers to the last committed atomic checkpoint without metadata > corruption. Thanks for the explanation. Thanks, > > Thanks, > >> >>> + >>> + inode_unlock(inode); >>> + mnt_drop_write_file(filp); >>> + >>> + return f2fs_write_checkpoint(sbi, &cpc); >>> + >>> +out_gc_unlock: >>> + spin_lock(&sbi->stat_lock); >>> + sbi->alias_reserved_blocks -= ei.len; >>> + spin_unlock(&sbi->stat_lock); >>> + >>> + spin_lock(&FREE_I(sbi)->segmap_lock); >>> + FDEV(f2fs_target_device_index(sbi, ei.blk)).is_reserving = false; >>> + spin_unlock(&FREE_I(sbi)->segmap_lock); >>> + f2fs_up_write_trace(&sbi->gc_lock, &glc); >>> + >>> +out_inode_unlock: >>> + inode_unlock(inode); >>> + mnt_drop_write_file(filp); >>> + return err; >>> +} >>> + >>> +static int f2fs_ioc_release_dev_alias(struct file *filp) >>> +{ >>> + struct inode *inode = file_inode(filp); >>> + struct f2fs_sb_info *sbi = F2FS_I_SB(inode); >>> + struct extent_tree *et = F2FS_I(inode)->extent_tree[EX_READ]; >>> + struct extent_info ei = {0, }; >>> + struct cp_control cpc = { CP_SYNC, 0, 0, 0 }; >>> + struct f2fs_lock_context lc, glc; >>> + int err; >>> + >>> + if (!capable(CAP_SYS_ADMIN)) >>> + return -EPERM; >>> + >>> + if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) >>> + return -EINVAL; >>> + >>> + err = mnt_want_write_file(filp); >>> + if (err) >>> + return err; >>> + >>> + inode_lock(inode); >>> + >>> + if (!IS_DEVICE_ALIASING(inode)) { >>> + err = -EINVAL; >>> + goto out_inode_unlock; >>> + } >>> + >>> + if (!F2FS_HAS_BLOCKS(inode)) { >>> + err = 0; >>> + goto out_inode_unlock; >>> + } >>> + >>> + err = filemap_write_and_wait(inode->i_mapping); >>> + if (err) >>> + goto out_inode_unlock; >>> + >>> + read_lock(&et->lock); >>> + ei = et->largest; >>> + read_unlock(&et->lock); >>> + >>> + f2fs_down_write_trace(&sbi->gc_lock, &glc); >>> + f2fs_lock_op(sbi, &lc); >>> + >>> + if (unlikely(is_sbi_flag_set(sbi, SBI_CP_DISABLED))) { >>> + err = -EINVAL; >>> + f2fs_unlock_op(sbi, &lc); >>> + f2fs_up_write_trace(&sbi->gc_lock, &glc); >>> + goto out_inode_unlock; >>> + } >>> + >>> + filemap_invalidate_lock(inode->i_mapping); >>> + truncate_setsize(inode, 0); >>> + >>> + err = f2fs_truncate_blocks(inode, 0, false); >>> + if (err) >>> + i_size_write(inode, (loff_t)ei.len << sbi->log_blocksize); >>> + filemap_invalidate_unlock(inode->i_mapping); >>> + >>> + if (err) { >>> + f2fs_unlock_op(sbi, &lc); >>> + f2fs_up_write_trace(&sbi->gc_lock, &glc); >>> + goto out_inode_unlock; >>> + } >>> + >>> + f2fs_update_inode_page(inode); >>> + >>> + f2fs_unlock_op(sbi, &lc); >>> + f2fs_up_write_trace(&sbi->gc_lock, &glc); >> >> err = f2fs_write_checkpoint(sbi, &cpc); >> >> Thanks, >> >>> + >>> + inode_unlock(inode); >>> + mnt_drop_write_file(filp); >>> + >>> + return f2fs_write_checkpoint(sbi, &cpc); >>> + >>> +out_inode_unlock: >>> + inode_unlock(inode); >>> + mnt_drop_write_file(filp); >>> + return err; >>> +} >>> + >>> static int f2fs_ioc_io_prio(struct file *filp, unsigned long arg) >>> { >>> struct inode *inode = file_inode(filp); >>> @@ -4041,7 +4297,7 @@ static int reserve_compress_blocks(struct dnode_of_data *dn, pgoff_t count, >>> } >>> >>> ret = inc_valid_block_count(sbi, dn->inode, >>> - &to_reserved, false); >>> + &to_reserved, false, false); >>> if (unlikely(ret)) >>> return ret; >>> >>> @@ -4742,8 +4998,14 @@ static long __f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) >>> return f2fs_ioc_compress_file(filp); >>> case F2FS_IOC_GET_DEV_ALIAS_FILE: >>> return f2fs_ioc_get_dev_alias_file(filp, arg); >>> + case F2FS_IOC_GET_DEV_ALIAS_STATUS: >>> + return f2fs_ioc_get_dev_alias_status(filp, arg); >>> case F2FS_IOC_IO_PRIO: >>> return f2fs_ioc_io_prio(filp, arg); >>> + case F2FS_IOC_RESERVE_DEV_ALIAS: >>> + return f2fs_ioc_reserve_dev_alias(filp); >>> + case F2FS_IOC_RELEASE_DEV_ALIAS: >>> + return f2fs_ioc_release_dev_alias(filp); >>> default: >>> return -ENOTTY; >>> } >>> @@ -5530,7 +5792,10 @@ long f2fs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) >>> case F2FS_IOC_DECOMPRESS_FILE: >>> case F2FS_IOC_COMPRESS_FILE: >>> case F2FS_IOC_GET_DEV_ALIAS_FILE: >>> + case F2FS_IOC_GET_DEV_ALIAS_STATUS: >>> case F2FS_IOC_IO_PRIO: >>> + case F2FS_IOC_RESERVE_DEV_ALIAS: >>> + case F2FS_IOC_RELEASE_DEV_ALIAS: >>> break; >>> default: >>> return -ENOIOCTLCMD; >>> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c >>> index ffaa7ba76a1b..93bcb35a5b5d 100644 >>> --- a/fs/f2fs/gc.c >>> +++ b/fs/f2fs/gc.c >>> @@ -2197,29 +2197,37 @@ int f2fs_gc_range(struct f2fs_sb_info *sbi, >>> return 0; >>> } >>> >>> +void f2fs_reset_gc_victim_resource(struct f2fs_sb_info *sbi, >>> + unsigned int start, unsigned int end) >>> +{ >>> + int i; >>> + >>> + mutex_lock(&DIRTY_I(sbi)->seglist_lock); >>> + for (i = 0; i < MAX_GC_POLICY; i++) >>> + if (SIT_I(sbi)->last_victim[i] >= start && >>> + SIT_I(sbi)->last_victim[i] <= end) >>> + SIT_I(sbi)->last_victim[i] = 0; >>> + >>> + for (i = BG_GC; i <= FG_GC; i++) >>> + if (sbi->next_victim_seg[i] >= start && >>> + sbi->next_victim_seg[i] <= end) >>> + sbi->next_victim_seg[i] = NULL_SEGNO; >>> + mutex_unlock(&DIRTY_I(sbi)->seglist_lock); >>> +} >>> + >>> static int free_segment_range(struct f2fs_sb_info *sbi, >>> unsigned int secs, bool dry_run) >>> { >>> unsigned int next_inuse, start, end; >>> struct cp_control cpc = { CP_RESIZE, 0, 0, 0 }; >>> - int gc_mode, gc_type; >>> int err = 0; >>> int type; >>> >>> - /* Force block allocation for GC */ >>> MAIN_SECS(sbi) -= secs; >>> start = MAIN_SECS(sbi) * SEGS_PER_SEC(sbi); >>> end = MAIN_SEGS(sbi) - 1; >>> >>> - mutex_lock(&DIRTY_I(sbi)->seglist_lock); >>> - for (gc_mode = 0; gc_mode < MAX_GC_POLICY; gc_mode++) >>> - if (SIT_I(sbi)->last_victim[gc_mode] >= start) >>> - SIT_I(sbi)->last_victim[gc_mode] = 0; >>> - >>> - for (gc_type = BG_GC; gc_type <= FG_GC; gc_type++) >>> - if (sbi->next_victim_seg[gc_type] >= start) >>> - sbi->next_victim_seg[gc_type] = NULL_SEGNO; >>> - mutex_unlock(&DIRTY_I(sbi)->seglist_lock); >>> + f2fs_reset_gc_victim_resource(sbi, start, end); >>> >>> /* Move out cursegs from the target range */ >>> for (type = CURSEG_HOT_DATA; type < NR_CURSEG_PERSIST_TYPE; type++) { >>> diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c >>> index cac03b8e91a1..8c3b57987f6c 100644 >>> --- a/fs/f2fs/namei.c >>> +++ b/fs/f2fs/namei.c >>> @@ -425,6 +425,9 @@ static int f2fs_link(struct dentry *old_dentry, struct inode *dir, >>> if (!f2fs_is_checkpoint_ready(sbi)) >>> return -ENOSPC; >>> >>> + if (IS_DEVICE_ALIASING(inode)) >>> + return -EPERM; >>> + >>> err = fscrypt_prepare_link(old_dentry, dir, dentry); >>> if (err) >>> return err; >>> @@ -568,6 +571,9 @@ static int f2fs_unlink(struct inode *dir, struct dentry *dentry) >>> >>> trace_f2fs_unlink_enter(dir, dentry); >>> >>> + if (IS_DEVICE_ALIASING(inode)) >>> + return -EPERM; >>> + >>> if (unlikely(f2fs_cp_error(sbi))) { >>> err = -EIO; >>> goto out; >>> @@ -946,6 +952,9 @@ static int f2fs_rename(struct mnt_idmap *idmap, struct inode *old_dir, >>> bool old_is_dir = S_ISDIR(old_inode->i_mode); >>> int err; >>> >>> + if (IS_DEVICE_ALIASING(old_inode)) >>> + return -EPERM; >>> + >>> if (unlikely(f2fs_cp_error(sbi))) >>> return -EIO; >>> if (!f2fs_is_checkpoint_ready(sbi)) >>> @@ -1016,6 +1025,8 @@ static int f2fs_rename(struct mnt_idmap *idmap, struct inode *old_dir, >>> } >>> >>> if (new_inode) { >>> + if (IS_DEVICE_ALIASING(new_inode)) >>> + return -EPERM; >>> >>> err = -ENOTEMPTY; >>> if (old_is_dir && !f2fs_empty_dir(new_inode)) >>> @@ -1143,6 +1154,9 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry, >>> int old_nlink = 0, new_nlink = 0; >>> int err; >>> >>> + if (IS_DEVICE_ALIASING(old_inode) || IS_DEVICE_ALIASING(new_inode)) >>> + return -EPERM; >>> + >>> if (unlikely(f2fs_cp_error(sbi))) >>> return -EIO; >>> if (!f2fs_is_checkpoint_ready(sbi)) >>> diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c >>> index d71ddb3ee918..d70dc5ef3de4 100644 >>> --- a/fs/f2fs/segment.c >>> +++ b/fs/f2fs/segment.c >>> @@ -261,7 +261,7 @@ static int __replace_atomic_write_block(struct inode *inode, pgoff_t index, >>> } else { >>> blkcnt_t count = 1; >>> >>> - err = inc_valid_block_count(sbi, inode, &count, true); >>> + err = inc_valid_block_count(sbi, inode, &count, true, false); >>> if (err) { >>> f2fs_put_dnode(&dn); >>> return err; >>> @@ -2502,35 +2502,42 @@ static int update_sit_entry_for_alloc(struct f2fs_sb_info *sbi, struct seg_entry >>> unsigned int segno, block_t blkaddr, unsigned int offset, int del) >>> { >>> bool exist; >>> + int del_count = del; >>> + int i; >>> >>> - exist = f2fs_test_and_set_bit(offset, se->cur_valid_map); >>> - if (unlikely(exist)) { >>> - f2fs_err(sbi, "Bitmap was wrongly set, blk:%u", blkaddr); >>> - f2fs_bug_on(sbi, 1); >>> - se->valid_blocks--; >>> - del = 0; >>> - } >>> + f2fs_bug_on(sbi, GET_SEGNO(sbi, blkaddr) != GET_SEGNO(sbi, blkaddr + del_count - 1)); >>> >>> - if (f2fs_block_unit_discard(sbi) && >>> - !f2fs_test_and_set_bit(offset, se->discard_map)) >>> - sbi->discard_blks--; >>> + for (i = 0; i < del_count; i++) { >>> + exist = f2fs_test_and_set_bit(offset + i, se->cur_valid_map); >>> + if (unlikely(exist)) { >>> + f2fs_err(sbi, "Bitmap was wrongly set, blk:%u", blkaddr + i); >>> + f2fs_bug_on(sbi, 1); >>> + se->valid_blocks--; >>> + del -= 1; >>> + continue; >>> + } >>> >>> - /* >>> - * SSR should never reuse block which is checkpointed >>> - * or newly invalidated. >>> - */ >>> - if (!is_sbi_flag_set(sbi, SBI_CP_DISABLED)) { >>> - if (!f2fs_test_and_set_bit(offset, se->ckpt_valid_map)) { >>> - se->ckpt_valid_blocks++; >>> - if (__is_large_section(sbi)) >>> - get_sec_entry(sbi, segno)->ckpt_valid_blocks++; >>> + if (f2fs_block_unit_discard(sbi) && >>> + !f2fs_test_and_set_bit(offset + i, se->discard_map)) >>> + sbi->discard_blks--; >>> + >>> + /* >>> + * SSR should never reuse block which is checkpointed >>> + * or newly invalidated. >>> + */ >>> + if (!is_sbi_flag_set(sbi, SBI_CP_DISABLED)) { >>> + if (!f2fs_test_and_set_bit(offset + i, se->ckpt_valid_map)) { >>> + se->ckpt_valid_blocks++; >>> + if (__is_large_section(sbi)) >>> + get_sec_entry(sbi, segno)->ckpt_valid_blocks++; >>> + } >>> } >>> - } >>> >>> - if (!f2fs_test_bit(offset, se->ckpt_valid_map)) { >>> - se->ckpt_valid_blocks += del; >>> - if (__is_large_section(sbi)) >>> - get_sec_entry(sbi, segno)->ckpt_valid_blocks += del; >>> + if (!f2fs_test_bit(offset + i, se->ckpt_valid_map)) { >>> + se->ckpt_valid_blocks += 1; >>> + if (__is_large_section(sbi)) >>> + get_sec_entry(sbi, segno)->ckpt_valid_blocks += 1; >>> + } >>> } >>> >>> if (__is_large_section(sbi)) >>> @@ -2585,9 +2592,14 @@ void f2fs_invalidate_blocks(struct f2fs_sb_info *sbi, block_t addr, >>> unsigned int segno = GET_SEGNO(sbi, addr); >>> struct sit_info *sit_i = SIT_I(sbi); >>> block_t addr_start = addr, addr_end = addr + len - 1; >>> - unsigned int seg_num = GET_SEGNO(sbi, addr_end) - segno + 1; >>> + unsigned int seg_num; >>> unsigned int i = 1, max_blocks = sbi->blocks_per_seg, cnt; >>> >>> + if (len == 0) >>> + return; >>> + >>> + seg_num = GET_SEGNO(sbi, addr_end) - segno + 1; >>> + >>> f2fs_bug_on(sbi, addr == NULL_ADDR); >>> if (addr == NEW_ADDR || addr == COMPRESS_ADDR) >>> return; >>> @@ -2620,6 +2632,52 @@ void f2fs_invalidate_blocks(struct f2fs_sb_info *sbi, block_t addr, >>> up_write(&sit_i->sentry_lock); >>> } >>> >>> +void f2fs_reserve_device_alias(struct f2fs_sb_info *sbi, block_t addr, >>> + unsigned int len) >>> +{ >>> + unsigned int segno = GET_SEGNO(sbi, addr); >>> + struct sit_info *sit_i = SIT_I(sbi); >>> + block_t addr_start = addr, addr_end = addr + len - 1; >>> + unsigned int seg_num; >>> + unsigned int i = 1, max_blocks = sbi->blocks_per_seg, cnt; >>> + >>> + if (len == 0) >>> + return; >>> + >>> + seg_num = GET_SEGNO(sbi, addr_end) - segno + 1; >>> + >>> + down_write(&sit_i->sentry_lock); >>> + >>> + if (seg_num == 1) >>> + cnt = len; >>> + else >>> + cnt = max_blocks - GET_BLKOFF_FROM_SEG0(sbi, addr); >>> + >>> + do { >>> + update_segment_mtime(sbi, addr_start, 0); >>> + update_sit_entry(sbi, addr_start, cnt); >>> + __set_test_and_inuse(sbi, segno); >>> + >>> + /* Remove the segment from PRE (prefree) to prevent checkpoint from freeing it! */ >>> + mutex_lock(&DIRTY_I(sbi)->seglist_lock); >>> + if (test_and_clear_bit(segno, DIRTY_I(sbi)->dirty_segmap[PRE])) >>> + DIRTY_I(sbi)->nr_dirty[PRE]--; >>> + mutex_unlock(&DIRTY_I(sbi)->seglist_lock); >>> + >>> + /* add it into dirty seglist */ >>> + locate_dirty_segment(sbi, segno); >>> + >>> + /* update @addr_start and @cnt and @segno */ >>> + addr_start = START_BLOCK(sbi, ++segno); >>> + if (++i == seg_num) >>> + cnt = GET_BLKOFF_FROM_SEG0(sbi, addr_end) + 1; >>> + else >>> + cnt = max_blocks; >>> + } while (i <= seg_num); >>> + >>> + up_write(&sit_i->sentry_lock); >>> +} >>> + >>> bool f2fs_is_checkpointed_data(struct f2fs_sb_info *sbi, block_t blkaddr) >>> { >>> struct sit_info *sit_i = SIT_I(sbi); >>> @@ -2758,8 +2816,13 @@ static int is_next_segment_free(struct f2fs_sb_info *sbi, >>> unsigned int segno = curseg->segno + 1; >>> struct free_segmap_info *free_i = FREE_I(sbi); >>> >>> - if (segno < MAIN_SEGS(sbi) && segno % SEGS_PER_SEC(sbi)) >>> + if (segno < MAIN_SEGS(sbi) && segno % SEGS_PER_SEC(sbi)) { >>> + int devi = f2fs_target_device_index(sbi, START_BLOCK(sbi, segno)); >>> + >>> + if (f2fs_dev_is_reserving(sbi, devi)) >>> + return 0; >>> return !test_bit(segno, free_i->free_segmap); >>> + } >>> return 0; >>> } >>> >>> @@ -2778,7 +2841,8 @@ static int get_new_segment(struct f2fs_sb_info *sbi, >>> unsigned int alloc_policy = sbi->allocate_section_policy; >>> unsigned int alloc_hint = sbi->allocate_section_hint; >>> bool init = true; >>> - int i; >>> + bool looped = false; >>> + int i, devi; >>> int ret = 0; >>> >>> spin_lock(&free_i->segmap_lock); >>> @@ -2791,8 +2855,13 @@ static int get_new_segment(struct f2fs_sb_info *sbi, >>> if (!new_sec && ((*newseg + 1) % SEGS_PER_SEC(sbi))) { >>> segno = find_next_zero_bit(free_i->free_segmap, >>> GET_SEG_FROM_SEC(sbi, hint + 1), *newseg + 1); >>> - if (segno < GET_SEG_FROM_SEC(sbi, hint + 1)) >>> + if (segno < GET_SEG_FROM_SEC(sbi, hint + 1)) { >>> + devi = f2fs_target_device_index(sbi, START_BLOCK(sbi, segno)); >>> + >>> + if (f2fs_dev_is_alloc_blocked(sbi, devi, pinning)) >>> + goto find_other_zone; >>> goto got_it; >>> + } >>> } >>> >>> #ifdef CONFIG_BLK_DEV_ZONED >>> @@ -2828,33 +2897,42 @@ static int get_new_segment(struct f2fs_sb_info *sbi, >>> find_other_zone: >>> secno = find_next_zero_bit(free_i->free_secmap, MAIN_SECS(sbi), hint); >>> >>> -#ifdef CONFIG_BLK_DEV_ZONED >>> - if (secno >= MAIN_SECS(sbi) && f2fs_sb_has_blkzoned(sbi)) { >>> - /* Write only to sequential zones */ >>> - if (sbi->blkzone_alloc_policy == BLKZONE_ALLOC_ONLY_SEQ) { >>> - hint = GET_SEC_FROM_SEG(sbi, sbi->first_seq_zone_segno); >>> - secno = find_next_zero_bit(free_i->free_secmap, MAIN_SECS(sbi), hint); >>> - } else >>> - secno = find_first_zero_bit(free_i->free_secmap, >>> - MAIN_SECS(sbi)); >>> - if (secno >= MAIN_SECS(sbi)) { >>> - ret = -ENOSPC; >>> - f2fs_bug_on(sbi, 1); >>> - goto out_unlock; >>> - } >>> - } >>> -#endif >>> - >>> if (secno >= MAIN_SECS(sbi)) { >>> - secno = find_first_zero_bit(free_i->free_secmap, >>> - MAIN_SECS(sbi)); >>> - if (secno >= MAIN_SECS(sbi)) { >>> + if (looped) { >>> ret = -ENOSPC; >>> f2fs_bug_on(sbi, !pinning); >>> goto out_unlock; >>> } >>> + hint = 0; >>> +#ifdef CONFIG_BLK_DEV_ZONED >>> + /* Write only to sequential zones */ >>> + if (f2fs_sb_has_blkzoned(sbi) && >>> + sbi->blkzone_alloc_policy == BLKZONE_ALLOC_ONLY_SEQ) >>> + hint = GET_SEC_FROM_SEG(sbi, sbi->first_seq_zone_segno); >>> +#endif >>> + looped = true; >>> + goto find_other_zone; >>> } >>> + >>> segno = GET_SEG_FROM_SEC(sbi, secno); >>> + >>> + devi = f2fs_target_device_index(sbi, START_BLOCK(sbi, segno)); >>> + >>> + if (f2fs_dev_is_alloc_blocked(sbi, devi, pinning)) { >>> + while (devi < sbi->s_ndevs && >>> + f2fs_dev_is_alloc_blocked(sbi, devi, pinning)) { >>> + unsigned int end_segno = GET_SEGNO(sbi, FDEV(devi).end_blk); >>> + >>> + hint = GET_SEC_FROM_SEG(sbi, end_segno) + 1; >>> + devi++; >>> + } >>> + goto find_other_zone; >>> + } >>> + >>> + if (sec_usage_check(sbi, secno)) { >>> + hint = secno + 1; >>> + goto find_other_zone; >>> + } >>> zoneno = GET_ZONE_FROM_SEC(sbi, secno); >>> >>> /* give up on finding another zone */ >>> diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h >>> index b0c06b3580b4..107508ae7eb3 100644 >>> --- a/fs/f2fs/segment.h >>> +++ b/fs/f2fs/segment.h >>> @@ -954,10 +954,32 @@ static inline block_t sum_blk_addr(struct f2fs_sb_info *sbi, int base, int type) >>> - (base + 1) + type; >>> } >>> >>> +static inline bool f2fs_dev_is_reserving(struct f2fs_sb_info *sbi, int devi) >>> +{ >>> + if (!f2fs_sb_has_device_alias(sbi)) >>> + return false; >>> + return FDEV(devi).is_reserving; >>> +} >>> + >>> +static inline bool f2fs_dev_is_alloc_blocked(struct f2fs_sb_info *sbi, >>> + int devi, bool pinning) >>> +{ >>> + if (!f2fs_sb_has_device_alias(sbi)) >>> + return false; >>> + return (pinning && FDEV(devi).has_alias) || FDEV(devi).is_reserving; >>> +} >>> + >>> static inline bool sec_usage_check(struct f2fs_sb_info *sbi, unsigned int secno) >>> { >>> if (is_cursec(sbi, secno) || (sbi->cur_victim_sec == secno)) >>> return true; >>> + if (f2fs_sb_has_device_alias(sbi)) { >>> + block_t start_blk = START_BLOCK(sbi, GET_SEG_FROM_SEC(sbi, secno)); >>> + int devi = f2fs_target_device_index(sbi, start_blk); >>> + >>> + if (f2fs_dev_is_reserving(sbi, devi)) >>> + return true; >>> + } >>> return false; >>> } >>> >>> diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c >>> index c448d992ff2a..d5dc83e613e2 100644 >>> --- a/fs/f2fs/super.c >>> +++ b/fs/f2fs/super.c >>> @@ -5001,6 +5001,39 @@ static void f2fs_tuning_parameters(struct f2fs_sb_info *sbi) >>> sbi->readdir_ra = true; >>> } >>> >>> +static void f2fs_restore_device_alias(struct f2fs_sb_info *sbi) >>> +{ >>> + struct inode *root = d_inode(sbi->sb->s_root); >>> + struct f2fs_dir_entry *de; >>> + struct folio *folio; >>> + int i; >>> + >>> + if (!f2fs_sb_has_device_alias(sbi)) >>> + return; >>> + >>> + for (i = 1; i < sbi->s_ndevs; i++) { >>> + char *name = strrchr(FDEV(i).path, '/'); >>> + struct inode *inode; >>> + struct qstr qstr; >>> + >>> + name = name ? name + 1 : FDEV(i).path; >>> + qstr.name = name; >>> + qstr.len = strlen(name); >>> + >>> + de = f2fs_find_entry(root, &qstr, &folio); >>> + if (!de) >>> + continue; >>> + >>> + inode = f2fs_iget(sbi->sb, le32_to_cpu(de->ino)); >>> + if (!IS_ERR(inode)) { >>> + if (IS_DEVICE_ALIASING(inode)) >>> + FDEV(i).has_alias = true; >>> + iput(inode); >>> + } >>> + f2fs_folio_put(folio, 0); >>> + } >>> +} >>> + >>> static int f2fs_fill_super(struct super_block *sb, struct fs_context *fc) >>> { >>> struct f2fs_fs_context *ctx = fc->fs_private; >>> @@ -5209,6 +5242,7 @@ static int f2fs_fill_super(struct super_block *sb, struct fs_context *fc) >>> sbi->last_valid_block_count = sbi->total_valid_block_count; >>> sbi->reserved_blocks = 0; >>> sbi->current_reserved_blocks = 0; >>> + sbi->alias_reserved_blocks = 0; >>> limit_reserve_root(sbi); >>> adjust_unusable_cap_perc(sbi); >>> >>> @@ -5436,6 +5470,8 @@ static int f2fs_fill_super(struct super_block *sb, struct fs_context *fc) >>> f2fs_update_time(sbi, REQ_TIME); >>> clear_sbi_flag(sbi, SBI_CP_DISABLED_QUICK); >>> >>> + f2fs_restore_device_alias(sbi); >>> + >>> sbi->umount_lock_holder = NULL; >>> return 0; >>> >>> diff --git a/include/uapi/linux/f2fs.h b/include/uapi/linux/f2fs.h >>> index 795e26258355..4409ada2fecb 100644 >>> --- a/include/uapi/linux/f2fs.h >>> +++ b/include/uapi/linux/f2fs.h >>> @@ -45,6 +45,9 @@ >>> #define F2FS_IOC_START_ATOMIC_REPLACE _IO(F2FS_IOCTL_MAGIC, 25) >>> #define F2FS_IOC_GET_DEV_ALIAS_FILE _IOR(F2FS_IOCTL_MAGIC, 26, __u32) >>> #define F2FS_IOC_IO_PRIO _IOW(F2FS_IOCTL_MAGIC, 27, __u32) >>> +#define F2FS_IOC_RESERVE_DEV_ALIAS _IO(F2FS_IOCTL_MAGIC, 28) >>> +#define F2FS_IOC_RELEASE_DEV_ALIAS _IO(F2FS_IOCTL_MAGIC, 29) >>> +#define F2FS_IOC_GET_DEV_ALIAS_STATUS _IOR(F2FS_IOCTL_MAGIC, 30, __u32) >>> >>> /* >>> * should be same as XFS_IOC_GOINGDOWN. >>> @@ -70,6 +73,10 @@ enum { >>> F2FS_IOPRIO_MAX, >>> }; >>> >>> +/* for F2FS_IOC_GET_DEV_ALIAS_STATUS */ >>> +#define F2FS_DEV_ALIAS_STATUS_RELEASED 0 >>> +#define F2FS_DEV_ALIAS_STATUS_RESERVED 1 >>> + >>> struct f2fs_gc_range { >>> __u32 sync; >>> __u64 start; >>