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 1wDXMe-0035ED-2l for pgsql-hackers@arkaria.postgresql.org; Fri, 17 Apr 2026 00:47:21 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wDXMc-007LJP-2w for pgsql-hackers@arkaria.postgresql.org; Fri, 17 Apr 2026 00:47:18 +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 1wDXMc-007LJG-1Z for pgsql-hackers@lists.postgresql.org; Fri, 17 Apr 2026 00:47:18 +0000 Received: from mail-ej1-x62e.google.com ([2a00:1450:4864:20::62e]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wDXMa-00000001V8Y-1F9C for pgsql-hackers@postgresql.org; Fri, 17 Apr 2026 00:47:18 +0000 Received: by mail-ej1-x62e.google.com with SMTP id a640c23a62f3a-b9b1ffbb9f5so18515666b.2 for ; Thu, 16 Apr 2026 17:47:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1776386834; cv=none; d=google.com; s=arc-20240605; b=Er4NaRwYEkFZgT1hQ0nfCeyTD8wlH9TbK6XgSWvMZZk+7UAhFYhh70/r44O14ycwJ/ ncfDkCusOSf16aFhlOvpkhvax29yGThA3udjNw/iTY8NzoFc0KH+kJB5QuC6RCB3leT4 lyf/O5tu4/S6ttiOT1PejQPYbX5HvuJjXFEzh2AwsfcUlfv5l3Njv+jTU0NxIssf1cPd OQIsH1psRzC0MQ9Hyni+0kSc46lJw6cImoODx1D3t3KycRljiE2NEl6neVKvHfwmzrZq 8TmDtrwQyWJeERfvyH/7hNsl9CsvNyBz4BgqPJo3nFF/YyfdrsenfO4NcWrS7iVICdkm 9yRQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=6EuyF8qou5vUV4npx2b+7b/NEp4ZMCQfBB9Oy1JUEag=; fh=RfrkJab44jNT7RraF/sJO97r9/nkUL0AAgzmC7PBS2w=; b=UY1t9iTTHnNJxCHhvGOZZhqntQ7u29FC3Lr2h/9BU0xgdn9tW03WmYo6ZCPCgxTygY nCXdkN2L1El05kh8F5J+QOJCqps5eUcW50OpghlIniTnvQ0I2e5GHSnX625oIzq6HeRn VHG9kFs3+X9ZRRZEJ+gqyz7IUqi0cGsLv5aW2b74WQOKSU4WXSHdr9YLQY1RjOyc0Sge 84gUVG1cO7jQOC7fa2BinUSVZEijU0T0RPgVQmp3qGoteh8R8dJ6Ih0M3AdQ3aJtxmgb kJRQweDt0UEEWGdFX1h8vqsTL75wUSTDuPsuXh83gf6Cz0f2F5LfJD0TGJm2lJe3FpDV iaIw==; darn=postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1776386834; x=1776991634; darn=postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=6EuyF8qou5vUV4npx2b+7b/NEp4ZMCQfBB9Oy1JUEag=; b=GNro3ZwTs5gTkOPmzwustgvUS6We9jL1EERgvEpjg6Lv8nKhK54jWNBC6E9xnCtgYT 5e0vUJ3G7PYBFz4t558NHWQFbZlKH2pEPxsxLZsjU/IcumiNmKmzwTR3awxvj6zeJ2Lv KNdytRGzL9kgImP2ZqR9QkE8z8wgsElRx5XEHCMVN2dMtuPwRoWlvORjFJFmK68X9xNK n21kJvQ8RplkSn83H3xgYr8aDRnyiHjkeZh+uAR7J0RnRa4J9RrbSZyhgfoHim/Vr0WE xLeFkTyJZnMQW16hVyC8p3powCFB9BCLclWf1DNpMGTrE55OyY2QSBWWcwDKnDhyHYrA gfOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776386834; x=1776991634; h=to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=6EuyF8qou5vUV4npx2b+7b/NEp4ZMCQfBB9Oy1JUEag=; b=pDNQzeNenC/vu17sPop5jgiaoiY6TmTubEUtv+/qk1/amNVC+2SGsljIi2H30wSBHt wcJciXUqUevGiH/jsxaxdk9LsS5PYKRlIwUIT9kEOpcw0fgZN+86gQH+OhVUzMUFzcc9 7kSu07xFqApuhLi5UOIPXQMy/XgJYu2QYS9xHxVr/Dux5BH+uCBKblqKtjcPYe+cy+00 zhgdfGXRe1Huwy6ZOtqhdNxSP7miPwBSPmJCB01BC89UW7IVu8czQH5O0JNFmI+BeLcx +QuCDZ1THh2ho+5yk4v/KjyBJqGCzfGqBQeOQyYoAiwqw915UfhSVNO4hiThp1PKlJrw /yWg== X-Gm-Message-State: AOJu0YzATFUZixszi0SQYm3tMsuSy/vbeanSC4MCm73Zl1g0W9NImU6/ j50ZZhOgI9bscJeSDZxDuvqM8Cjtp6XD+Tn3EDtve0eWI+Oo80iARitHLhN5wTAEsfP49BHb5Av 0Ync6l5Vfdbsj2fgd3JBE92WExyQ10Mva4g== X-Gm-Gg: AeBDies3FYswWgsjwnhTlwrehFQ8YbcOYgZujF9eAevMyO+2QlilXrqrF1Xr0sLNdEq 9WOEn2rGnOvRZRV9VoBLmnrTgEcyvxIK66Ye5sSDCymesudpNswseL4fFIodOBVWRVIcYk+vO/l jYF7lUM+EtmAi5VoTXCarXXoU/0Eq6wpLhaJHHTB4za5BQJO7ML2iDIpCsOk6m1oOYIq8i+QJJ0 S4ejqerDcCMWZXEE4/DLqAKPoA9fK8Q01QTxYPYNMslhKr5gpznQY5QpKqzaFbrUHKaJD18u3d1 Ku4d6NCszCrewmB6yUYKfT/G0UxdgY7TwtWVdJc3wrsTuPxUAQtZzUh8b9aOzCs= X-Received: by 2002:a17:907:3f9d:b0:ba0:fb72:1f42 with SMTP id a640c23a62f3a-ba41a633320mr33142966b.29.1776386834200; Thu, 16 Apr 2026 17:47:14 -0700 (PDT) MIME-Version: 1.0 From: Josh Kupershmidt Date: Thu, 16 Apr 2026 20:47:00 -0400 X-Gm-Features: AQROBzDxG8ZO8LCwx8Zv98UNJFwb3iAkD398AJqEuO7FMLey-FpfCA__mW5In-o Message-ID: Subject: pg_dump: eliminate tmpfile double-write in tar format output To: pgsql-hackers Content-Type: multipart/mixed; boundary="0000000000003e346a064f9d4ad2" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000003e346a064f9d4ad2 Content-Type: multipart/alternative; boundary="0000000000003e3468064f9d4ad0" --0000000000003e3468064f9d4ad0 Content-Type: text/plain; charset="UTF-8" Hi, Please find attached a patch optimizing pg_dump's tar format (-Ft) when writing to a seekable file. The diff here is limited to src/bin/pg_dump/pg_backup_tar.c. Currently, every TOC entry in the tar-format dump goes through a temporary file: data is written to a tmpfile, then on close the tmpfile is seeked to determine its length, the tar header is written, and the entire tmpfile gets copied to the tar output. We end up writing the data twice: once to the tmpfile and once to the final tar file. The patch adds a "direct-write" mode for seekable outputs. Instead of using a tmpfile, we write a placeholder tar header (with length 0) directly to the tar output, stream the data after it, then seek back to rewrite the header with the actual length. This should cut the I/O in half for the data path. The tmpfile path is preserved as a fallback for three cases: 1. Output is not seekable (stdout/pipe) 2. Another member is already being written directly (guard against interleaving) 3. We're in the LO section, where the blob TOC file stays open while individual blob data files are written and closed inside it On a test 500K-row database (~255MB, 184MB dump file), pg_dump -Ft time goes down from about 1.42s (master) to 1.22s (patched). The percent improvement is a bit less for larger databases: dump time goes down from 10.24s (master) to 9.34s (patched) for a database about 10x as large. A benchmark script (bench_tar_direct_write.sh) is included for reproducing some of the performance testing I did. Thanks, Josh --0000000000003e3468064f9d4ad0 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi,
=
Please find attached a patch optimizing pg_dump's tar format (-Ft) = when writing to a seekable file. The diff here is limited to src/bin/pg_dum= p/pg_backup_tar.c.

Currently, every TOC entry in the tar-format dump= goes through a temporary file: data is written to a tmpfile, then on close= the tmpfile is seeked to determine its length, the tar header is written, = and the entire tmpfile gets copied to the tar output. We end up writing the= data twice: once to the tmpfile and once to the final tar file.

The= patch adds a "direct-write" mode for seekable outputs. Instead o= f using a tmpfile, we write a placeholder tar header (with length 0) direct= ly to the tar output, stream the data after it, then seek back to rewrite t= he header with the actual length. This should cut the I/O in half for the d= ata path.

The tmpfile path is preserved as a fallback for three case= s:
1. Output is not seekable (stdout/pipe)
2. Another member is alrea= dy being written directly (guard against interleaving)
3. We're in t= he LO section, where the blob TOC file stays open while individual blob dat= a files are written and closed inside it

On a test 500K-row database= (~255MB, 184MB dump file), pg_dump -Ft time goes down from about 1.42s (ma= ster) to 1.22s (patched). The percent improvement is a bit less for larger = databases: dump time goes down from 10.24s (master) to 9.34s (patched) for = a database about 10x as large.

A benchmark script (bench_tar_direct_= write.sh) is included for reproducing some of the performance testing I did= .

Thanks,
Josh

--0000000000003e3468064f9d4ad0-- --0000000000003e346a064f9d4ad2 Content-Type: application/x-sh; name="bench_tar_direct_write.sh" Content-Disposition: attachment; filename="bench_tar_direct_write.sh" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mnp6xygd0 IyEvYmluL2Jhc2gKIwojIEJlbmNobWFyazogcGdfZHVtcCB0YXIgZm9ybWF0IGRpcmVjdC13cml0 ZSBvcHRpbWl6YXRpb24KIwojIENvbXBhcmVzIHBnX2R1bXAgLUZ0ICh0YXIgZm9ybWF0KSB0byAt RnAgKHBsYWluIGZvcm1hdCkgd3JpdGluZyB0byBhIGZpbGUsCiMgd2l0aCBhbmQgd2l0aG91dCB0 aGUgcGF0Y2ggdG8gcGdfYmFja3VwX3Rhci5jLgojCiMgVXNhZ2U6CiMgICAxLiBCdWlsZCBhbmQg aW5zdGFsbCBQb3N0Z3JlU1FMIGludG8gYSBsb2NhbCBwcmVmaXguCiMgICAyLiBSdW4gdGhpcyBz Y3JpcHQ6ICAuL2JlbmNoX3Rhcl9kaXJlY3Rfd3JpdGUuc2ggL3BhdGgvdG8vcGcvaW5zdGFsbAoj CiMgVGhlIHNjcmlwdCBjcmVhdGVzIGEgdGVtcG9yYXJ5IGRhdGFiYXNlLCBwb3B1bGF0ZXMgaXQg d2l0aCB+MjU1TUIgb2YgZGF0YSwKIyBydW5zIHBnX2R1bXAgaW4gdGFyIGFuZCBwbGFpbiBmb3Jt YXRzIDMgdGltZXMgZWFjaCwgYW5kIHByaW50cyBhIHN1bW1hcnkuCgpzZXQgLWUKClBHSU5TVEFM TD0iJHsxOj9Vc2FnZTogJDAgL3BhdGgvdG8vcGcvaW5zdGFsbH0iCmV4cG9ydCBQQVRIPSIkUEdJ TlNUQUxML2JpbjokUEFUSCIKZXhwb3J0IExEX0xJQlJBUllfUEFUSD0iJFBHSU5TVEFMTC9saWI6 JFBHSU5TVEFMTC9saWI2NDoke0xEX0xJQlJBUllfUEFUSDotfSIKClBHREFUQT0kKG1rdGVtcCAt ZCAvdG1wL2JlbmNoX3Rhcl9YWFhYWFgpClBHUE9SVD01NDM5OQpEQk5BTUU9YmVuY2hfdGFyX3Rl c3QKRFVNUEZJTEU9JChta3RlbXAgL3RtcC9iZW5jaF9kdW1wX1hYWFhYWCkKCmNsZWFudXAoKSB7 CiAgICBwZ19jdGwgLUQgIiRQR0RBVEEiIHN0b3AgLW0gaW1tZWRpYXRlIDI+L2Rldi9udWxsIHx8 IHRydWUKICAgIHJtIC1yZiAiJFBHREFUQSIgIiREVU1QRklMRSIKfQp0cmFwIGNsZWFudXAgRVhJ VAoKZWNobyAiPT0+IEluaXRpYWxpemluZyBQb3N0Z3JlU1FMIGluc3RhbmNlIGluICRQR0RBVEEi CmluaXRkYiAtRCAiJFBHREFUQSIgLS1uby1zeW5jID4gL2Rldi9udWxsCmNhdCA+PiAiJFBHREFU QS9wb3N0Z3Jlc3FsLmNvbmYiIDw8Q09ORgpwb3J0ID0gJFBHUE9SVApzaGFyZWRfYnVmZmVycyA9 IDI1Nk1CCndvcmtfbWVtID0gNjRNQgptYWludGVuYW5jZV93b3JrX21lbSA9IDI1Nk1CCmxvZ2dp bmdfY29sbGVjdG9yID0gb2ZmCkNPTkYKcGdfY3RsIC1EICIkUEdEQVRBIiAtbCAiJFBHREFUQS9z ZXJ2ZXIubG9nIiAtbyAiLXAgJFBHUE9SVCIgc3RhcnQgLXcgLXMKCmVjaG8gIj09PiBDcmVhdGlu ZyB0ZXN0IGRhdGFiYXNlICgkREJOQU1FKSB3aXRoIH4yNTVNQiBvZiBkYXRhIgpwc3FsIC1wICRQ R1BPUlQgLWQgcG9zdGdyZXMgLXEgLWMgIkNSRUFURSBEQVRBQkFTRSAkREJOQU1FOyIKcHNxbCAt cCAkUEdQT1JUIC1kICREQk5BTUUgLXEgPDwnU1FMJwpDUkVBVEUgVEFCTEUgbGFyZ2VfZGF0YSAo CiAgICBpZCBzZXJpYWwgUFJJTUFSWSBLRVksCiAgICB2YWwxIGludCwKICAgIHZhbDIgdGV4dCwK ICAgIHZhbDMgZmxvYXQsCiAgICBwYXlsb2FkIHRleHQKKTsKSU5TRVJUIElOVE8gbGFyZ2VfZGF0 YSAodmFsMSwgdmFsMiwgdmFsMywgcGF5bG9hZCkKICBTRUxFQ1QgKHJhbmRvbSgpKjEwMDAwMDAp OjppbnQsCiAgICAgICAgIG1kNShyYW5kb20oKTo6dGV4dCksCiAgICAgICAgIHJhbmRvbSgpKjEw MDAsCiAgICAgICAgIHJlcGVhdChtZDUocmFuZG9tKCk6OnRleHQpLCAxMCkKICBGUk9NIGdlbmVy YXRlX3NlcmllcygxLCA1MDAwMDApOwpDUkVBVEUgSU5ERVggbGFyZ2VfZGF0YV92YWwxX2lkeCBP TiBsYXJnZV9kYXRhICh2YWwxKTsKQ1JFQVRFIElOREVYIGxhcmdlX2RhdGFfdmFsMl9pZHggT04g bGFyZ2VfZGF0YSAodmFsMik7CkFOQUxZWkUgbGFyZ2VfZGF0YTsKU1FMCmVjaG8gIiAgICQocHNx bCAtcCAkUEdQT1JUIC1kICREQk5BTUUgLXRBYyBcCiAgICAiU0VMRUNUIHBnX3NpemVfcHJldHR5 KHBnX3RvdGFsX3JlbGF0aW9uX3NpemUoJ2xhcmdlX2RhdGEnKSkiKSB0b3RhbCIKCnJ1bl9iZW5j aCgpIHsKICAgIGxvY2FsIGxhYmVsPSIkMSIgZm10PSIkMiIKICAgIGxvY2FsIGJlc3Q9IiIKICAg IGZvciBpIGluIDEgMiAzOyBkbwogICAgICAgIGxvY2FsIHNlY3MKICAgICAgICBzZWNzPSQoIHsg dGltZSBwZ19kdW1wIC1wICRQR1BPUlQgLUYiJGZtdCIgLWYgIiREVU1QRklMRSIgJERCTkFNRTsg fSAyPiYxIFwKICAgICAgICAgICAgIHwgYXdrICcvXnJlYWwvIHsKICAgICAgICAgICAgICAgICBz cGxpdCgkMiwgYSwgIm0iKTsKICAgICAgICAgICAgICAgICBzcGxpdChhWzJdLCBiLCAicyIpOwog ICAgICAgICAgICAgICAgIHByaW50IGFbMV0qNjAgKyBiWzFdCiAgICAgICAgICAgICAgIH0nICkK ICAgICAgICBpZiBbIC16ICIkYmVzdCIgXSB8fCBhd2sgIkJFR0lOe2V4aXQoISgkc2VjcyA8ICRi ZXN0KSl9IjsgdGhlbgogICAgICAgICAgICBiZXN0PSRzZWNzCiAgICAgICAgZmkKICAgICAgICBy bSAtZiAiJERVTVBGSUxFIgogICAgZG9uZQogICAgcHJpbnRmICIgICUtMjVzICU3LjNmcyAgKGJl c3Qgb2YgMylcbiIgIiRsYWJlbCIgIiRiZXN0Igp9CgplY2hvICIiCmVjaG8gIj09PiBSdW5uaW5n IGJlbmNobWFya3MgKDMgcnVucyBlYWNoLCBiZXN0LW9mLTMgcmVwb3J0ZWQpIgplY2hvICIiCnJ1 bl9iZW5jaCAiVGFyIGZvcm1hdCAgKC1GdCkiIHQKcnVuX2JlbmNoICJQbGFpbiBmb3JtYXQgKC1G cCkiIHAKZWNobyAiIgplY2hvICJEb25lLiBDb21wYXJlIHRoZXNlIG51bWJlcnMgYmVmb3JlIGFu ZCBhZnRlciBhcHBseWluZyB0aGUgcGF0Y2guIgo= --0000000000003e346a064f9d4ad2 Content-Type: application/octet-stream; name="pg_backup_tar_mode_direct_write.diff" Content-Disposition: attachment; filename="pg_backup_tar_mode_direct_write.diff" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mnp6xygk1 ZGlmZiAtLWdpdCBhL3NyYy9iaW4vcGdfZHVtcC9wZ19iYWNrdXBfdGFyLmMgYi9zcmMvYmluL3Bn X2R1bXAvcGdfYmFja3VwX3Rhci5jCmluZGV4IGEzODc5NDEwYzk0Li43YWNmZjk1ZGJjMSAxMDA2 NDQKLS0tIGEvc3JjL2Jpbi9wZ19kdW1wL3BnX2JhY2t1cF90YXIuYworKysgYi9zcmMvYmluL3Bn X2R1bXAvcGdfYmFja3VwX3Rhci5jCkBAIC03Myw2ICs3Myw4IEBAIHR5cGVkZWYgc3RydWN0CiAJ cGdvZmZfdAkJcG9zOwogCXBnb2ZmX3QJCWZpbGVMZW47CiAJQXJjaGl2ZUhhbmRsZSAqQUg7CisJ cGdvZmZfdAkJaGVhZGVyUG9zOwkJLyogcG9zaXRpb24gb2YgdGFyIGhlYWRlciBpbiB0YXJGSCBm b3IKKwkJCQkJCQkJICogZGlyZWN0LXdyaXRlIG1vZGUgKHNlZWthYmxlIG91dHB1dCkgKi8KIH0g VEFSX01FTUJFUjsKIAogdHlwZWRlZiBzdHJ1Y3QKQEAgLTg2LDYgKzg4LDkgQEAgdHlwZWRlZiBz dHJ1Y3QKIAlUQVJfTUVNQkVSICpGSDsKIAlpbnQJCQlpc1NwZWNpYWxTY3JpcHQ7CiAJVEFSX01F TUJFUiAqc2NyaXB0VEg7CisJVEFSX01FTUJFUiAqZGlyZWN0V3JpdGVNZW1iZXI7CS8qIGN1cnJl bnRseSBhY3RpdmUgZGlyZWN0LXdyaXRlIG1lbWJlciwKKwkJCQkJCQkJCSAqIG9yIE5VTEwgKi8K Kwlib29sCQlpbkxPczsJCQkJLyogdHJ1ZSB3aGlsZSB3cml0aW5nIGxhcmdlIG9iamVjdHMgKi8K IH0gbGNsQ29udGV4dDsKIAogdHlwZWRlZiBzdHJ1Y3QKQEAgLTMzMSw2MSArMzM2LDEwMSBAQCB0 YXJPcGVuKEFyY2hpdmVIYW5kbGUgKkFILCBjb25zdCBjaGFyICpmaWxlbmFtZSwgY2hhciBtb2Rl KQogCX0KIAllbHNlCiAJewotCQlpbnQJCQlvbGRfdW1hc2s7Ci0KIAkJdG0gPSBwZ19tYWxsb2Mw X29iamVjdChUQVJfTUVNQkVSKTsKIAogCQkvKgotCQkgKiBQT1NJWCBkb2VzIG5vdCByZXF1aXJl LCBidXQgcGVybWl0cywgdG1wZmlsZSgpIHRvIHJlc3RyaWN0IGZpbGUKLQkJICogcGVybWlzc2lv bnMuICBHaXZlbiBhbiBPUyBjcmFzaCBhZnRlciB3ZSB3cml0ZSBkYXRhLCB0aGUgZmlsZXN5c3Rl bQotCQkgKiBtaWdodCByZXRhaW4gdGhlIGRhdGEgYnV0IGZvcmdldCB0bXBmaWxlKCkncyB1bmxp bmsoKS4gIElmIHNvLCB0aGUKLQkJICogZmlsZSBtb2RlIHByb3RlY3RzIGNvbmZpZGVudGlhbGl0 eSBvZiB0aGUgZGF0YSB3cml0dGVuLgorCQkgKiBXaGVuIHRoZSB0YXIgb3V0cHV0IGlzIHNlZWth YmxlIGFuZCBubyBvdGhlciBtZW1iZXIgaXMgY3VycmVudGx5CisJCSAqIGJlaW5nIHdyaXR0ZW4g ZGlyZWN0bHksIHdlIGNhbiB3cml0ZSBkYXRhIGRpcmVjdGx5IHRvIHRoZSB0YXIKKwkJICogZmls ZSBpbnN0ZWFkIG9mIHVzaW5nIGEgdGVtcG9yYXJ5IGZpbGUuICBXZSB3cml0ZSBhIHBsYWNlaG9s ZGVyCisJCSAqIGhlYWRlciBmaXJzdCwgc3RyZWFtIHRoZSBkYXRhLCB0aGVuIHNlZWsgYmFjayB0 byBmaXggdGhlIGhlYWRlcgorCQkgKiB3aXRoIHRoZSBhY3R1YWwgZmlsZSBsZW5ndGguICBUaGlz IGF2b2lkcyB0aGUgb3ZlcmhlYWQgb2Ygd3JpdGluZworCQkgKiBhbGwgZGF0YSB0d2ljZSAob25j ZSB0byB0bXBmaWxlLCBvbmNlIHRvIHRhciBvdXRwdXQpLgorCQkgKgorCQkgKiBXZSBjYW5ub3Qg dXNlIHRoaXMgb3B0aW1pemF0aW9uIHdoZW4gYW5vdGhlciBkaXJlY3Qtd3JpdGUgbWVtYmVyCisJ CSAqIGlzIGFscmVhZHkgYWN0aXZlIChlLmcuLCB0aGUgYmxvYiBUT0MgZmlsZSBpcyBvcGVuIHdo aWxlCisJCSAqIGluZGl2aWR1YWwgYmxvYiBkYXRhIGZpbGVzIGFyZSBiZWluZyB3cml0dGVuKS4g IFRoZSBpbkxPcyBjaGVjaworCQkgKiBpcyBuZWVkZWQgYmV5b25kIGRpcmVjdFdyaXRlTWVtYmVy PT1OVUxMIGJlY2F1c2UgdGhlIGxvVG9jIG1lbWJlcgorCQkgKiBzdGF5cyBvcGVuIGFuZCByZWNl aXZlcyBpbnRlcmxlYXZlZCB0YXJQcmludGYgd3JpdGVzIHdoaWxlIGJsb2IKKwkJICogZGF0YSBm aWxlcyBhcmUgYmVpbmcgZmluYWxpemVkLCB3aGljaCB3b3VsZCBjb3JydXB0IHRoZSBhcmNoaXZl CisJCSAqIGlmIGxvVG9jIHdlcmUgaW4gZGlyZWN0LXdyaXRlIG1vZGUuCisJCSAqCisJCSAqIE5v dGU6IHRhckZIcG9zIGlzIG5vdCBrZXB0IHVwLXRvLWRhdGUgZHVyaW5nIGRpcmVjdCB3cml0ZXMK KwkJICogKHRhcldyaXRlIHVwZGF0ZXMgdGgtPnBvcyBidXQgbm90IGN0eC0+dGFyRkhwb3MpLiAg V2UgZml4IGl0CisJCSAqIGluIF90YXJBZGRGaWxlIHVzaW5nIGZ0ZWxsbygpIGFmdGVyIHRoZSBt ZW1iZXIgaXMgY29tcGxldGUuCiAJCSAqLwotCQlvbGRfdW1hc2sgPSB1bWFzayhTX0lSV1hHIHwg U19JUldYTyk7CisJCWlmIChjdHgtPmhhc1NlZWsgJiYgY3R4LT5kaXJlY3RXcml0ZU1lbWJlciA9 PSBOVUxMICYmCisJCQkhY3R4LT5pbkxPcykKKwkJeworCQkJdG0tPnRtcEZIID0gTlVMTDsKKwkJ CXRtLT5uRkggPSBjdHgtPnRhckZIOwkvKiB0YXJXcml0ZSgpIHdyaXRlcyBkYXRhIGhlcmUgKi8K KwkJCXRtLT5oZWFkZXJQb3MgPSBjdHgtPnRhckZIcG9zOworCisJCQkvKiBXcml0ZSBhIHBsYWNl aG9sZGVyIGhlYWRlciAoZmlsZUxlbj0wLCB3aWxsIGJlIHJld3JpdHRlbikgKi8KKwkJCXRtLT50 YXJnZXRGaWxlID0gcGdfc3RyZHVwKGZpbGVuYW1lKTsKKwkJCXRtLT5maWxlTGVuID0gMDsKKwkJ CXRtLT50YXJGSCA9IGN0eC0+dGFyRkg7CS8qIF90YXJXcml0ZUhlYWRlcigpIHdyaXRlcyBoZXJl ICovCisJCQlfdGFyV3JpdGVIZWFkZXIodG0pOworCQkJY3R4LT50YXJGSHBvcyArPSBUQVJfQkxP Q0tfU0laRTsKKwkJCWN0eC0+ZGlyZWN0V3JpdGVNZW1iZXIgPSB0bTsKKwkJfQorCQllbHNlCisJ CXsKKwkJCWludAkJCW9sZF91bWFzazsKKworCQkJLyoKKwkJCSAqIFBPU0lYIGRvZXMgbm90IHJl cXVpcmUsIGJ1dCBwZXJtaXRzLCB0bXBmaWxlKCkgdG8gcmVzdHJpY3QKKwkJCSAqIGZpbGUgcGVy bWlzc2lvbnMuICBHaXZlbiBhbiBPUyBjcmFzaCBhZnRlciB3ZSB3cml0ZSBkYXRhLAorCQkJICog dGhlIGZpbGVzeXN0ZW0gbWlnaHQgcmV0YWluIHRoZSBkYXRhIGJ1dCBmb3JnZXQgdG1wZmlsZSgp J3MKKwkJCSAqIHVubGluaygpLiAgSWYgc28sIHRoZSBmaWxlIG1vZGUgcHJvdGVjdHMgY29uZmlk ZW50aWFsaXR5IG9mCisJCQkgKiB0aGUgZGF0YSB3cml0dGVuLgorCQkJICovCisJCQlvbGRfdW1h c2sgPSB1bWFzayhTX0lSV1hHIHwgU19JUldYTyk7CiAKICNpZm5kZWYgV0lOMzIKLQkJdG0tPnRt cEZIID0gdG1wZmlsZSgpOworCQkJdG0tPnRtcEZIID0gdG1wZmlsZSgpOwogI2Vsc2UKIAotCQkv KgotCQkgKiBPbiBXSU4zMiwgdG1wZmlsZSgpIGdlbmVyYXRlcyBhIGZpbGVuYW1lIGluIHRoZSBy b290IGRpcmVjdG9yeSwKLQkJICogd2hpY2ggcmVxdWlyZXMgYWRtaW5pc3RyYXRpdmUgcGVybWlz c2lvbnMgb24gY2VydGFpbiBzeXN0ZW1zLiBMb29wCi0JCSAqIHVudGlsIHdlIGZpbmQgYSB1bmlx dWUgZmlsZSBuYW1lIHdlIGNhbiBjcmVhdGUuCi0JCSAqLwotCQl3aGlsZSAoMSkKLQkJewotCQkJ Y2hhcgkgICAqbmFtZTsKLQkJCWludAkJCWZkOworCQkJLyoKKwkJCSAqIE9uIFdJTjMyLCB0bXBm aWxlKCkgZ2VuZXJhdGVzIGEgZmlsZW5hbWUgaW4gdGhlIHJvb3QKKwkJCSAqIGRpcmVjdG9yeSwg d2hpY2ggcmVxdWlyZXMgYWRtaW5pc3RyYXRpdmUgcGVybWlzc2lvbnMgb24KKwkJCSAqIGNlcnRh aW4gc3lzdGVtcy4gTG9vcCB1bnRpbCB3ZSBmaW5kIGEgdW5pcXVlIGZpbGUgbmFtZSB3ZQorCQkJ ICogY2FuIGNyZWF0ZS4KKwkJCSAqLworCQkJd2hpbGUgKDEpCisJCQl7CisJCQkJY2hhcgkgICAq bmFtZTsKKwkJCQlpbnQJCQlmZDsKIAotCQkJbmFtZSA9IF90ZW1wbmFtKE5VTEwsICJwZ190ZW1w XyIpOwotCQkJaWYgKG5hbWUgPT0gTlVMTCkKLQkJCQlicmVhazsKLQkJCWZkID0gb3BlbihuYW1l LCBPX1JEV1IgfCBPX0NSRUFUIHwgT19FWENMIHwgT19CSU5BUlkgfAotCQkJCQkgIE9fVEVNUE9S QVJZLCBTX0lSVVNSIHwgU19JV1VTUik7Ci0JCQlmcmVlKG5hbWUpOworCQkJCW5hbWUgPSBfdGVt cG5hbShOVUxMLCAicGdfdGVtcF8iKTsKKwkJCQlpZiAobmFtZSA9PSBOVUxMKQorCQkJCQlicmVh azsKKwkJCQlmZCA9IG9wZW4obmFtZSwgT19SRFdSIHwgT19DUkVBVCB8IE9fRVhDTCB8IE9fQklO QVJZIHwKKwkJCQkJCSAgT19URU1QT1JBUlksIFNfSVJVU1IgfCBTX0lXVVNSKTsKKwkJCQlmcmVl KG5hbWUpOwogCi0JCQlpZiAoZmQgIT0gLTEpCQkvKiBjcmVhdGVkIGEgZmlsZSAqLwotCQkJewot CQkJCXRtLT50bXBGSCA9IGZkb3BlbihmZCwgIncrYiIpOwotCQkJCWJyZWFrOworCQkJCWlmIChm ZCAhPSAtMSkJLyogY3JlYXRlZCBhIGZpbGUgKi8KKwkJCQl7CisJCQkJCXRtLT50bXBGSCA9IGZk b3BlbihmZCwgIncrYiIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZSBpZiAoZXJybm8g IT0gRUVYSVNUKQorCQkJCQlicmVhazsKIAkJCX0KLQkJCWVsc2UgaWYgKGVycm5vICE9IEVFWElT VCkJLyogZmFpbHVyZSBvdGhlciB0aGFuIGZpbGUgZXhpc3RzICovCi0JCQkJYnJlYWs7Ci0JCX0K ICNlbmRpZgogCi0JCWlmICh0bS0+dG1wRkggPT0gTlVMTCkKLQkJCXBnX2ZhdGFsKCJjb3VsZCBu b3QgZ2VuZXJhdGUgdGVtcG9yYXJ5IGZpbGUgbmFtZTogJW0iKTsKKwkJCWlmICh0bS0+dG1wRkgg PT0gTlVMTCkKKwkJCQlwZ19mYXRhbCgiY291bGQgbm90IGdlbmVyYXRlIHRlbXBvcmFyeSBmaWxl IG5hbWU6ICVtIik7CiAKLQkJdW1hc2sob2xkX3VtYXNrKTsKKwkJCXVtYXNrKG9sZF91bWFzayk7 CiAKLQkJaWYgKEFILT5jb21wcmVzc2lvbl9zcGVjLmFsZ29yaXRobSA9PSBQR19DT01QUkVTU0lP Tl9OT05FKQogCQkJdG0tPm5GSCA9IHRtLT50bXBGSDsKLQkJZWxzZQorCQkJdG0tPnRhcmdldEZp bGUgPSBwZ19zdHJkdXAoZmlsZW5hbWUpOworCQl9CisKKwkJaWYgKEFILT5jb21wcmVzc2lvbl9z cGVjLmFsZ29yaXRobSAhPSBQR19DT01QUkVTU0lPTl9OT05FKQogCQkJcGdfZmF0YWwoImNvbXBy ZXNzaW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGFyIGFyY2hpdmUgZm9ybWF0Iik7CiAKIAkJdG0t PkFIID0gQUg7Ci0JCXRtLT50YXJnZXRGaWxlID0gcGdfc3RyZHVwKGZpbGVuYW1lKTsKIAl9CiAK IAl0bS0+bW9kZSA9IG1vZGU7CkBAIC04ODIsNiArOTI3LDcgQEAgX1N0YXJ0TE9zKEFyY2hpdmVI YW5kbGUgKkFILCBUb2NFbnRyeSAqdGUpCiAJY2hhcgkJZm5hbWVbS19TVERfQlVGX1NJWkVdOwog CiAJc3ByaW50ZihmbmFtZSwgImJsb2JzXyVkLnRvYyIsIHRlLT5kdW1wSWQpOworCWN0eC0+aW5M T3MgPSB0cnVlOwogCWN0eC0+bG9Ub2MgPSB0YXJPcGVuKEFILCBmbmFtZSwgJ3cnKTsKIH0KIApA QCAtOTQxLDYgKzk4Nyw3IEBAIF9FbmRMT3MoQXJjaGl2ZUhhbmRsZSAqQUgsIFRvY0VudHJ5ICp0 ZSkKIAkvKiBXcml0ZUludChBSCwgMCk7ICovCiAKIAl0YXJDbG9zZShBSCwgY3R4LT5sb1RvYyk7 CisJY3R4LT5pbkxPcyA9IGZhbHNlOwogfQogCiAKQEAgLTk4OSw1MSArMTAzNiw5NSBAQCBzdGF0 aWMgdm9pZAogX3RhckFkZEZpbGUoQXJjaGl2ZUhhbmRsZSAqQUgsIFRBUl9NRU1CRVIgKnRoKQog ewogCWxjbENvbnRleHQgKmN0eCA9IChsY2xDb250ZXh0ICopIEFILT5mb3JtYXREYXRhOwotCUZJ TEUJICAgKnRtcCA9IHRoLT50bXBGSDsJLyogR3JhYiBpdCBmb3IgY29udmVuaWVuY2UgKi8KLQlj aGFyCQlidWZbMzI3NjhdOwotCXNpemVfdAkJY250OwotCXBnb2ZmX3QJCWxlbiA9IDA7Ci0Jc2l6 ZV90CQlyZXM7CiAJc2l6ZV90CQlpLAogCQkJCXBhZDsKIAotCS8qCi0JICogRmluZCBmaWxlIGxl biAmIGdvIGJhY2sgdG8gc3RhcnQuCi0JICovCi0JaWYgKGZzZWVrbyh0bXAsIDAsIFNFRUtfRU5E KSAhPSAwKQotCQlwZ19mYXRhbCgiZXJyb3IgZHVyaW5nIGZpbGUgc2VlazogJW0iKTsKLQl0aC0+ ZmlsZUxlbiA9IGZ0ZWxsbyh0bXApOwotCWlmICh0aC0+ZmlsZUxlbiA8IDApCi0JCXBnX2ZhdGFs KCJjb3VsZCBub3QgZGV0ZXJtaW5lIHNlZWsgcG9zaXRpb24gaW4gYXJjaGl2ZSBmaWxlOiAlbSIp OwotCWlmIChmc2Vla28odG1wLCAwLCBTRUVLX1NFVCkgIT0gMCkKLQkJcGdfZmF0YWwoImVycm9y IGR1cmluZyBmaWxlIHNlZWs6ICVtIik7Ci0KLQlfdGFyV3JpdGVIZWFkZXIodGgpOwotCi0Jd2hp bGUgKChjbnQgPSBmcmVhZChidWYsIDEsIHNpemVvZihidWYpLCB0bXApKSA+IDApCisJaWYgKHRo LT50bXBGSCA9PSBOVUxMKQogCXsKLQkJaWYgKChyZXMgPSBmd3JpdGUoYnVmLCAxLCBjbnQsIHRo LT50YXJGSCkpICE9IGNudCkKKwkJLyoKKwkJICogRGlyZWN0LXdyaXRlIG1vZGU6IGRhdGEgd2Fz IHdyaXR0ZW4gZGlyZWN0bHkgdG8gdGFyRkggYWZ0ZXIgYQorCQkgKiBwbGFjZWhvbGRlciBoZWFk ZXIuICBTZWVrIGJhY2sgdG8gcmV3cml0ZSB0aGUgaGVhZGVyIHdpdGggdGhlCisJCSAqIGFjdHVh bCBmaWxlIGxlbmd0aCwgdGhlbiBzZWVrIHRvIHRoZSBlbmQgYW5kIHdyaXRlIHBhZGRpbmcuCisJ CSAqLworCQlwZ29mZl90CQllbmRQb3M7CisKKwkJLyogRmx1c2ggYW55IGJ1ZmZlcmVkIGRhdGEg c28gZnRlbGxvIHJldHVybnMgdGhlIHJpZ2h0IHBvc2l0aW9uICovCisJCWlmIChmZmx1c2godGgt PnRhckZIKSAhPSAwKQogCQkJV1JJVEVfRVJST1JfRVhJVDsKLQkJbGVuICs9IHJlczsKLQl9Ci0J aWYgKCFmZW9mKHRtcCkpCi0JCVJFQURfRVJST1JfRVhJVCh0bXApOwogCi0JaWYgKGZjbG9zZSh0 bXApICE9IDApCQkvKiBUaGlzICpzaG91bGQqIGRlbGV0ZSBpdC4uLiAqLwotCQlwZ19mYXRhbCgi Y291bGQgbm90IGNsb3NlIHRlbXBvcmFyeSBmaWxlOiAlbSIpOworCQllbmRQb3MgPSBmdGVsbG8o dGgtPnRhckZIKTsKKwkJaWYgKGVuZFBvcyA8IDApCisJCQlwZ19mYXRhbCgiY291bGQgbm90IGRl dGVybWluZSBzZWVrIHBvc2l0aW9uIGluIGFyY2hpdmUgZmlsZTogJW0iKTsKIAotCWlmIChsZW4g IT0gdGgtPmZpbGVMZW4pCi0JCXBnX2ZhdGFsKCJhY3R1YWwgZmlsZSBsZW5ndGggKCVsbGQpIGRv ZXMgbm90IG1hdGNoIGV4cGVjdGVkICglbGxkKSIsCi0JCQkJIChsb25nIGxvbmcpIGxlbiwgKGxv bmcgbG9uZykgdGgtPmZpbGVMZW4pOworCQl0aC0+ZmlsZUxlbiA9IGVuZFBvcyAtIHRoLT5oZWFk ZXJQb3MgLSBUQVJfQkxPQ0tfU0laRTsKIAotCXBhZCA9IHRhclBhZGRpbmdCeXRlc1JlcXVpcmVk KGxlbik7Ci0JZm9yIChpID0gMDsgaSA8IHBhZDsgaSsrKQotCXsKLQkJaWYgKGZwdXRjKCdcMCcs IHRoLT50YXJGSCkgPT0gRU9GKQotCQkJV1JJVEVfRVJST1JfRVhJVDsKKwkJLyogU2VlayBiYWNr IHRvIHJld3JpdGUgdGhlIGhlYWRlciB3aXRoIHRoZSBjb3JyZWN0IGxlbmd0aCAqLworCQlpZiAo ZnNlZWtvKHRoLT50YXJGSCwgdGgtPmhlYWRlclBvcywgU0VFS19TRVQpICE9IDApCisJCQlwZ19m YXRhbCgiZXJyb3IgZHVyaW5nIGZpbGUgc2VlazogJW0iKTsKKworCQlfdGFyV3JpdGVIZWFkZXIo dGgpOworCisJCS8qIFNlZWsgYmFjayB0byBlbmQgb2YgZGF0YSAqLworCQlpZiAoZnNlZWtvKHRo LT50YXJGSCwgZW5kUG9zLCBTRUVLX1NFVCkgIT0gMCkKKwkJCXBnX2ZhdGFsKCJlcnJvciBkdXJp bmcgZmlsZSBzZWVrOiAlbSIpOworCisJCS8qIFdyaXRlIHRhciBwYWRkaW5nICovCisJCXBhZCA9 IHRhclBhZGRpbmdCeXRlc1JlcXVpcmVkKHRoLT5maWxlTGVuKTsKKwkJZm9yIChpID0gMDsgaSA8 IHBhZDsgaSsrKQorCQl7CisJCQlpZiAoZnB1dGMoJ1wwJywgdGgtPnRhckZIKSA9PSBFT0YpCisJ CQkJV1JJVEVfRVJST1JfRVhJVDsKKwkJfQorCisJCWN0eC0+dGFyRkhwb3MgPSBlbmRQb3MgKyBw YWQ7CisJCWN0eC0+ZGlyZWN0V3JpdGVNZW1iZXIgPSBOVUxMOwogCX0KKwllbHNlCisJeworCQkv KgorCQkgKiBUbXBmaWxlIG1vZGU6IGNvcHkgZGF0YSBmcm9tIHRtcGZpbGUgdG8gdGFyRkggKG9y aWdpbmFsIHBhdGgpLgorCQkgKi8KKwkJRklMRQkgICAqdG1wID0gdGgtPnRtcEZIOworCQljaGFy CQlidWZbMzI3NjhdOworCQlzaXplX3QJCWNudDsKKwkJcGdvZmZfdAkJbGVuID0gMDsKKwkJc2l6 ZV90CQlyZXM7CisKKwkJaWYgKGZzZWVrbyh0bXAsIDAsIFNFRUtfRU5EKSAhPSAwKQorCQkJcGdf ZmF0YWwoImVycm9yIGR1cmluZyBmaWxlIHNlZWs6ICVtIik7CisJCXRoLT5maWxlTGVuID0gZnRl bGxvKHRtcCk7CisJCWlmICh0aC0+ZmlsZUxlbiA8IDApCisJCQlwZ19mYXRhbCgiY291bGQgbm90 IGRldGVybWluZSBzZWVrIHBvc2l0aW9uIGluIGFyY2hpdmUgZmlsZTogJW0iKTsKKwkJaWYgKGZz ZWVrbyh0bXAsIDAsIFNFRUtfU0VUKSAhPSAwKQorCQkJcGdfZmF0YWwoImVycm9yIGR1cmluZyBm aWxlIHNlZWs6ICVtIik7CisKKwkJX3RhcldyaXRlSGVhZGVyKHRoKTsKKworCQl3aGlsZSAoKGNu dCA9IGZyZWFkKGJ1ZiwgMSwgc2l6ZW9mKGJ1ZiksIHRtcCkpID4gMCkKKwkJeworCQkJaWYgKChy ZXMgPSBmd3JpdGUoYnVmLCAxLCBjbnQsIHRoLT50YXJGSCkpICE9IGNudCkKKwkJCQlXUklURV9F UlJPUl9FWElUOworCQkJbGVuICs9IHJlczsKKwkJfQorCQlpZiAoIWZlb2YodG1wKSkKKwkJCVJF QURfRVJST1JfRVhJVCh0bXApOwogCi0JY3R4LT50YXJGSHBvcyArPSBsZW4gKyBwYWQ7CisJCWlm IChmY2xvc2UodG1wKSAhPSAwKQorCQkJcGdfZmF0YWwoImNvdWxkIG5vdCBjbG9zZSB0ZW1wb3Jh cnkgZmlsZTogJW0iKTsKKworCQlpZiAobGVuICE9IHRoLT5maWxlTGVuKQorCQkJcGdfZmF0YWwo ImFjdHVhbCBmaWxlIGxlbmd0aCAoJWxsZCkgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgKCVsbGQp IiwKKwkJCQkJIChsb25nIGxvbmcpIGxlbiwgKGxvbmcgbG9uZykgdGgtPmZpbGVMZW4pOworCisJ CXBhZCA9IHRhclBhZGRpbmdCeXRlc1JlcXVpcmVkKGxlbik7CisJCWZvciAoaSA9IDA7IGkgPCBw YWQ7IGkrKykKKwkJeworCQkJaWYgKGZwdXRjKCdcMCcsIHRoLT50YXJGSCkgPT0gRU9GKQorCQkJ CVdSSVRFX0VSUk9SX0VYSVQ7CisJCX0KKworCQljdHgtPnRhckZIcG9zICs9IGxlbiArIHBhZDsK Kwl9CiB9CiAKIC8qIExvY2F0ZSB0aGUgZmlsZSBpbiB0aGUgYXJjaGl2ZSwgcmVhZCBoZWFkZXIg YW5kIHBvc2l0aW9uIHRvIGRhdGEgKi8K --0000000000003e346a064f9d4ad2--