Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lyQ5N-0007WN-KH for pgsql-hackers@arkaria.postgresql.org; Wed, 30 Jun 2021 02:36:22 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1lyQ5M-0004Vc-I3 for pgsql-hackers@arkaria.postgresql.org; Wed, 30 Jun 2021 02:36:20 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lyQ5L-0004VU-W5 for pgsql-hackers@lists.postgresql.org; Wed, 30 Jun 2021 02:36:20 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by makus.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1lyQ5G-0003hZ-I9 for pgsql-hackers@lists.postgresql.org; Wed, 30 Jun 2021 02:36:19 +0000 Received: from mail.postgrespro.ru (cyclops.postgrespro.ru [93.174.131.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) by mail.postgrespro.ru (Postfix) with ESMTPSA id EBF9921C8A0A; Wed, 30 Jun 2021 05:36:11 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mail; t=1625020571; bh=KnJ8hUzLCzH7zEI1rFaLaaQX2MR1/lrwcbscsW1dKFs=; h=Date:From:To:Cc:Subject:In-Reply-To:References; b=DQHN//MBc3V+fE56i/Yv5czE8ZWm88IlarRETFnhvn1zTPNZ3lwU803QbG+WnOSGY cOEIQJZsfv/+zCzPYdvHMRuDpvVB5x5JZgxUPSy4S+/CHy1BrKy/wiCeADcKAWVzCE WYNDZ1ejygbCuS2cRqsHe1iw+62v1Iesd8tzErzU= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=_79534d6e5988ed9c709a4fb1a8b3645b" Content-Transfer-Encoding: 8bit Date: Wed, 30 Jun 2021 05:36:11 +0300 From: Yura Sokolov To: Anastasia Lubennikova Cc: pgsql-hackers@lists.postgresql.org Subject: Re: Extensible storage manager API - smgr hooks In-Reply-To: References: User-Agent: Roundcube Webmail/1.4.0 Message-ID: <1dc080496f58ce5375778baed0c0fbcc@postgrespro.ru> X-Sender: y.sokolov@postgrespro.ru List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=_79534d6e5988ed9c709a4fb1a8b3645b Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8; format=flowed Anastasia Lubennikova писал 2021-06-30 00:49: > Hi, hackers! > > Many recently discussed features can make use of an extensible storage > manager API. Namely, storage level compression and encryption [1], > [2], [3], disk quota feature [4], SLRU storage changes [5], and any > other features that may want to substitute PostgreSQL storage layer > with their implementation (i.e. lazy_restore [6]). > > Attached is a proposal to change smgr API to make it extensible. The > idea is to add a hook for plugins to get control in smgr and define > custom storage managers. The patch replaces smgrsw[] array and smgr_sw > selector with smgr() function that loads f_smgr implementation. > > As before it has only one implementation - smgr_md, which is wrapped > into smgr_standard(). > > To create custom implementation, a developer needs to implement smgr > API functions > static const struct f_smgr smgr_custom = > { > .smgr_init = custominit, > ... > } > > create a hook function > > const f_smgr * smgr_custom(BackendId backend, RelFileNode rnode) > { > //Here we can also add some logic and chose which smgr to use > based on rnode and backend > return &smgr_custom; > } > > and finally set the hook: > smgr_hook = smgr_custom; > > [1] > https://www.postgresql.org/message-id/flat/11996861554042351@iva4-dd95b404a60b.qloud-c.yandex.net > [2] > https://www.postgresql.org/message-id/flat/272dd2d9.e52a.17235f2c050.Coremail.chjischj%40163.com > [3] https://postgrespro.com/docs/enterprise/9.6/cfs > [4] > https://www.postgresql.org/message-id/flat/CAB0yre%3DRP_ho6Bq4cV23ELKxRcfhV2Yqrb1zHp0RfUPEWCnBRw%40mail.gmail.com > [5] > https://www.postgresql.org/message-id/flat/20180814213500.GA74618%4060f81dc409fc.ant.amazon.com > [6] > https://wiki.postgresql.org/wiki/PGCon_2021_Fun_With_WAL#Lazy_Restore > > -- > > Best regards, > Lubennikova Anastasia Good day, Anastasia. I also think smgr should be extended with different implementations aside of md. But which way concrete implementation will be chosen for particular relation? I believe it should be (immutable!) property of tablespace, and should be passed to smgropen. Patch in current state doesn't show clear way to distinct different implementations per relation. I don't think patch should be that invasive. smgrsw could pointer to array instead of static array as it is of now, and then reln->smgr_which will remain with same meaning. Yep it then will need a way to select specific implementation, but something like `char smgr_name[NAMEDATALEN]` field with linear search in (i believe) small smgrsw array should be enough. Maybe I'm missing something? regards, Sokolov Yura. --=_79534d6e5988ed9c709a4fb1a8b3645b Content-Transfer-Encoding: base64 Content-Type: text/x-patch; charset=US-ASCII; name=0001-smgr_api.patch Content-Disposition: attachment; filename=0001-smgr_api.patch; size=13240 RnJvbSA5MDA4NTM5OGY1ZWNjOTBkNmI3Y2FhMzE4YmQzZDVmMjg2N2VmOTVjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBhbmFzdGFzaWEgPGx1YmVubmlrb3ZhYXZAZ21haWwuY29tPgpE YXRlOiBUdWUsIDI5IEp1biAyMDIxIDIyOjE2OjI2ICswMzAwClN1YmplY3Q6IFtQQVRDSF0gc21n cl9hcGkucGF0Y2gKCiAgICBNYWtlIHNtZ3IgQVBJIHBsdWdnYWJsZS4gQWRkIHNtZ3JfaG9vayB0 aGF0IGNhbiBiZSB1c2VkIHRvIGRlZmluZSBjdXN0b20gc3RvcmFnZSBtYW5hZ2Vycy4KICAgIFJl bW92ZSBzbWdyc3dbXSBhcnJheSBhbmQgc21ncl9zdyBzZWxlY3Rvci4gSW5zdGVhZCwgc21ncm9w ZW4oKSB1c2VzIHNtZ3IoKSBmdW5jdGlvbiB0byBsb2FkCiAgICBmX3NtZ3IgaW1wbGVtZW50YXRp b24gdXNpbmcgc21ncl9ob29rLgoKICAgIEFsc28gYWRkIHNtZ3JfaW5pdF9ob29rIGFuZCBzbWdy X3NodXRkb3duX2hvb2suCiAgICBBbmQgYSBsb3Qgb2YgbWVjaGFuaWNhbCBjaGFuZ2VzIGluIHNt Z3IuYyBmdW5jdGlvbnMuCi0tLQogc3JjL2JhY2tlbmQvc3RvcmFnZS9zbWdyL3NtZ3IuYyB8IDEz NiArKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLS0tLQogc3JjL2luY2x1ZGUvc3RvcmFnZS9z bWdyLmggICAgICB8ICA1NiArKysrKysrKysrKystCiAyIGZpbGVzIGNoYW5nZWQsIDExNiBpbnNl cnRpb25zKCspLCA3NiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9zdG9y YWdlL3NtZ3Ivc21nci5jIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9zbWdyL3NtZ3IuYwppbmRleCA0 ZGMyNDY0OWRmLi41ZjE5ODFhMzUzIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9zdG9yYWdlL3Nt Z3Ivc21nci5jCisrKyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2Uvc21nci9zbWdyLmMKQEAgLTI2LDQ3 ICsyNiw4IEBACiAjaW5jbHVkZSAidXRpbHMvaHNlYXJjaC5oIgogI2luY2x1ZGUgInV0aWxzL2lu dmFsLmgiCiAKLQotLyoKLSAqIFRoaXMgc3RydWN0IG9mIGZ1bmN0aW9uIHBvaW50ZXJzIGRlZmlu ZXMgdGhlIEFQSSBiZXR3ZWVuIHNtZ3IuYyBhbmQKLSAqIGFueSBpbmRpdmlkdWFsIHN0b3JhZ2Ug bWFuYWdlciBtb2R1bGUuICBOb3RlIHRoYXQgc21nciBzdWJmdW5jdGlvbnMgYXJlCi0gKiBnZW5l cmFsbHkgZXhwZWN0ZWQgdG8gcmVwb3J0IHByb2JsZW1zIHZpYSBlbG9nKEVSUk9SKS4gIEFuIGV4 Y2VwdGlvbiBpcwotICogdGhhdCBzbWdyX3VubGluayBzaG91bGQgdXNlIGVsb2coV0FSTklORyks IHJhdGhlciB0aGFuIGVycm9yaW5nIG91dCwKLSAqIGJlY2F1c2Ugd2Ugbm9ybWFsbHkgdW5saW5r IHJlbGF0aW9ucyBkdXJpbmcgcG9zdC1jb21taXQvYWJvcnQgY2xlYW51cCwKLSAqIGFuZCBzbyBp dCdzIHRvbyBsYXRlIHRvIHJhaXNlIGFuIGVycm9yLiAgQWxzbywgdmFyaW91cyBjb25kaXRpb25z IHRoYXQKLSAqIHdvdWxkIG5vcm1hbGx5IGJlIGVycm9ycyBzaG91bGQgYmUgYWxsb3dlZCBkdXJp bmcgYm9vdHN0cmFwIGFuZC9vciBXQUwKLSAqIHJlY292ZXJ5IC0tLSBzZWUgY29tbWVudHMgaW4g bWQuYyBmb3IgZGV0YWlscy4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgZl9zbWdyCi17Ci0Jdm9pZAkJ KCpzbWdyX2luaXQpICh2b2lkKTsJLyogbWF5IGJlIE5VTEwgKi8KLQl2b2lkCQkoKnNtZ3Jfc2h1 dGRvd24pICh2b2lkKTsJLyogbWF5IGJlIE5VTEwgKi8KLQl2b2lkCQkoKnNtZ3Jfb3BlbikgKFNN Z3JSZWxhdGlvbiByZWxuKTsKLQl2b2lkCQkoKnNtZ3JfY2xvc2UpIChTTWdyUmVsYXRpb24gcmVs biwgRm9ya051bWJlciBmb3JrbnVtKTsKLQl2b2lkCQkoKnNtZ3JfY3JlYXRlKSAoU01nclJlbGF0 aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251bSwKLQkJCQkJCQkJYm9vbCBpc1JlZG8pOwotCWJv b2wJCSgqc21ncl9leGlzdHMpIChTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVt KTsKLQl2b2lkCQkoKnNtZ3JfdW5saW5rKSAoUmVsRmlsZU5vZGVCYWNrZW5kIHJub2RlLCBGb3Jr TnVtYmVyIGZvcmtudW0sCi0JCQkJCQkJCWJvb2wgaXNSZWRvKTsKLQl2b2lkCQkoKnNtZ3JfZXh0 ZW5kKSAoU01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251bSwKLQkJCQkJCQkJQmxv Y2tOdW1iZXIgYmxvY2tudW0sIGNoYXIgKmJ1ZmZlciwgYm9vbCBza2lwRnN5bmMpOwotCWJvb2wJ CSgqc21ncl9wcmVmZXRjaCkgKFNNZ3JSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0s Ci0JCQkJCQkJCSAgQmxvY2tOdW1iZXIgYmxvY2tudW0pOwotCXZvaWQJCSgqc21ncl9yZWFkKSAo U01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251bSwKLQkJCQkJCQkgIEJsb2NrTnVt YmVyIGJsb2NrbnVtLCBjaGFyICpidWZmZXIpOwotCXZvaWQJCSgqc21ncl93cml0ZSkgKFNNZ3JS ZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0sCi0JCQkJCQkJICAgQmxvY2tOdW1iZXIg YmxvY2tudW0sIGNoYXIgKmJ1ZmZlciwgYm9vbCBza2lwRnN5bmMpOwotCXZvaWQJCSgqc21ncl93 cml0ZWJhY2spIChTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVtLAotCQkJCQkJ CQkgICBCbG9ja051bWJlciBibG9ja251bSwgQmxvY2tOdW1iZXIgbmJsb2Nrcyk7Ci0JQmxvY2tO dW1iZXIgKCpzbWdyX25ibG9ja3MpIChTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBmb3Jr bnVtKTsKLQl2b2lkCQkoKnNtZ3JfdHJ1bmNhdGUpIChTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051 bWJlciBmb3JrbnVtLAotCQkJCQkJCQkgIEJsb2NrTnVtYmVyIG5ibG9ja3MpOwotCXZvaWQJCSgq c21ncl9pbW1lZHN5bmMpIChTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVtKTsK LX0gZl9zbWdyOwotCi1zdGF0aWMgY29uc3QgZl9zbWdyIHNtZ3Jzd1tdID0geworc3RhdGljIGNv bnN0IGZfc21nciBzbWdyX21kID0gewogCS8qIG1hZ25ldGljIGRpc2sgKi8KLQl7CiAJCS5zbWdy X2luaXQgPSBtZGluaXQsCiAJCS5zbWdyX3NodXRkb3duID0gTlVMTCwKIAkJLnNtZ3Jfb3BlbiA9 IG1kb3BlbiwKQEAgLTgyLDExICs0Myw4IEBAIHN0YXRpYyBjb25zdCBmX3NtZ3Igc21ncnN3W10g PSB7CiAJCS5zbWdyX25ibG9ja3MgPSBtZG5ibG9ja3MsCiAJCS5zbWdyX3RydW5jYXRlID0gbWR0 cnVuY2F0ZSwKIAkJLnNtZ3JfaW1tZWRzeW5jID0gbWRpbW1lZHN5bmMsCi0JfQogfTsKIAotc3Rh dGljIGNvbnN0IGludCBOU21nciA9IGxlbmd0aG9mKHNtZ3Jzdyk7Ci0KIC8qCiAgKiBFYWNoIGJh Y2tlbmQgaGFzIGEgaGFzaHRhYmxlIHRoYXQgc3RvcmVzIGFsbCBleHRhbnQgU01nclJlbGF0aW9u IG9iamVjdHMuCiAgKiBJbiBhZGRpdGlvbiwgInVub3duZWQiIFNNZ3JSZWxhdGlvbiBvYmplY3Rz IGFyZSBjaGFpbmVkIHRvZ2V0aGVyIGluIGEgbGlzdC4KQEAgLTExMCwxMyArNjgsMTAgQEAgc3Rh dGljIHZvaWQgc21ncnNodXRkb3duKGludCBjb2RlLCBEYXR1bSBhcmcpOwogdm9pZAogc21ncmlu aXQodm9pZCkKIHsKLQlpbnQJCQlpOworCWlmIChzbWdyX2luaXRfaG9vaykKKwkJKCpzbWdyX2lu aXRfaG9vaykoKTsKIAotCWZvciAoaSA9IDA7IGkgPCBOU21ncjsgaSsrKQotCXsKLQkJaWYgKHNt Z3Jzd1tpXS5zbWdyX2luaXQpCi0JCQlzbWdyc3dbaV0uc21ncl9pbml0KCk7Ci0JfQorCXNtZ3Jf aW5pdF9zdGFuZGFyZCgpOwogCiAJLyogcmVnaXN0ZXIgdGhlIHNodXRkb3duIHByb2MgKi8KIAlv bl9wcm9jX2V4aXQoc21ncnNodXRkb3duLCAwKTsKQEAgLTEyOCwxNSArODMsNTAgQEAgc21ncmlu aXQodm9pZCkKIHN0YXRpYyB2b2lkCiBzbWdyc2h1dGRvd24oaW50IGNvZGUsIERhdHVtIGFyZykK IHsKLQlpbnQJCQlpOworCWlmIChzbWdyX3NodXRkb3duX2hvb2spCisJCSgqc21ncl9zaHV0ZG93 bl9ob29rKSgpOworCisJc21ncl9zaHV0ZG93bl9zdGFuZGFyZCgpOworfQorCisvKiBIb29rcyBm b3IgcGx1Z2lucyB0byBnZXQgY29udHJvbCBpbiBzbWdyICovCitzbWdyX2hvb2tfdHlwZSBzbWdy X2hvb2sgPSBOVUxMOworc21ncl9pbml0X2hvb2tfdHlwZSBzbWdyX2luaXRfaG9vayA9IE5VTEw7 CitzbWdyX3NodXRkb3duX2hvb2tfdHlwZSBzbWdyX3NodXRkb3duX2hvb2sgPSBOVUxMOworCitj b25zdCBmX3NtZ3IgKgorc21ncl9zdGFuZGFyZChCYWNrZW5kSWQgYmFja2VuZCwgUmVsRmlsZU5v ZGUgcm5vZGUpCit7CisJcmV0dXJuICZzbWdyX21kOworfQogCi0JZm9yIChpID0gMDsgaSA8IE5T bWdyOyBpKyspCit2b2lkCitzbWdyX2luaXRfc3RhbmRhcmQodm9pZCkKK3sKKwltZGluaXQoKTsK K30KKwordm9pZAorc21ncl9zaHV0ZG93bl9zdGFuZGFyZCh2b2lkKQoreworfQorCitjb25zdCBm X3NtZ3IgKgorc21ncihCYWNrZW5kSWQgYmFja2VuZCwgUmVsRmlsZU5vZGUgcm5vZGUpCit7CisJ Y29uc3QgZl9zbWdyICpyZXN1bHQ7CisKKwlpZiAoc21ncl9ob29rKQogCXsKLQkJaWYgKHNtZ3Jz d1tpXS5zbWdyX3NodXRkb3duKQotCQkJc21ncnN3W2ldLnNtZ3Jfc2h1dGRvd24oKTsKKwkJcmVz dWx0ID0gKCpzbWdyX2hvb2spKGJhY2tlbmQsIHJub2RlKTsKIAl9CisJZWxzZQorCQlyZXN1bHQg PSBzbWdyX3N0YW5kYXJkKGJhY2tlbmQsIHJub2RlKTsKKworCXJldHVybiByZXN1bHQ7CiB9CiAK KwogLyoKICAqCXNtZ3JvcGVuKCkgLS0gUmV0dXJuIGFuIFNNZ3JSZWxhdGlvbiBvYmplY3QsIGNy ZWF0aW5nIGl0IGlmIG5lZWQgYmUuCiAgKgpAQCAtMTc2LDEwICsxNjYsMTEgQEAgc21ncm9wZW4o UmVsRmlsZU5vZGUgcm5vZGUsIEJhY2tlbmRJZCBiYWNrZW5kKQogCQlyZWxuLT5zbWdyX3Rhcmdi bG9jayA9IEludmFsaWRCbG9ja051bWJlcjsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPD0gTUFYX0ZP UktOVU07ICsraSkKIAkJCXJlbG4tPnNtZ3JfY2FjaGVkX25ibG9ja3NbaV0gPSBJbnZhbGlkQmxv Y2tOdW1iZXI7Ci0JCXJlbG4tPnNtZ3Jfd2hpY2ggPSAwOwkvKiB3ZSBvbmx5IGhhdmUgbWQuYyBh dCBwcmVzZW50ICovCisKKwkJcmVsbi0+c21nciA9IHNtZ3IoYmFja2VuZCwgcm5vZGUpOwogCiAJ CS8qIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIGluaXRpYWxpemF0aW9uICovCi0JCXNtZ3Jzd1ty ZWxuLT5zbWdyX3doaWNoXS5zbWdyX29wZW4ocmVsbik7CisJCSgqcmVsbi0+c21ncikuc21ncl9v cGVuKHJlbG4pOwogCiAJCS8qIGl0IGhhcyBubyBvd25lciB5ZXQgKi8KIAkJZGxpc3RfcHVzaF90 YWlsKCZ1bm93bmVkX3JlbG5zLCAmcmVsbi0+bm9kZSk7CkBAIC0yNDYsNyArMjM3LDcgQEAgc21n cmNsZWFyb3duZXIoU01nclJlbGF0aW9uICpvd25lciwgU01nclJlbGF0aW9uIHJlbG4pCiBib29s CiBzbWdyZXhpc3RzKFNNZ3JSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0pCiB7Ci0J cmV0dXJuIHNtZ3Jzd1tyZWxuLT5zbWdyX3doaWNoXS5zbWdyX2V4aXN0cyhyZWxuLCBmb3JrbnVt KTsKKwlyZXR1cm4gKCpyZWxuLT5zbWdyKS5zbWdyX2V4aXN0cyhyZWxuLCBmb3JrbnVtKTsKIH0K IAogLyoKQEAgLTI1OSw3ICsyNTAsNyBAQCBzbWdyY2xvc2UoU01nclJlbGF0aW9uIHJlbG4pCiAJ Rm9ya051bWJlcglmb3JrbnVtOwogCiAJZm9yIChmb3JrbnVtID0gMDsgZm9ya251bSA8PSBNQVhf Rk9SS05VTTsgZm9ya251bSsrKQotCQlzbWdyc3dbcmVsbi0+c21ncl93aGljaF0uc21ncl9jbG9z ZShyZWxuLCBmb3JrbnVtKTsKKwkJKCpyZWxuLT5zbWdyKS5zbWdyX2Nsb3NlKHJlbG4sIGZvcmtu dW0pOwogCiAJb3duZXIgPSByZWxuLT5zbWdyX293bmVyOwogCkBAIC0zMzIsNyArMzIzLDcgQEAg c21ncmNsb3Nlbm9kZShSZWxGaWxlTm9kZUJhY2tlbmQgcm5vZGUpCiB2b2lkCiBzbWdyY3JlYXRl KFNNZ3JSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0sIGJvb2wgaXNSZWRvKQogewot CXNtZ3Jzd1tyZWxuLT5zbWdyX3doaWNoXS5zbWdyX2NyZWF0ZShyZWxuLCBmb3JrbnVtLCBpc1Jl ZG8pOworCSgqcmVsbi0+c21ncikuc21ncl9jcmVhdGUocmVsbiwgZm9ya251bSwgaXNSZWRvKTsK IH0KIAogLyoKQEAgLTM2MCwxMiArMzUxLDEwIEBAIHNtZ3Jkb3N5bmNhbGwoU01nclJlbGF0aW9u ICpyZWxzLCBpbnQgbnJlbHMpCiAJICovCiAJZm9yIChpID0gMDsgaSA8IG5yZWxzOyBpKyspCiAJ ewotCQlpbnQJCQl3aGljaCA9IHJlbHNbaV0tPnNtZ3Jfd2hpY2g7Ci0KIAkJZm9yIChmb3JrbnVt ID0gMDsgZm9ya251bSA8PSBNQVhfRk9SS05VTTsgZm9ya251bSsrKQogCQl7Ci0JCQlpZiAoc21n cnN3W3doaWNoXS5zbWdyX2V4aXN0cyhyZWxzW2ldLCBmb3JrbnVtKSkKLQkJCQlzbWdyc3dbd2hp Y2hdLnNtZ3JfaW1tZWRzeW5jKHJlbHNbaV0sIGZvcmtudW0pOworCQkJaWYgKCgqcmVsc1tpXS0+ c21ncikuc21ncl9leGlzdHMocmVsc1tpXSwgZm9ya251bSkpCisJCQkJKCpyZWxzW2ldLT5zbWdy KS5zbWdyX2ltbWVkc3luYyhyZWxzW2ldLCBmb3JrbnVtKTsKIAkJfQogCX0KIH0KQEAgLTQwNCwx MyArMzkzLDEyIEBAIHNtZ3Jkb3VubGlua2FsbChTTWdyUmVsYXRpb24gKnJlbHMsIGludCBucmVs cywgYm9vbCBpc1JlZG8pCiAJZm9yIChpID0gMDsgaSA8IG5yZWxzOyBpKyspCiAJewogCQlSZWxG aWxlTm9kZUJhY2tlbmQgcm5vZGUgPSByZWxzW2ldLT5zbWdyX3Jub2RlOwotCQlpbnQJCQl3aGlj aCA9IHJlbHNbaV0tPnNtZ3Jfd2hpY2g7CiAKIAkJcm5vZGVzW2ldID0gcm5vZGU7CiAKIAkJLyog Q2xvc2UgdGhlIGZvcmtzIGF0IHNtZ3IgbGV2ZWwgKi8KIAkJZm9yIChmb3JrbnVtID0gMDsgZm9y a251bSA8PSBNQVhfRk9SS05VTTsgZm9ya251bSsrKQotCQkJc21ncnN3W3doaWNoXS5zbWdyX2Ns b3NlKHJlbHNbaV0sIGZvcmtudW0pOworCQkJKCpyZWxzW2ldLT5zbWdyKS5zbWdyX2Nsb3NlKHJl bHNbaV0sIGZvcmtudW0pOwogCX0KIAogCS8qCkBAIC00MzksMTAgKzQyNyw4IEBAIHNtZ3Jkb3Vu bGlua2FsbChTTWdyUmVsYXRpb24gKnJlbHMsIGludCBucmVscywgYm9vbCBpc1JlZG8pCiAKIAlm b3IgKGkgPSAwOyBpIDwgbnJlbHM7IGkrKykKIAl7Ci0JCWludAkJCXdoaWNoID0gcmVsc1tpXS0+ c21ncl93aGljaDsKLQogCQlmb3IgKGZvcmtudW0gPSAwOyBmb3JrbnVtIDw9IE1BWF9GT1JLTlVN OyBmb3JrbnVtKyspCi0JCQlzbWdyc3dbd2hpY2hdLnNtZ3JfdW5saW5rKHJub2Rlc1tpXSwgZm9y a251bSwgaXNSZWRvKTsKKwkJCSgqcmVsc1tpXS0+c21ncikuc21ncl91bmxpbmsocm5vZGVzW2ld LCBmb3JrbnVtLCBpc1JlZG8pOwogCX0KIAogCXBmcmVlKHJub2Rlcyk7CkBAIC00NjIsNyArNDQ4 LDcgQEAgdm9pZAogc21ncmV4dGVuZChTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBmb3Jr bnVtLCBCbG9ja051bWJlciBibG9ja251bSwKIAkJICAgY2hhciAqYnVmZmVyLCBib29sIHNraXBG c3luYykKIHsKLQlzbWdyc3dbcmVsbi0+c21ncl93aGljaF0uc21ncl9leHRlbmQocmVsbiwgZm9y a251bSwgYmxvY2tudW0sCisJKCpyZWxuLT5zbWdyKS5zbWdyX2V4dGVuZChyZWxuLCBmb3JrbnVt LCBibG9ja251bSwKIAkJCQkJCQkJCQkgYnVmZmVyLCBza2lwRnN5bmMpOwogCiAJLyoKQEAgLTQ4 Niw3ICs0NzIsNyBAQCBzbWdyZXh0ZW5kKFNNZ3JSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZv cmtudW0sIEJsb2NrTnVtYmVyIGJsb2NrbnVtLAogYm9vbAogc21ncnByZWZldGNoKFNNZ3JSZWxh dGlvbiByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0sIEJsb2NrTnVtYmVyIGJsb2NrbnVtKQogewot CXJldHVybiBzbWdyc3dbcmVsbi0+c21ncl93aGljaF0uc21ncl9wcmVmZXRjaChyZWxuLCBmb3Jr bnVtLCBibG9ja251bSk7CisJcmV0dXJuICgqcmVsbi0+c21ncikuc21ncl9wcmVmZXRjaChyZWxu LCBmb3JrbnVtLCBibG9ja251bSk7CiB9CiAKIC8qCkBAIC01MDEsNyArNDg3LDcgQEAgdm9pZAog c21ncnJlYWQoU01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251bSwgQmxvY2tOdW1i ZXIgYmxvY2tudW0sCiAJCSBjaGFyICpidWZmZXIpCiB7Ci0Jc21ncnN3W3JlbG4tPnNtZ3Jfd2hp Y2hdLnNtZ3JfcmVhZChyZWxuLCBmb3JrbnVtLCBibG9ja251bSwgYnVmZmVyKTsKKwkoKnJlbG4t PnNtZ3IpLnNtZ3JfcmVhZChyZWxuLCBmb3JrbnVtLCBibG9ja251bSwgYnVmZmVyKTsKIH0KIAog LyoKQEAgLTUyMyw3ICs1MDksNyBAQCB2b2lkCiBzbWdyd3JpdGUoU01nclJlbGF0aW9uIHJlbG4s IEZvcmtOdW1iZXIgZm9ya251bSwgQmxvY2tOdW1iZXIgYmxvY2tudW0sCiAJCSAgY2hhciAqYnVm ZmVyLCBib29sIHNraXBGc3luYykKIHsKLQlzbWdyc3dbcmVsbi0+c21ncl93aGljaF0uc21ncl93 cml0ZShyZWxuLCBmb3JrbnVtLCBibG9ja251bSwKKwkoKnJlbG4tPnNtZ3IpLnNtZ3Jfd3JpdGUo cmVsbiwgZm9ya251bSwgYmxvY2tudW0sCiAJCQkJCQkJCQkJYnVmZmVyLCBza2lwRnN5bmMpOwog fQogCkBAIC01MzYsNyArNTIyLDcgQEAgdm9pZAogc21ncndyaXRlYmFjayhTTWdyUmVsYXRpb24g cmVsbiwgRm9ya051bWJlciBmb3JrbnVtLCBCbG9ja051bWJlciBibG9ja251bSwKIAkJCSAgQmxv Y2tOdW1iZXIgbmJsb2NrcykKIHsKLQlzbWdyc3dbcmVsbi0+c21ncl93aGljaF0uc21ncl93cml0 ZWJhY2socmVsbiwgZm9ya251bSwgYmxvY2tudW0sCisJKCpyZWxuLT5zbWdyKS5zbWdyX3dyaXRl YmFjayhyZWxuLCBmb3JrbnVtLCBibG9ja251bSwKIAkJCQkJCQkJCQkJbmJsb2Nrcyk7CiB9CiAK QEAgLTU1NCw3ICs1NDAsNyBAQCBzbWdybmJsb2NrcyhTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051 bWJlciBmb3JrbnVtKQogCWlmIChyZXN1bHQgIT0gSW52YWxpZEJsb2NrTnVtYmVyKQogCQlyZXR1 cm4gcmVzdWx0OwogCi0JcmVzdWx0ID0gc21ncnN3W3JlbG4tPnNtZ3Jfd2hpY2hdLnNtZ3JfbmJs b2NrcyhyZWxuLCBmb3JrbnVtKTsKKwlyZXN1bHQgPSAoKnJlbG4tPnNtZ3IpLnNtZ3JfbmJsb2Nr cyhyZWxuLCBmb3JrbnVtKTsKIAogCXJlbG4tPnNtZ3JfY2FjaGVkX25ibG9ja3NbZm9ya251bV0g PSByZXN1bHQ7CiAKQEAgLTYyMCw3ICs2MDYsNyBAQCBzbWdydHJ1bmNhdGUoU01nclJlbGF0aW9u IHJlbG4sIEZvcmtOdW1iZXIgKmZvcmtudW0sIGludCBuZm9ya3MsIEJsb2NrTnVtYmVyICpuYgog CQkvKiBNYWtlIHRoZSBjYWNoZWQgc2l6ZSBpcyBpbnZhbGlkIGlmIHdlIGVuY291bnRlciBhbiBl cnJvci4gKi8KIAkJcmVsbi0+c21ncl9jYWNoZWRfbmJsb2Nrc1tmb3JrbnVtW2ldXSA9IEludmFs aWRCbG9ja051bWJlcjsKIAotCQlzbWdyc3dbcmVsbi0+c21ncl93aGljaF0uc21ncl90cnVuY2F0 ZShyZWxuLCBmb3JrbnVtW2ldLCBuYmxvY2tzW2ldKTsKKwkJKCpyZWxuLT5zbWdyKS5zbWdyX3Ry dW5jYXRlKHJlbG4sIGZvcmtudW1baV0sIG5ibG9ja3NbaV0pOwogCiAJCS8qCiAJCSAqIFdlIG1p Z2h0IGFzIHdlbGwgdXBkYXRlIHRoZSBsb2NhbCBzbWdyX2NhY2hlZF9uYmxvY2tzIHZhbHVlcy4g VGhlCkBAIC02NTksNyArNjQ1LDcgQEAgc21ncnRydW5jYXRlKFNNZ3JSZWxhdGlvbiByZWxuLCBG b3JrTnVtYmVyICpmb3JrbnVtLCBpbnQgbmZvcmtzLCBCbG9ja051bWJlciAqbmIKIHZvaWQKIHNt Z3JpbW1lZHN5bmMoU01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251bSkKIHsKLQlz bWdyc3dbcmVsbi0+c21ncl93aGljaF0uc21ncl9pbW1lZHN5bmMocmVsbiwgZm9ya251bSk7CisJ KCpyZWxuLT5zbWdyKS5zbWdyX2ltbWVkc3luYyhyZWxuLCBmb3JrbnVtKTsKIH0KIAogLyoKZGlm ZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3N0b3JhZ2Uvc21nci5oIGIvc3JjL2luY2x1ZGUvc3RvcmFn ZS9zbWdyLmgKaW5kZXggYTZmYmY3YjZhNi4uMTljODA0ZGU1NyAxMDA2NDQKLS0tIGEvc3JjL2lu Y2x1ZGUvc3RvcmFnZS9zbWdyLmgKKysrIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9zbWdyLmgKQEAg LTE4LDYgKzE4LDggQEAKICNpbmNsdWRlICJzdG9yYWdlL2Jsb2NrLmgiCiAjaW5jbHVkZSAic3Rv cmFnZS9yZWxmaWxlbm9kZS5oIgogCitzdHJ1Y3QgZl9zbWdyOworCiAvKgogICogc21nci5jIG1h aW50YWlucyBhIHRhYmxlIG9mIFNNZ3JSZWxhdGlvbiBvYmplY3RzLCB3aGljaCBhcmUgZXNzZW50 aWFsbHkKICAqIGNhY2hlZCBmaWxlIGhhbmRsZXMuICBBbiBTTWdyUmVsYXRpb24gaXMgY3JlYXRl ZCAoaWYgbm90IGFscmVhZHkgcHJlc2VudCkKQEAgLTU5LDcgKzYxLDcgQEAgdHlwZWRlZiBzdHJ1 Y3QgU01nclJlbGF0aW9uRGF0YQogCSAqIEZpZWxkcyBiZWxvdyBoZXJlIGFyZSBpbnRlbmRlZCB0 byBiZSBwcml2YXRlIHRvIHNtZ3IuYyBhbmQgaXRzCiAJICogc3VibW9kdWxlcy4gIERvIG5vdCB0 b3VjaCB0aGVtIGZyb20gZWxzZXdoZXJlLgogCSAqLwotCWludAkJCXNtZ3Jfd2hpY2g7CQkvKiBz dG9yYWdlIG1hbmFnZXIgc2VsZWN0b3IgKi8KKwljb25zdCBzdHJ1Y3QgZl9zbWdyICpzbWdyOyAv KiBzdG9yYWdlIG1hbmFnZXIgc2VsZWN0b3IgKi8KIAogCS8qCiAJICogZm9yIG1kLmM7IHBlci1m b3JrIGFycmF5cyBvZiB0aGUgbnVtYmVyIG9mIG9wZW4gc2VnbWVudHMKQEAgLTc3LDYgKzc5LDU4 IEBAIHR5cGVkZWYgU01nclJlbGF0aW9uRGF0YSAqU01nclJlbGF0aW9uOwogI2RlZmluZSBTbWdy SXNUZW1wKHNtZ3IpIFwKIAlSZWxGaWxlTm9kZUJhY2tlbmRJc1RlbXAoKHNtZ3IpLT5zbWdyX3Ju b2RlKQogCisKKy8qCisgKiBUaGlzIHN0cnVjdCBvZiBmdW5jdGlvbiBwb2ludGVycyBkZWZpbmVz IHRoZSBBUEkgYmV0d2VlbiBzbWdyLmMgYW5kCisgKiBhbnkgaW5kaXZpZHVhbCBzdG9yYWdlIG1h bmFnZXIgbW9kdWxlLiAgTm90ZSB0aGF0IHNtZ3Igc3ViZnVuY3Rpb25zIGFyZQorICogZ2VuZXJh bGx5IGV4cGVjdGVkIHRvIHJlcG9ydCBwcm9ibGVtcyB2aWEgZWxvZyhFUlJPUikuICBBbiBleGNl cHRpb24gaXMKKyAqIHRoYXQgc21ncl91bmxpbmsgc2hvdWxkIHVzZSBlbG9nKFdBUk5JTkcpLCBy YXRoZXIgdGhhbiBlcnJvcmluZyBvdXQsCisgKiBiZWNhdXNlIHdlIG5vcm1hbGx5IHVubGluayBy ZWxhdGlvbnMgZHVyaW5nIHBvc3QtY29tbWl0L2Fib3J0IGNsZWFudXAsCisgKiBhbmQgc28gaXQn cyB0b28gbGF0ZSB0byByYWlzZSBhbiBlcnJvci4gIEFsc28sIHZhcmlvdXMgY29uZGl0aW9ucyB0 aGF0CisgKiB3b3VsZCBub3JtYWxseSBiZSBlcnJvcnMgc2hvdWxkIGJlIGFsbG93ZWQgZHVyaW5n IGJvb3RzdHJhcCBhbmQvb3IgV0FMCisgKiByZWNvdmVyeSAtLS0gc2VlIGNvbW1lbnRzIGluIG1k LmMgZm9yIGRldGFpbHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IGZfc21ncgoreworCXZvaWQJCSgq c21ncl9pbml0KSAodm9pZCk7CS8qIG1heSBiZSBOVUxMICovCisJdm9pZAkJKCpzbWdyX3NodXRk b3duKSAodm9pZCk7CS8qIG1heSBiZSBOVUxMICovCisJdm9pZAkJKCpzbWdyX29wZW4pIChTTWdy UmVsYXRpb24gcmVsbik7CisJdm9pZAkJKCpzbWdyX2Nsb3NlKSAoU01nclJlbGF0aW9uIHJlbG4s IEZvcmtOdW1iZXIgZm9ya251bSk7CisJdm9pZAkJKCpzbWdyX2NyZWF0ZSkgKFNNZ3JSZWxhdGlv biByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0sCisJCQkJCQkJCWJvb2wgaXNSZWRvKTsKKwlib29s CQkoKnNtZ3JfZXhpc3RzKSAoU01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251bSk7 CisJdm9pZAkJKCpzbWdyX3VubGluaykgKFJlbEZpbGVOb2RlQmFja2VuZCBybm9kZSwgRm9ya051 bWJlciBmb3JrbnVtLAorCQkJCQkJCQlib29sIGlzUmVkbyk7CisJdm9pZAkJKCpzbWdyX2V4dGVu ZCkgKFNNZ3JSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0sCisJCQkJCQkJCUJsb2Nr TnVtYmVyIGJsb2NrbnVtLCBjaGFyICpidWZmZXIsIGJvb2wgc2tpcEZzeW5jKTsKKwlib29sCQko KnNtZ3JfcHJlZmV0Y2gpIChTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVtLAor CQkJCQkJCQkgIEJsb2NrTnVtYmVyIGJsb2NrbnVtKTsKKwl2b2lkCQkoKnNtZ3JfcmVhZCkgKFNN Z3JSZWxhdGlvbiByZWxuLCBGb3JrTnVtYmVyIGZvcmtudW0sCisJCQkJCQkJICBCbG9ja051bWJl ciBibG9ja251bSwgY2hhciAqYnVmZmVyKTsKKwl2b2lkCQkoKnNtZ3Jfd3JpdGUpIChTTWdyUmVs YXRpb24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVtLAorCQkJCQkJCSAgIEJsb2NrTnVtYmVyIGJs b2NrbnVtLCBjaGFyICpidWZmZXIsIGJvb2wgc2tpcEZzeW5jKTsKKwl2b2lkCQkoKnNtZ3Jfd3Jp dGViYWNrKSAoU01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251bSwKKwkJCQkJCQkJ ICAgQmxvY2tOdW1iZXIgYmxvY2tudW0sIEJsb2NrTnVtYmVyIG5ibG9ja3MpOworCUJsb2NrTnVt YmVyICgqc21ncl9uYmxvY2tzKSAoU01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251 bSk7CisJdm9pZAkJKCpzbWdyX3RydW5jYXRlKSAoU01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1i ZXIgZm9ya251bSwKKwkJCQkJCQkJICBCbG9ja051bWJlciBuYmxvY2tzKTsKKwl2b2lkCQkoKnNt Z3JfaW1tZWRzeW5jKSAoU01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251bSk7Cit9 IGZfc21ncjsKKwordHlwZWRlZiB2b2lkICgqc21ncl9pbml0X2hvb2tfdHlwZSkgKHZvaWQpOwor dHlwZWRlZiB2b2lkICgqc21ncl9zaHV0ZG93bl9ob29rX3R5cGUpICh2b2lkKTsKK2V4dGVybiBQ R0RMTElNUE9SVCBzbWdyX2luaXRfaG9va190eXBlIHNtZ3JfaW5pdF9ob29rOworZXh0ZXJuIFBH RExMSU1QT1JUIHNtZ3Jfc2h1dGRvd25faG9va190eXBlIHNtZ3Jfc2h1dGRvd25faG9vazsKK2V4 dGVybiB2b2lkIHNtZ3JfaW5pdF9zdGFuZGFyZCh2b2lkKTsKK2V4dGVybiB2b2lkIHNtZ3Jfc2h1 dGRvd25fc3RhbmRhcmQodm9pZCk7CisKKwordHlwZWRlZiBjb25zdCBmX3NtZ3IgKigqc21ncl9o b29rX3R5cGUpIChCYWNrZW5kSWQgYmFja2VuZCwgUmVsRmlsZU5vZGUgcm5vZGUpOworZXh0ZXJu IFBHRExMSU1QT1JUIHNtZ3JfaG9va190eXBlIHNtZ3JfaG9vazsKK2V4dGVybiBjb25zdCBmX3Nt Z3IgKnNtZ3Jfc3RhbmRhcmQoQmFja2VuZElkIGJhY2tlbmQsIFJlbEZpbGVOb2RlIHJub2RlKTsK KworZXh0ZXJuIGNvbnN0IGZfc21nciAqc21ncihCYWNrZW5kSWQgYmFja2VuZCwgUmVsRmlsZU5v ZGUgcm5vZGUpOworCiBleHRlcm4gdm9pZCBzbWdyaW5pdCh2b2lkKTsKIGV4dGVybiBTTWdyUmVs YXRpb24gc21ncm9wZW4oUmVsRmlsZU5vZGUgcm5vZGUsIEJhY2tlbmRJZCBiYWNrZW5kKTsKIGV4 dGVybiBib29sIHNtZ3JleGlzdHMoU01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251 bSk7Ci0tIAoyLjI1LjEKCg== --=_79534d6e5988ed9c709a4fb1a8b3645b--