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 E7E28C3ABA2 for ; Mon, 16 Sep 2024 17:10:35 +0000 (UTC) Received: from [127.0.0.1] (helo=sfs-ml-2.v29.lw.sourceforge.com) by sfs-ml-2.v29.lw.sourceforge.com with esmtp (Exim 4.95) (envelope-from ) id 1sqFFB-0002Wx-Ub; Mon, 16 Sep 2024 17:10:33 +0000 Received: from [172.30.29.66] (helo=mx.sourceforge.net) by sfs-ml-2.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1sqFFB-0002Wj-0c for linux-f2fs-devel@lists.sourceforge.net; Mon, 16 Sep 2024 17:10:33 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=In-Reply-To:Content-Transfer-Encoding:Content-Type: MIME-Version:References:Message-ID:Subject:Cc:To:From:Date: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=FYYeEBrtv1mzG0tD4Bs+ZftAcSUOHi+97PFK2IWmRhw=; b=cjjGDpemoVxeOEYzERDtXCbaHW XJpoV9URlBj7HfiKRZWlTVru3eJwOPaUSyCh8YJfJOeprmuVrlAMOJbdeNme6YoJad0nTfZ+XCGYI RpMB/vba0r1gwpTzhTG4NgBC2aTUmIQnvwDY+taljRz4FaWGzRYLnY+he06J32+F4wFI=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=In-Reply-To:Content-Transfer-Encoding:Content-Type:MIME-Version: References:Message-ID:Subject:Cc:To:From:Date: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=FYYeEBrtv1mzG0tD4Bs+ZftAcSUOHi+97PFK2IWmRhw=; b=Gcy1HZIKRPtgCVRU024LJsHQDH I8WCMmJ4AVsxOr4Y8gR+JGCbGKmse4nHm01kV+fSAy48zFx56uONOw7MjJyLtm/A2yYjcuso0E2sc TkUDbaQeVrCC4ytfrbujlfyyhNuwwVdbUaM/TGgEH9Kj9IDuxyVxxejCT1Z8Xx67kJfI=; Received: from dfw.source.kernel.org ([139.178.84.217]) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.95) id 1sqFF9-000497-4B for linux-f2fs-devel@lists.sourceforge.net; Mon, 16 Sep 2024 17:10:32 +0000 Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by dfw.source.kernel.org (Postfix) with ESMTP id E002A5C589B; Mon, 16 Sep 2024 17:10:16 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0C3D6C4CEC4; Mon, 16 Sep 2024 17:10:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1726506620; bh=PURqVwYInz1hujzo3/vXTwZMB9mBg4BhaAV1rQrozjY=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=eYVzPd4GlcKPGzyilsgs6LNVSXeAzubd7CGQqnbBvI5AgcSQzthSnnIcjk9AphdnL r4IjShn6z82jSIptkPop4E8sx6vEQsvT7zkglRRyb+dWEFwApznN8tOnhwAkpSdGCP fS0l69VvtwayVZ+F86L0m59biJZXyDz8PI2MGKPqna7L81p6pEU3kE2XTWwjLGy4yy KbE9b+SJFyK1TY1KV0l0VP0YFWzIwIP9ib6ZK4i5Eo2+Jo84sTDTazKgX0l+dG6A1K xG7VvX+st7udhQqMpH8ohARpwpUNzb4tRajBFv1SrH8UMvPIaLIiAWIj3A7G21T4hA yR9Nt43JobOSA== Date: Mon, 16 Sep 2024 17:10:18 +0000 To: Daeho Jeong Message-ID: References: <20240913212802.912131-1-daeho43@gmail.com> <20240913212802.912131-2-daeho43@gmail.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-Headers-End: 1sqFF9-000497-4B Subject: Re: [f2fs-dev] [PATCH 2/2] mkfs.f2fs: add device aliasing feature 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: Jaegeuk Kim via Linux-f2fs-devel Reply-To: Jaegeuk Kim Cc: Daeho Jeong , kernel-team@android.com, linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net T24gMDkvMTYsIERhZWhvIEplb25nIHdyb3RlOgo+IE9uIEZyaSwgU2VwIDEzLCAyMDI0IGF0IDM6 MjfigK9QTSBKYWVnZXVrIEtpbSA8amFlZ2V1a0BrZXJuZWwub3JnPiB3cm90ZToKPiA+Cj4gPiBP biAwOS8xMywgRGFlaG8gSmVvbmcgd3JvdGU6Cj4gPiA+IEZyb206IERhZWhvIEplb25nIDxkYWVo b2plb25nQGdvb2dsZS5jb20+Cj4gPiA+Cj4gPiA+IFdlIGNhbiBhZGQgYSBkZXZpY2UgYWxpYXNp bmcgZmlsZSB3aGljaCBjYW4gbWFwIHRoZSB3aG9sZSBkZXZpY2Ugd2l0aCBhbgo+ID4gPiBleHRl bnQsIG5vdCB1c2luZyBub2RlIGJsb2Nrcy4gVGhpcyBtYXBwZWQgYXJlYSBzaG91bGQgYmUgcGlu bmVkIGFuZAo+ID4gPiBub3JtYWxseSB1c2VkIGZvciByZWFkLW9ubHkgdXNhZ2VzLiBBZnRlciBm aW5pc2hlZCB1c2luZyBpdCwgd2UgY2FuCj4gPiA+IGRlYWxsb2NhdGUgdGhlIHdob2xlIGFyZWEg YW5kIHJldHVybiBpdCBiYWNrIHRvIHVzZSBpdCBmb3Igb3RoZXIgZmlsZXMuCj4gPiA+Cj4gPiA+ IFNpZ25lZC1vZmYtYnk6IERhZWhvIEplb25nIDxkYWVob2plb25nQGdvb2dsZS5jb20+Cj4gPiA+ IC0tLQo+ID4gPiAgZnNjay9kdW1wLmMgICAgICAgICAgICAgfCAgMTMgKysKPiA+ID4gIGZzY2sv ZnNjay5jICAgICAgICAgICAgIHwgIDQ5ICsrKystLQo+ID4gPiAgZnNjay9mc2NrLmggICAgICAg ICAgICAgfCAgIDQgKy0KPiA+ID4gIGZzY2svbWFpbi5jICAgICAgICAgICAgIHwgICA1ICsKPiA+ ID4gIGluY2x1ZGUvZjJmc19mcy5oICAgICAgIHwgIDExICsrCj4gPiA+ICBta2ZzL2YyZnNfZm9y bWF0LmMgICAgICB8IDMzNSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0t Cj4gPiA+ICBta2ZzL2YyZnNfZm9ybWF0X21haW4uYyB8ICAzMCArKystCj4gPiA+ICA3IGZpbGVz IGNoYW5nZWQsIDM2MyBpbnNlcnRpb25zKCspLCA4NCBkZWxldGlvbnMoLSkKPiA+ID4KPiA+ID4g ZGlmZiAtLWdpdCBhL2ZzY2svZHVtcC5jIGIvZnNjay9kdW1wLmMKPiA+ID4gaW5kZXggOGQ1NjEz ZS4uYWE5YjVkMyAxMDA2NDQKPiA+ID4gLS0tIGEvZnNjay9kdW1wLmMKPiA+ID4gKysrIGIvZnNj ay9kdW1wLmMKPiA+ID4gQEAgLTQ5OSw2ICs0OTksMTkgQEAgc3RhdGljIGludCBkdW1wX2lub2Rl X2JsayhzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksIHUzMiBuaWQsCj4gPiA+ICAgICAgIH0KPiA+ ID4KPiA+ID4gICAgICAgYy5zaG93X2ZpbGVfbWFwX21heF9vZmZzZXQgPSBmMmZzX21heF9maWxl X29mZnNldCgmbm9kZV9ibGstPmkpOwo+ID4gPiArCj4gPiA+ICsgICAgIGlmIChJU19BTElBU0lO Rygmbm9kZV9ibGstPmkpKSB7Cj4gPiA+ICsgICAgICAgICAgICAgdTMyIGJsa2FkZHIgPSBsZTMy X3RvX2NwdShub2RlX2Jsay0+aS5pX2V4dC5ibGtfYWRkcik7Cj4gPiA+ICsgICAgICAgICAgICAg dTMyIGxlbiA9IGxlMzJfdG9fY3B1KG5vZGVfYmxrLT5pLmlfZXh0Lmxlbik7Cj4gPiA+ICsgICAg ICAgICAgICAgdTMyIGlkeDsKPiA+ID4gKwo+ID4gPiArICAgICAgICAgICAgIGZvciAoaWR4ID0g MDsgaWR4IDwgbGVuOyBpZHgrKykKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgIGR1bXBfZGF0 YV9ibGsoc2JpLCBpZHggKiBGMkZTX0JMS1NJWkUsIGJsa2FkZHIrKywgZmFsc2UpOwo+ID4gPiAr ICAgICAgICAgICAgIHByaW50X2V4dGVudCh0cnVlKTsKPiA+ID4gKwo+ID4gPiArICAgICAgICAg ICAgIGdvdG8gZHVtcF94YXR0cjsKPiA+ID4gKyAgICAgfQo+ID4gPiArCj4gPiA+ICAgICAgIGFk ZHJfcGVyX2Jsb2NrID0gQUREUlNfUEVSX0JMT0NLKCZub2RlX2Jsay0+aSk7Cj4gPiA+Cj4gPiA+ ICAgICAgIC8qIGNoZWNrIGRhdGEgYmxvY2tzIGluIGlub2RlICovCj4gPiA+IGRpZmYgLS1naXQg YS9mc2NrL2ZzY2suYyBiL2ZzY2svZnNjay5jCj4gPiA+IGluZGV4IGY4NjA3ZmQuLjZmZWIyOTQg MTAwNjQ0Cj4gPiA+IC0tLSBhL2ZzY2svZnNjay5jCj4gPiA+ICsrKyBiL2ZzY2svZnNjay5jCj4g PiA+IEBAIC05MTQsNiArOTE0LDcgQEAgdm9pZCBmc2NrX2Noa19pbm9kZV9ibGsoc3RydWN0IGYy ZnNfc2JfaW5mbyAqc2JpLCB1MzIgbmlkLAo+ID4gPiAgICAgICBpbnQgbmVlZF9maXggPSAwOwo+ ID4gPiAgICAgICBpbnQgcmV0Owo+ID4gPiAgICAgICB1MzIgY2x1c3Rlcl9zaXplID0gMSA8PCBu b2RlX2Jsay0+aS5pX2xvZ19jbHVzdGVyX3NpemU7Cj4gPiA+ICsgICAgIGJvb2wgaXNfYWxpYXNp bmcgPSBJU19BTElBU0lORygmbm9kZV9ibGstPmkpOwo+ID4gPgo+ID4gPiAgICAgICBpZiAoIWNv bXByZXNzZWQpCj4gPiA+ICAgICAgICAgICAgICAgZ290byBjaGVja19uZXh0Owo+ID4gPiBAQCAt MTE0Niw2ICsxMTQ3LDMzIEBAIGNoZWNrX25leHQ6Cj4gPiA+ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGFkZHJzX3Blcl9ibGsgKiBOSURTX1BFUl9CTE9DSyAqCj4gPiA+ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIE5JRFNfUEVSX0JMT0NLKSAqIEYyRlNfQkxLU0laRTsKPiA+ ID4gICAgICAgfQo+ID4gPiArCj4gPiA+ICsgICAgIGlmIChpc19hbGlhc2luZykgewo+ID4gPiAr ICAgICAgICAgICAgIHN0cnVjdCBleHRlbnRfaW5mbyBlaTsKPiA+ID4gKwo+ID4gPiArICAgICAg ICAgICAgIGdldF9leHRlbnRfaW5mbygmZWksICZub2RlX2Jsay0+aS5pX2V4dCk7Cj4gPiA+ICsg ICAgICAgICAgICAgZm9yIChpZHggPSAwOyBpZHggPCBlaS5sZW47IGlkeCsrLCBjaGlsZC5wZ29m cysrKSB7Cj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICBibG9ja190IGJsa2FkZHIgPSBlaS5i bGsgKyBpZHg7Cj4gPiA+ICsKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrIGV4 dGVudCBpbmZvICovCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICBjaGVja19leHRlbnRfaW5m bygmY2hpbGQsIGJsa2FkZHIsIDApOwo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgcmV0ID0g ZnNja19jaGtfZGF0YV9ibGsoc2JpLCAmbm9kZV9ibGstPmksIGJsa2FkZHIsCj4gPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICZjaGlsZCwgKGlfYmxvY2tzID09ICpibGtfY250KSwg ZnR5cGUsIG5pZCwKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4LCBuaS0+ dmVyc2lvbiwgbm9kZV9ibGspOwo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXQp IHsKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJsa19jbnQgPSAqYmxrX2Nu dCArIDE7Cj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJfcXR5cGUg IT0gLTEpCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcWZfbGFz dF9ibGtvZnNbY3VyX3F0eXBlXSA9IGNoaWxkLnBnb2ZzOwo+ID4gPiArICAgICAgICAgICAgICAg ICAgICAgfSBlbHNlIGlmIChjLmZpeF9vbikgewo+ID4gPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBub2RlX2Jsay0+aS5pX2V4dC5sZW4gPSBjcHVfdG9fbGUzMihpZHgpOwo+ID4gPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX2ZpeCA9IDE7Cj4gPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwo+ID4gPiArICAgICAgICAgICAgICAgICAgICAg fQo+ID4gPiArICAgICAgICAgICAgIH0KPiA+ID4gKwo+ID4gPiArICAgICAgICAgICAgIGdvdG8g Y2hlY2s7Cj4gPiA+ICsgICAgIH0KPiA+ID4gKwo+ID4gPiAgICAgICBmb3IgKGlkeCA9IDA7IGlk eCA8IGFkZHJzOyBpZHgrKywgY2hpbGQucGdvZnMrKykgewo+ID4gPiAgICAgICAgICAgICAgIGJs b2NrX3QgYmxrYWRkciA9IGxlMzJfdG9fY3B1KG5vZGVfYmxrLT5pLmlfYWRkcltvZnMgKyBpZHhd KTsKPiA+ID4KPiA+ID4gQEAgLTExNzgsMTEgKzEyMDYsMTEgQEAgY2hlY2tfbmV4dDoKPiA+ID4g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQucGdvZnMgLSBjYmMtPmNoZWFkZXJf cGdvZnMgPCBjbHVzdGVyX3NpemUpCj4gPiA+ICAgICAgICAgICAgICAgICAgICAgICBjYmMtPmNu dCsrOwo+ID4gPiAgICAgICAgICAgICAgIHJldCA9IGZzY2tfY2hrX2RhdGFfYmxrKHNiaSwKPiA+ ID4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfQ0FTRUZPTERFRCgmbm9kZV9ibGst PmkpLAo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm9kZV9ibGstPmksCj4g PiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsa2FkZHIsCj4gPiA+ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICZjaGlsZCwgKGlfYmxvY2tzID09ICpibGtfY250KSwKPiA+ ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnR5cGUsIG5pZCwgaWR4LCBuaS0+dmVy c2lvbiwKPiA+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9pc19lbmNyeXB0 KCZub2RlX2Jsay0+aSksIG5vZGVfYmxrKTsKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgbm9kZV9ibGspOwo+ID4gPiAgICAgICAgICAgICAgIGlmIChibGthZGRyICE9IGxlMzJf dG9fY3B1KG5vZGVfYmxrLT5pLmlfYWRkcltvZnMgKyBpZHhdKSkKPiA+ID4gICAgICAgICAgICAg ICAgICAgICAgIG5lZWRfZml4ID0gMTsKPiA+ID4gICAgICAgICAgICAgICBpZiAoIXJldCkgewo+ ID4gPiBAQCAtMTM3Niw3ICsxNDA0LDcgQEAgc2tpcF9ibGtjbnRfZml4Ogo+ID4gPiAgICAgICB9 Cj4gPiA+Cj4gPiA+ICAgICAgIC8qIGRyb3AgZXh0ZW50IGluZm9ybWF0aW9uIHRvIGF2b2lkIHBv dGVudGlhbCB3cm9uZyBhY2Nlc3MgKi8KPiA+ID4gLSAgICAgaWYgKG5lZWRfZml4ICYmIGYyZnNf ZGV2X2lzX3dyaXRhYmxlKCkpCj4gPiA+ICsgICAgIGlmIChuZWVkX2ZpeCAmJiBmMmZzX2Rldl9p c193cml0YWJsZSgpICYmICFpc19hbGlhc2luZykKPiA+ID4gICAgICAgICAgICAgICBub2RlX2Js ay0+aS5pX2V4dC5sZW4gPSAwOwo+ID4gPgo+ID4gPiAgICAgICBpZiAoKGMuZmVhdHVyZSAmIEYy RlNfRkVBVFVSRV9JTk9ERV9DSEtTVU0pICYmCj4gPiA+IEBAIC0xNDQ4LDExICsxNDc2LDkgQEAg aW50IGZzY2tfY2hrX2Rub2RlX2JsayhzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksIHN0cnVjdCBm MmZzX2lub2RlICppbm9kZSwKPiA+ID4gICAgICAgICAgICAgICBpZiAoIWNvbXByX3JlbCAmJiBi bGthZGRyID09IE5FV19BRERSICYmIGNoaWxkLT5wZ29mcyAtCj4gPiA+ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGNiYy0+Y2hlYWRlcl9wZ29mcyA8IGNsdXN0ZXJfc2l6ZSkKPiA+ID4g ICAgICAgICAgICAgICAgICAgICAgIGNiYy0+Y250Kys7Cj4gPiA+IC0gICAgICAgICAgICAgcmV0 ID0gZnNja19jaGtfZGF0YV9ibGsoc2JpLCBJU19DQVNFRk9MREVEKGlub2RlKSwKPiA+ID4gLSAg ICAgICAgICAgICAgICAgICAgIGJsa2FkZHIsIGNoaWxkLAo+ID4gPiArICAgICAgICAgICAgIHJl dCA9IGZzY2tfY2hrX2RhdGFfYmxrKHNiaSwgaW5vZGUsIGJsa2FkZHIsIGNoaWxkLAo+ID4gPiAg ICAgICAgICAgICAgICAgICAgICAgbGU2NF90b19jcHUoaW5vZGUtPmlfYmxvY2tzKSA9PSAqYmxr X2NudCwgZnR5cGUsCj4gPiA+IC0gICAgICAgICAgICAgICAgICAgICBuaWQsIGlkeCwgbmktPnZl cnNpb24sCj4gPiA+IC0gICAgICAgICAgICAgICAgICAgICBmaWxlX2lzX2VuY3J5cHQoaW5vZGUp LCBub2RlX2Jsayk7Cj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICBuaWQsIGlkeCwgbmktPnZl cnNpb24sIG5vZGVfYmxrKTsKPiA+ID4gICAgICAgICAgICAgICBpZiAoYmxrYWRkciAhPSBsZTMy X3RvX2NwdShub2RlX2Jsay0+ZG4uYWRkcltpZHhdKSkKPiA+ID4gICAgICAgICAgICAgICAgICAg ICAgIG5lZWRfZml4ID0gMTsKPiA+ID4gICAgICAgICAgICAgICBpZiAoIXJldCkgewo+ID4gPiBA QCAtMjA1NiwxMiArMjA4MiwxNSBAQCBpbnQgZnNja19jaGtfZGVudHJ5X2JsayhzdHJ1Y3QgZjJm c19zYl9pbmZvICpzYmksIGludCBjYXNlZm9sZGVkLCB1MzIgYmxrX2FkZHIsCj4gPiA+ICAgICAg IHJldHVybiAwOwo+ID4gPiAgfQo+ID4gPgo+ID4gPiAtaW50IGZzY2tfY2hrX2RhdGFfYmxrKHN0 cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwgaW50IGNhc2Vmb2xkZWQsCj4gPiA+ICtpbnQgZnNja19j aGtfZGF0YV9ibGsoc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLCBzdHJ1Y3QgZjJmc19pbm9kZSAq aW5vZGUsCj4gPiA+ICAgICAgICAgICAgICAgdTMyIGJsa19hZGRyLCBzdHJ1Y3QgY2hpbGRfaW5m byAqY2hpbGQsIGludCBsYXN0X2JsaywKPiA+ID4gICAgICAgICAgICAgICBlbnVtIEZJTEVfVFlQ RSBmdHlwZSwgdTMyIHBhcmVudF9uaWQsIHUxNiBpZHhfaW5fbm9kZSwgdTggdmVyLAo+ID4gPiAt ICAgICAgICAgICAgIGludCBlbmNfbmFtZSwgc3RydWN0IGYyZnNfbm9kZSAqbm9kZV9ibGspCj4g PiA+ICsgICAgICAgICAgICAgc3RydWN0IGYyZnNfbm9kZSAqbm9kZV9ibGspCj4gPiA+ICB7Cj4g PiA+ICAgICAgIHN0cnVjdCBmMmZzX2ZzY2sgKmZzY2sgPSBGMkZTX0ZTQ0soc2JpKTsKPiA+ID4g KyAgICAgaW50IGNhc2Vmb2xkZWQgPSBJU19DQVNFRk9MREVEKGlub2RlKTsKPiA+ID4gKyAgICAg aW50IGVuY19uYW1lID0gZmlsZV9pc19lbmNyeXB0KGlub2RlKTsKPiA+ID4gKyAgICAgaW50IGFs aWFzaW5nID0gSVNfQUxJQVNJTkcoaW5vZGUpOwo+ID4gPgo+ID4gPiAgICAgICAvKiBJcyBpdCBy ZXNlcnZlZCBibG9jaz8gKi8KPiA+ID4gICAgICAgaWYgKGJsa19hZGRyID09IE5FV19BRERSKSB7 Cj4gPiA+IEBAIC0yMDc0LDcgKzIxMDMsNyBAQCBpbnQgZnNja19jaGtfZGF0YV9ibGsoc3RydWN0 IGYyZnNfc2JfaW5mbyAqc2JpLCBpbnQgY2FzZWZvbGRlZCwKPiA+ID4gICAgICAgICAgICAgICBy ZXR1cm4gLUVJTlZBTDsKPiA+ID4gICAgICAgfQo+ID4gPgo+ID4gPiAtICAgICBpZiAoaXNfdmFs aWRfc3NhX2RhdGFfYmxrKHNiaSwgYmxrX2FkZHIsIHBhcmVudF9uaWQsCj4gPiA+ICsgICAgIGlm ICghYWxpYXNpbmcgJiYgaXNfdmFsaWRfc3NhX2RhdGFfYmxrKHNiaSwgYmxrX2FkZHIsIHBhcmVu dF9uaWQsCj4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBpZHhfaW5fbm9kZSwgdmVyKSkgewo+ID4gPiAgICAgICAgICAgICAgIEFTU0VSVF9NU0coInN1 bW1hcnkgZGF0YSBibG9jayBpcyBub3QgdmFsaWQuIFsweCV4XSIsCj4gPiA+ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRfbmlkKTsKPiA+ID4gZGlm ZiAtLWdpdCBhL2ZzY2svZnNjay5oIGIvZnNjay9mc2NrLmgKPiA+ID4gaW5kZXggNmNhYzkyNi4u ZDMwNmMyMiAxMDA2NDQKPiA+ID4gLS0tIGEvZnNjay9mc2NrLmgKPiA+ID4gKysrIGIvZnNjay9m c2NrLmgKPiA+ID4gQEAgLTE3OSw5ICsxNzksOSBAQCBleHRlcm4gaW50IGZzY2tfY2hrX2lkbm9k ZV9ibGsoc3RydWN0IGYyZnNfc2JfaW5mbyAqLCBzdHJ1Y3QgZjJmc19pbm9kZSAqLAo+ID4gPiAg ZXh0ZXJuIGludCBmc2NrX2Noa19kaWRub2RlX2JsayhzdHJ1Y3QgZjJmc19zYl9pbmZvICosIHN0 cnVjdCBmMmZzX2lub2RlICosCj4gPiA+ICAgICAgICAgICAgICAgZW51bSBGSUxFX1RZUEUsIHN0 cnVjdCBmMmZzX25vZGUgKiwgdTMyICosCj4gPiA+ICAgICAgICAgICAgICAgc3RydWN0IGYyZnNf Y29tcHJfYmxrX2NudCAqLCBzdHJ1Y3QgY2hpbGRfaW5mbyAqKTsKPiA+ID4gLWV4dGVybiBpbnQg ZnNja19jaGtfZGF0YV9ibGsoc3RydWN0IGYyZnNfc2JfaW5mbyAqLCBpbnQsCj4gPiA+ICtleHRl cm4gaW50IGZzY2tfY2hrX2RhdGFfYmxrKHN0cnVjdCBmMmZzX3NiX2luZm8gKiwgc3RydWN0IGYy ZnNfaW5vZGUgKiwKPiA+ID4gICAgICAgICAgICAgICB1MzIsIHN0cnVjdCBjaGlsZF9pbmZvICos IGludCwgZW51bSBGSUxFX1RZUEUsIHUzMiwgdTE2LCB1OCwKPiA+ID4gLSAgICAgICAgICAgICBp bnQsIHN0cnVjdCBmMmZzX25vZGUgKik7Cj4gPiA+ICsgICAgICAgICAgICAgc3RydWN0IGYyZnNf bm9kZSAqKTsKPiA+ID4gIGV4dGVybiBpbnQgZnNja19jaGtfZGVudHJ5X2JsayhzdHJ1Y3QgZjJm c19zYl9pbmZvICosIGludCwKPiA+ID4gICAgICAgICAgICAgICB1MzIsIHN0cnVjdCBjaGlsZF9p bmZvICosIGludCwgaW50LCBzdHJ1Y3QgZjJmc19ub2RlICopOwo+ID4gPiAgaW50IGZzY2tfY2hr X2lubGluZV9kZW50cmllcyhzdHJ1Y3QgZjJmc19zYl9pbmZvICosIHN0cnVjdCBmMmZzX25vZGUg KiwKPiA+ID4gZGlmZiAtLWdpdCBhL2ZzY2svbWFpbi5jIGIvZnNjay9tYWluLmMKPiA+ID4gaW5k ZXggYzEzZTI4Ny4uYzRmNjE2NyAxMDA2NDQKPiA+ID4gLS0tIGEvZnNjay9tYWluLmMKPiA+ID4g KysrIGIvZnNjay9tYWluLmMKPiA+ID4gQEAgLTk3Niw2ICs5NzYsMTEgQEAgc3RhdGljIGludCBk b19kZWZyYWcoc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpKQo+ID4gPiAgICAgICAgICAgICAgIHJl dHVybiAtMTsKPiA+ID4gICAgICAgfQo+ID4gPgo+ID4gPiArICAgICBpZiAoZ2V0X3NiKGZlYXR1 cmUpICYgRjJGU19GRUFUVVJFX0RFVklDRV9BTElBUykgewo+ID4gPiArICAgICAgICAgICAgIE1T RygwLCAiTm90IHN1cHBvcnQgb24gaW1hZ2Ugd2l0aCBkZXZpY2UgYWxpYXNpbmcgZmVhdHVyZS5c biIpOwo+ID4gPiArICAgICAgICAgICAgIHJldHVybiAtMTsKPiA+ID4gKyAgICAgfQo+ID4gPiAr Cj4gPiA+ICAgICAgIGlmIChjLmRlZnJhZ19zdGFydCA+IGdldF9zYihibG9ja19jb3VudCkpCj4g PiA+ICAgICAgICAgICAgICAgZ290byBvdXRfcmFuZ2U7Cj4gPiA+ICAgICAgIGlmIChjLmRlZnJh Z19zdGFydCA8IFNNX0koc2JpKS0+bWFpbl9ibGthZGRyKQo+ID4gPiBkaWZmIC0tZ2l0IGEvaW5j bHVkZS9mMmZzX2ZzLmggYi9pbmNsdWRlL2YyZnNfZnMuaAo+ID4gPiBpbmRleCBmZGJjMjViLi4x MDhmZGUzIDEwMDY0NAo+ID4gPiAtLS0gYS9pbmNsdWRlL2YyZnNfZnMuaAo+ID4gPiArKysgYi9p bmNsdWRlL2YyZnNfZnMuaAo+ID4gPiBAQCAtNDQyLDYgKzQ0Miw3IEBAIHN0cnVjdCBkZXZpY2Vf aW5mbyB7Cj4gPiA+ICAgICAgIHVpbnQ2NF90IHN0YXJ0X2Jsa2FkZHI7Cj4gPiA+ICAgICAgIHVp bnQ2NF90IGVuZF9ibGthZGRyOwo+ID4gPiAgICAgICB1aW50MzJfdCB0b3RhbF9zZWdtZW50czsK PiA+ID4gKyAgICAgY2hhciAqYWxpYXNfZmlsZW5hbWU7Cj4gPiA+Cj4gPiA+ICAgICAgIC8qIHRv IGhhbmRsZSB6b25lIGJsb2NrIGRldmljZXMgKi8KPiA+ID4gICAgICAgaW50IHpvbmVkX21vZGVs Owo+ID4gPiBAQCAtNjYxLDcgKzY2MiwxMyBAQCBlbnVtIHsKPiA+ID4gICAqLwo+ID4gPiAgI2Rl ZmluZSBGMkZTX0lNTVVUQUJMRV9GTCAgICAgICAgICAgIDB4MDAwMDAwMTAgLyogSW1tdXRhYmxl IGZpbGUgKi8KPiA+ID4gICNkZWZpbmUgRjJGU19OT0FUSU1FX0ZMICAgICAgICAgICAgICAgICAg ICAgIDB4MDAwMDAwODAgLyogZG8gbm90IHVwZGF0ZSBhdGltZSAqLwo+ID4gPiArI2RlZmluZSBG MkZTX0RFVklDRV9BTElBU19GTCAgICAgICAgIDB4ODAwMDAwMDAgLyogRmlsZSBmb3IgYWxpYXNp bmcgYSBkZXZpY2UgKi8KPiA+ID4gKyNkZWZpbmUgSVNfQUxJQVNJTkcoZmkpICAgICAoKGZpKS0+ aV9mbGFncyAmIGNwdV90b19sZTMyKEYyRlNfREVWSUNFX0FMSUFTX0ZMKSkKPiA+Cj4gPiBDb3Vs ZCB5b3UgcGxlYXNlIHJlYmFzZSBvbiB0aGUgbGF0ZXN0IGYyZnMtdG9vbHM/IEkgZ290IG1lcmdl IGNvbmZsaWN0IGFyb3VuZAo+ID4gaGVyZS4KPiAKPiBMZXQgbWUgcmViYXNlIGl0Lgo+IAo+ID4K PiA+ID4KPiA+ID4gKy8qCj4gPiA+ICsgKiBPbi1kaXNrIGZpbGUgaW5saW5lIGZsYWdzIChmMmZz X2lub2RlOjppX2lubGluZSkKPiA+ID4gKyAqLwo+ID4gPiArI2RlZmluZSBGMkZTX1BJTl9GSUxF ICAgICAgICAgICAweDQwICAgIC8qIGZpbGUgc2hvdWxkIG5vdCBiZSBnY2VkICovCj4gPgo+ID4g RG8gd2UgbmVlZCB0aGUgYWJvdmUgZGVmaW5lPwo+IAo+IFdlIG5lZWQgdGhpcyB0byBzZXQgRjJG U19QSU5fRklMRSB0byBkZXZpY2UgYWxpYXNpbmcgZmlsZXMuCgpUaGUgZGVmaW5pdGlvbiBhbHJl YWR5IGV4aXN0cyBpbjoKCiA5NjQgI2RlZmluZSBGMkZTX1BJTl9GSUxFICAgICAgICAgICAweDQw ICAgIC8qIGZpbGUgc2hvdWxkIG5vdCBiZSBnY2VkICovCgo+IAo+ID4KPiA+ID4KPiA+ID4gICNk ZWZpbmUgRjJGU19FTkNfVVRGOF8xMl8xICAgMQo+ID4gPiAgI2RlZmluZSBGMkZTX0VOQ19TVFJJ Q1RfTU9ERV9GTCAgICAgICgxIDw8IDApCj4gPiA+IEBAIC02OTQsNiArNzAxLDcgQEAgZW51bSB7 Cj4gPiA+ICAjZGVmaW5lIEYyRlNfRkVBVFVSRV9DQVNFRk9MRCAgICAgICAgICAgICAgICAweDEw MDAKPiA+ID4gICNkZWZpbmUgRjJGU19GRUFUVVJFX0NPTVBSRVNTSU9OICAgICAweDIwMDAKPiA+ ID4gICNkZWZpbmUgRjJGU19GRUFUVVJFX1JPICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAo+ ID4gPiArI2RlZmluZSBGMkZTX0ZFQVRVUkVfREVWSUNFX0FMSUFTICAgIDB4ODAwMAo+ID4gPgo+ ID4gPiAgI2RlZmluZSBNQVhfTlJfRkVBVFVSRSAgICAgICAgICAgICAgICAgICAgICAgMzIKPiA+ ID4KPiA+ID4gQEAgLTE1MTUsMTEgKzE1MjMsMTQgQEAgc3RydWN0IGYyZnNfY29uZmlndXJhdGlv biB7Cj4gPiA+ICAgICAgIHRpbWVfdCBmaXhlZF90aW1lOwo+ID4gPiAgICAgICBpbnQgcm9sbF9m b3J3YXJkOwo+ID4gPiAgICAgICBib29sIG5lZWRfZnN5bmM7Cj4gPiA+ICsgICAgIGludCBhbGlh c2VkX2RldmljZXM7Cj4gPiA+ICsgICAgIHVpbnQzMl90IGFsaWFzZWRfc2VnbWVudHM7Cj4gPiA+ Cj4gPiA+ICAgICAgIC8qIG1rZnMgcGFyYW1ldGVycyAqLwo+ID4gPiAgICAgICBpbnQgZmFrZV9z ZWVkOwo+ID4gPiAgICAgICB1aW50MzJfdCBuZXh0X2ZyZWVfbmlkOwo+ID4gPiAgICAgICB1aW50 MzJfdCBscGZfaW5vOwo+ID4gPiArICAgICB1aW50MzJfdCBmaXJzdF9hbGlhc19pbm87Cj4gPiA+ ICAgICAgIHVpbnQzMl90IHJvb3RfdWlkOwo+ID4gPiAgICAgICB1aW50MzJfdCByb290X2dpZDsK PiA+ID4gICAgICAgdWludDMyX3QgYmxrc2l6ZTsKPiA+ID4gZGlmZiAtLWdpdCBhL21rZnMvZjJm c19mb3JtYXQuYyBiL21rZnMvZjJmc19mb3JtYXQuYwo+ID4gPiBpbmRleCBkYjFiYzg5Li4wNzdm NjIwIDEwMDY0NAo+ID4gPiAtLS0gYS9ta2ZzL2YyZnNfZm9ybWF0LmMKPiA+ID4gKysrIGIvbWtm cy9mMmZzX2Zvcm1hdC5jCj4gPiA+IEBAIC0xMyw2ICsxMyw3IEBACj4gPiA+ICAjaW5jbHVkZSA8 dW5pc3RkLmg+Cj4gPiA+ICAjaW5jbHVkZSA8ZjJmc19mcy5oPgo+ID4gPiAgI2luY2x1ZGUgPGFz c2VydC5oPgo+ID4gPiArI2luY2x1ZGUgPHN0ZGJvb2wuaD4KPiA+ID4KPiA+ID4gICNpZmRlZiBI QVZFX1NZU19TVEFUX0gKPiA+ID4gICNpbmNsdWRlIDxzeXMvc3RhdC5oPgo+ID4gPiBAQCAtMzks MTAgKzQwLDYyIEBAIHN0cnVjdCBmMmZzX3N1cGVyX2Jsb2NrIHJhd19zYjsKPiA+ID4gIHN0cnVj dCBmMmZzX3N1cGVyX2Jsb2NrICpzYiA9ICZyYXdfc2I7Cj4gPiA+ICBzdHJ1Y3QgZjJmc19jaGVj a3BvaW50ICpjcDsKPiA+ID4KPiA+ID4gK3N0YXRpYyBpbmxpbmUgYm9vbCBkZXZpY2VfaXNfYWxp YXNlZCh1bnNpZ25lZCBpbnQgZGV2X251bSkKPiA+ID4gK3sKPiA+ID4gKyAgICAgaWYgKGRldl9u dW0gPj0gYy5uZGV2cykKPiA+ID4gKyAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cj4gPiA+ICsg ICAgIHJldHVybiBjLmRldmljZXNbZGV2X251bV0uYWxpYXNfZmlsZW5hbWUgIT0gTlVMTDsKPiA+ ID4gK30KPiA+ID4gKwo+ID4gPiArc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdGFyZ2V0X2Rl dmljZV9pbmRleCh1aW50NjRfdCBibGthZGRyKQo+ID4gPiArewo+ID4gPiArICAgICBpbnQgaTsK PiA+ID4gKwo+ID4gPiArICAgICBmb3IgKGkgPSAwOyBpIDwgYy5uZGV2czsgaSsrKQo+ID4gPiAr ICAgICAgICAgICAgIGlmIChjLmRldmljZXNbaV0uc3RhcnRfYmxrYWRkciA8PSBibGthZGRyICYm Cj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuZGV2aWNlc1tpXS5lbmRfYmxr YWRkciA+PSBibGthZGRyKQo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Cj4g PiA+ICsgICAgIHJldHVybiAwOwo+ID4gPiArfQo+ID4gPiArCj4gPiA+ICsjZGVmaW5lIEdFVF9T RUdOTyhibGtfYWRkcikgKChibGtfYWRkciAtIGdldF9zYihtYWluX2Jsa2FkZHIpKSAvIFwKPiA+ ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5ibGtzX3Blcl9zZWcpCj4gPiA+ICsj ZGVmaW5lIFNUQVJUX0JMT0NLKHNlZ25vKSAoc2Vnbm8gKiBjLmJsa3NfcGVyX3NlZyArIGdldF9z YihtYWluX2Jsa2FkZHIpKQo+ID4gPiArCj4gPiA+ICAvKiBSZXR1cm4gZmlyc3Qgc2VnbWVudCBu dW1iZXIgb2YgZWFjaCBhcmVhICovCj4gPiA+IC0jZGVmaW5lIHByZXZfem9uZShjdXIpICAgICAg ICAgICAgICAgKGMuY3VyX3NlZ1tjdXJdIC0gYy5zZWdzX3Blcl96b25lKQo+ID4gPiAtI2RlZmlu ZSBuZXh0X3pvbmUoY3VyKSAgICAgICAgICAgICAgIChjLmN1cl9zZWdbY3VyXSArIGMuc2Vnc19w ZXJfem9uZSkKPiA+ID4gLSNkZWZpbmUgbGFzdF96b25lKGN1cikgICAgICAgICAgICAgICAoKGN1 ciAtIDEpICogYy5zZWdzX3Blcl96b25lKQo+ID4gPiArc3RhdGljIGlubGluZSB1aW50MzJfdCBu ZXh0X3pvbmUoaW50IHNlZ190eXBlKQo+ID4gPiArewo+ID4gPiArICAgICB1aW50MzJfdCBuZXh0 X3NlZyA9IGMuY3VyX3NlZ1tzZWdfdHlwZV0gKyBjLnNlZ3NfcGVyX3pvbmU7Cj4gPiA+ICsgICAg IHVpbnQ2NF90IG5leHRfYmxrYWRkciA9IFNUQVJUX0JMT0NLKG5leHRfc2VnKTsKPiA+ID4gKyAg ICAgaW50IGRldl9udW07Cj4gPiA+ICsKPiA+ID4gKyAgICAgZGV2X251bSA9IHRhcmdldF9kZXZp Y2VfaW5kZXgobmV4dF9ibGthZGRyKTsKPiA+ID4gKyAgICAgaWYgKCFkZXZpY2VfaXNfYWxpYXNl ZChkZXZfbnVtKSkKPiA+ID4gKyAgICAgICAgICAgICByZXR1cm4gR0VUX1NFR05PKG5leHRfYmxr YWRkcik7Cj4gPiA+ICsKPiA+ID4gKyAgICAgd2hpbGUgKGRldl9udW0gPCBjLm5kZXZzICYmIGRl dmljZV9pc19hbGlhc2VkKGRldl9udW0pKQo+ID4gPiArICAgICAgICAgICAgIGRldl9udW0rKzsK PiA+ID4gKwo+ID4gPiArICAgICByZXR1cm4gR0VUX1NFR05PKGMuZGV2aWNlc1tkZXZfbnVtIC0g MV0uZW5kX2Jsa2FkZHIgKyAxKTsKPiA+ID4gK30KPiA+ID4gKwo+ID4gPiArc3RhdGljIGlubGlu ZSB1aW50MzJfdCBsYXN0X3pvbmUodWludDMyX3QgdG90YWxfem9uZSkKPiA+ID4gK3sKPiA+ID4g KyAgICAgdWludDMyX3QgbGFzdF9zZWcgPSAodG90YWxfem9uZSAtIDEpICogYy5zZWdzX3Blcl96 b25lOwo+ID4gPiArICAgICB1aW50NjRfdCBsYXN0X2Jsa2FkZHIgPSBTVEFSVF9CTE9DSyhsYXN0 X3NlZyk7Cj4gPiA+ICsgICAgIGludCBkZXZfbnVtOwo+ID4gPiArCj4gPiA+ICsgICAgIGRldl9u dW0gPSB0YXJnZXRfZGV2aWNlX2luZGV4KGxhc3RfYmxrYWRkcik7Cj4gPiA+ICsgICAgIGlmICgh ZGV2aWNlX2lzX2FsaWFzZWQoZGV2X251bSkpCj4gPiA+ICsgICAgICAgICAgICAgcmV0dXJuIEdF VF9TRUdOTyhsYXN0X2Jsa2FkZHIpOwo+ID4gPiArCj4gPiA+ICsgICAgIHdoaWxlIChkZXZfbnVt ID4gMCAmJiBkZXZpY2VfaXNfYWxpYXNlZChkZXZfbnVtKSkKPiA+ID4gKyAgICAgICAgICAgICBk ZXZfbnVtLS07Cj4gPiA+ICsKPiA+ID4gKyAgICAgcmV0dXJuIEdFVF9TRUdOTyhjLmRldmljZXNb ZGV2X251bSArIDFdLnN0YXJ0X2Jsa2FkZHIpIC0KPiA+ID4gKyAgICAgICAgICAgICBjLnNlZ3Nf cGVyX3pvbmU7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4gICNkZWZpbmUgbGFzdF9zZWN0aW9uKGN1 cikgICAgKGN1ciArIChjLnNlY3NfcGVyX3pvbmUgLSAxKSAqIGMuc2Vnc19wZXJfc2VjKQo+ID4g Pgo+ID4gPiAgLyogUmV0dXJuIHRpbWUgZml4ZWQgYnkgdGhlIHVzZXIgb3IgY3VycmVudCB0aW1l IGJ5IGRlZmF1bHQgKi8KPiA+ID4gQEAgLTIyMCw3ICsyNzMsNyBAQCBzdGF0aWMgaW50IGYyZnNf cHJlcGFyZV9zdXBlcl9ibG9jayh2b2lkKQo+ID4gPiAgICAgICB1aW50NjRfdCB0b3RhbF9tZXRh X3pvbmVzLCB0b3RhbF9tZXRhX3NlZ21lbnRzOwo+ID4gPiAgICAgICB1aW50MzJfdCBzaXRfYml0 bWFwX3NpemUsIG1heF9zaXRfYml0bWFwX3NpemU7Cj4gPiA+ICAgICAgIHVpbnQzMl90IG1heF9u YXRfYml0bWFwX3NpemUsIG1heF9uYXRfc2VnbWVudHM7Cj4gPiA+IC0gICAgIHVpbnQzMl90IHRv dGFsX3pvbmVzLCBhdmFpbF96b25lczsKPiA+ID4gKyAgICAgdWludDMyX3QgdG90YWxfem9uZXMs IGF2YWlsX3pvbmVzID0gMDsKPiA+ID4gICAgICAgZW51bSBxdW90YV90eXBlIHF0eXBlOwo+ID4g PiAgICAgICBpbnQgaTsKPiA+ID4KPiA+ID4gQEAgLTMxNCw2ICszNjcsMTYgQEAgc3RhdGljIGlu dCBmMmZzX3ByZXBhcmVfc3VwZXJfYmxvY2sodm9pZCkKPiA+ID4gICAgICAgICAgICAgICAgICAg ICAgIGMuZGV2aWNlc1tpXS5lbmRfYmxrYWRkciA9IGMuZGV2aWNlc1tpXS5zdGFydF9ibGthZGRy ICsKPiA+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmRldmljZXNb aV0udG90YWxfc2VnbWVudHMgKgo+ID4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGMuYmxrc19wZXJfc2VnIC0gMTsKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgIGlm IChkZXZpY2VfaXNfYWxpYXNlZChpKSkgewo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBpZiAoYy5kZXZpY2VzW2ldLnpvbmVkX21vZGVsID09Cj4gPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGMkZTX1pPTkVEX0hNKSB7Cj4gPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNHKDEsICJcdEVycm9yOiBkbyBu b3Qgc3VwcG9ydCAiCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ImRldmljZSBhbGlhc2luZyBmb3IgZGV2aWNlWyVkXVxuIiwgaSk7Cj4gPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwo+ID4gPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICB9Cj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMu YWxpYXNlZF9zZWdtZW50cyArPQo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGMuZGV2aWNlc1tpXS50b3RhbF9zZWdtZW50czsKPiA+ID4gKyAgICAgICAgICAgICAg ICAgICAgIH0KPiA+ID4gICAgICAgICAgICAgICB9Cj4gPiA+ICAgICAgICAgICAgICAgaWYgKGMu bmRldnMgPiAxKSB7Cj4gPiA+ICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoc2ItPmRldnNb aV0ucGF0aCwgYy5kZXZpY2VzW2ldLnBhdGgsIE1BWF9QQVRIX0xFTik7Cj4gPiA+IEBAIC01MzEs MTAgKzU5NCwxNiBAQCBzdGF0aWMgaW50IGYyZnNfcHJlcGFyZV9zdXBlcl9ibG9jayh2b2lkKQo+ ID4gPiAgICAgICBpZiAoYy5mZWF0dXJlICYgRjJGU19GRUFUVVJFX0xPU1RfRk9VTkQpCj4gPiA+ ICAgICAgICAgICAgICAgYy5scGZfaW5vID0gYy5uZXh0X2ZyZWVfbmlkKys7Cj4gPiA+Cj4gPiA+ ICsgICAgIGlmIChjLmFsaWFzZWRfZGV2aWNlcykgewo+ID4gPiArICAgICAgICAgICAgIGMuZmly c3RfYWxpYXNfaW5vID0gYy5uZXh0X2ZyZWVfbmlkOwo+ID4gPiArICAgICAgICAgICAgIGMubmV4 dF9mcmVlX25pZCArPSBjLmFsaWFzZWRfZGV2aWNlczsKPiA+ID4gKyAgICAgICAgICAgICBhdmFp bF96b25lcyArPSBjLmFsaWFzZWRfc2VnbWVudHMgLyBjLnNlZ3NfcGVyX3pvbmU7Cj4gPiA+ICsg ICAgIH0KPiA+ID4gKwo+ID4gPiAgICAgICBpZiAoYy5mZWF0dXJlICYgRjJGU19GRUFUVVJFX1JP KQo+ID4gPiAtICAgICAgICAgICAgIGF2YWlsX3pvbmVzID0gMjsKPiA+ID4gKyAgICAgICAgICAg ICBhdmFpbF96b25lcyArPSAyOwo+ID4gPiAgICAgICBlbHNlCj4gPiA+IC0gICAgICAgICAgICAg YXZhaWxfem9uZXMgPSA2Owo+ID4gPiArICAgICAgICAgICAgIGF2YWlsX3pvbmVzICs9IDY7Cj4g PiA+Cj4gPiA+ICAgICAgIGlmICh0b3RhbF96b25lcyA8PSBhdmFpbF96b25lcykgewo+ID4gPiAg ICAgICAgICAgICAgIE1TRygxLCAiXHRFcnJvcjogJWQgem9uZXM6IE5lZWQgbW9yZSB6b25lcyAi Cj4gPiA+IEBAIC03MDEsNiArNzcwLDcgQEAgc3RhdGljIGludCBmMmZzX3dyaXRlX2NoZWNrX3Bv aW50X3BhY2sodm9pZCkKPiA+ID4gICAgICAgY2hhciAqc3VtX2NvbXBhY3QsICpzdW1fY29tcGFj dF9wOwo+ID4gPiAgICAgICBzdHJ1Y3QgZjJmc19zdW1tYXJ5ICpzdW1fZW50cnk7Cj4gPiA+ICAg ICAgIHVuc2lnbmVkIHNob3J0IHZibG9ja3M7Cj4gPiA+ICsgICAgIHVpbnQzMl90IHVzZWRfc2Vn bWVudHMgPSBjLmFsaWFzZWRfc2VnbWVudHM7Cj4gPiA+ICAgICAgIGludCByZXQgPSAtMTsKPiA+ ID4KPiA+ID4gICAgICAgY3AgPSBjYWxsb2MoRjJGU19CTEtTSVpFLCAxKTsKPiA+ID4gQEAgLTc1 Miw5ICs4MjIsMTQgQEAgc3RhdGljIGludCBmMmZzX3dyaXRlX2NoZWNrX3BvaW50X3BhY2sodm9p ZCkKPiA+ID4gICAgICAgfQo+ID4gPgo+ID4gPiAgICAgICBzZXRfY3AoY3VyX25vZGVfYmxrb2Zm WzBdLCBjLmN1cnNlZ19vZmZzZXRbQ1VSU0VHX0hPVF9OT0RFXSk7Cj4gPiA+ICsgICAgIHNldF9j cChjdXJfbm9kZV9ibGtvZmZbMl0sIGMuY3Vyc2VnX29mZnNldFtDVVJTRUdfQ09MRF9OT0RFXSk7 Cj4gPiA+ICAgICAgIHNldF9jcChjdXJfZGF0YV9ibGtvZmZbMF0sIGMuY3Vyc2VnX29mZnNldFtD VVJTRUdfSE9UX0RBVEFdKTsKPiA+ID4gKyAgICAgc2V0X2NwKGN1cl9kYXRhX2Jsa29mZlsyXSwg Yy5jdXJzZWdfb2Zmc2V0W0NVUlNFR19DT0xEX0RBVEFdKTsKPiA+ID4gICAgICAgc2V0X2NwKHZh bGlkX2Jsb2NrX2NvdW50LCBjLmN1cnNlZ19vZmZzZXRbQ1VSU0VHX0hPVF9OT0RFXSArCj4gPiA+ IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5jdXJzZWdfb2Zmc2V0W0NV UlNFR19IT1RfREFUQV0pOwo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgYy5jdXJzZWdfb2Zm c2V0W0NVUlNFR19IT1RfREFUQV0gKwo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgYy5jdXJz ZWdfb2Zmc2V0W0NVUlNFR19DT0xEX05PREVdICsKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAg IGMuY3Vyc2VnX29mZnNldFtDVVJTRUdfQ09MRF9EQVRBXSArCj4gPiA+ICsgICAgICAgICAgICAg ICAgICAgICBjLmFsaWFzZWRfc2VnbWVudHMgKiBjLmJsa3NfcGVyX3NlZyk7Cj4gPiA+ICAgICAg IHNldF9jcChyc3ZkX3NlZ21lbnRfY291bnQsIGMucmVzZXJ2ZWRfc2VnbWVudHMpOwo+ID4gPgo+ ID4gPiAgICAgICAvKgo+ID4gPiBAQCAtODAyLDE1ICs4NzcsMTYgQEAgc3RhdGljIGludCBmMmZz X3dyaXRlX2NoZWNrX3BvaW50X3BhY2sodm9pZCkKPiA+ID4gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBjLnJlc2VydmVkX3NlZ21lbnRzKTsKPiA+ID4KPiA+ID4gICAgICAg LyogbWFpbiBzZWdtZW50cyAtIHJlc2VydmVkIHNlZ21lbnRzIC0gKG5vZGUgKyBkYXRhIHNlZ21l bnRzKSAqLwo+ID4gPiAtICAgICBpZiAoYy5mZWF0dXJlICYgRjJGU19GRUFUVVJFX1JPKSB7Cj4g PiA+IC0gICAgICAgICAgICAgc2V0X2NwKGZyZWVfc2VnbWVudF9jb3VudCwgZjJmc19nZXRfdXNh YmxlX3NlZ21lbnRzKHNiKSAtIDIpOwo+ID4gPiAtICAgICAgICAgICAgIHNldF9jcCh1c2VyX2Js b2NrX2NvdW50LCAoKGdldF9jcChmcmVlX3NlZ21lbnRfY291bnQpICsgMiAtCj4gPiA+IC0gICAg ICAgICAgICAgICAgICAgICBnZXRfY3Aob3ZlcnByb3Zfc2VnbWVudF9jb3VudCkpICogYy5ibGtz X3Blcl9zZWcpKTsKPiA+ID4gLSAgICAgfSBlbHNlIHsKPiA+ID4gLSAgICAgICAgICAgICBzZXRf Y3AoZnJlZV9zZWdtZW50X2NvdW50LCBmMmZzX2dldF91c2FibGVfc2VnbWVudHMoc2IpIC0gNik7 Cj4gPiA+IC0gICAgICAgICAgICAgc2V0X2NwKHVzZXJfYmxvY2tfY291bnQsICgoZ2V0X2NwKGZy ZWVfc2VnbWVudF9jb3VudCkgKyA2IC0KPiA+ID4gLSAgICAgICAgICAgICAgICAgICAgIGdldF9j cChvdmVycHJvdl9zZWdtZW50X2NvdW50KSkgKiBjLmJsa3NfcGVyX3NlZykpOwo+ID4gPiAtICAg ICB9Cj4gPiA+ICsgICAgIGlmIChjLmZlYXR1cmUgJiBGMkZTX0ZFQVRVUkVfUk8pCj4gPiA+ICsg ICAgICAgICAgICAgdXNlZF9zZWdtZW50cyArPSAyOwo+ID4gPiArICAgICBlbHNlCj4gPiA+ICsg ICAgICAgICAgICAgdXNlZF9zZWdtZW50cyArPSA2Owo+ID4gPiArCj4gPiA+ICsgICAgIHNldF9j cCh1c2VyX2Jsb2NrX2NvdW50LCAoZjJmc19nZXRfdXNhYmxlX3NlZ21lbnRzKHNiKSAtCj4gPiA+ ICsgICAgICAgICAgICAgICAgICAgICBnZXRfY3Aob3ZlcnByb3Zfc2VnbWVudF9jb3VudCkpICog Yy5ibGtzX3Blcl9zZWcpOwo+ID4gPiArICAgICBzZXRfY3AoZnJlZV9zZWdtZW50X2NvdW50LCBm MmZzX2dldF91c2FibGVfc2VnbWVudHMoc2IpIC0KPiA+ID4gKyAgICAgICAgICAgICAgICAgICAg IHVzZWRfc2VnbWVudHMpOwo+ID4gPiArCj4gPiA+ICAgICAgIC8qIGNwIHBhZ2UgKDIpLCBkYXRh IHN1bW1hcmllcyAoMSksIG5vZGUgc3VtbWFyaWVzICgzKSAqLwo+ID4gPiAgICAgICBzZXRfY3Ao Y3BfcGFja190b3RhbF9ibG9ja19jb3VudCwgNiArIGdldF9zYihjcF9wYXlsb2FkKSk7Cj4gPiA+ ICAgICAgIGZsYWdzID0gQ1BfVU1PVU5UX0ZMQUcgfCBDUF9DT01QQUNUX1NVTV9GTEFHOwo+ID4g PiBAQCAtODI2LDggKzkwMiwxMCBAQCBzdGF0aWMgaW50IGYyZnNfd3JpdGVfY2hlY2tfcG9pbnRf cGFjayh2b2lkKQo+ID4gPgo+ID4gPiAgICAgICBzZXRfY3AoY2twdF9mbGFncywgZmxhZ3MpOwo+ ID4gPiAgICAgICBzZXRfY3AoY3BfcGFja19zdGFydF9zdW0sIDEgKyBnZXRfc2IoY3BfcGF5bG9h ZCkpOwo+ID4gPiAtICAgICBzZXRfY3AodmFsaWRfbm9kZV9jb3VudCwgYy5jdXJzZWdfb2Zmc2V0 W0NVUlNFR19IT1RfTk9ERV0pOwo+ID4gPiAtICAgICBzZXRfY3AodmFsaWRfaW5vZGVfY291bnQs IGMuY3Vyc2VnX29mZnNldFtDVVJTRUdfSE9UX05PREVdKTsKPiA+ID4gKyAgICAgc2V0X2NwKHZh bGlkX25vZGVfY291bnQsIGMuY3Vyc2VnX29mZnNldFtDVVJTRUdfSE9UX05PREVdICsKPiA+ID4g KyAgICAgICAgICAgICAgICAgICAgIGMuY3Vyc2VnX29mZnNldFtDVVJTRUdfQ09MRF9OT0RFXSk7 Cj4gPiA+ICsgICAgIHNldF9jcCh2YWxpZF9pbm9kZV9jb3VudCwgYy5jdXJzZWdfb2Zmc2V0W0NV UlNFR19IT1RfTk9ERV0gKwo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgYy5jdXJzZWdfb2Zm c2V0W0NVUlNFR19DT0xEX05PREVdKTsKPiA+ID4gICAgICAgc2V0X2NwKG5leHRfZnJlZV9uaWQs IGMubmV4dF9mcmVlX25pZCk7Cj4gPiA+ICAgICAgIHNldF9jcChzaXRfdmVyX2JpdG1hcF9ieXRl c2l6ZSwgKChnZXRfc2Ioc2VnbWVudF9jb3VudF9zaXQpIC8gMikgPDwKPiA+ID4gICAgICAgICAg ICAgICAgICAgICAgIGdldF9zYihsb2dfYmxvY2tzX3Blcl9zZWcpKSAvIDgpOwo+ID4gPiBAQCAt OTc1LDkgKzEwNTMsMTIgQEAgc3RhdGljIGludCBmMmZzX3dyaXRlX2NoZWNrX3BvaW50X3BhY2so dm9pZCkKPiA+ID4gICAgICAgICAgICAgICBnb3RvIGZyZWVfY3BfcGF5bG9hZDsKPiA+ID4gICAg ICAgfQo+ID4gPgo+ID4gPiAtICAgICAvKiBGaWxsIHNlZ21lbnQgc3VtbWFyeSBmb3IgQ09MRF9O T0RFIHRvIHplcm8uICovCj4gPiA+ICsgICAgIC8qIFByZXBhcmUgYW5kIHdyaXRlIFNlZ21lbnQg c3VtbWFyeSBmb3IgQ09MRF9OT0RFICovCj4gPiA+ICAgICAgIG1lbXNldChzdW0sIDAsIEYyRlNf QkxLU0laRSk7Cj4gPiA+ICAgICAgIFNFVF9TVU1fVFlQRShzdW0sIFNVTV9UWVBFX05PREUpOwo+ ID4gPiArICAgICBtZW1jcHkoc3VtLT5lbnRyaWVzLCBjLnN1bVtDVVJTRUdfQ09MRF9OT0RFXSwK PiA+ID4gKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgZjJmc19zdW1tYXJ5KSAq IE1BWF9DQUNIRV9TVU1TKTsKPiA+ID4gKwo+ID4gPiAgICAgICBjcF9zZWdfYmxrKys7Cj4gPiA+ ICAgICAgIERCRygxLCAiXHRXcml0aW5nIFNlZ21lbnQgc3VtbWFyeSBmb3IgQ09MRF9OT0RFLCBh dCBvZmZzZXQgMHglMDgiUFJJeDY0IlxuIiwKPiA+ID4gICAgICAgICAgICAgICAgICAgICAgIGNw X3NlZ19ibGspOwo+ID4gPiBAQCAtMTIxMCwxMCArMTI5MSw0MCBAQCB2b2lkIHVwZGF0ZV9zdW1t YXJ5X2VudHJ5KGludCBjdXJzZWdfdHlwZSwgbmlkX3QgbmlkLAo+ID4gPiAgICAgICBzdW0tPm9m c19pbl9ub2RlID0gY3B1X3RvX2xlMTYob2ZzX2luX25vZGUpOwo+ID4gPiAgfQo+ID4gPgo+ID4g PiArc3RhdGljIHZvaWQgYWRkX2RlbnRyeShzdHJ1Y3QgZjJmc19kZW50cnlfYmxvY2sgKmRlbnRf YmxrLCB1bnNpZ25lZCBpbnQgKmRpZHgsCj4gPiA+ICsgICAgICAgICAgICAgY29uc3QgY2hhciAq bmFtZSwgdWludDMyX3QgaW5vLCB1OCB0eXBlKQo+ID4gPiArewo+ID4gPiArICAgICBpbnQgbGVu ID0gc3RybGVuKG5hbWUpOwo+ID4gPiArICAgICBmMmZzX2hhc2hfdCBoYXNoOwo+ID4gPiArCj4g PiA+ICsgICAgIGlmIChuYW1lWzBdID09ICcuJyAmJiAobGVuID09IDEgfHwgKGxlbiA9PSAyICYm IG5hbWVbMV0gPT0gJy4nKSkpCj4gPiA+ICsgICAgICAgICAgICAgaGFzaCA9IDA7Cj4gPiA+ICsg ICAgIGVsc2UKPiA+ID4gKyAgICAgICAgICAgICBoYXNoID0gZjJmc19kZW50cnlfaGFzaCgwLCAw LCAodW5zaWduZWQgY2hhciAqKW5hbWUsIGxlbik7Cj4gPiA+ICsKPiA+ID4gKyAgICAgRjJGU19E RU5UUllfQkxPQ0tfREVOVFJZKGRlbnRfYmxrLCAqZGlkeCkuaGFzaF9jb2RlID0gY3B1X3RvX2xl MzIoaGFzaCk7Cj4gPiA+ICsgICAgIEYyRlNfREVOVFJZX0JMT0NLX0RFTlRSWShkZW50X2Jsaywg KmRpZHgpLmlubyA9IGNwdV90b19sZTMyKGlubyk7Cj4gPiA+ICsgICAgIEYyRlNfREVOVFJZX0JM T0NLX0RFTlRSWShkZW50X2JsaywgKmRpZHgpLm5hbWVfbGVuID0gY3B1X3RvX2xlMTYobGVuKTsK PiA+ID4gKyAgICAgRjJGU19ERU5UUllfQkxPQ0tfREVOVFJZKGRlbnRfYmxrLCAqZGlkeCkuZmls ZV90eXBlID0gdHlwZTsKPiA+ID4gKwo+ID4gPiArICAgICB3aGlsZSAobGVuID4gRjJGU19TTE9U X0xFTikgewo+ID4gPiArICAgICAgICAgICAgIG1lbWNweShGMkZTX0RFTlRSWV9CTE9DS19GSUxF TkFNRShkZW50X2JsaywgKmRpZHgpLCBuYW1lLAo+ID4gPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBGMkZTX1NMT1RfTEVOKTsKPiA+ID4gKyAgICAgICAgICAgICB0ZXN0X2FuZF9zZXRf Yml0X2xlKCpkaWR4LCBkZW50X2Jsay0+ZGVudHJ5X2JpdG1hcCk7Cj4gPiA+ICsgICAgICAgICAg ICAgbGVuIC09IChpbnQpRjJGU19TTE9UX0xFTjsKPiA+ID4gKyAgICAgICAgICAgICBuYW1lICs9 IEYyRlNfU0xPVF9MRU47Cj4gPiA+ICsgICAgICAgICAgICAgKCpkaWR4KSsrOwo+ID4gPiArICAg ICB9Cj4gPiA+ICsgICAgIG1lbWNweShGMkZTX0RFTlRSWV9CTE9DS19GSUxFTkFNRShkZW50X2Js aywgKmRpZHgpLCBuYW1lLCBsZW4pOwo+ID4gPiArICAgICB0ZXN0X2FuZF9zZXRfYml0X2xlKCpk aWR4LCBkZW50X2Jsay0+ZGVudHJ5X2JpdG1hcCk7Cj4gPiA+ICsgICAgICgqZGlkeCkrKzsKPiA+ ID4gK30KPiA+ID4gKwo+ID4gPiAgc3RhdGljIGJsb2NrX3QgZjJmc19hZGRfZGVmYXVsdF9kZW50 cnlfcm9vdCh2b2lkKQo+ID4gPiAgewo+ID4gPiAgICAgICBzdHJ1Y3QgZjJmc19kZW50cnlfYmxv Y2sgKmRlbnRfYmxrID0gTlVMTDsKPiA+ID4gICAgICAgYmxvY2tfdCBkYXRhX2Jsa2FkZHI7Cj4g PiA+ICsgICAgIHVuc2lnbmVkIGludCBkaWR4ID0gMDsKPiA+ID4KPiA+ID4gICAgICAgZGVudF9i bGsgPSBjYWxsb2MoRjJGU19CTEtTSVpFLCAxKTsKPiA+ID4gICAgICAgaWYoZGVudF9ibGsgPT0g TlVMTCkgewo+ID4gPiBAQCAtMTIyMSwzNyArMTMzMiwyNiBAQCBzdGF0aWMgYmxvY2tfdCBmMmZz X2FkZF9kZWZhdWx0X2RlbnRyeV9yb290KHZvaWQpCj4gPiA+ICAgICAgICAgICAgICAgcmV0dXJu IDA7Cj4gPiA+ICAgICAgIH0KPiA+ID4KPiA+ID4gLSAgICAgRjJGU19ERU5UUllfQkxPQ0tfREVO VFJZKGRlbnRfYmxrLCAwKS5oYXNoX2NvZGUgPSAwOwo+ID4gPiAtICAgICBGMkZTX0RFTlRSWV9C TE9DS19ERU5UUlkoZGVudF9ibGssIDApLmlubyA9IHNiLT5yb290X2lubzsKPiA+ID4gLSAgICAg RjJGU19ERU5UUllfQkxPQ0tfREVOVFJZKGRlbnRfYmxrLCAwKS5uYW1lX2xlbiA9IGNwdV90b19s ZTE2KDEpOwo+ID4gPiAtICAgICBGMkZTX0RFTlRSWV9CTE9DS19ERU5UUlkoZGVudF9ibGssIDAp LmZpbGVfdHlwZSA9IEYyRlNfRlRfRElSOwo+ID4gPiAtICAgICBtZW1jcHkoRjJGU19ERU5UUllf QkxPQ0tfRklMRU5BTUUoZGVudF9ibGssIDApLCAiLiIsIDEpOwo+ID4gPiArICAgICBhZGRfZGVu dHJ5KGRlbnRfYmxrLCAmZGlkeCwgIi4iLAo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgbGUz Ml90b19jcHUoc2ItPnJvb3RfaW5vKSwgRjJGU19GVF9ESVIpOwo+ID4gPiArICAgICBhZGRfZGVu dHJ5KGRlbnRfYmxrLCAmZGlkeCwgIi4uIiwKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgIGxl MzJfdG9fY3B1KHNiLT5yb290X2lubyksIEYyRlNfRlRfRElSKTsKPiA+ID4KPiA+ID4gLSAgICAg RjJGU19ERU5UUllfQkxPQ0tfREVOVFJZKGRlbnRfYmxrLCAxKS5oYXNoX2NvZGUgPSAwOwo+ID4g PiAtICAgICBGMkZTX0RFTlRSWV9CTE9DS19ERU5UUlkoZGVudF9ibGssIDEpLmlubyA9IHNiLT5y b290X2lubzsKPiA+ID4gLSAgICAgRjJGU19ERU5UUllfQkxPQ0tfREVOVFJZKGRlbnRfYmxrLCAx KS5uYW1lX2xlbiA9IGNwdV90b19sZTE2KDIpOwo+ID4gPiAtICAgICBGMkZTX0RFTlRSWV9CTE9D S19ERU5UUlkoZGVudF9ibGssIDEpLmZpbGVfdHlwZSA9IEYyRlNfRlRfRElSOwo+ID4gPiAtICAg ICBtZW1jcHkoRjJGU19ERU5UUllfQkxPQ0tfRklMRU5BTUUoZGVudF9ibGssIDEpLCAiLi4iLCAy KTsKPiA+ID4gLQo+ID4gPiAtICAgICAvKiBiaXRtYXAgZm9yIC4gYW5kIC4uICovCj4gPiA+IC0g ICAgIHRlc3RfYW5kX3NldF9iaXRfbGUoMCwgZGVudF9ibGstPmRlbnRyeV9iaXRtYXApOwo+ID4g PiAtICAgICB0ZXN0X2FuZF9zZXRfYml0X2xlKDEsIGRlbnRfYmxrLT5kZW50cnlfYml0bWFwKTsK PiA+ID4gLQo+ID4gPiAtICAgICBpZiAoYy5scGZfaW5vKSB7Cj4gPiA+IC0gICAgICAgICAgICAg aW50IGxlbiA9IHN0cmxlbihMUEYpOwo+ID4gPiAtICAgICAgICAgICAgIGYyZnNfaGFzaF90IGhh c2ggPSBmMmZzX2RlbnRyeV9oYXNoKDAsIDAsICh1bnNpZ25lZCBjaGFyICopTFBGLCBsZW4pOwo+ ID4gPiArICAgICBpZiAoYy5scGZfaW5vKQo+ID4gPiArICAgICAgICAgICAgIGFkZF9kZW50cnko ZGVudF9ibGssICZkaWR4LCBMUEYsIGMubHBmX2lubywgRjJGU19GVF9ESVIpOwo+ID4gPgo+ID4g PiAtICAgICAgICAgICAgIEYyRlNfREVOVFJZX0JMT0NLX0RFTlRSWShkZW50X2JsaywgMikuaGFz aF9jb2RlID0gY3B1X3RvX2xlMzIoaGFzaCk7Cj4gPiA+IC0gICAgICAgICAgICAgRjJGU19ERU5U UllfQkxPQ0tfREVOVFJZKGRlbnRfYmxrLCAyKS5pbm8gPSBjcHVfdG9fbGUzMihjLmxwZl9pbm8p Owo+ID4gPiAtICAgICAgICAgICAgIEYyRlNfREVOVFJZX0JMT0NLX0RFTlRSWShkZW50X2Jsaywg MikubmFtZV9sZW4gPSBjcHVfdG9fbGUxNihsZW4pOwo+ID4gPiAtICAgICAgICAgICAgIEYyRlNf REVOVFJZX0JMT0NLX0RFTlRSWShkZW50X2JsaywgMikuZmlsZV90eXBlID0gRjJGU19GVF9ESVI7 Cj4gPiA+IC0gICAgICAgICAgICAgbWVtY3B5KEYyRlNfREVOVFJZX0JMT0NLX0ZJTEVOQU1FKGRl bnRfYmxrLCAyKSwgTFBGLCBGMkZTX1NMT1RfTEVOKTsKPiA+ID4gKyAgICAgaWYgKGMuYWxpYXNl ZF9kZXZpY2VzKSB7Cj4gPiA+ICsgICAgICAgICAgICAgaW50IGksIGRldl9vZmYgPSAwOwo+ID4g Pgo+ID4gPiAtICAgICAgICAgICAgIG1lbWNweShGMkZTX0RFTlRSWV9CTE9DS19GSUxFTkFNRShk ZW50X2JsaywgMyksICZMUEZbRjJGU19TTE9UX0xFTl0sCj4gPiA+IC0gICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGxlbiAtIEYyRlNfU0xPVF9MRU4pOwo+ID4gPiArICAgICAgICAgICAgIGZv ciAoaSA9IDE7IGkgPCBjLm5kZXZzOyBpKyspIHsKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAg IGlmICghZGV2aWNlX2lzX2FsaWFzZWQoaSkpCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGNvbnRpbnVlOwo+ID4gPgo+ID4gPiAtICAgICAgICAgICAgIHRlc3RfYW5kX3NldF9i aXRfbGUoMiwgZGVudF9ibGstPmRlbnRyeV9iaXRtYXApOwo+ID4gPiAtICAgICAgICAgICAgIHRl c3RfYW5kX3NldF9iaXRfbGUoMywgZGVudF9ibGstPmRlbnRyeV9iaXRtYXApOwo+ID4gPiArICAg ICAgICAgICAgICAgICAgICAgYWRkX2RlbnRyeShkZW50X2JsaywgJmRpZHgsIGMuZGV2aWNlc1tp XS5hbGlhc19maWxlbmFtZSwKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBjLmZpcnN0X2FsaWFzX2lubyArIGRldl9vZmYsCj4gPiA+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgRjJGU19GVF9SRUdfRklMRSk7Cj4gPiA+ICsgICAgICAgICAg ICAgICAgICAgICBkZXZfb2ZmKys7Cj4gPiA+ICsgICAgICAgICAgICAgfQo+ID4gPiAgICAgICB9 Cj4gPiA+Cj4gPiA+ICAgICAgIGRhdGFfYmxrYWRkciA9IGFsbG9jX25leHRfZnJlZV9ibG9jayhD VVJTRUdfSE9UX0RBVEEpOwo+ID4gPiBAQCAtMTMyNCw2ICsxNDI0LDcgQEAgc3RhdGljIGludCBm MmZzX3dyaXRlX2RlZmF1bHRfcXVvdGEoaW50IHF0eXBlLCBfX2xlMzIgcmF3X2lkKQo+ID4gPiAg ICAgICBzdHJ1Y3QgdjJfZGlza19kcWluZm8gZGRxaW5mbzsKPiA+ID4gICAgICAgc3RydWN0IHYy cjFfZGlza19kcWJsayBkcWJsazsKPiA+ID4gICAgICAgYmxvY2tfdCBibGthZGRyOwo+ID4gPiAr ICAgICB1aW50NjRfdCBpY250ID0gMSwgYmNudCA9IDE7Cj4gPiA+ICAgICAgIGludCBpOwo+ID4g Pgo+ID4gPiAgICAgICBpZiAoZmlsZWJ1ZiA9PSBOVUxMKSB7Cj4gPiA+IEBAIC0xMzU5LDE2ICsx NDYwLDE4IEBAIHN0YXRpYyBpbnQgZjJmc193cml0ZV9kZWZhdWx0X3F1b3RhKGludCBxdHlwZSwg X19sZTMyIHJhd19pZCkKPiA+ID4gICAgICAgZHFibGsuZHFiX3BhZCA9IGNwdV90b19sZTMyKDAp Owo+ID4gPiAgICAgICBkcWJsay5kcWJfaWhhcmRsaW1pdCA9IGNwdV90b19sZTY0KDApOwo+ID4g PiAgICAgICBkcWJsay5kcWJfaXNvZnRsaW1pdCA9IGNwdV90b19sZTY0KDApOwo+ID4gPiAtICAg ICBpZiAoYy5scGZfaW5vKQo+ID4gPiAtICAgICAgICAgICAgIGRxYmxrLmRxYl9jdXJpbm9kZXMg PSBjcHVfdG9fbGU2NCgyKTsKPiA+ID4gLSAgICAgZWxzZQo+ID4gPiAtICAgICAgICAgICAgIGRx YmxrLmRxYl9jdXJpbm9kZXMgPSBjcHVfdG9fbGU2NCgxKTsKPiA+ID4gKyAgICAgaWYgKGMubHBm X2lubykgewo+ID4gPiArICAgICAgICAgICAgIGljbnQrKzsKPiA+ID4gKyAgICAgICAgICAgICBi Y250Kys7Cj4gPiA+ICsgICAgIH0KPiA+ID4gKyAgICAgaWYgKGMuYWxpYXNlZF9kZXZpY2VzKSB7 Cj4gPiA+ICsgICAgICAgICAgICAgaWNudCArPSBjLmFsaWFzZWRfZGV2aWNlczsKPiA+ID4gKyAg ICAgICAgICAgICBiY250ICs9IGMuYWxpYXNlZF9zZWdtZW50cyAqIGMuYmxrc19wZXJfc2VnOwo+ ID4gPiArICAgICB9Cj4gPiA+ICsgICAgIGRxYmxrLmRxYl9jdXJpbm9kZXMgPSBjcHVfdG9fbGU2 NChpY250KTsKPiA+ID4gICAgICAgZHFibGsuZHFiX2JoYXJkbGltaXQgPSBjcHVfdG9fbGU2NCgw KTsKPiA+ID4gICAgICAgZHFibGsuZHFiX2Jzb2Z0bGltaXQgPSBjcHVfdG9fbGU2NCgwKTsKPiA+ ID4gLSAgICAgaWYgKGMubHBmX2lubykKPiA+ID4gLSAgICAgICAgICAgICBkcWJsay5kcWJfY3Vy c3BhY2UgPSBjcHVfdG9fbGU2NChGMkZTX0JMS1NJWkUgKiAyKTsKPiA+ID4gLSAgICAgZWxzZQo+ ID4gPiAtICAgICAgICAgICAgIGRxYmxrLmRxYl9jdXJzcGFjZSA9IGNwdV90b19sZTY0KEYyRlNf QkxLU0laRSk7Cj4gPiA+ICsgICAgIGRxYmxrLmRxYl9jdXJzcGFjZSA9IGNwdV90b19sZTY0KEYy RlNfQkxLU0laRSAqIGJjbnQpOwo+ID4gPiAgICAgICBkcWJsay5kcWJfYnRpbWUgPSBjcHVfdG9f bGU2NCgwKTsKPiA+ID4gICAgICAgZHFibGsuZHFiX2l0aW1lID0gY3B1X3RvX2xlNjQoMCk7Cj4g PiA+Cj4gPiA+IEBAIC0xNDkxLDYgKzE1OTQsNyBAQCBzdGF0aWMgYmxvY2tfdCBmMmZzX2FkZF9k ZWZhdWx0X2RlbnRyeV9scGYodm9pZCkKPiA+ID4gIHsKPiA+ID4gICAgICAgc3RydWN0IGYyZnNf ZGVudHJ5X2Jsb2NrICpkZW50X2JsazsKPiA+ID4gICAgICAgYmxvY2tfdCBkYXRhX2Jsa2FkZHI7 Cj4gPiA+ICsgICAgIHVuc2lnbmVkIGludCBkaWR4ID0gMDsKPiA+ID4KPiA+ID4gICAgICAgZGVu dF9ibGsgPSBjYWxsb2MoRjJGU19CTEtTSVpFLCAxKTsKPiA+ID4gICAgICAgaWYgKGRlbnRfYmxr ID09IE5VTEwpIHsKPiA+ID4gQEAgLTE0OTgsMjAgKzE2MDIsOCBAQCBzdGF0aWMgYmxvY2tfdCBm MmZzX2FkZF9kZWZhdWx0X2RlbnRyeV9scGYodm9pZCkKPiA+ID4gICAgICAgICAgICAgICByZXR1 cm4gMDsKPiA+ID4gICAgICAgfQo+ID4gPgo+ID4gPiAtICAgICBGMkZTX0RFTlRSWV9CTE9DS19E RU5UUlkoZGVudF9ibGssIDApLmhhc2hfY29kZSA9IDA7Cj4gPiA+IC0gICAgIEYyRlNfREVOVFJZ X0JMT0NLX0RFTlRSWShkZW50X2JsaywgMCkuaW5vID0gY3B1X3RvX2xlMzIoYy5scGZfaW5vKTsK PiA+ID4gLSAgICAgRjJGU19ERU5UUllfQkxPQ0tfREVOVFJZKGRlbnRfYmxrLCAwKS5uYW1lX2xl biA9IGNwdV90b19sZTE2KDEpOwo+ID4gPiAtICAgICBGMkZTX0RFTlRSWV9CTE9DS19ERU5UUlko ZGVudF9ibGssIDApLmZpbGVfdHlwZSA9IEYyRlNfRlRfRElSOwo+ID4gPiAtICAgICBtZW1jcHko RjJGU19ERU5UUllfQkxPQ0tfRklMRU5BTUUoZGVudF9ibGssIDApLCAiLiIsIDEpOwo+ID4gPiAt Cj4gPiA+IC0gICAgIEYyRlNfREVOVFJZX0JMT0NLX0RFTlRSWShkZW50X2JsaywgMSkuaGFzaF9j b2RlID0gMDsKPiA+ID4gLSAgICAgRjJGU19ERU5UUllfQkxPQ0tfREVOVFJZKGRlbnRfYmxrLCAx KS5pbm8gPSBzYi0+cm9vdF9pbm87Cj4gPiA+IC0gICAgIEYyRlNfREVOVFJZX0JMT0NLX0RFTlRS WShkZW50X2JsaywgMSkubmFtZV9sZW4gPSBjcHVfdG9fbGUxNigyKTsKPiA+ID4gLSAgICAgRjJG U19ERU5UUllfQkxPQ0tfREVOVFJZKGRlbnRfYmxrLCAxKS5maWxlX3R5cGUgPSBGMkZTX0ZUX0RJ UjsKPiA+ID4gLSAgICAgbWVtY3B5KEYyRlNfREVOVFJZX0JMT0NLX0ZJTEVOQU1FKGRlbnRfYmxr LCAxKSwgIi4uIiwgMik7Cj4gPiA+IC0KPiA+ID4gLSAgICAgdGVzdF9hbmRfc2V0X2JpdF9sZSgw LCBkZW50X2Jsay0+ZGVudHJ5X2JpdG1hcCk7Cj4gPiA+IC0gICAgIHRlc3RfYW5kX3NldF9iaXRf bGUoMSwgZGVudF9ibGstPmRlbnRyeV9iaXRtYXApOwo+ID4gPiArICAgICBhZGRfZGVudHJ5KGRl bnRfYmxrLCAmZGlkeCwgIi4iLCBjLmxwZl9pbm8sIEYyRlNfRlRfRElSKTsKPiA+ID4gKyAgICAg YWRkX2RlbnRyeShkZW50X2JsaywgJmRpZHgsICIuLiIsIGMubHBmX2lubywgRjJGU19GVF9ESVIp Owo+ID4gPgo+ID4gPiAgICAgICBkYXRhX2Jsa2FkZHIgPSBhbGxvY19uZXh0X2ZyZWVfYmxvY2so Q1VSU0VHX0hPVF9EQVRBKTsKPiA+ID4KPiA+ID4gQEAgLTE1NzksNiArMTY3MSwxMDQgQEAgZXhp dDoKPiA+ID4gICAgICAgcmV0dXJuIGVycjsKPiA+ID4gIH0KPiA+ID4KPiA+ID4gK3N0YXRpYyB2 b2lkIGFsbG9jYXRlX2Jsb2Nrc19mb3JfYWxpYXNlZF9kZXZpY2Uoc3RydWN0IGYyZnNfbm9kZSAq cmF3X25vZGUsCj4gPiA+ICsgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRldl9udW0pCj4gPiA+ ICt7Cj4gPiA+ICsgICAgIHVpbnQzMl90IHN0YXJ0X3NlZ25vID0gKGMuZGV2aWNlc1tkZXZfbnVt XS5zdGFydF9ibGthZGRyIC0KPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgIGdldF9zYihtYWlu X2Jsa2FkZHIpKSAvIGMuYmxrc19wZXJfc2VnOwo+ID4gPiArICAgICB1aW50MzJfdCBlbmRfc2Vn bm8gPSAoYy5kZXZpY2VzW2Rldl9udW1dLmVuZF9ibGthZGRyIC0KPiA+ID4gKyAgICAgICAgICAg ICAgICAgICAgIGdldF9zYihtYWluX2Jsa2FkZHIpICsgMSkgLyBjLmJsa3NfcGVyX3NlZzsKPiA+ ID4gKyAgICAgdWludDMyX3Qgc2Vnbm87Cj4gPiA+ICsgICAgIHVpbnQ2NF90IGJsa2NudDsKPiA+ ID4gKyAgICAgc3RydWN0IGYyZnNfc2l0X2Jsb2NrICpzaXRfYmxrID0gY2FsbG9jKEYyRlNfQkxL U0laRSwgMSk7Cj4gPiA+ICsKPiA+ID4gKyAgICAgQVNTRVJUKHNpdF9ibGspOwo+ID4gPiArCj4g PiA+ICsgICAgIGZvciAoc2Vnbm8gPSBzdGFydF9zZWdubzsgc2Vnbm8gPCBlbmRfc2Vnbm87IHNl Z25vKyspIHsKPiA+ID4gKyAgICAgICAgICAgICBzdHJ1Y3QgZjJmc19zaXRfZW50cnkgKnNpdDsK PiA+ID4gKyAgICAgICAgICAgICB1aW50NjRfdCBzaXRfYmxrX2FkZHIgPSBnZXRfc2Ioc2l0X2Js a2FkZHIpICsKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgIChzZWdubyAvIFNJVF9FTlRSWV9Q RVJfQkxPQ0spOwo+ID4gPiArCj4gPiA+ICsgICAgICAgICAgICAgQVNTRVJUKGRldl9yZWFkX2Js b2NrKHNpdF9ibGssIHNpdF9ibGtfYWRkcikgPj0gMCk7Cj4gPiA+ICsgICAgICAgICAgICAgc2l0 ID0gJnNpdF9ibGstPmVudHJpZXNbc2Vnbm8gJSBTSVRfRU5UUllfUEVSX0JMT0NLXTsKPiA+ID4g KyAgICAgICAgICAgICBtZW1zZXQoJnNpdC0+dmFsaWRfbWFwLCAweEZGLCBTSVRfVkJMT0NLX01B UF9TSVpFKTsKPiA+ID4gKyAgICAgICAgICAgICBzaXQtPnZibG9ja3MgPSBjcHVfdG9fbGUxNigo Q1VSU0VHX0NPTERfREFUQSA8PAo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFNJVF9WQkxPQ0tTX1NISUZUKSB8IGMuYmxrc19wZXJfc2VnKTsKPiA+ID4gKyAgICAg ICAgICAgICBzaXQtPm10aW1lID0gY3B1X3RvX2xlNjQobWtmc190aW1lKTsKPiA+ID4gKyAgICAg ICAgICAgICBBU1NFUlQoZGV2X3dyaXRlX2Jsb2NrKHNpdF9ibGssIHNpdF9ibGtfYWRkcikgPj0g MCk7Cj4gPiA+ICsgICAgIH0KPiA+ID4gKwo+ID4gPiArICAgICBibGtjbnQgPSAoZW5kX3NlZ25v IC0gc3RhcnRfc2Vnbm8pICogYy5ibGtzX3Blcl9zZWc7Cj4gPiA+ICsgICAgIHJhd19ub2RlLT5p Lmlfc2l6ZSA9IGNwdV90b19sZTY0KGJsa2NudCA8PCBnZXRfc2IobG9nX2Jsb2Nrc2l6ZSkpOwo+ ID4gPiArICAgICByYXdfbm9kZS0+aS5pX2Jsb2NrcyA9IGNwdV90b19sZTY0KGJsa2NudCArIDEp Owo+ID4gPiArCj4gPiA+ICsgICAgIHJhd19ub2RlLT5pLmlfZXh0LmZvZnMgPSBjcHVfdG9fbGUz MigwKTsKPiA+ID4gKyAgICAgcmF3X25vZGUtPmkuaV9leHQuYmxrX2FkZHIgPQo+ID4gPiArICAg ICAgICAgICAgIGNwdV90b19sZTMyKGMuZGV2aWNlc1tkZXZfbnVtXS5zdGFydF9ibGthZGRyKTsK PiA+ID4gKyAgICAgcmF3X25vZGUtPmkuaV9leHQubGVuID0gY3B1X3RvX2xlMzIoYmxrY250KTsK PiA+ID4gKwo+ID4gPiArICAgICBmcmVlKHNpdF9ibGspOwo+ID4gPiArfQo+ID4gPiArCj4gPiA+ ICtzdGF0aWMgaW50IGYyZnNfd3JpdGVfYWxpYXNfaW5vZGVzKHZvaWQpCj4gPiA+ICt7Cj4gPiA+ ICsgICAgIHN0cnVjdCBmMmZzX25vZGUgKnJhd19ub2RlOwo+ID4gPiArICAgICBibG9ja190IG5v ZGVfYmxrYWRkcjsKPiA+ID4gKyAgICAgaW50IGVyciA9IDA7Cj4gPiA+ICsgICAgIHVuc2lnbmVk IGludCBpLCBkZXZfb2ZmID0gMDsKPiA+ID4gKwo+ID4gPiArICAgICBBU1NFUlQoYy5hbGlhc2Vk X2RldmljZXMpOwo+ID4gPiArCj4gPiA+ICsgICAgIHJhd19ub2RlID0gY2FsbG9jKEYyRlNfQkxL U0laRSwgMSk7Cj4gPiA+ICsgICAgIGlmIChyYXdfbm9kZSA9PSBOVUxMKSB7Cj4gPiA+ICsgICAg ICAgICAgICAgTVNHKDEsICJcdEVycm9yOiBDYWxsb2MgRmFpbGVkIGZvciByYXdfbm9kZSEhIVxu Iik7Cj4gPiA+ICsgICAgICAgICAgICAgcmV0dXJuIC0xOwo+ID4gPiArICAgICB9Cj4gPiA+ICsK PiA+ID4gKyAgICAgZm9yIChpID0gMTsgaSA8IGMubmRldnM7IGkrKykgewo+ID4gPiArICAgICAg ICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOwo+ID4gPiArICAgICAgICAgICAgIG5pZF90IGlu bzsKPiA+ID4gKwo+ID4gPiArICAgICAgICAgICAgIGlmICghZGV2aWNlX2lzX2FsaWFzZWQoaSkp Cj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKPiA+ID4gKwo+ID4gPiArICAg ICAgICAgICAgIGlubyA9IGMuZmlyc3RfYWxpYXNfaW5vICsgZGV2X29mZjsKPiA+ID4gKyAgICAg ICAgICAgICBkZXZfb2ZmKys7Cj4gPiA+ICsgICAgICAgICAgICAgZjJmc19pbml0X2lub2RlKHNi LCByYXdfbm9kZSwgaW5vLCBta2ZzX3RpbWUsIDB4ODFjMCk7Cj4gPiA+ICsKPiA+ID4gKyAgICAg ICAgICAgICByYXdfbm9kZS0+aS5pX2ZsYWdzID0gY3B1X3RvX2xlMzIoRjJGU19JTU1VVEFCTEVf RkwgfAo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGMkZTX0RFVklDRV9BTElB U19GTCk7Cj4gPiA+ICsgICAgICAgICAgICAgcmF3X25vZGUtPmkuaV9pbmxpbmUgPSBGMkZTX1BJ Tl9GSUxFOwo+ID4gPiArICAgICAgICAgICAgIHJhd19ub2RlLT5pLmlfcGlubyA9IHNiLT5yb290 X2lubzsKPiA+ID4gKyAgICAgICAgICAgICBmaWxlbmFtZSA9IGMuZGV2aWNlc1tpXS5hbGlhc19m aWxlbmFtZTsKPiA+ID4gKyAgICAgICAgICAgICByYXdfbm9kZS0+aS5pX25hbWVsZW4gPSBjcHVf dG9fbGUzMihzdHJsZW4oZmlsZW5hbWUpKTsKPiA+ID4gKyAgICAgICAgICAgICBtZW1jcHkocmF3 X25vZGUtPmkuaV9uYW1lLCBmaWxlbmFtZSwgc3RybGVuKGZpbGVuYW1lKSk7Cj4gPiA+ICsKPiA+ ID4gKyAgICAgICAgICAgICBub2RlX2Jsa2FkZHIgPSBhbGxvY19uZXh0X2ZyZWVfYmxvY2soQ1VS U0VHX0NPTERfTk9ERSk7Cj4gPiA+ICsgICAgICAgICAgICAgRjJGU19OT0RFX0ZPT1RFUihyYXdf bm9kZSktPm5leHRfYmxrYWRkciA9Cj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICBjcHVfdG9f bGUzMihub2RlX2Jsa2FkZHIgKyAxKTsKPiA+ID4gKwo+ID4gPiArICAgICAgICAgICAgIGFsbG9j YXRlX2Jsb2Nrc19mb3JfYWxpYXNlZF9kZXZpY2UocmF3X25vZGUsIGkpOwo+ID4gPiArCj4gPiA+ ICsgICAgICAgICAgICAgREJHKDEsICJcdFdyaXRpbmcgYWxpYXNlZCBkZXZpY2UgaW5vZGUgKGNv bGQgbm9kZSksICIKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mZnNldCAw eCV4XG4iLCBub2RlX2Jsa2FkZHIpOwo+ID4gPiArICAgICAgICAgICAgIGlmICh3cml0ZV9pbm9k ZShyYXdfbm9kZSwgbm9kZV9ibGthZGRyKSA8IDApIHsKPiA+ID4gKyAgICAgICAgICAgICAgICAg ICAgIE1TRygxLCAiXHRFcnJvcjogV2hpbGUgd3JpdGluZyB0aGUgcmF3X25vZGUgdG8gIgo+ID4g PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXNrISEhXG4iKTsKPiA+ ID4gKyAgICAgICAgICAgICAgICAgICAgIGVyciA9IC0xOwo+ID4gPiArICAgICAgICAgICAgICAg ICAgICAgZ290byBleGl0Owo+ID4gPiArICAgICAgICAgICAgIH0KPiA+ID4gKwo+ID4gPiArICAg ICAgICAgICAgIHVwZGF0ZV9uYXRfam91cm5hbChpbm8sIG5vZGVfYmxrYWRkcik7Cj4gPiA+ICsg ICAgICAgICAgICAgdXBkYXRlX3NpdF9qb3VybmFsKENVUlNFR19DT0xEX05PREUpOwo+ID4gPiAr ICAgICAgICAgICAgIHVwZGF0ZV9zdW1tYXJ5X2VudHJ5KENVUlNFR19DT0xEX05PREUsIGlubywg MCk7Cj4gPiA+ICsgICAgIH0KPiA+ID4gKwo+ID4gPiArZXhpdDoKPiA+ID4gKyAgICAgZnJlZShy YXdfbm9kZSk7Cj4gPiA+ICsgICAgIHJldHVybiBlcnI7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4g IHN0YXRpYyBpbnQgZjJmc19jcmVhdGVfcm9vdF9kaXIodm9pZCkKPiA+ID4gIHsKPiA+ID4gICAg ICAgZW51bSBxdW90YV90eXBlIHF0eXBlOwo+ID4gPiBAQCAtMTYwOCw2ICsxNzk4LDE1IEBAIHN0 YXRpYyBpbnQgZjJmc19jcmVhdGVfcm9vdF9kaXIodm9pZCkKPiA+ID4gICAgICAgICAgICAgICB9 Cj4gPiA+ICAgICAgIH0KPiA+ID4KPiA+ID4gKyAgICAgaWYgKGMuYWxpYXNlZF9kZXZpY2VzKSB7 Cj4gPiA+ICsgICAgICAgICAgICAgZXJyID0gZjJmc193cml0ZV9hbGlhc19pbm9kZXMoKTsKPiA+ ID4gKyAgICAgICAgICAgICBpZiAoZXJyIDwgMCkgewo+ID4gPiArICAgICAgICAgICAgICAgICAg ICAgTVNHKDEsICJcdEVycm9yOiBGYWlsZWQgdG8gd3JpdGUgYWxpYXNlZCBkZXZpY2UgIgo+ID4g PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5vZGVzISEhXG4iKTsKPiA+ID4gKyAg ICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKPiA+ID4gKyAgICAgICAgICAgICB9Cj4gPiA+ ICsgICAgIH0KPiA+ID4gKwo+ID4gPiAgI2lmbmRlZiBXSVRIX0FORFJPSUQKPiA+ID4gICAgICAg ZXJyID0gZjJmc19kaXNjYXJkX29ic29sZXRlX2Rub2RlKCk7Cj4gPiA+ICAgICAgIGlmIChlcnIg PCAwKSB7Cj4gPiA+IGRpZmYgLS1naXQgYS9ta2ZzL2YyZnNfZm9ybWF0X21haW4uYyBiL21rZnMv ZjJmc19mb3JtYXRfbWFpbi5jCj4gPiA+IGluZGV4IDJiYTFjMjEuLmIxMTNiYmMgMTAwNjQ0Cj4g PiA+IC0tLSBhL21rZnMvZjJmc19mb3JtYXRfbWFpbi5jCj4gPiA+ICsrKyBiL21rZnMvZjJmc19m b3JtYXRfbWFpbi5jCj4gPiA+IEBAIC01MCw3ICs1MCw3IEBAIHN0YXRpYyB2b2lkIG1rZnNfdXNh Z2UoKQo+ID4gPiAgICAgICBNU0coMCwgIlxuVXNhZ2U6IG1rZnMuZjJmcyBbb3B0aW9uc10gZGV2 aWNlIFtzZWN0b3JzXVxuIik7Cj4gPiA+ICAgICAgIE1TRygwLCAiW29wdGlvbnNdOlxuIik7Cj4g PiA+ICAgICAgIE1TRygwLCAiICAtYiBmaWxlc3lzdGVtIGJsb2NrIHNpemUgW2RlZmF1bHQ6NDA5 Nl1cbiIpOwo+ID4gPiAtICAgICBNU0coMCwgIiAgLWMgW2RldmljZV9uYW1lXSB1cCB0byA3IGFk ZGl0aW9uYWwgZGV2aWNlcywgZXhjZXB0IG1ldGEgZGV2aWNlXG4iKTsKPiA+ID4gKyAgICAgTVNH KDAsICIgIC1jIFtkZXZpY2VfbmFtZVtAYWxpYXNfZmlsZW5hbWVdXSB1cCB0byA3IGFkZGl0aW9u YWwgZGV2aWNlcywgZXhjZXB0IG1ldGEgZGV2aWNlXG4iKTsKPiA+ID4gICAgICAgTVNHKDAsICIg IC1kIGRlYnVnIGxldmVsIFtkZWZhdWx0OjBdXG4iKTsKPiA+ID4gICAgICAgTVNHKDAsICIgIC1l IFtjb2xkIGZpbGUgZXh0IGxpc3RdIGUuZy4gXCJtcDMsZ2lmLG1vdlwiXG4iKTsKPiA+ID4gICAg ICAgTVNHKDAsICIgIC1FIFtob3QgZmlsZSBleHQgbGlzdF0gZS5nLiBcImRiXCJcbiIpOwo+ID4g PiBAQCAtMTA1LDYgKzEwNSw5IEBAIHN0YXRpYyB2b2lkIGYyZnNfc2hvd19pbmZvKCkKPiA+ID4K PiA+ID4gICAgICAgaWYgKGMuZmVhdHVyZSAmIEYyRlNfRkVBVFVSRV9DT01QUkVTU0lPTikKPiA+ ID4gICAgICAgICAgICAgICBNU0coMCwgIkluZm86IEVuYWJsZSBDb21wcmVzc2lvblxuIik7Cj4g PiA+ICsKPiA+ID4gKyAgICAgaWYgKGMuZmVhdHVyZSAmIEYyRlNfRkVBVFVSRV9ERVZJQ0VfQUxJ QVMpCj4gPiA+ICsgICAgICAgICAgICAgTVNHKDAsICJJbmZvOiBFbmFibGUgZGV2aWNlIGFsaWFz aW5nXG4iKTsKPiA+ID4gIH0KPiA+ID4KPiA+ID4gICNpZiBkZWZpbmVkKEFORFJPSURfVEFSR0VU KSAmJiBkZWZpbmVkKEhBVkVfU1lTX1VUU05BTUVfSCkKPiA+ID4gQEAgLTE4MSw2ICsxODQsNyBA QCBzdGF0aWMgdm9pZCBmMmZzX3BhcnNlX29wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkK PiA+ID4gICAgICAgaW50MzJfdCBvcHRpb249MDsKPiA+ID4gICAgICAgaW50IHZhbDsKPiA+ID4g ICAgICAgY2hhciAqdG9rZW47Cj4gPiA+ICsgICAgIGludCBkZXZfbnVtOwo+ID4gPgo+ID4gPiAg ICAgICB3aGlsZSAoKG9wdGlvbiA9IGdldG9wdF9sb25nKGFyZ2MsYXJndixvcHRpb25fc3RyaW5n LGxvbmdfb3B0cyxOVUxMKSkgIT0gRU9GKSB7Cj4gPiA+ICAgICAgICAgICAgICAgc3dpdGNoIChv cHRpb24pIHsKPiA+ID4gQEAgLTIwMCwxNyArMjA0LDM1IEBAIHN0YXRpYyB2b2lkIGYyZnNfcGFy c2Vfb3B0aW9ucyhpbnQgYXJnYywgY2hhciAqYXJndltdKQo+ID4gPiAgICAgICAgICAgICAgICAg ICAgICAgfQo+ID4gPiAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4gPiA+ICAgICAgICAg ICAgICAgY2FzZSAnYyc6Cj4gPiA+IC0gICAgICAgICAgICAgICAgICAgICBpZiAoYy5uZGV2cyA+ PSBNQVhfREVWSUNFUykgewo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgZGV2X251bSA9IGMu bmRldnM7Cj4gPiA+ICsKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgIGlmIChkZXZfbnVtID49 IE1BWF9ERVZJQ0VTKSB7Cj4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TRygw LCAiRXJyb3I6IFRvbyBtYW55IGRldmljZXNcbiIpOwo+ID4gPiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBta2ZzX3VzYWdlKCk7Cj4gPiA+ICAgICAgICAgICAgICAgICAgICAgICB9Cj4g PiA+Cj4gPiA+IC0gICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKG9wdGFyZykgPiBNQVhf UEFUSF9MRU4pIHsKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gc3RydG9rKG9w dGFyZywgIkAiKTsKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJsZW4odG9rZW4p ID4gTUFYX1BBVEhfTEVOKSB7Cj4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1T RygwLCAiRXJyb3I6IGRldmljZSBwYXRoIHNob3VsZCBiZSBsZXNzIHRoYW4gIgo+ID4gPiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlZCBjaGFyYWN0ZXJzXG4iLCBNQVhf UEFUSF9MRU4pOwo+ID4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBta2ZzX3VzYWdl KCk7Cj4gPiA+ICAgICAgICAgICAgICAgICAgICAgICB9Cj4gPiA+IC0gICAgICAgICAgICAgICAg ICAgICBjLmRldmljZXNbYy5uZGV2cysrXS5wYXRoID0gc3RyZHVwKG9wdGFyZyk7Cj4gPiA+ICsg ICAgICAgICAgICAgICAgICAgICBjLmRldmljZXNbZGV2X251bV0ucGF0aCA9IHN0cmR1cCh0b2tl bik7Cj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IHN0cnRvayhOVUxMLCAiIik7 Cj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4pIHsKPiA+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmxlbih0b2tlbikgPiBNQVhfUEFUSF9MRU4pIHsK PiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU0coMCwgIkVycm9y OiBhbGlhc19maWxlbmFtZSBzaG91bGQgIgo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgImJlIGxlc3MgdGhhbiAlZCBjaGFyYWN0ZXJzXG4iLAo+ID4g PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1BBVEhf TEVOKTsKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBta2ZzX3Vz YWdlKCk7Cj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KPiA+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgYy5kZXZpY2VzW2Rldl9udW1dLmFsaWFzX2ZpbGVuYW1l ID0KPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJkdXAodG9r ZW4pOwo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWMuYWxpYXNlZF9k ZXZpY2VzKQo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuZmVh dHVyZSB8PSBGMkZTX0ZFQVRVUkVfREVWSUNFX0FMSUFTOwo+ID4gPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBjLmFsaWFzZWRfZGV2aWNlcysrOwo+ID4gPiArICAgICAgICAgICAgICAg ICAgICAgfQo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgYy5uZGV2cysrOwo+ID4gPiAgICAg ICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4gPiA+ICAgICAgICAgICAgICAgY2FzZSAnZCc6Cj4g PiA+ICAgICAgICAgICAgICAgICAgICAgICBjLmRiZ19sdiA9IGF0b2kob3B0YXJnKTsKPiA+ID4g LS0KPiA+ID4gMi40Ni4wLjY2Mi5nOTJkMDg4MWJiMC1nb29nCj4gPiA+CgoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KTGludXgtZjJmcy1kZXZlbCBtYWls aW5nIGxpc3QKTGludXgtZjJmcy1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKaHR0cHM6Ly9s aXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlzdHMvbGlzdGluZm8vbGludXgtZjJmcy1kZXZlbAo= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 B9593142E77 for ; Mon, 16 Sep 2024 17:10:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726506620; cv=none; b=lbxfGtdn8XckF9ip0uXTCK58IWXb4m+tIazSOFbcBPSpUAPh1VOdjMg7tfLwCkBg36h1L+z4XgdcaO83epg6ZE/SGxbw3ok55Dj8kbMX1spJEtQslnzZ5AD/FrRxS2s3YmpA+qPlTaiQC+wHlVPjd2ec50lYuRsDXS3jO5MU5aE= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726506620; c=relaxed/simple; bh=PURqVwYInz1hujzo3/vXTwZMB9mBg4BhaAV1rQrozjY=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=G1X9+zaA03zyt/teys6WreBcVRddpvJLdTH2Q+pQHWstce+jXl+EYfeOMIyKynouku9HAO1mkwAcO/so394IXChOpPp/RzmtMrPxXx8W4ZR0sjQS6PS4ML7IMGwjXWwzoz4+176TxuHeXL/ucP/Vu28C/ERCy/g07Ssto4iZK+s= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=eYVzPd4G; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="eYVzPd4G" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0C3D6C4CEC4; Mon, 16 Sep 2024 17:10:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1726506620; bh=PURqVwYInz1hujzo3/vXTwZMB9mBg4BhaAV1rQrozjY=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=eYVzPd4GlcKPGzyilsgs6LNVSXeAzubd7CGQqnbBvI5AgcSQzthSnnIcjk9AphdnL r4IjShn6z82jSIptkPop4E8sx6vEQsvT7zkglRRyb+dWEFwApznN8tOnhwAkpSdGCP fS0l69VvtwayVZ+F86L0m59biJZXyDz8PI2MGKPqna7L81p6pEU3kE2XTWwjLGy4yy KbE9b+SJFyK1TY1KV0l0VP0YFWzIwIP9ib6ZK4i5Eo2+Jo84sTDTazKgX0l+dG6A1K xG7VvX+st7udhQqMpH8ohARpwpUNzb4tRajBFv1SrH8UMvPIaLIiAWIj3A7G21T4hA yR9Nt43JobOSA== Date: Mon, 16 Sep 2024 17:10:18 +0000 From: Jaegeuk Kim To: Daeho Jeong Cc: linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, kernel-team@android.com, Daeho Jeong Subject: Re: [PATCH 2/2] mkfs.f2fs: add device aliasing feature Message-ID: References: <20240913212802.912131-1-daeho43@gmail.com> <20240913212802.912131-2-daeho43@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: On 09/16, Daeho Jeong wrote: > On Fri, Sep 13, 2024 at 3:27 PM Jaegeuk Kim wrote: > > > > On 09/13, Daeho Jeong wrote: > > > From: Daeho Jeong > > > > > > We can add a device aliasing file which can map the whole device with an > > > extent, not using node blocks. This mapped area should be pinned and > > > normally used for read-only usages. After finished using it, we can > > > deallocate the whole area and return it back to use it for other files. > > > > > > Signed-off-by: Daeho Jeong > > > --- > > > fsck/dump.c | 13 ++ > > > fsck/fsck.c | 49 ++++-- > > > fsck/fsck.h | 4 +- > > > fsck/main.c | 5 + > > > include/f2fs_fs.h | 11 ++ > > > mkfs/f2fs_format.c | 335 ++++++++++++++++++++++++++++++++-------- > > > mkfs/f2fs_format_main.c | 30 +++- > > > 7 files changed, 363 insertions(+), 84 deletions(-) > > > > > > diff --git a/fsck/dump.c b/fsck/dump.c > > > index 8d5613e..aa9b5d3 100644 > > > --- a/fsck/dump.c > > > +++ b/fsck/dump.c > > > @@ -499,6 +499,19 @@ static int dump_inode_blk(struct f2fs_sb_info *sbi, u32 nid, > > > } > > > > > > c.show_file_map_max_offset = f2fs_max_file_offset(&node_blk->i); > > > + > > > + if (IS_ALIASING(&node_blk->i)) { > > > + u32 blkaddr = le32_to_cpu(node_blk->i.i_ext.blk_addr); > > > + u32 len = le32_to_cpu(node_blk->i.i_ext.len); > > > + u32 idx; > > > + > > > + for (idx = 0; idx < len; idx++) > > > + dump_data_blk(sbi, idx * F2FS_BLKSIZE, blkaddr++, false); > > > + print_extent(true); > > > + > > > + goto dump_xattr; > > > + } > > > + > > > addr_per_block = ADDRS_PER_BLOCK(&node_blk->i); > > > > > > /* check data blocks in inode */ > > > diff --git a/fsck/fsck.c b/fsck/fsck.c > > > index f8607fd..6feb294 100644 > > > --- a/fsck/fsck.c > > > +++ b/fsck/fsck.c > > > @@ -914,6 +914,7 @@ void fsck_chk_inode_blk(struct f2fs_sb_info *sbi, u32 nid, > > > int need_fix = 0; > > > int ret; > > > u32 cluster_size = 1 << node_blk->i.i_log_cluster_size; > > > + bool is_aliasing = IS_ALIASING(&node_blk->i); > > > > > > if (!compressed) > > > goto check_next; > > > @@ -1146,6 +1147,33 @@ check_next: > > > addrs_per_blk * NIDS_PER_BLOCK * > > > NIDS_PER_BLOCK) * F2FS_BLKSIZE; > > > } > > > + > > > + if (is_aliasing) { > > > + struct extent_info ei; > > > + > > > + get_extent_info(&ei, &node_blk->i.i_ext); > > > + for (idx = 0; idx < ei.len; idx++, child.pgofs++) { > > > + block_t blkaddr = ei.blk + idx; > > > + > > > + /* check extent info */ > > > + check_extent_info(&child, blkaddr, 0); > > > + ret = fsck_chk_data_blk(sbi, &node_blk->i, blkaddr, > > > + &child, (i_blocks == *blk_cnt), ftype, nid, > > > + idx, ni->version, node_blk); > > > + if (!ret) { > > > + *blk_cnt = *blk_cnt + 1; > > > + if (cur_qtype != -1) > > > + qf_last_blkofs[cur_qtype] = child.pgofs; > > > + } else if (c.fix_on) { > > > + node_blk->i.i_ext.len = cpu_to_le32(idx); > > > + need_fix = 1; > > > + break; > > > + } > > > + } > > > + > > > + goto check; > > > + } > > > + > > > for (idx = 0; idx < addrs; idx++, child.pgofs++) { > > > block_t blkaddr = le32_to_cpu(node_blk->i.i_addr[ofs + idx]); > > > > > > @@ -1178,11 +1206,11 @@ check_next: > > > child.pgofs - cbc->cheader_pgofs < cluster_size) > > > cbc->cnt++; > > > ret = fsck_chk_data_blk(sbi, > > > - IS_CASEFOLDED(&node_blk->i), > > > + &node_blk->i, > > > blkaddr, > > > &child, (i_blocks == *blk_cnt), > > > ftype, nid, idx, ni->version, > > > - file_is_encrypt(&node_blk->i), node_blk); > > > + node_blk); > > > if (blkaddr != le32_to_cpu(node_blk->i.i_addr[ofs + idx])) > > > need_fix = 1; > > > if (!ret) { > > > @@ -1376,7 +1404,7 @@ skip_blkcnt_fix: > > > } > > > > > > /* drop extent information to avoid potential wrong access */ > > > - if (need_fix && f2fs_dev_is_writable()) > > > + if (need_fix && f2fs_dev_is_writable() && !is_aliasing) > > > node_blk->i.i_ext.len = 0; > > > > > > if ((c.feature & F2FS_FEATURE_INODE_CHKSUM) && > > > @@ -1448,11 +1476,9 @@ int fsck_chk_dnode_blk(struct f2fs_sb_info *sbi, struct f2fs_inode *inode, > > > if (!compr_rel && blkaddr == NEW_ADDR && child->pgofs - > > > cbc->cheader_pgofs < cluster_size) > > > cbc->cnt++; > > > - ret = fsck_chk_data_blk(sbi, IS_CASEFOLDED(inode), > > > - blkaddr, child, > > > + ret = fsck_chk_data_blk(sbi, inode, blkaddr, child, > > > le64_to_cpu(inode->i_blocks) == *blk_cnt, ftype, > > > - nid, idx, ni->version, > > > - file_is_encrypt(inode), node_blk); > > > + nid, idx, ni->version, node_blk); > > > if (blkaddr != le32_to_cpu(node_blk->dn.addr[idx])) > > > need_fix = 1; > > > if (!ret) { > > > @@ -2056,12 +2082,15 @@ int fsck_chk_dentry_blk(struct f2fs_sb_info *sbi, int casefolded, u32 blk_addr, > > > return 0; > > > } > > > > > > -int fsck_chk_data_blk(struct f2fs_sb_info *sbi, int casefolded, > > > +int fsck_chk_data_blk(struct f2fs_sb_info *sbi, struct f2fs_inode *inode, > > > u32 blk_addr, struct child_info *child, int last_blk, > > > enum FILE_TYPE ftype, u32 parent_nid, u16 idx_in_node, u8 ver, > > > - int enc_name, struct f2fs_node *node_blk) > > > + struct f2fs_node *node_blk) > > > { > > > struct f2fs_fsck *fsck = F2FS_FSCK(sbi); > > > + int casefolded = IS_CASEFOLDED(inode); > > > + int enc_name = file_is_encrypt(inode); > > > + int aliasing = IS_ALIASING(inode); > > > > > > /* Is it reserved block? */ > > > if (blk_addr == NEW_ADDR) { > > > @@ -2074,7 +2103,7 @@ int fsck_chk_data_blk(struct f2fs_sb_info *sbi, int casefolded, > > > return -EINVAL; > > > } > > > > > > - if (is_valid_ssa_data_blk(sbi, blk_addr, parent_nid, > > > + if (!aliasing && is_valid_ssa_data_blk(sbi, blk_addr, parent_nid, > > > idx_in_node, ver)) { > > > ASSERT_MSG("summary data block is not valid. [0x%x]", > > > parent_nid); > > > diff --git a/fsck/fsck.h b/fsck/fsck.h > > > index 6cac926..d306c22 100644 > > > --- a/fsck/fsck.h > > > +++ b/fsck/fsck.h > > > @@ -179,9 +179,9 @@ extern int fsck_chk_idnode_blk(struct f2fs_sb_info *, struct f2fs_inode *, > > > extern int fsck_chk_didnode_blk(struct f2fs_sb_info *, struct f2fs_inode *, > > > enum FILE_TYPE, struct f2fs_node *, u32 *, > > > struct f2fs_compr_blk_cnt *, struct child_info *); > > > -extern int fsck_chk_data_blk(struct f2fs_sb_info *, int, > > > +extern int fsck_chk_data_blk(struct f2fs_sb_info *, struct f2fs_inode *, > > > u32, struct child_info *, int, enum FILE_TYPE, u32, u16, u8, > > > - int, struct f2fs_node *); > > > + struct f2fs_node *); > > > extern int fsck_chk_dentry_blk(struct f2fs_sb_info *, int, > > > u32, struct child_info *, int, int, struct f2fs_node *); > > > int fsck_chk_inline_dentries(struct f2fs_sb_info *, struct f2fs_node *, > > > diff --git a/fsck/main.c b/fsck/main.c > > > index c13e287..c4f6167 100644 > > > --- a/fsck/main.c > > > +++ b/fsck/main.c > > > @@ -976,6 +976,11 @@ static int do_defrag(struct f2fs_sb_info *sbi) > > > return -1; > > > } > > > > > > + if (get_sb(feature) & F2FS_FEATURE_DEVICE_ALIAS) { > > > + MSG(0, "Not support on image with device aliasing feature.\n"); > > > + return -1; > > > + } > > > + > > > if (c.defrag_start > get_sb(block_count)) > > > goto out_range; > > > if (c.defrag_start < SM_I(sbi)->main_blkaddr) > > > diff --git a/include/f2fs_fs.h b/include/f2fs_fs.h > > > index fdbc25b..108fde3 100644 > > > --- a/include/f2fs_fs.h > > > +++ b/include/f2fs_fs.h > > > @@ -442,6 +442,7 @@ struct device_info { > > > uint64_t start_blkaddr; > > > uint64_t end_blkaddr; > > > uint32_t total_segments; > > > + char *alias_filename; > > > > > > /* to handle zone block devices */ > > > int zoned_model; > > > @@ -661,7 +662,13 @@ enum { > > > */ > > > #define F2FS_IMMUTABLE_FL 0x00000010 /* Immutable file */ > > > #define F2FS_NOATIME_FL 0x00000080 /* do not update atime */ > > > +#define F2FS_DEVICE_ALIAS_FL 0x80000000 /* File for aliasing a device */ > > > +#define IS_ALIASING(fi) ((fi)->i_flags & cpu_to_le32(F2FS_DEVICE_ALIAS_FL)) > > > > Could you please rebase on the latest f2fs-tools? I got merge conflict around > > here. > > Let me rebase it. > > > > > > > > > +/* > > > + * On-disk file inline flags (f2fs_inode::i_inline) > > > + */ > > > +#define F2FS_PIN_FILE 0x40 /* file should not be gced */ > > > > Do we need the above define? > > We need this to set F2FS_PIN_FILE to device aliasing files. The definition already exists in: 964 #define F2FS_PIN_FILE 0x40 /* file should not be gced */ > > > > > > > > > #define F2FS_ENC_UTF8_12_1 1 > > > #define F2FS_ENC_STRICT_MODE_FL (1 << 0) > > > @@ -694,6 +701,7 @@ enum { > > > #define F2FS_FEATURE_CASEFOLD 0x1000 > > > #define F2FS_FEATURE_COMPRESSION 0x2000 > > > #define F2FS_FEATURE_RO 0x4000 > > > +#define F2FS_FEATURE_DEVICE_ALIAS 0x8000 > > > > > > #define MAX_NR_FEATURE 32 > > > > > > @@ -1515,11 +1523,14 @@ struct f2fs_configuration { > > > time_t fixed_time; > > > int roll_forward; > > > bool need_fsync; > > > + int aliased_devices; > > > + uint32_t aliased_segments; > > > > > > /* mkfs parameters */ > > > int fake_seed; > > > uint32_t next_free_nid; > > > uint32_t lpf_ino; > > > + uint32_t first_alias_ino; > > > uint32_t root_uid; > > > uint32_t root_gid; > > > uint32_t blksize; > > > diff --git a/mkfs/f2fs_format.c b/mkfs/f2fs_format.c > > > index db1bc89..077f620 100644 > > > --- a/mkfs/f2fs_format.c > > > +++ b/mkfs/f2fs_format.c > > > @@ -13,6 +13,7 @@ > > > #include > > > #include > > > #include > > > +#include > > > > > > #ifdef HAVE_SYS_STAT_H > > > #include > > > @@ -39,10 +40,62 @@ struct f2fs_super_block raw_sb; > > > struct f2fs_super_block *sb = &raw_sb; > > > struct f2fs_checkpoint *cp; > > > > > > +static inline bool device_is_aliased(unsigned int dev_num) > > > +{ > > > + if (dev_num >= c.ndevs) > > > + return false; > > > + return c.devices[dev_num].alias_filename != NULL; > > > +} > > > + > > > +static inline unsigned int target_device_index(uint64_t blkaddr) > > > +{ > > > + int i; > > > + > > > + for (i = 0; i < c.ndevs; i++) > > > + if (c.devices[i].start_blkaddr <= blkaddr && > > > + c.devices[i].end_blkaddr >= blkaddr) > > > + return i; > > > + return 0; > > > +} > > > + > > > +#define GET_SEGNO(blk_addr) ((blk_addr - get_sb(main_blkaddr)) / \ > > > + c.blks_per_seg) > > > +#define START_BLOCK(segno) (segno * c.blks_per_seg + get_sb(main_blkaddr)) > > > + > > > /* Return first segment number of each area */ > > > -#define prev_zone(cur) (c.cur_seg[cur] - c.segs_per_zone) > > > -#define next_zone(cur) (c.cur_seg[cur] + c.segs_per_zone) > > > -#define last_zone(cur) ((cur - 1) * c.segs_per_zone) > > > +static inline uint32_t next_zone(int seg_type) > > > +{ > > > + uint32_t next_seg = c.cur_seg[seg_type] + c.segs_per_zone; > > > + uint64_t next_blkaddr = START_BLOCK(next_seg); > > > + int dev_num; > > > + > > > + dev_num = target_device_index(next_blkaddr); > > > + if (!device_is_aliased(dev_num)) > > > + return GET_SEGNO(next_blkaddr); > > > + > > > + while (dev_num < c.ndevs && device_is_aliased(dev_num)) > > > + dev_num++; > > > + > > > + return GET_SEGNO(c.devices[dev_num - 1].end_blkaddr + 1); > > > +} > > > + > > > +static inline uint32_t last_zone(uint32_t total_zone) > > > +{ > > > + uint32_t last_seg = (total_zone - 1) * c.segs_per_zone; > > > + uint64_t last_blkaddr = START_BLOCK(last_seg); > > > + int dev_num; > > > + > > > + dev_num = target_device_index(last_blkaddr); > > > + if (!device_is_aliased(dev_num)) > > > + return GET_SEGNO(last_blkaddr); > > > + > > > + while (dev_num > 0 && device_is_aliased(dev_num)) > > > + dev_num--; > > > + > > > + return GET_SEGNO(c.devices[dev_num + 1].start_blkaddr) - > > > + c.segs_per_zone; > > > +} > > > + > > > #define last_section(cur) (cur + (c.secs_per_zone - 1) * c.segs_per_sec) > > > > > > /* Return time fixed by the user or current time by default */ > > > @@ -220,7 +273,7 @@ static int f2fs_prepare_super_block(void) > > > uint64_t total_meta_zones, total_meta_segments; > > > uint32_t sit_bitmap_size, max_sit_bitmap_size; > > > uint32_t max_nat_bitmap_size, max_nat_segments; > > > - uint32_t total_zones, avail_zones; > > > + uint32_t total_zones, avail_zones = 0; > > > enum quota_type qtype; > > > int i; > > > > > > @@ -314,6 +367,16 @@ static int f2fs_prepare_super_block(void) > > > c.devices[i].end_blkaddr = c.devices[i].start_blkaddr + > > > c.devices[i].total_segments * > > > c.blks_per_seg - 1; > > > + if (device_is_aliased(i)) { > > > + if (c.devices[i].zoned_model == > > > + F2FS_ZONED_HM) { > > > + MSG(1, "\tError: do not support " > > > + "device aliasing for device[%d]\n", i); > > > + return -1; > > > + } > > > + c.aliased_segments += > > > + c.devices[i].total_segments; > > > + } > > > } > > > if (c.ndevs > 1) { > > > memcpy(sb->devs[i].path, c.devices[i].path, MAX_PATH_LEN); > > > @@ -531,10 +594,16 @@ static int f2fs_prepare_super_block(void) > > > if (c.feature & F2FS_FEATURE_LOST_FOUND) > > > c.lpf_ino = c.next_free_nid++; > > > > > > + if (c.aliased_devices) { > > > + c.first_alias_ino = c.next_free_nid; > > > + c.next_free_nid += c.aliased_devices; > > > + avail_zones += c.aliased_segments / c.segs_per_zone; > > > + } > > > + > > > if (c.feature & F2FS_FEATURE_RO) > > > - avail_zones = 2; > > > + avail_zones += 2; > > > else > > > - avail_zones = 6; > > > + avail_zones += 6; > > > > > > if (total_zones <= avail_zones) { > > > MSG(1, "\tError: %d zones: Need more zones " > > > @@ -701,6 +770,7 @@ static int f2fs_write_check_point_pack(void) > > > char *sum_compact, *sum_compact_p; > > > struct f2fs_summary *sum_entry; > > > unsigned short vblocks; > > > + uint32_t used_segments = c.aliased_segments; > > > int ret = -1; > > > > > > cp = calloc(F2FS_BLKSIZE, 1); > > > @@ -752,9 +822,14 @@ static int f2fs_write_check_point_pack(void) > > > } > > > > > > set_cp(cur_node_blkoff[0], c.curseg_offset[CURSEG_HOT_NODE]); > > > + set_cp(cur_node_blkoff[2], c.curseg_offset[CURSEG_COLD_NODE]); > > > set_cp(cur_data_blkoff[0], c.curseg_offset[CURSEG_HOT_DATA]); > > > + set_cp(cur_data_blkoff[2], c.curseg_offset[CURSEG_COLD_DATA]); > > > set_cp(valid_block_count, c.curseg_offset[CURSEG_HOT_NODE] + > > > - c.curseg_offset[CURSEG_HOT_DATA]); > > > + c.curseg_offset[CURSEG_HOT_DATA] + > > > + c.curseg_offset[CURSEG_COLD_NODE] + > > > + c.curseg_offset[CURSEG_COLD_DATA] + > > > + c.aliased_segments * c.blks_per_seg); > > > set_cp(rsvd_segment_count, c.reserved_segments); > > > > > > /* > > > @@ -802,15 +877,16 @@ static int f2fs_write_check_point_pack(void) > > > c.reserved_segments); > > > > > > /* main segments - reserved segments - (node + data segments) */ > > > - if (c.feature & F2FS_FEATURE_RO) { > > > - set_cp(free_segment_count, f2fs_get_usable_segments(sb) - 2); > > > - set_cp(user_block_count, ((get_cp(free_segment_count) + 2 - > > > - get_cp(overprov_segment_count)) * c.blks_per_seg)); > > > - } else { > > > - set_cp(free_segment_count, f2fs_get_usable_segments(sb) - 6); > > > - set_cp(user_block_count, ((get_cp(free_segment_count) + 6 - > > > - get_cp(overprov_segment_count)) * c.blks_per_seg)); > > > - } > > > + if (c.feature & F2FS_FEATURE_RO) > > > + used_segments += 2; > > > + else > > > + used_segments += 6; > > > + > > > + set_cp(user_block_count, (f2fs_get_usable_segments(sb) - > > > + get_cp(overprov_segment_count)) * c.blks_per_seg); > > > + set_cp(free_segment_count, f2fs_get_usable_segments(sb) - > > > + used_segments); > > > + > > > /* cp page (2), data summaries (1), node summaries (3) */ > > > set_cp(cp_pack_total_block_count, 6 + get_sb(cp_payload)); > > > flags = CP_UMOUNT_FLAG | CP_COMPACT_SUM_FLAG; > > > @@ -826,8 +902,10 @@ static int f2fs_write_check_point_pack(void) > > > > > > set_cp(ckpt_flags, flags); > > > set_cp(cp_pack_start_sum, 1 + get_sb(cp_payload)); > > > - set_cp(valid_node_count, c.curseg_offset[CURSEG_HOT_NODE]); > > > - set_cp(valid_inode_count, c.curseg_offset[CURSEG_HOT_NODE]); > > > + set_cp(valid_node_count, c.curseg_offset[CURSEG_HOT_NODE] + > > > + c.curseg_offset[CURSEG_COLD_NODE]); > > > + set_cp(valid_inode_count, c.curseg_offset[CURSEG_HOT_NODE] + > > > + c.curseg_offset[CURSEG_COLD_NODE]); > > > set_cp(next_free_nid, c.next_free_nid); > > > set_cp(sit_ver_bitmap_bytesize, ((get_sb(segment_count_sit) / 2) << > > > get_sb(log_blocks_per_seg)) / 8); > > > @@ -975,9 +1053,12 @@ static int f2fs_write_check_point_pack(void) > > > goto free_cp_payload; > > > } > > > > > > - /* Fill segment summary for COLD_NODE to zero. */ > > > + /* Prepare and write Segment summary for COLD_NODE */ > > > memset(sum, 0, F2FS_BLKSIZE); > > > SET_SUM_TYPE(sum, SUM_TYPE_NODE); > > > + memcpy(sum->entries, c.sum[CURSEG_COLD_NODE], > > > + sizeof(struct f2fs_summary) * MAX_CACHE_SUMS); > > > + > > > cp_seg_blk++; > > > DBG(1, "\tWriting Segment summary for COLD_NODE, at offset 0x%08"PRIx64"\n", > > > cp_seg_blk); > > > @@ -1210,10 +1291,40 @@ void update_summary_entry(int curseg_type, nid_t nid, > > > sum->ofs_in_node = cpu_to_le16(ofs_in_node); > > > } > > > > > > +static void add_dentry(struct f2fs_dentry_block *dent_blk, unsigned int *didx, > > > + const char *name, uint32_t ino, u8 type) > > > +{ > > > + int len = strlen(name); > > > + f2fs_hash_t hash; > > > + > > > + if (name[0] == '.' && (len == 1 || (len == 2 && name[1] == '.'))) > > > + hash = 0; > > > + else > > > + hash = f2fs_dentry_hash(0, 0, (unsigned char *)name, len); > > > + > > > + F2FS_DENTRY_BLOCK_DENTRY(dent_blk, *didx).hash_code = cpu_to_le32(hash); > > > + F2FS_DENTRY_BLOCK_DENTRY(dent_blk, *didx).ino = cpu_to_le32(ino); > > > + F2FS_DENTRY_BLOCK_DENTRY(dent_blk, *didx).name_len = cpu_to_le16(len); > > > + F2FS_DENTRY_BLOCK_DENTRY(dent_blk, *didx).file_type = type; > > > + > > > + while (len > F2FS_SLOT_LEN) { > > > + memcpy(F2FS_DENTRY_BLOCK_FILENAME(dent_blk, *didx), name, > > > + F2FS_SLOT_LEN); > > > + test_and_set_bit_le(*didx, dent_blk->dentry_bitmap); > > > + len -= (int)F2FS_SLOT_LEN; > > > + name += F2FS_SLOT_LEN; > > > + (*didx)++; > > > + } > > > + memcpy(F2FS_DENTRY_BLOCK_FILENAME(dent_blk, *didx), name, len); > > > + test_and_set_bit_le(*didx, dent_blk->dentry_bitmap); > > > + (*didx)++; > > > +} > > > + > > > static block_t f2fs_add_default_dentry_root(void) > > > { > > > struct f2fs_dentry_block *dent_blk = NULL; > > > block_t data_blkaddr; > > > + unsigned int didx = 0; > > > > > > dent_blk = calloc(F2FS_BLKSIZE, 1); > > > if(dent_blk == NULL) { > > > @@ -1221,37 +1332,26 @@ static block_t f2fs_add_default_dentry_root(void) > > > return 0; > > > } > > > > > > - F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 0).hash_code = 0; > > > - F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 0).ino = sb->root_ino; > > > - F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 0).name_len = cpu_to_le16(1); > > > - F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 0).file_type = F2FS_FT_DIR; > > > - memcpy(F2FS_DENTRY_BLOCK_FILENAME(dent_blk, 0), ".", 1); > > > + add_dentry(dent_blk, &didx, ".", > > > + le32_to_cpu(sb->root_ino), F2FS_FT_DIR); > > > + add_dentry(dent_blk, &didx, "..", > > > + le32_to_cpu(sb->root_ino), F2FS_FT_DIR); > > > > > > - F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 1).hash_code = 0; > > > - F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 1).ino = sb->root_ino; > > > - F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 1).name_len = cpu_to_le16(2); > > > - F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 1).file_type = F2FS_FT_DIR; > > > - memcpy(F2FS_DENTRY_BLOCK_FILENAME(dent_blk, 1), "..", 2); > > > - > > > - /* bitmap for . and .. */ > > > - test_and_set_bit_le(0, dent_blk->dentry_bitmap); > > > - test_and_set_bit_le(1, dent_blk->dentry_bitmap); > > > - > > > - if (c.lpf_ino) { > > > - int len = strlen(LPF); > > > - f2fs_hash_t hash = f2fs_dentry_hash(0, 0, (unsigned char *)LPF, len); > > > + if (c.lpf_ino) > > > + add_dentry(dent_blk, &didx, LPF, c.lpf_ino, F2FS_FT_DIR); > > > > > > - F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 2).hash_code = cpu_to_le32(hash); > > > - F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 2).ino = cpu_to_le32(c.lpf_ino); > > > - F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 2).name_len = cpu_to_le16(len); > > > - F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 2).file_type = F2FS_FT_DIR; > > > - memcpy(F2FS_DENTRY_BLOCK_FILENAME(dent_blk, 2), LPF, F2FS_SLOT_LEN); > > > + if (c.aliased_devices) { > > > + int i, dev_off = 0; > > > > > > - memcpy(F2FS_DENTRY_BLOCK_FILENAME(dent_blk, 3), &LPF[F2FS_SLOT_LEN], > > > - len - F2FS_SLOT_LEN); > > > + for (i = 1; i < c.ndevs; i++) { > > > + if (!device_is_aliased(i)) > > > + continue; > > > > > > - test_and_set_bit_le(2, dent_blk->dentry_bitmap); > > > - test_and_set_bit_le(3, dent_blk->dentry_bitmap); > > > + add_dentry(dent_blk, &didx, c.devices[i].alias_filename, > > > + c.first_alias_ino + dev_off, > > > + F2FS_FT_REG_FILE); > > > + dev_off++; > > > + } > > > } > > > > > > data_blkaddr = alloc_next_free_block(CURSEG_HOT_DATA); > > > @@ -1324,6 +1424,7 @@ static int f2fs_write_default_quota(int qtype, __le32 raw_id) > > > struct v2_disk_dqinfo ddqinfo; > > > struct v2r1_disk_dqblk dqblk; > > > block_t blkaddr; > > > + uint64_t icnt = 1, bcnt = 1; > > > int i; > > > > > > if (filebuf == NULL) { > > > @@ -1359,16 +1460,18 @@ static int f2fs_write_default_quota(int qtype, __le32 raw_id) > > > dqblk.dqb_pad = cpu_to_le32(0); > > > dqblk.dqb_ihardlimit = cpu_to_le64(0); > > > dqblk.dqb_isoftlimit = cpu_to_le64(0); > > > - if (c.lpf_ino) > > > - dqblk.dqb_curinodes = cpu_to_le64(2); > > > - else > > > - dqblk.dqb_curinodes = cpu_to_le64(1); > > > + if (c.lpf_ino) { > > > + icnt++; > > > + bcnt++; > > > + } > > > + if (c.aliased_devices) { > > > + icnt += c.aliased_devices; > > > + bcnt += c.aliased_segments * c.blks_per_seg; > > > + } > > > + dqblk.dqb_curinodes = cpu_to_le64(icnt); > > > dqblk.dqb_bhardlimit = cpu_to_le64(0); > > > dqblk.dqb_bsoftlimit = cpu_to_le64(0); > > > - if (c.lpf_ino) > > > - dqblk.dqb_curspace = cpu_to_le64(F2FS_BLKSIZE * 2); > > > - else > > > - dqblk.dqb_curspace = cpu_to_le64(F2FS_BLKSIZE); > > > + dqblk.dqb_curspace = cpu_to_le64(F2FS_BLKSIZE * bcnt); > > > dqblk.dqb_btime = cpu_to_le64(0); > > > dqblk.dqb_itime = cpu_to_le64(0); > > > > > > @@ -1491,6 +1594,7 @@ static block_t f2fs_add_default_dentry_lpf(void) > > > { > > > struct f2fs_dentry_block *dent_blk; > > > block_t data_blkaddr; > > > + unsigned int didx = 0; > > > > > > dent_blk = calloc(F2FS_BLKSIZE, 1); > > > if (dent_blk == NULL) { > > > @@ -1498,20 +1602,8 @@ static block_t f2fs_add_default_dentry_lpf(void) > > > return 0; > > > } > > > > > > - F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 0).hash_code = 0; > > > - F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 0).ino = cpu_to_le32(c.lpf_ino); > > > - F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 0).name_len = cpu_to_le16(1); > > > - F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 0).file_type = F2FS_FT_DIR; > > > - memcpy(F2FS_DENTRY_BLOCK_FILENAME(dent_blk, 0), ".", 1); > > > - > > > - F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 1).hash_code = 0; > > > - F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 1).ino = sb->root_ino; > > > - F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 1).name_len = cpu_to_le16(2); > > > - F2FS_DENTRY_BLOCK_DENTRY(dent_blk, 1).file_type = F2FS_FT_DIR; > > > - memcpy(F2FS_DENTRY_BLOCK_FILENAME(dent_blk, 1), "..", 2); > > > - > > > - test_and_set_bit_le(0, dent_blk->dentry_bitmap); > > > - test_and_set_bit_le(1, dent_blk->dentry_bitmap); > > > + add_dentry(dent_blk, &didx, ".", c.lpf_ino, F2FS_FT_DIR); > > > + add_dentry(dent_blk, &didx, "..", c.lpf_ino, F2FS_FT_DIR); > > > > > > data_blkaddr = alloc_next_free_block(CURSEG_HOT_DATA); > > > > > > @@ -1579,6 +1671,104 @@ exit: > > > return err; > > > } > > > > > > +static void allocate_blocks_for_aliased_device(struct f2fs_node *raw_node, > > > + unsigned int dev_num) > > > +{ > > > + uint32_t start_segno = (c.devices[dev_num].start_blkaddr - > > > + get_sb(main_blkaddr)) / c.blks_per_seg; > > > + uint32_t end_segno = (c.devices[dev_num].end_blkaddr - > > > + get_sb(main_blkaddr) + 1) / c.blks_per_seg; > > > + uint32_t segno; > > > + uint64_t blkcnt; > > > + struct f2fs_sit_block *sit_blk = calloc(F2FS_BLKSIZE, 1); > > > + > > > + ASSERT(sit_blk); > > > + > > > + for (segno = start_segno; segno < end_segno; segno++) { > > > + struct f2fs_sit_entry *sit; > > > + uint64_t sit_blk_addr = get_sb(sit_blkaddr) + > > > + (segno / SIT_ENTRY_PER_BLOCK); > > > + > > > + ASSERT(dev_read_block(sit_blk, sit_blk_addr) >= 0); > > > + sit = &sit_blk->entries[segno % SIT_ENTRY_PER_BLOCK]; > > > + memset(&sit->valid_map, 0xFF, SIT_VBLOCK_MAP_SIZE); > > > + sit->vblocks = cpu_to_le16((CURSEG_COLD_DATA << > > > + SIT_VBLOCKS_SHIFT) | c.blks_per_seg); > > > + sit->mtime = cpu_to_le64(mkfs_time); > > > + ASSERT(dev_write_block(sit_blk, sit_blk_addr) >= 0); > > > + } > > > + > > > + blkcnt = (end_segno - start_segno) * c.blks_per_seg; > > > + raw_node->i.i_size = cpu_to_le64(blkcnt << get_sb(log_blocksize)); > > > + raw_node->i.i_blocks = cpu_to_le64(blkcnt + 1); > > > + > > > + raw_node->i.i_ext.fofs = cpu_to_le32(0); > > > + raw_node->i.i_ext.blk_addr = > > > + cpu_to_le32(c.devices[dev_num].start_blkaddr); > > > + raw_node->i.i_ext.len = cpu_to_le32(blkcnt); > > > + > > > + free(sit_blk); > > > +} > > > + > > > +static int f2fs_write_alias_inodes(void) > > > +{ > > > + struct f2fs_node *raw_node; > > > + block_t node_blkaddr; > > > + int err = 0; > > > + unsigned int i, dev_off = 0; > > > + > > > + ASSERT(c.aliased_devices); > > > + > > > + raw_node = calloc(F2FS_BLKSIZE, 1); > > > + if (raw_node == NULL) { > > > + MSG(1, "\tError: Calloc Failed for raw_node!!!\n"); > > > + return -1; > > > + } > > > + > > > + for (i = 1; i < c.ndevs; i++) { > > > + const char *filename; > > > + nid_t ino; > > > + > > > + if (!device_is_aliased(i)) > > > + continue; > > > + > > > + ino = c.first_alias_ino + dev_off; > > > + dev_off++; > > > + f2fs_init_inode(sb, raw_node, ino, mkfs_time, 0x81c0); > > > + > > > + raw_node->i.i_flags = cpu_to_le32(F2FS_IMMUTABLE_FL | > > > + F2FS_DEVICE_ALIAS_FL); > > > + raw_node->i.i_inline = F2FS_PIN_FILE; > > > + raw_node->i.i_pino = sb->root_ino; > > > + filename = c.devices[i].alias_filename; > > > + raw_node->i.i_namelen = cpu_to_le32(strlen(filename)); > > > + memcpy(raw_node->i.i_name, filename, strlen(filename)); > > > + > > > + node_blkaddr = alloc_next_free_block(CURSEG_COLD_NODE); > > > + F2FS_NODE_FOOTER(raw_node)->next_blkaddr = > > > + cpu_to_le32(node_blkaddr + 1); > > > + > > > + allocate_blocks_for_aliased_device(raw_node, i); > > > + > > > + DBG(1, "\tWriting aliased device inode (cold node), " > > > + "offset 0x%x\n", node_blkaddr); > > > + if (write_inode(raw_node, node_blkaddr) < 0) { > > > + MSG(1, "\tError: While writing the raw_node to " > > > + "disk!!!\n"); > > > + err = -1; > > > + goto exit; > > > + } > > > + > > > + update_nat_journal(ino, node_blkaddr); > > > + update_sit_journal(CURSEG_COLD_NODE); > > > + update_summary_entry(CURSEG_COLD_NODE, ino, 0); > > > + } > > > + > > > +exit: > > > + free(raw_node); > > > + return err; > > > +} > > > + > > > static int f2fs_create_root_dir(void) > > > { > > > enum quota_type qtype; > > > @@ -1608,6 +1798,15 @@ static int f2fs_create_root_dir(void) > > > } > > > } > > > > > > + if (c.aliased_devices) { > > > + err = f2fs_write_alias_inodes(); > > > + if (err < 0) { > > > + MSG(1, "\tError: Failed to write aliased device " > > > + "inodes!!!\n"); > > > + goto exit; > > > + } > > > + } > > > + > > > #ifndef WITH_ANDROID > > > err = f2fs_discard_obsolete_dnode(); > > > if (err < 0) { > > > diff --git a/mkfs/f2fs_format_main.c b/mkfs/f2fs_format_main.c > > > index 2ba1c21..b113bbc 100644 > > > --- a/mkfs/f2fs_format_main.c > > > +++ b/mkfs/f2fs_format_main.c > > > @@ -50,7 +50,7 @@ static void mkfs_usage() > > > MSG(0, "\nUsage: mkfs.f2fs [options] device [sectors]\n"); > > > MSG(0, "[options]:\n"); > > > MSG(0, " -b filesystem block size [default:4096]\n"); > > > - MSG(0, " -c [device_name] up to 7 additional devices, except meta device\n"); > > > + MSG(0, " -c [device_name[@alias_filename]] up to 7 additional devices, except meta device\n"); > > > MSG(0, " -d debug level [default:0]\n"); > > > MSG(0, " -e [cold file ext list] e.g. \"mp3,gif,mov\"\n"); > > > MSG(0, " -E [hot file ext list] e.g. \"db\"\n"); > > > @@ -105,6 +105,9 @@ static void f2fs_show_info() > > > > > > if (c.feature & F2FS_FEATURE_COMPRESSION) > > > MSG(0, "Info: Enable Compression\n"); > > > + > > > + if (c.feature & F2FS_FEATURE_DEVICE_ALIAS) > > > + MSG(0, "Info: Enable device aliasing\n"); > > > } > > > > > > #if defined(ANDROID_TARGET) && defined(HAVE_SYS_UTSNAME_H) > > > @@ -181,6 +184,7 @@ static void f2fs_parse_options(int argc, char *argv[]) > > > int32_t option=0; > > > int val; > > > char *token; > > > + int dev_num; > > > > > > while ((option = getopt_long(argc,argv,option_string,long_opts,NULL)) != EOF) { > > > switch (option) { > > > @@ -200,17 +204,35 @@ static void f2fs_parse_options(int argc, char *argv[]) > > > } > > > break; > > > case 'c': > > > - if (c.ndevs >= MAX_DEVICES) { > > > + dev_num = c.ndevs; > > > + > > > + if (dev_num >= MAX_DEVICES) { > > > MSG(0, "Error: Too many devices\n"); > > > mkfs_usage(); > > > } > > > > > > - if (strlen(optarg) > MAX_PATH_LEN) { > > > + token = strtok(optarg, "@"); > > > + if (strlen(token) > MAX_PATH_LEN) { > > > MSG(0, "Error: device path should be less than " > > > "%d characters\n", MAX_PATH_LEN); > > > mkfs_usage(); > > > } > > > - c.devices[c.ndevs++].path = strdup(optarg); > > > + c.devices[dev_num].path = strdup(token); > > > + token = strtok(NULL, ""); > > > + if (token) { > > > + if (strlen(token) > MAX_PATH_LEN) { > > > + MSG(0, "Error: alias_filename should " > > > + "be less than %d characters\n", > > > + MAX_PATH_LEN); > > > + mkfs_usage(); > > > + } > > > + c.devices[dev_num].alias_filename = > > > + strdup(token); > > > + if (!c.aliased_devices) > > > + c.feature |= F2FS_FEATURE_DEVICE_ALIAS; > > > + c.aliased_devices++; > > > + } > > > + c.ndevs++; > > > break; > > > case 'd': > > > c.dbg_lv = atoi(optarg); > > > -- > > > 2.46.0.662.g92d0881bb0-goog > > >