Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vaDZE-005KAu-1o for pgsql-hackers@arkaria.postgresql.org; Mon, 29 Dec 2025 13:45:49 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vaDZD-00GuRA-1T for pgsql-hackers@arkaria.postgresql.org; Mon, 29 Dec 2025 13:45:48 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vaDZD-00GuR2-08 for pgsql-hackers@lists.postgresql.org; Mon, 29 Dec 2025 13:45:47 +0000 Received: from mail-ej1-x635.google.com ([2a00:1450:4864:20::635]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vaDZ8-003PE2-2t for pgsql-hackers@lists.postgresql.org; Mon, 29 Dec 2025 13:45:47 +0000 Received: by mail-ej1-x635.google.com with SMTP id a640c23a62f3a-b734fcbf1e3so1874411466b.3 for ; Mon, 29 Dec 2025 05:45:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1767015940; x=1767620740; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=GiZPip84A6KJD0Ho5cN/+k5jXiPUo07cWKOc0PF1oiY=; b=A5UfLvUoG3aJYW5pHcZNnAh1G8KVl4a+biHsAw4u03/TSCJ/kzq1ChQCx/y6IBITcW I8MsRkfuToPquGlepPxw9SC0LmLgZa3qvy+3l3JjhgJn7et/wN3R3BIXfHEKsntu30Zg 8xAklko0IVyZuh/yg1NNn4+o7fMwzolq07qybc+f0bIhskDI66fve/tYR0pwfcamjgwp zPQJucWJCunFONTPwErlRUx14Nh+cHnzmtyF4e/+xjpZtLB5xMXtYl+zRvCmFQYHSbTa bT12bhBExtOTAJ4eTeA2AGsJn6wMLX3yEopoHxxwepI+ush6Q/1klpXSbPapWnxiD3f7 L5xg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767015940; x=1767620740; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=GiZPip84A6KJD0Ho5cN/+k5jXiPUo07cWKOc0PF1oiY=; b=EkEkxLZDolfrpY8e4vw+NrKk+ODfFxyHgOrTt5wkxRcVvAGWMILsT5SL7Wj+ygCU4w Yiwleo8mZOMKnmihY1fmhZVfhd2nAu8oZfbeJAbOeZcxarmatkgKOWwAdLmtejjGR/BX Gyk3DiHp5yXd4sCsnkNDQX+KAV93cxys6ZyMO66rOecacssGLhjmrUrvzA0dpA2abHtW YmazodiYulKlnK5OVcLnHdJM60ISt5hkcQtMIb+VkCIYnfOaY0lXG9B4wTvY7HyZNDWC F+4BXcPr0Ems/fnT7ai3inIOpTj0g5+SqyfBm7MYz8suokIk3ZorcnAqLIv/OKb/3S9P s8RQ== X-Forwarded-Encrypted: i=1; AJvYcCUCrC1NDoau8Rn01yncEV3iYec7aJO6pRwjTZMI3b+7D7MvFthprgs0vbiCkY/IcVSSJeYIf8YfJPxAkYrt@lists.postgresql.org X-Gm-Message-State: AOJu0YxtYPdOcjgHoKzGmar54m10IUO17XQn+BMtjxFbgTU11KcSLX2T WsvpemhK0p9Scsqhgw17r7oiYEcP6qI393L28qD0yX7nVBwjni/biUAYDeIIY5RCLNDRRi5ZDon NqXQDAjaO5X8Qkard1aV620Wbyt/kI09IhtmI X-Gm-Gg: AY/fxX7UBBCHOy65TD2OmC+Kf+4DXERSa66pHse7xzUBau8bSRTQxO+aOfFKQoR4NxV dYHfeKl7tQ6vt5PFWo9cSOwiMPu89BFUVe8vYbqe6u9KKsVUW9/hm/WLgp4idmVnm+GVVkCWLt8 Zbpjtwyao0IrxYd8Z9FyG3ovec4caZZBgdEIoIgiyJ6QQGHZQPZ6NKfvk2mWKFPa4Tj62OV58un Oxhc8axXU4EhSzZPcp2LA2wzpHseA7yO17lOsk34sBUYiTM60XWcdp8LWAIEeflM3jFEXlwbQ1m tu2EudYzyIHwtanQiOGR9GQAVlzQ/XTgzM4DiVg= X-Google-Smtp-Source: AGHT+IEdVKZgGaVl7gxQSSKpcEAVzkbWm4YWRyQrtMluiBOTnUwW8ZmGv4sOvH3VcwPuh9uzIBIgTWfDJ0hZW3G/LjU= X-Received: by 2002:a17:907:9719:b0:b80:f4d:4aba with SMTP id a640c23a62f3a-b80371d6999mr3228289166b.47.1767015939887; Mon, 29 Dec 2025 05:45:39 -0800 (PST) MIME-Version: 1.0 References: <4c70b0f6-5aba-464c-b145-464a620c1222@eisentraut.org> In-Reply-To: From: Dharin Shah Date: Mon, 29 Dec 2025 14:45:27 +0100 X-Gm-Features: AQt7F2obSWEb1r9R57UfHuzd6wMiIt590mgmZay_lqRlKoW4HSKl_okz-XfT4GU Message-ID: Subject: Re: Fwd: [PATCH] Add zstd compression for TOAST using extended header format To: Michael Paquier Cc: Robert Treat , Peter Eisentraut , pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="0000000000006916ea064717750d" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000006916ea064717750d Content-Type: multipart/alternative; boundary="0000000000006916e8064717750b" --0000000000006916e8064717750b Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hello Michael, Following up on the discussion about avoiding method-specific shortcuts in detoast paths, this patch is a refactor-only step: it introduces a small decoded/in-memory representation of an on-disk external TOAST pointer, and refactors detoast_attr() and detoast_attr_slice() to use it. The goal is to centralize =E2=80=9Chow do we interpret an external datum?= =E2=80=9D so that detoast code paths don=E2=80=99t have to reason directly about va_extinfo e= ncoding vs payload layout details. This is intended as groundwork for a follow-up patch adding a new vartag-based method (e.g., zstd) without scattering special cases in detoast paths. Key changes - Introduces DecodedExternalToast + ToastDecompressMethod + TOAST_EXT_HAS_TCINFO in toast_internals.h. - Adds a small static decoder in detoast.c (decode_external_toast_pointer()= ) - Refactors detoast_attr() and detoast_attr_slice() to use a decode -> fetch -> decompress dispatch pattern - No on-disk format changes; existing behavior preserved (including error behavior for unsupported compression builds). Why HAS_TCINFO? - Previously, =E2=80=9Cis compressed?=E2=80=9D was used as a proxy for whet= her the external payload begins with tcinfo. This patch makes that explicit: HAS_TCINFO captures payload layout, which is distinct from whether the value is compressed. This separation is needed for future methods that may store external compressed payloads without tcinfo. Testing: Core regression suites pass Performance: I ran a small detoast-focused benchmark that forces external storage; results were within run-to-run variance, with no measurable regression. (Benchmark script attached: benchmark_toast_detoast.sql for reproduction) Thanks, Dharin On Thu, Dec 25, 2025 at 1:54=E2=80=AFAM Dharin Shah wrote: > Thanks Michael & Robert, > > Agreed =E2=80=94 I don=E2=80=99t think it=E2=80=99s realistic or practica= l to talk about > deprecating or replacing pglz (or lz4) given on-disk compatibility > requirements. > > > Note that I am not on board with simply reusing varatt_external for > > zstd-compressed entries, neither do I think that this is the best move > > ever. It makes the core patch simpler, but it makes things like > > ToastCompressionId more complicated to think about. If anything, I'd > > consider a rename of varatt_external as the best way to go with an > > intermediate "translation" structure only used in memory as I am > > proposing on the other thread (something that others seem meh enough > > about but I am not seeing alternate proposals floating around, > > either). This would make things like detoast_external_attr() less > > confusing, I think, as the latest patch posted on this thread is > > actually proving with its shortcut for toast_fetch_datum as one > > example of something I'd rather not do.. > > On the design: I understand & share the same concerns that we=E2=80=99d e= nd up > with multiple =E2=80=9Csources of truth=E2=80=9D for external compression= method > identification (pglz/lz4 via va_extinfo bits, zstd via vartag), and that > this pushes method-specific shortcuts into detoast paths. > > Would you be OK if I split this into two steps? > > 1.First, a refactor-only patch introducing a small decoded/in-memory > representation of an external TOAST pointer, so detoast/toast code paths > don=E2=80=99t have to reason directly about tcinfo vs vartag vs va_extinf= o. This > would be a cleanup with no on-disk format change and no behavioral change > for existing methods. Is this the same =E2=80=9Ctranslation structure=E2= =80=9D approach you > mentioned in the other thread? If you can point me to it, I=E2=80=99ll al= ign with > that proposal. > > 2. Then, a follow-up patch adding zstd using VARTAG_ONDISK_ZSTD, > implemented on top of that abstraction to keep zstd handling centralized > and minimize special-casing in detoast. > If that direction matches what you had in mind, I can first post the > proposed translation structure/API for feedback before respinning the zst= d > patch. > > Thanks, > Dharin > > > On Thu, Dec 25, 2025 at 1:25=E2=80=AFAM Michael Paquier > wrote: > >> On Wed, Dec 24, 2025 at 11:50:48AM -0500, Robert Treat wrote: >> > Agreed that I can't see pglz being removed any time soon, if ever. >> > Thinking through what a conversion process would look like seems >> > unwieldy at best, so I think we definitely need it for backwards >> > compatibility, plus I think it is useful to have a self-contained >> > option. I'd almost suggest we should look at replacing lz4, but I >> > don't think that is significantly easier, it just has a smaller, more >> > invested, blast radius. >> >> Backward-compatibility requirements make a replacement of LZ4 >> basically impossible to me, for the same reasons as pglz. We could >> not replace the bit used in the va_extinfo to track if LZ4 compression >> is used, either. One thing that I do wonder is if it would make >> things simpler in the long-run if we introduced a new separated vartag >> for LZ4-compressed external TOAST pointers as well. At least we'd >> have a leaner design: it means that we have to keep the >> varatt_external available on read, but we could update to the new >> format when writing entries. Or perhaps that's not worth the >> complication based on the last sentence you are writing.. >> >> > That said, I do suspect ztsd could quickly >> > become a popular recommendation and/or default among users / >> > consultants / service providers. >> >> .. Because I strongly suspect that this is going to be true, and that >> zstd would just be a better replacement over lz4. That's a trend that >> I see is already going on for wal_compression. >> >> Note that I am not on board with simply reusing varatt_external for >> zstd-compressed entries, neither do I think that this is the best move >> ever. It makes the core patch simpler, but it makes things like >> ToastCompressionId more complicated to think about. If anything, I'd >> consider a rename of varatt_external as the best way to go with an >> intermediate "translation" structure only used in memory as I am >> proposing on the other thread (something that others seem meh enough >> about but I am not seeing alternate proposals floating around, >> either). This would make things like detoast_external_attr() less >> confusing, I think, as the latest patch posted on this thread is >> actually proving with its shortcut for toast_fetch_datum as one >> example of something I'd rather not do.. >> -- >> Michael >> > --0000000000006916e8064717750b Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hello Michael,

Following up on the discussion about= avoiding method-specific shortcuts in detoast paths, this patch is a refac= tor-only step: it introduces a small decoded/in-memory representation of an= on-disk external TOAST pointer, and refactors detoast_attr() and detoast_a= ttr_slice() to use it.

The goal is to centralize =E2=80=9Chow do we = interpret an external datum?=E2=80=9D so that detoast code paths don=E2=80= =99t have to reason directly about va_extinfo encoding vs payload layout de= tails. This is intended as groundwork for a follow-up patch adding a new va= rtag-based method (e.g., zstd) without scattering special cases in detoast = paths.

Key changes
- Introduces DecodedExternalToast + ToastDeco= mpressMethod + TOAST_EXT_HAS_TCINFO in toast_internals.h.
- Adds = a small static decoder in detoast.c (decode_external_toast_pointer())
=
- Refactors detoast_attr() and detoast_attr_slice() to use a decode -&= gt; fetch -> decompress dispatch pattern
- No on-disk format c= hanges; existing behavior preserved (including error behavior for unsupport= ed compression builds).

Why HAS_TCINFO?
- Prev= iously, =E2=80=9Cis compressed?=E2=80=9D was used as a proxy for whether th= e external payload begins with tcinfo. This patch makes that explicit: HAS_= TCINFO captures payload layout, which is distinct from whether the value is= compressed. This separation is needed for future methods that may store ex= ternal compressed payloads without tcinfo.

Testing= : Core regression suites pass=C2=A0

Performa= nce: I ran a small detoast-focused benchmark that forces external storage; = results were within run-to-run variance, with no measurable regression. (Be= nchmark script attached: benchmark_toast_detoast.sql for reproduction)

Thanks,
Dharin

On= Thu, Dec 25, 2025 at 1:54=E2=80=AFAM Dharin Shah <dharinshah95@gmail.com> wrote:
Thanks Michael & Robert,

Agreed =E2=80=94 I don=E2=80=99t thin= k it=E2=80=99s realistic or practical to talk about deprecating or replacin= g pglz (or lz4) given on-disk compatibility requirements.

> Note = that I am not on board with simply reusing varatt_external for
> zstd= -compressed entries, neither do I think that this is the best move
>= =C2=A0ever.=C2=A0 It makes the core patch simpler, but it makes things like=
>=C2=A0ToastCompressionId more complicated to think about.=C2=A0 If = anything, I'd
>=C2=A0consider a rename of varatt_external as the = best way to go with an
>=C2=A0intermediate "translation" st= ructure only used in memory as I am
>=C2=A0proposing on the other thr= ead (something that others seem meh enough
>=C2=A0about but I am not = seeing alternate proposals floating around,
>=C2=A0either).=C2=A0 Thi= s would make things like detoast_external_attr() less
>=C2=A0confusin= g, I think, as the latest patch posted on this thread is
>=C2=A0actua= lly proving with its shortcut for toast_fetch_datum as one
>=C2=A0exa= mple of something I'd rather not do..

On the design: I understan= d & share the same concerns that we=E2=80=99d end up with multiple =E2= =80=9Csources of truth=E2=80=9D for external compression method identificat= ion (pglz/lz4 via va_extinfo bits, zstd via vartag), and that this pushes m= ethod-specific shortcuts into detoast paths.

Would you be OK if I sp= lit this into two steps?

1.First, a refactor-only patch introducing = a small decoded/in-memory representation of an external TOAST pointer, so d= etoast/toast code paths don=E2=80=99t have to reason directly about tcinfo = vs vartag vs va_extinfo. This would be a cleanup with no on-disk format cha= nge and no behavioral change for existing methods. Is this the same =E2=80= =9Ctranslation structure=E2=80=9D approach you mentioned in the other threa= d? If you can point me to it, I=E2=80=99ll align with that proposal.
2. Then, a follow-up patch adding zstd using VARTAG_ONDISK_ZSTD, implement= ed on top of that abstraction to keep zstd handling centralized and minimiz= e special-casing in detoast.
If that direction matches what you had in m= ind, I can first post the proposed translation structure/API for feedback b= efore respinning the zstd patch.

Thanks,
Dharin

=

On Thu, Dec 25, 2025 at 1:25=E2=80=AFAM Michael Paquier <michael@paquier.xyz> wrote:
On= Wed, Dec 24, 2025 at 11:50:48AM -0500, Robert Treat wrote:
> Agreed that I can't see pglz being removed any time soon, if ever.=
> Thinking through what a conversion process would look like seems
> unwieldy at best, so I think we definitely need it for backwards
> compatibility, plus I think it is useful to have a self-contained
> option. I'd almost suggest we should look at replacing lz4, but I<= br> > don't think that is significantly easier, it just has a smaller, m= ore
> invested, blast radius.

Backward-compatibility requirements make a replacement of LZ4
basically impossible to me, for the same reasons as pglz.=C2=A0 We could not replace the bit used in the va_extinfo to track if LZ4 compression
is used, either.=C2=A0 One thing that I do wonder is if it would make
things simpler in the long-run if we introduced a new separated vartag
for LZ4-compressed external TOAST pointers as well.=C2=A0 At least we'd=
have a leaner design: it means that we have to keep the
varatt_external available on read, but we could update to the new
format when writing entries.=C2=A0 Or perhaps that's not worth the
complication based on the last sentence you are writing..=C2=A0

> That said, I do suspect ztsd could quickly
> become a popular recommendation and/or default among users /
> consultants / service providers.

..=C2=A0 Because I strongly suspect that this is going to be true, and that=
zstd would just be a better replacement over lz4.=C2=A0 That's a trend = that
I see is already going on for wal_compression.

Note that I am not on board with simply reusing varatt_external for
zstd-compressed entries, neither do I think that this is the best move
ever.=C2=A0 It makes the core patch simpler, but it makes things like
ToastCompressionId more complicated to think about.=C2=A0 If anything, I= 9;d
consider a rename of varatt_external as the best way to go with an
intermediate "translation" structure only used in memory as I am<= br> proposing on the other thread (something that others seem meh enough
about but I am not seeing alternate proposals floating around,
either).=C2=A0 This would make things like detoast_external_attr() less
confusing, I think, as the latest patch posted on this thread is
actually proving with its shortcut for toast_fetch_datum as one
example of something I'd rather not do..
--
Michael
--0000000000006916e8064717750b-- --0000000000006916ea064717750d Content-Type: application/octet-stream; name="benchmark_toast_detoast.sql" Content-Disposition: attachment; filename="benchmark_toast_detoast.sql" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mjr7gnlp1 LS0gUXVpY2sgYmVuY2htYXJrIGZvciBleHRlcm5hbCBUT0FTVCBkZXRvYXN0IHBhdGhzCi0tIFRl c3RzIGNvbXByZXNzZWQgKFBHTFopIGFuZCB1bmNvbXByZXNzZWQgZXh0ZXJuYWwgc3RvcmFnZQoK XHRpbWluZyBvZmYKCi0tIFBBUlQgMTogQ29tcHJlc3NlZCBleHRlcm5hbCAoUEdMWikKRFJPUCBU QUJMRSBJRiBFWElTVFMgYmVuY2hfY29tcHJlc3NlZDsKQ1JFQVRFIFRBQkxFIGJlbmNoX2NvbXBy ZXNzZWQgKGlkIHNlcmlhbCwgZGF0YSB0ZXh0IENPTVBSRVNTSU9OIHBnbHopOwoKXGVjaG8gJ0lu c2VydGluZyAyMDAgcm93cyBvZiBzZW1pLWNvbXByZXNzaWJsZSBkYXRhLi4uJwpcdGltaW5nIG9u CklOU0VSVCBJTlRPIGJlbmNoX2NvbXByZXNzZWQgKGRhdGEpClNFTEVDVCBzdHJpbmdfYWdnKG1k NShnOjp0ZXh0KSB8fCAnX3h4XycgfHwgcmVwZWF0KCdhJywgODApLCAnJykKRlJPTSBnZW5lcmF0 ZV9zZXJpZXMoMSwgMjAwKSByb3dfaWQsCiAgICAgTEFURVJBTCAoU0VMRUNUIGcgRlJPTSBnZW5l cmF0ZV9zZXJpZXMoMSwgNDAwKSBnKSBzdWIKR1JPVVAgQlkgcm93X2lkOwpcdGltaW5nIG9mZgoK Q0hFQ0tQT0lOVDsKCi0tIFZlcmlmeSBpdCdzIGFjdHVhbGx5IGV4dGVybmFsClNFTEVDVCBjb3Vu dCgqKSBhcyByb3dzLAogICAgICAgcGdfY29sdW1uX2NvbXByZXNzaW9uKGRhdGEpIGFzIGNvbXBy ZXNzaW9uLAogICAgICAgY291bnQocGdfY29sdW1uX3RvYXN0X2NodW5rX2lkKGRhdGEpKSBhcyBl eHRlcm5hbApGUk9NIGJlbmNoX2NvbXByZXNzZWQKR1JPVVAgQlkgcGdfY29sdW1uX2NvbXByZXNz aW9uKGRhdGEpOwoKXGVjaG8gJ1JlYWQgYmVuY2htYXJrIChjb21wcmVzc2VkIGV4dGVybmFsKTon Clx0aW1pbmcgb24KU0VMRUNUIGNvdW50KCopLCBzdW0obGVuZ3RoKGRhdGEpKSBGUk9NIGJlbmNo X2NvbXByZXNzZWQ7ClNFTEVDVCBjb3VudCgqKSwgc3VtKGxlbmd0aChkYXRhKSkgRlJPTSBiZW5j aF9jb21wcmVzc2VkOwpTRUxFQ1QgY291bnQoKiksIHN1bShsZW5ndGgoZGF0YSkpIEZST00gYmVu Y2hfY29tcHJlc3NlZDsKU0VMRUNUIGNvdW50KCopLCBzdW0obGVuZ3RoKGRhdGEpKSBGUk9NIGJl bmNoX2NvbXByZXNzZWQ7ClNFTEVDVCBjb3VudCgqKSwgc3VtKGxlbmd0aChkYXRhKSkgRlJPTSBi ZW5jaF9jb21wcmVzc2VkOwpcdGltaW5nIG9mZgoKXGVjaG8gJ1NsaWNlIGJlbmNobWFyayAoY29t cHJlc3NlZCBleHRlcm5hbCk6JwpcdGltaW5nIG9uClNFTEVDVCBjb3VudCgqKSwgc3VtKGxlbmd0 aChzdWJzdHJpbmcoZGF0YSBmcm9tIDEgZm9yIDEwMDApKSkgRlJPTSBiZW5jaF9jb21wcmVzc2Vk OwpTRUxFQ1QgY291bnQoKiksIHN1bShsZW5ndGgoc3Vic3RyaW5nKGRhdGEgZnJvbSAxIGZvciAx MDAwKSkpIEZST00gYmVuY2hfY29tcHJlc3NlZDsKU0VMRUNUIGNvdW50KCopLCBzdW0obGVuZ3Ro KHN1YnN0cmluZyhkYXRhIGZyb20gMSBmb3IgMTAwMCkpKSBGUk9NIGJlbmNoX2NvbXByZXNzZWQ7 Clx0aW1pbmcgb2ZmCgotLSBQQVJUIDI6IFVuY29tcHJlc3NlZCBleHRlcm5hbApEUk9QIFRBQkxF IElGIEVYSVNUUyBiZW5jaF91bmNvbXByZXNzZWQ7CkNSRUFURSBUQUJMRSBiZW5jaF91bmNvbXBy ZXNzZWQgKGlkIHNlcmlhbCwgZGF0YSB0ZXh0KTsKQUxURVIgVEFCTEUgYmVuY2hfdW5jb21wcmVz c2VkIEFMVEVSIENPTFVNTiBkYXRhIFNFVCBTVE9SQUdFIEVYVEVSTkFMOwoKXGVjaG8gJ0luc2Vy dGluZyAyMDAgcm93cyB1bmNvbXByZXNzZWQuLi4nClx0aW1pbmcgb24KSU5TRVJUIElOVE8gYmVu Y2hfdW5jb21wcmVzc2VkIChkYXRhKQpTRUxFQ1QgcmVwZWF0KGNocig2NSArIChnICUgMjYpKSwg NTAgKiAxMDI0KSBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAyMDApIGc7Clx0aW1pbmcgb2ZmCgpD SEVDS1BPSU5UOwoKU0VMRUNUIGNvdW50KCopIGFzIHJvd3MsCiAgICAgICBjb2FsZXNjZShwZ19j b2x1bW5fY29tcHJlc3Npb24oZGF0YSksICdub25lJykgYXMgY29tcHJlc3Npb24sCiAgICAgICBj b3VudChwZ19jb2x1bW5fdG9hc3RfY2h1bmtfaWQoZGF0YSkpIGFzIGV4dGVybmFsCkZST00gYmVu Y2hfdW5jb21wcmVzc2VkCkdST1VQIEJZIHBnX2NvbHVtbl9jb21wcmVzc2lvbihkYXRhKTsKClxl Y2hvICdSZWFkIGJlbmNobWFyayAodW5jb21wcmVzc2VkIGV4dGVybmFsKTonClx0aW1pbmcgb24K U0VMRUNUIGNvdW50KCopLCBzdW0obGVuZ3RoKGRhdGEpKSBGUk9NIGJlbmNoX3VuY29tcHJlc3Nl ZDsKU0VMRUNUIGNvdW50KCopLCBzdW0obGVuZ3RoKGRhdGEpKSBGUk9NIGJlbmNoX3VuY29tcHJl c3NlZDsKU0VMRUNUIGNvdW50KCopLCBzdW0obGVuZ3RoKGRhdGEpKSBGUk9NIGJlbmNoX3VuY29t cHJlc3NlZDsKU0VMRUNUIGNvdW50KCopLCBzdW0obGVuZ3RoKGRhdGEpKSBGUk9NIGJlbmNoX3Vu Y29tcHJlc3NlZDsKU0VMRUNUIGNvdW50KCopLCBzdW0obGVuZ3RoKGRhdGEpKSBGUk9NIGJlbmNo X3VuY29tcHJlc3NlZDsKXHRpbWluZyBvZmYKClxlY2hvICdTbGljZSBiZW5jaG1hcmsgKHVuY29t cHJlc3NlZCBleHRlcm5hbCk6JwpcdGltaW5nIG9uClNFTEVDVCBjb3VudCgqKSwgc3VtKGxlbmd0 aChzdWJzdHJpbmcoZGF0YSBmcm9tIDEgZm9yIDEwMDApKSkgRlJPTSBiZW5jaF91bmNvbXByZXNz ZWQ7ClNFTEVDVCBjb3VudCgqKSwgc3VtKGxlbmd0aChzdWJzdHJpbmcoZGF0YSBmcm9tIDEgZm9y IDEwMDApKSkgRlJPTSBiZW5jaF91bmNvbXByZXNzZWQ7ClNFTEVDVCBjb3VudCgqKSwgc3VtKGxl bmd0aChzdWJzdHJpbmcoZGF0YSBmcm9tIDEgZm9yIDEwMDApKSkgRlJPTSBiZW5jaF91bmNvbXBy ZXNzZWQ7Clx0aW1pbmcgb2ZmCgotLSBDbGVhbnVwCkRST1AgVEFCTEUgYmVuY2hfY29tcHJlc3Nl ZDsKRFJPUCBUQUJMRSBiZW5jaF91bmNvbXByZXNzZWQ7CgpcZWNobyAnRG9uZS4nCg== --0000000000006916ea064717750d Content-Type: application/octet-stream; name="0001-refactor-detoast-to-use-decoded-external-toast-abstr.patch" Content-Disposition: attachment; filename="0001-refactor-detoast-to-use-decoded-external-toast-abstr.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mjr7mo1x2 RnJvbSA0OTkzOWZlMzQxNjgwM2Q0NDZiYTQzYzQwNGVhZTk3MTFhM2FlMjFiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBEaGFyaW4gU2hhaCA8ODYxNjEzMCtEaGFyaW4tc2hhaEB1c2Vy cy5ub3JlcGx5LmdpdGh1Yi5jb20+CkRhdGU6IFN1biwgMjggRGVjIDIwMjUgMjM6MjE6MjEgKzAx MDAKU3ViamVjdDogW1BBVENIIHYxXSByZWZhY3RvciBkZXRvYXN0IHRvIHVzZSBkZWNvZGVkIGV4 dGVybmFsIHRvYXN0IGFic3RyYWN0aW9uCgotLS0KIHNyYy9iYWNrZW5kL2FjY2Vzcy9jb21tb24v ZGV0b2FzdC5jICB8IDMyNiArKysrKysrKysrKysrKysrKysrKy0tLS0tLS0KIHNyYy9pbmNsdWRl L2FjY2Vzcy90b2FzdF9pbnRlcm5hbHMuaCB8ICAzOSArKysrCiAyIGZpbGVzIGNoYW5nZWQsIDI3 OCBpbnNlcnRpb25zKCspLCA4NyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2Vu ZC9hY2Nlc3MvY29tbW9uL2RldG9hc3QuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9jb21tb24vZGV0 b2FzdC5jCmluZGV4IDYyNjUxNzg3NzQyLi5mZGFkZTU3NDkxMyAxMDA2NDQKLS0tIGEvc3JjL2Jh Y2tlbmQvYWNjZXNzL2NvbW1vbi9kZXRvYXN0LmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL2Nv bW1vbi9kZXRvYXN0LmMKQEAgLTI5LDYgKzI5LDcwIEBAIHN0YXRpYyBzdHJ1Y3QgdmFybGVuYSAq dG9hc3RfZmV0Y2hfZGF0dW1fc2xpY2Uoc3RydWN0IHZhcmxlbmEgKmF0dHIsCiBzdGF0aWMgc3Ry dWN0IHZhcmxlbmEgKnRvYXN0X2RlY29tcHJlc3NfZGF0dW0oc3RydWN0IHZhcmxlbmEgKmF0dHIp Owogc3RhdGljIHN0cnVjdCB2YXJsZW5hICp0b2FzdF9kZWNvbXByZXNzX2RhdHVtX3NsaWNlKHN0 cnVjdCB2YXJsZW5hICphdHRyLCBpbnQzMiBzbGljZWxlbmd0aCk7CiAKK3N0YXRpYyBzdHJ1Y3Qg dmFybGVuYSAqdG9hc3RfZmV0Y2hfZGF0dW1fZGVjb2RlZChjb25zdCBEZWNvZGVkRXh0ZXJuYWxU b2FzdCAqZGVjb2RlZCk7CitzdGF0aWMgc3RydWN0IHZhcmxlbmEgKnRvYXN0X2RlY29tcHJlc3Nf ZGVjb2RlZChjb25zdCBzdHJ1Y3QgdmFybGVuYSAqY29tcHJlc3NlZCwKKwkJCQkJCQkJCQkJCWNv bnN0IERlY29kZWRFeHRlcm5hbFRvYXN0ICpkZWNvZGVkKTsKKworLyogLS0tLS0tLS0tLQorICog ZGVjb2RlX2V4dGVybmFsX3RvYXN0X3BvaW50ZXIgLQorICoKKyAqCURlY29kZSBleHRlcm5hbCB2 YXJsZW5hIGludG8gRGVjb2RlZEV4dGVybmFsVG9hc3Qgc3RydWN0LgorICoJT25seSBoYW5kbGVz IFZBUlRBR19PTkRJU0sgd2l0aCBrbm93biBjb21wcmVzc2lvbiBtZXRob2RzLgorICoJUmV0dXJu cyBmYWxzZSBmb3IgSU5ESVJFQ1QsIEVYUEFOREVELCBvciB1bnJlY29nbml6ZWQgY29tcHJlc3Np b24uCisgKiAtLS0tLS0tLS0tCisgKi8KK3N0YXRpYyBib29sCitkZWNvZGVfZXh0ZXJuYWxfdG9h c3RfcG9pbnRlcihjb25zdCBzdHJ1Y3QgdmFybGVuYSAqYXR0ciwKKwkJCQkJCSAgIERlY29kZWRF eHRlcm5hbFRvYXN0ICpkZWNvZGVkKQoreworCXN0cnVjdCB2YXJhdHRfZXh0ZXJuYWwgdG9hc3Rf cG9pbnRlcjsKKwl2YXJ0YWdfZXh0ZXJuYWwgdGFnOworCisJQXNzZXJ0KFZBUkFUVF9JU19FWFRF Uk5BTChhdHRyKSk7CisKKwl0YWcgPSBWQVJUQUdfRVhURVJOQUwoYXR0cik7CisKKwlpZiAodGFn ID09IFZBUlRBR19PTkRJU0spCisJeworCQlWQVJBVFRfRVhURVJOQUxfR0VUX1BPSU5URVIodG9h c3RfcG9pbnRlciwgYXR0cik7CisKKwkJZGVjb2RlZC0+dG9hc3RyZWxpZCA9IHRvYXN0X3BvaW50 ZXIudmFfdG9hc3RyZWxpZDsKKwkJZGVjb2RlZC0+dmFsdWVpZCA9IHRvYXN0X3BvaW50ZXIudmFf dmFsdWVpZDsKKwkJZGVjb2RlZC0+cmF3c2l6ZSA9IHRvYXN0X3BvaW50ZXIudmFfcmF3c2l6ZTsK KwkJZGVjb2RlZC0+ZXh0c2l6ZSA9IFZBUkFUVF9FWFRFUk5BTF9HRVRfRVhUU0laRSh0b2FzdF9w b2ludGVyKTsKKwkJZGVjb2RlZC0+ZmxhZ3MgPSBUT0FTVF9FWFRfSVNfT05ESVNLOworCisJCWlm IChWQVJBVFRfRVhURVJOQUxfSVNfQ09NUFJFU1NFRCh0b2FzdF9wb2ludGVyKSkKKwkJeworCQkJ dWludDMyCQljbWlkID0gVkFSQVRUX0VYVEVSTkFMX0dFVF9DT01QUkVTU19NRVRIT0QodG9hc3Rf cG9pbnRlcik7CisKKwkJCXN3aXRjaCAoY21pZCkKKwkJCXsKKwkJCQljYXNlIFRPQVNUX1BHTFpf Q09NUFJFU1NJT05fSUQ6CisJCQkJCWRlY29kZWQtPm1ldGhvZCA9IFRPQVNUX0RFQ09NUF9QR0xa OworCQkJCQlkZWNvZGVkLT5mbGFncyB8PSBUT0FTVF9FWFRfSEFTX1RDSU5GTzsKKwkJCQkJYnJl YWs7CisJCQkJY2FzZSBUT0FTVF9MWjRfQ09NUFJFU1NJT05fSUQ6CisJCQkJCWRlY29kZWQtPm1l dGhvZCA9IFRPQVNUX0RFQ09NUF9MWjQ7CisJCQkJCWRlY29kZWQtPmZsYWdzIHw9IFRPQVNUX0VY VF9IQVNfVENJTkZPOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQkvKiBVbmtub3du IGNvbXByZXNzaW9uIC0gbGV0IGNhbGxlciBmYWxsIGJhY2sgKi8KKwkJCQkJcmV0dXJuIGZhbHNl OworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJZGVjb2RlZC0+bWV0aG9kID0gVE9BU1RfREVD T01QX05PTkU7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKiBOb3QgYW4gb24tZGlz ayBkYXR1bSAoSU5ESVJFQ1QsIEVYUEFOREVELCBldGMuKSAqLworCXJldHVybiBmYWxzZTsKK30K KwogLyogLS0tLS0tLS0tLQogICogZGV0b2FzdF9leHRlcm5hbF9hdHRyIC0KICAqCkBAIC0xMTUs NTcgKzE3OSw3OCBAQCBkZXRvYXN0X2V4dGVybmFsX2F0dHIoc3RydWN0IHZhcmxlbmEgKmF0dHIp CiBzdHJ1Y3QgdmFybGVuYSAqCiBkZXRvYXN0X2F0dHIoc3RydWN0IHZhcmxlbmEgKmF0dHIpCiB7 Ci0JaWYgKFZBUkFUVF9JU19FWFRFUk5BTF9PTkRJU0soYXR0cikpCisJaWYgKFZBUkFUVF9JU19F WFRFUk5BTChhdHRyKSkKIAl7Ci0JCS8qCi0JCSAqIFRoaXMgaXMgYW4gZXh0ZXJuYWxseSBzdG9y ZWQgZGF0dW0gLS0tIGZldGNoIGl0IGJhY2sgZnJvbSB0aGVyZQotCQkgKi8KLQkJYXR0ciA9IHRv YXN0X2ZldGNoX2RhdHVtKGF0dHIpOwotCQkvKiBJZiBpdCdzIGNvbXByZXNzZWQsIGRlY29tcHJl c3MgaXQgKi8KLQkJaWYgKFZBUkFUVF9JU19DT01QUkVTU0VEKGF0dHIpKQorCQlEZWNvZGVkRXh0 ZXJuYWxUb2FzdCBkZWNvZGVkOworCisJCWlmIChkZWNvZGVfZXh0ZXJuYWxfdG9hc3RfcG9pbnRl cihhdHRyLCAmZGVjb2RlZCkpCiAJCXsKLQkJCXN0cnVjdCB2YXJsZW5hICp0bXAgPSBhdHRyOwor CQkJc3RydWN0IHZhcmxlbmEgKmZldGNoZWQgPSB0b2FzdF9mZXRjaF9kYXR1bV9kZWNvZGVkKCZk ZWNvZGVkKTsKKworCQkJaWYgKGRlY29kZWQubWV0aG9kICE9IFRPQVNUX0RFQ09NUF9OT05FKQor CQkJeworCQkJCXN0cnVjdCB2YXJsZW5hICpyZXN1bHQgPSB0b2FzdF9kZWNvbXByZXNzX2RlY29k ZWQoZmV0Y2hlZCwgJmRlY29kZWQpOworCQkJCXBmcmVlKGZldGNoZWQpOworCQkJCXJldHVybiBy ZXN1bHQ7CisJCQl9CisJCQlyZXR1cm4gZmV0Y2hlZDsKKwkJfQogCi0JCQlhdHRyID0gdG9hc3Rf ZGVjb21wcmVzc19kYXR1bSh0bXApOwotCQkJcGZyZWUodG1wKTsKKwkJLyogRGVjb2RlIGZhaWxl ZDogSU5ESVJFQ1QsIEVYUEFOREVELCBvciB1bnJlY29nbml6ZWQgY29tcHJlc3Npb24gKi8KKwkJ aWYgKFZBUkFUVF9JU19FWFRFUk5BTF9PTkRJU0soYXR0cikpCisJCXsKKwkJCS8qIFVucmVjb2du aXplZCBjb21wcmVzc2lvbiAtIGxlZ2FjeSBwYXRoIHByZXNlcnZlcyBlcnJvciBiZWhhdmlvciAq LworCQkJYXR0ciA9IHRvYXN0X2ZldGNoX2RhdHVtKGF0dHIpOworCQkJaWYgKFZBUkFUVF9JU19D T01QUkVTU0VEKGF0dHIpKQorCQkJeworCQkJCXN0cnVjdCB2YXJsZW5hICp0bXAgPSBhdHRyOwor CisJCQkJYXR0ciA9IHRvYXN0X2RlY29tcHJlc3NfZGF0dW0odG1wKTsKKwkJCQlwZnJlZSh0bXAp OworCQkJfQorCQkJcmV0dXJuIGF0dHI7CiAJCX0KLQl9Ci0JZWxzZSBpZiAoVkFSQVRUX0lTX0VY VEVSTkFMX0lORElSRUNUKGF0dHIpKQotCXsKLQkJLyoKLQkJICogVGhpcyBpcyBhbiBpbmRpcmVj dCBwb2ludGVyIC0tLSBkZXJlZmVyZW5jZSBpdAotCQkgKi8KLQkJc3RydWN0IHZhcmF0dF9pbmRp cmVjdCByZWRpcmVjdDsKKwkJZWxzZSBpZiAoVkFSQVRUX0lTX0VYVEVSTkFMX0lORElSRUNUKGF0 dHIpKQorCQl7CisJCQkvKgorCQkJICogVGhpcyBpcyBhbiBpbmRpcmVjdCBwb2ludGVyIC0tLSBk ZXJlZmVyZW5jZSBpdAorCQkJICovCisJCQlzdHJ1Y3QgdmFyYXR0X2luZGlyZWN0IHJlZGlyZWN0 OwogCi0JCVZBUkFUVF9FWFRFUk5BTF9HRVRfUE9JTlRFUihyZWRpcmVjdCwgYXR0cik7Ci0JCWF0 dHIgPSAoc3RydWN0IHZhcmxlbmEgKikgcmVkaXJlY3QucG9pbnRlcjsKKwkJCVZBUkFUVF9FWFRF Uk5BTF9HRVRfUE9JTlRFUihyZWRpcmVjdCwgYXR0cik7CisJCQlhdHRyID0gKHN0cnVjdCB2YXJs ZW5hICopIHJlZGlyZWN0LnBvaW50ZXI7CiAKLQkJLyogbmVzdGVkIGluZGlyZWN0IERhdHVtcyBh cmVuJ3QgYWxsb3dlZCAqLwotCQlBc3NlcnQoIVZBUkFUVF9JU19FWFRFUk5BTF9JTkRJUkVDVChh dHRyKSk7CisJCQkvKiBuZXN0ZWQgaW5kaXJlY3QgRGF0dW1zIGFyZW4ndCBhbGxvd2VkICovCisJ CQlBc3NlcnQoIVZBUkFUVF9JU19FWFRFUk5BTF9JTkRJUkVDVChhdHRyKSk7CiAKLQkJLyogcmVj dXJzZSBpbiBjYXNlIHZhbHVlIGlzIHN0aWxsIGV4dGVuZGVkIGluIHNvbWUgb3RoZXIgd2F5ICov Ci0JCWF0dHIgPSBkZXRvYXN0X2F0dHIoYXR0cik7CisJCQkvKiByZWN1cnNlIGluIGNhc2UgdmFs dWUgaXMgc3RpbGwgZXh0ZW5kZWQgaW4gc29tZSBvdGhlciB3YXkgKi8KKwkJCWF0dHIgPSBkZXRv YXN0X2F0dHIoYXR0cik7CiAKLQkJLyogaWYgaXQgaXNuJ3QsIHdlJ2QgYmV0dGVyIGNvcHkgaXQg Ki8KLQkJaWYgKGF0dHIgPT0gKHN0cnVjdCB2YXJsZW5hICopIHJlZGlyZWN0LnBvaW50ZXIpCi0J CXsKLQkJCXN0cnVjdCB2YXJsZW5hICpyZXN1bHQ7CisJCQkvKiBpZiBpdCBpc24ndCwgd2UnZCBi ZXR0ZXIgY29weSBpdCAqLworCQkJaWYgKGF0dHIgPT0gKHN0cnVjdCB2YXJsZW5hICopIHJlZGly ZWN0LnBvaW50ZXIpCisJCQl7CisJCQkJc3RydWN0IHZhcmxlbmEgKnJlc3VsdDsKIAotCQkJcmVz dWx0ID0gKHN0cnVjdCB2YXJsZW5hICopIHBhbGxvYyhWQVJTSVpFX0FOWShhdHRyKSk7Ci0JCQlt ZW1jcHkocmVzdWx0LCBhdHRyLCBWQVJTSVpFX0FOWShhdHRyKSk7Ci0JCQlhdHRyID0gcmVzdWx0 OworCQkJCXJlc3VsdCA9IChzdHJ1Y3QgdmFybGVuYSAqKSBwYWxsb2MoVkFSU0laRV9BTlkoYXR0 cikpOworCQkJCW1lbWNweShyZXN1bHQsIGF0dHIsIFZBUlNJWkVfQU5ZKGF0dHIpKTsKKwkJCQlh dHRyID0gcmVzdWx0OworCQkJfQorCQkJcmV0dXJuIGF0dHI7CisJCX0KKwkJZWxzZSBpZiAoVkFS QVRUX0lTX0VYVEVSTkFMX0VYUEFOREVEKGF0dHIpKQorCQl7CisJCQkvKgorCQkJICogVGhpcyBp cyBhbiBleHBhbmRlZC1vYmplY3QgcG9pbnRlciAtLS0gZ2V0IGZsYXQgZm9ybWF0CisJCQkgKi8K KwkJCWF0dHIgPSBkZXRvYXN0X2V4dGVybmFsX2F0dHIoYXR0cik7CisJCQkvKiBmbGF0dGVuZXJz IGFyZSBub3QgYWxsb3dlZCB0byBwcm9kdWNlIGNvbXByZXNzZWQvc2hvcnQgb3V0cHV0ICovCisJ CQlBc3NlcnQoIVZBUkFUVF9JU19FWFRFTkRFRChhdHRyKSk7CisJCQlyZXR1cm4gYXR0cjsKIAkJ fQogCX0KLQllbHNlIGlmIChWQVJBVFRfSVNfRVhURVJOQUxfRVhQQU5ERUQoYXR0cikpCi0Jewot CQkvKgotCQkgKiBUaGlzIGlzIGFuIGV4cGFuZGVkLW9iamVjdCBwb2ludGVyIC0tLSBnZXQgZmxh dCBmb3JtYXQKLQkJICovCi0JCWF0dHIgPSBkZXRvYXN0X2V4dGVybmFsX2F0dHIoYXR0cik7Ci0J CS8qIGZsYXR0ZW5lcnMgYXJlIG5vdCBhbGxvd2VkIHRvIHByb2R1Y2UgY29tcHJlc3NlZC9zaG9y dCBvdXRwdXQgKi8KLQkJQXNzZXJ0KCFWQVJBVFRfSVNfRVhURU5ERUQoYXR0cikpOwotCX0KLQll bHNlIGlmIChWQVJBVFRfSVNfQ09NUFJFU1NFRChhdHRyKSkKKworCS8qIEhhbmRsZSBpbmxpbmUg Y2FzZXMgKG5vdCBleHRlcm5hbCkgKi8KKwlpZiAoVkFSQVRUX0lTX0NPTVBSRVNTRUQoYXR0cikp CiAJewogCQkvKgogCQkgKiBUaGlzIGlzIGEgY29tcHJlc3NlZCB2YWx1ZSBpbnNpZGUgb2YgdGhl IG1haW4gdHVwbGUKQEAgLTIyMyw2MyArMzA4LDc1IEBAIGRldG9hc3RfYXR0cl9zbGljZShzdHJ1 Y3QgdmFybGVuYSAqYXR0ciwKIAllbHNlIGlmIChwZ19hZGRfczMyX292ZXJmbG93KHNsaWNlb2Zm c2V0LCBzbGljZWxlbmd0aCwgJnNsaWNlbGltaXQpKQogCQlzbGljZWxlbmd0aCA9IHNsaWNlbGlt aXQgPSAtMTsKIAotCWlmIChWQVJBVFRfSVNfRVhURVJOQUxfT05ESVNLKGF0dHIpKQorCWlmIChW QVJBVFRfSVNfRVhURVJOQUwoYXR0cikpCiAJewotCQlzdHJ1Y3QgdmFyYXR0X2V4dGVybmFsIHRv YXN0X3BvaW50ZXI7CisJCURlY29kZWRFeHRlcm5hbFRvYXN0IGRlY29kZWQ7CiAKLQkJVkFSQVRU X0VYVEVSTkFMX0dFVF9QT0lOVEVSKHRvYXN0X3BvaW50ZXIsIGF0dHIpOworCQlpZiAoZGVjb2Rl X2V4dGVybmFsX3RvYXN0X3BvaW50ZXIoYXR0ciwgJmRlY29kZWQpKQorCQl7CisJCQlpZiAoZGVj b2RlZC5tZXRob2QgPT0gVE9BU1RfREVDT01QX05PTkUpCisJCQkJcmV0dXJuIHRvYXN0X2ZldGNo X2RhdHVtX3NsaWNlKGF0dHIsIHNsaWNlb2Zmc2V0LCBzbGljZWxlbmd0aCk7CisKKwkJCS8qIENv bXByZXNzZWQ6IGZldGNoIGVub3VnaCB0byBkZWNvbXByZXNzIHRoZSByZXF1ZXN0ZWQgcHJlZml4 ICovCisJCQlpZiAoc2xpY2VsaW1pdCA+PSAwKQorCQkJeworCQkJCWludDMyCQltYXhfc2l6ZSA9 IGRlY29kZWQuZXh0c2l6ZTsKKworCQkJCS8qIFBHTFogc3VwcG9ydHMgcGFydGlhbCBkZWNvbXBy ZXNzaW9uOyBMWjQgbmVlZHMgYWxsIGRhdGEgKi8KKwkJCQlpZiAoZGVjb2RlZC5tZXRob2QgPT0g VE9BU1RfREVDT01QX1BHTFopCisJCQkJCW1heF9zaXplID0gcGdsel9tYXhpbXVtX2NvbXByZXNz ZWRfc2l6ZShzbGljZWxpbWl0LCBtYXhfc2l6ZSk7CisKKwkJCQlwcmVzbGljZSA9IHRvYXN0X2Zl dGNoX2RhdHVtX3NsaWNlKGF0dHIsIDAsIG1heF9zaXplKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlw cmVzbGljZSA9IHRvYXN0X2ZldGNoX2RhdHVtX2RlY29kZWQoJmRlY29kZWQpOworCQl9CisJCWVs c2UgaWYgKFZBUkFUVF9JU19FWFRFUk5BTF9PTkRJU0soYXR0cikpCisJCXsKKwkJCS8qIFVucmVj b2duaXplZCBjb21wcmVzc2lvbiAtIGxlZ2FjeSBwYXRoICovCisJCQlzdHJ1Y3QgdmFyYXR0X2V4 dGVybmFsIHRvYXN0X3BvaW50ZXI7CiAKLQkJLyogZmFzdCBwYXRoIGZvciBub24tY29tcHJlc3Nl ZCBleHRlcm5hbCBkYXR1bXMgKi8KLQkJaWYgKCFWQVJBVFRfRVhURVJOQUxfSVNfQ09NUFJFU1NF RCh0b2FzdF9wb2ludGVyKSkKLQkJCXJldHVybiB0b2FzdF9mZXRjaF9kYXR1bV9zbGljZShhdHRy LCBzbGljZW9mZnNldCwgc2xpY2VsZW5ndGgpOworCQkJVkFSQVRUX0VYVEVSTkFMX0dFVF9QT0lO VEVSKHRvYXN0X3BvaW50ZXIsIGF0dHIpOwogCi0JCS8qCi0JCSAqIEZvciBjb21wcmVzc2VkIHZh bHVlcywgd2UgbmVlZCB0byBmZXRjaCBlbm91Z2ggc2xpY2VzIHRvIGRlY29tcHJlc3MKLQkJICog YXQgbGVhc3QgdGhlIHJlcXVlc3RlZCBwYXJ0ICh3aGVuIGEgcHJlZml4IGlzIHJlcXVlc3RlZCku Ci0JCSAqIE90aGVyd2lzZSwganVzdCBmZXRjaCBhbGwgc2xpY2VzLgotCQkgKi8KLQkJaWYgKHNs aWNlbGltaXQgPj0gMCkKLQkJewotCQkJaW50MzIJCW1heF9zaXplID0gVkFSQVRUX0VYVEVSTkFM X0dFVF9FWFRTSVpFKHRvYXN0X3BvaW50ZXIpOworCQkJaWYgKCFWQVJBVFRfRVhURVJOQUxfSVNf Q09NUFJFU1NFRCh0b2FzdF9wb2ludGVyKSkKKwkJCQlyZXR1cm4gdG9hc3RfZmV0Y2hfZGF0dW1f c2xpY2UoYXR0ciwgc2xpY2VvZmZzZXQsIHNsaWNlbGVuZ3RoKTsKIAotCQkJLyoKLQkJCSAqIERl dGVybWluZSBtYXhpbXVtIGFtb3VudCBvZiBjb21wcmVzc2VkIGRhdGEgbmVlZGVkIGZvciBhIHBy ZWZpeAotCQkJICogb2YgYSBnaXZlbiBsZW5ndGggKGFmdGVyIGRlY29tcHJlc3Npb24pLgotCQkJ ICoKLQkJCSAqIEF0IGxlYXN0IGZvciBub3csIGlmIGl0J3MgTFo0IGRhdGEsIHdlJ2xsIGhhdmUg dG8gZmV0Y2ggdGhlCi0JCQkgKiB3aG9sZSB0aGluZywgYmVjYXVzZSB0aGVyZSBkb2Vzbid0IHNl ZW0gdG8gYmUgYW4gQVBJIGNhbGwgdG8KLQkJCSAqIGRldGVybWluZSBob3cgbXVjaCBjb21wcmVz c2VkIGRhdGEgd2UgbmVlZCB0byBiZSBzdXJlIG9mIGJlaW5nCi0JCQkgKiBhYmxlIHRvIGRlY29t cHJlc3MgdGhlIHJlcXVpcmVkIHNsaWNlLgotCQkJICovCi0JCQlpZiAoVkFSQVRUX0VYVEVSTkFM X0dFVF9DT01QUkVTU19NRVRIT0QodG9hc3RfcG9pbnRlcikgPT0KLQkJCQlUT0FTVF9QR0xaX0NP TVBSRVNTSU9OX0lEKQotCQkJCW1heF9zaXplID0gcGdsel9tYXhpbXVtX2NvbXByZXNzZWRfc2l6 ZShzbGljZWxpbWl0LCBtYXhfc2l6ZSk7CisJCQlpZiAoc2xpY2VsaW1pdCA+PSAwKQorCQkJewor CQkJCWludDMyCQltYXhfc2l6ZSA9IFZBUkFUVF9FWFRFUk5BTF9HRVRfRVhUU0laRSh0b2FzdF9w b2ludGVyKTsKIAotCQkJLyoKLQkJCSAqIEZldGNoIGVub3VnaCBjb21wcmVzc2VkIHNsaWNlcyAo Y29tcHJlc3NlZCBtYXJrZXIgd2lsbCBnZXQgc2V0Ci0JCQkgKiBhdXRvbWF0aWNhbGx5KS4KLQkJ CSAqLwotCQkJcHJlc2xpY2UgPSB0b2FzdF9mZXRjaF9kYXR1bV9zbGljZShhdHRyLCAwLCBtYXhf c2l6ZSk7CisJCQkJaWYgKFZBUkFUVF9FWFRFUk5BTF9HRVRfQ09NUFJFU1NfTUVUSE9EKHRvYXN0 X3BvaW50ZXIpID09CisJCQkJCVRPQVNUX1BHTFpfQ09NUFJFU1NJT05fSUQpCisJCQkJCW1heF9z aXplID0gcGdsel9tYXhpbXVtX2NvbXByZXNzZWRfc2l6ZShzbGljZWxpbWl0LCBtYXhfc2l6ZSk7 CisKKwkJCQlwcmVzbGljZSA9IHRvYXN0X2ZldGNoX2RhdHVtX3NsaWNlKGF0dHIsIDAsIG1heF9z aXplKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlwcmVzbGljZSA9IHRvYXN0X2ZldGNoX2RhdHVtKGF0 dHIpOwogCQl9Ci0JCWVsc2UKLQkJCXByZXNsaWNlID0gdG9hc3RfZmV0Y2hfZGF0dW0oYXR0cik7 Ci0JfQotCWVsc2UgaWYgKFZBUkFUVF9JU19FWFRFUk5BTF9JTkRJUkVDVChhdHRyKSkKLQl7Ci0J CXN0cnVjdCB2YXJhdHRfaW5kaXJlY3QgcmVkaXJlY3Q7CisJCWVsc2UgaWYgKFZBUkFUVF9JU19F WFRFUk5BTF9JTkRJUkVDVChhdHRyKSkKKwkJeworCQkJc3RydWN0IHZhcmF0dF9pbmRpcmVjdCBy ZWRpcmVjdDsKIAotCQlWQVJBVFRfRVhURVJOQUxfR0VUX1BPSU5URVIocmVkaXJlY3QsIGF0dHIp OworCQkJVkFSQVRUX0VYVEVSTkFMX0dFVF9QT0lOVEVSKHJlZGlyZWN0LCBhdHRyKTsKIAotCQkv KiBuZXN0ZWQgaW5kaXJlY3QgRGF0dW1zIGFyZW4ndCBhbGxvd2VkICovCi0JCUFzc2VydCghVkFS QVRUX0lTX0VYVEVSTkFMX0lORElSRUNUKHJlZGlyZWN0LnBvaW50ZXIpKTsKKwkJCS8qIG5lc3Rl ZCBpbmRpcmVjdCBEYXR1bXMgYXJlbid0IGFsbG93ZWQgKi8KKwkJCUFzc2VydCghVkFSQVRUX0lT X0VYVEVSTkFMX0lORElSRUNUKHJlZGlyZWN0LnBvaW50ZXIpKTsKIAotCQlyZXR1cm4gZGV0b2Fz dF9hdHRyX3NsaWNlKHJlZGlyZWN0LnBvaW50ZXIsCi0JCQkJCQkJCSAgc2xpY2VvZmZzZXQsIHNs aWNlbGVuZ3RoKTsKLQl9Ci0JZWxzZSBpZiAoVkFSQVRUX0lTX0VYVEVSTkFMX0VYUEFOREVEKGF0 dHIpKQotCXsKLQkJLyogcGFzcyBpdCBvZmYgdG8gZGV0b2FzdF9leHRlcm5hbF9hdHRyIHRvIGZs YXR0ZW4gKi8KLQkJcHJlc2xpY2UgPSBkZXRvYXN0X2V4dGVybmFsX2F0dHIoYXR0cik7CisJCQly ZXR1cm4gZGV0b2FzdF9hdHRyX3NsaWNlKHJlZGlyZWN0LnBvaW50ZXIsCisJCQkJCQkJCQkgIHNs aWNlb2Zmc2V0LCBzbGljZWxlbmd0aCk7CisJCX0KKwkJZWxzZSBpZiAoVkFSQVRUX0lTX0VYVEVS TkFMX0VYUEFOREVEKGF0dHIpKQorCQl7CisJCQkvKiBwYXNzIGl0IG9mZiB0byBkZXRvYXN0X2V4 dGVybmFsX2F0dHIgdG8gZmxhdHRlbiAqLworCQkJcHJlc2xpY2UgPSBkZXRvYXN0X2V4dGVybmFs X2F0dHIoYXR0cik7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBTaG91bGQgbm90IHJlYWNoIGhl cmUgLSB1bmtub3duIGV4dGVybmFsIHR5cGUgKi8KKwkJCWVsb2coRVJST1IsICJ1bmV4cGVjdGVk IGV4dGVybmFsIHZhcmxlbmEgdHlwZSIpOworCQkJcHJlc2xpY2UgPSBhdHRyOwkvKiBrZWVwIGNv bXBpbGVyIHF1aWV0ICovCisJCX0KIAl9CiAJZWxzZQogCQlwcmVzbGljZSA9IGF0dHI7CkBAIC00 NjIsNiArNTU5LDYxIEBAIHRvYXN0X2ZldGNoX2RhdHVtX3NsaWNlKHN0cnVjdCB2YXJsZW5hICph dHRyLCBpbnQzMiBzbGljZW9mZnNldCwKIAlyZXR1cm4gcmVzdWx0OwogfQogCisvKiAtLS0tLS0t LS0tCisgKiB0b2FzdF9mZXRjaF9kYXR1bV9kZWNvZGVkIC0KKyAqCisgKglGZXRjaCBUT0FTVCBk YXRhIHVzaW5nIHByZS1kZWNvZGVkIHBvaW50ZXIgaW5mby4KKyAqIC0tLS0tLS0tLS0KKyAqLwor c3RhdGljIHN0cnVjdCB2YXJsZW5hICoKK3RvYXN0X2ZldGNoX2RhdHVtX2RlY29kZWQoY29uc3Qg RGVjb2RlZEV4dGVybmFsVG9hc3QgKmRlY29kZWQpCit7CisJUmVsYXRpb24JdG9hc3RyZWw7CisJ c3RydWN0IHZhcmxlbmEgKnJlc3VsdDsKKwlpbnQzMgkJYXR0cnNpemUgPSBkZWNvZGVkLT5leHRz aXplOworCisJcmVzdWx0ID0gKHN0cnVjdCB2YXJsZW5hICopIHBhbGxvYyhhdHRyc2l6ZSArIFZB UkhEUlNaKTsKKworCS8qIEhBU19UQ0lORk8gZGV0ZXJtaW5lcyBoZWFkZXIgZm9ybWF0LCBub3Qg ImlzIGNvbXByZXNzZWQiICovCisJaWYgKGRlY29kZWQtPmZsYWdzICYgVE9BU1RfRVhUX0hBU19U Q0lORk8pCisJCVNFVF9WQVJTSVpFX0NPTVBSRVNTRUQocmVzdWx0LCBhdHRyc2l6ZSArIFZBUkhE UlNaKTsKKwllbHNlCisJCVNFVF9WQVJTSVpFKHJlc3VsdCwgYXR0cnNpemUgKyBWQVJIRFJTWik7 CisKKwlpZiAoYXR0cnNpemUgPT0gMCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCXRvYXN0cmVsID0g dGFibGVfb3BlbihkZWNvZGVkLT50b2FzdHJlbGlkLCBBY2Nlc3NTaGFyZUxvY2spOworCXRhYmxl X3JlbGF0aW9uX2ZldGNoX3RvYXN0X3NsaWNlKHRvYXN0cmVsLCBkZWNvZGVkLT52YWx1ZWlkLAor CQkJCQkJCQkJIGF0dHJzaXplLCAwLCBhdHRyc2l6ZSwgcmVzdWx0KTsKKwl0YWJsZV9jbG9zZSh0 b2FzdHJlbCwgQWNjZXNzU2hhcmVMb2NrKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIC0t LS0tLS0tLS0KKyAqIHRvYXN0X2RlY29tcHJlc3NfZGVjb2RlZCAtCisgKgorICoJRGVjb21wcmVz cyBUT0FTVCBkYXRhIHVzaW5nIGRlY29kZWQgbWV0aG9kLgorICogLS0tLS0tLS0tLQorICovCitz dGF0aWMgc3RydWN0IHZhcmxlbmEgKgordG9hc3RfZGVjb21wcmVzc19kZWNvZGVkKGNvbnN0IHN0 cnVjdCB2YXJsZW5hICpjb21wcmVzc2VkLAorCQkJCQkJIGNvbnN0IERlY29kZWRFeHRlcm5hbFRv YXN0ICpkZWNvZGVkKQoreworCXN3aXRjaCAoZGVjb2RlZC0+bWV0aG9kKQorCXsKKwkJY2FzZSBU T0FTVF9ERUNPTVBfUEdMWjoKKwkJCXJldHVybiBwZ2x6X2RlY29tcHJlc3NfZGF0dW0oY29tcHJl c3NlZCk7CisJCWNhc2UgVE9BU1RfREVDT01QX0xaNDoKKwkJCXJldHVybiBsejRfZGVjb21wcmVz c19kYXR1bShjb21wcmVzc2VkKTsKKwkJY2FzZSBUT0FTVF9ERUNPTVBfTk9ORToKKwkJZGVmYXVs dDoKKwkJCWVsb2coRVJST1IsICJ1bmV4cGVjdGVkIGRlY29tcHJlc3Npb24gbWV0aG9kICVkIiwg ZGVjb2RlZC0+bWV0aG9kKTsKKwkJCXJldHVybiBOVUxMOworCX0KK30KKwogLyogLS0tLS0tLS0t LQogICogdG9hc3RfZGVjb21wcmVzc19kYXR1bSAtCiAgKgpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1 ZGUvYWNjZXNzL3RvYXN0X2ludGVybmFscy5oIGIvc3JjL2luY2x1ZGUvYWNjZXNzL3RvYXN0X2lu dGVybmFscy5oCmluZGV4IDA2YWU4NTgzYzFlLi4wMjQ1ZjY3YjI0NiAxMDA2NDQKLS0tIGEvc3Jj L2luY2x1ZGUvYWNjZXNzL3RvYXN0X2ludGVybmFscy5oCisrKyBiL3NyYy9pbmNsdWRlL2FjY2Vz cy90b2FzdF9pbnRlcm5hbHMuaApAQCAtMTYsNiArMTYsNDUgQEAKICNpbmNsdWRlICJzdG9yYWdl L2xvY2tkZWZzLmgiCiAjaW5jbHVkZSAidXRpbHMvcmVsY2FjaGUuaCIKICNpbmNsdWRlICJ1dGls cy9zbmFwc2hvdC5oIgorI2luY2x1ZGUgInZhcmF0dC5oIgorCisvKgorICogRGVjb21wcmVzc2lv biBtZXRob2QgZm9yIGRlY29kZWQgdG9hc3QgcG9pbnRlcnMuIFNlcGFyYXRlIGZyb20KKyAqIFRv YXN0Q29tcHJlc3Npb25JZCAoMi1iaXQgb24tZGlzayBlbmNvZGluZykgdG8gYWxsb3cgZnV0dXJl IG1ldGhvZHMuCisgKi8KK3R5cGVkZWYgZW51bSBUb2FzdERlY29tcHJlc3NNZXRob2QKK3sKKwlU T0FTVF9ERUNPTVBfTk9ORSA9IDAsCisJVE9BU1RfREVDT01QX1BHTFogPSAxLAorCVRPQVNUX0RF Q09NUF9MWjQgPSAyCit9IFRvYXN0RGVjb21wcmVzc01ldGhvZDsKKworLyoKKyAqIEZsYWdzIGZv ciBEZWNvZGVkRXh0ZXJuYWxUb2FzdC4KKyAqCisgKiBIQVNfVENJTkZPOiBQYXlsb2FkIHN0YXJ0 cyB3aXRoIHRjaW5mbyBoZWFkZXIuIFRydWUgZm9yIFBHTFovTFo0IGV4dGVybmFsOworICogICBm YWxzZSBmb3IgdW5jb21wcmVzc2VkIG9yIGZ1dHVyZSBtZXRob2RzIHN0b3JpbmcgcmF3IGNvbXBy ZXNzZWQgZGF0YS4KKyAqIElTX09ORElTSzogU2V0IGZvciBWQVJUQUdfT05ESVNLIChmb3IgZnV0 dXJlIHZhcnRhZyBleHRlbnNpb24pLgorICovCisjZGVmaW5lIFRPQVNUX0VYVF9IQVNfVENJTkZP CTB4MDEKKyNkZWZpbmUgVE9BU1RfRVhUX0lTX09ORElTSwkJMHgwMgorCisvKgorICogRGVjb2Rl ZCByZXByZXNlbnRhdGlvbiBvZiBhbiBleHRlcm5hbCBvbi1kaXNrIFRPQVNUIHBvaW50ZXIuCisg KiBOb3JtYWxpemVzIHZhcnRhZy92YV9leHRpbmZvIHZhcmlhdGlvbnM7IGRlY29kZSBvbmNlLCB1 c2UgdGhyb3VnaG91dC4KKyAqCisgKiBIQVNfVENJTkZPIGluZGljYXRlcyBwYXlsb2FkIGZvcm1h dCAoaGFzIHRjaW5mbyBoZWFkZXIpLCBkaXN0aW5jdCBmcm9tCisgKiAiaXMgY29tcHJlc3NlZCIg KGV4dHNpemUgPCByYXdzaXplKSAtIGZ1dHVyZSBtZXRob2RzIG1heSBvbWl0IHRjaW5mby4KKyAq LwordHlwZWRlZiBzdHJ1Y3QgRGVjb2RlZEV4dGVybmFsVG9hc3QKK3sKKwlPaWQJCQl0b2FzdHJl bGlkOworCU9pZAkJCXZhbHVlaWQ7CisJdWludDMyCQlyYXdzaXplOwkJLyogRGVjb21wcmVzc2Vk IHNpemU7IGZvciBmdXR1cmUgbWV0aG9kcyB3aXRob3V0IHRjaW5mbyAqLworCXVpbnQzMgkJZXh0 c2l6ZTsJCS8qIE9uLWRpc2sgcGF5bG9hZCBzaXplICovCisJVG9hc3REZWNvbXByZXNzTWV0aG9k IG1ldGhvZDsKKwl1aW50OAkJZmxhZ3M7Cit9IERlY29kZWRFeHRlcm5hbFRvYXN0OwogCiAvKgog ICoJVGhlIGluZm9ybWF0aW9uIGF0IHRoZSBzdGFydCBvZiB0aGUgY29tcHJlc3NlZCB0b2FzdCBk YXRhLgotLSAKMi4zOS4zIChBcHBsZSBHaXQtMTQ2KQoK --0000000000006916ea064717750d--