From nobody Tue Feb 10 02:54:41 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 15000468684613.4198402894820674; Fri, 14 Jul 2017 08:41:08 -0700 (PDT) Received: from localhost ([::1]:38605 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dW2iD-0007Ce-T5 for importer@patchew.org; Fri, 14 Jul 2017 11:41:01 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40409) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dW2fx-0004sw-2Q for qemu-devel@nongnu.org; Fri, 14 Jul 2017 11:38:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dW2fv-0004xL-ED for qemu-devel@nongnu.org; Fri, 14 Jul 2017 11:38:41 -0400 Received: from mail-eopbgr20115.outbound.protection.outlook.com ([40.107.2.115]:63125 helo=EUR02-VE1-obe.outbound.protection.outlook.com) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dW2fp-0004sQ-Os; Fri, 14 Jul 2017 11:38:34 -0400 Received: from pavelb-Z68P-DS3.sw.ru (195.214.232.6) by HE1PR0802MB2556.eurprd08.prod.outlook.com (2603:10a6:3:e1::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1240.13; Fri, 14 Jul 2017 15:38:31 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=21U+9Q6lvnlVtrsGdI5lJiowqqzv59NIcNkbaKIG8e8=; b=TqY5DkQ/WTeDKJHzgXbtuvD43E2lOhg4ejCQaYBOQrFZQksywH+EQ/gaTkv7lNcQR5Rd4oKHVW8T36us1bWNRrOIxclu8c/Yi7hg5VojfZgHJq003V00j6AbNFBt4yAcQDRJZ6IcMpKWRT2lMP3ZqiTMzKvrPJ9+m9Ts4A5+FRw= Authentication-Results: nongnu.org; dkim=none (message not signed) header.d=none; nongnu.org; dmarc=none action=none header.from=virtuozzo.com; From: Pavel Butsykin To: qemu-block@nongnu.org, qemu-devel@nongnu.org Date: Fri, 14 Jul 2017 18:37:48 +0300 Message-Id: <20170714153749.25132-4-pbutsykin@virtuozzo.com> X-Mailer: git-send-email 2.13.0 In-Reply-To: <20170714153749.25132-1-pbutsykin@virtuozzo.com> References: <20170714153749.25132-1-pbutsykin@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: DB6PR1001CA0027.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:4:55::13) To HE1PR0802MB2556.eurprd08.prod.outlook.com (2603:10a6:3:e1::21) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 26d048bb-91d6-41d6-1381-08d4cace61f5 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(300000503095)(300135400095)(201703131423075)(201703031133081)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095); SRVR:HE1PR0802MB2556; X-Microsoft-Exchange-Diagnostics: 1; HE1PR0802MB2556; 3:8KLafy8aXpsUCpu59blbfRo0XKWVEwvmu/Aywnrl0t9nDBnnk65Ig9A1xx8rf/sSi5Ec/e4P+keS+RHUtqyXIHQMeabaNLqj7zj8ALS7QPn1fIKjhuWVRNng1NZrtRNcooNh/oV+i1ncWPy3pX3l876Z81U6Qp3BOjnty3Be1C1ftAdiI4NrmFGOdIkdXp6LtUn8XBUpGYfcvBKLbF5EwbRWBNeWjNQ78ye3RCnmsYGxHUYiY4GMFh615c5ZQVNZkC/rm2XR64D+TifeLLFjEzR0lngCMhsvmB8xVQDocrDJbN+BqS0sWq1qJXI4k2XQXumVQ4PSaJvXhcj1Do88QsFUIbS1TU0DUG0Nbo2GziSD2bxvXPyf/h38nhGL3LYdnKGTkJFxp5N4KOFLoh4lXi+sXpVh4kK0pig40eYP1nyPYtTHprLCoWKNuJIto8Q/ZTq6674duE+lLJpoj8oG5sUtx+LGqMwfHUWMIaEfm5XvDsDRAXWWUNaiCVfmqDI252Zdt1QFooj9XUAGIz7PGGyzWlxJrsA2TMsvQdra2iaPuTUbRv11NmO6+8CiXg4wsMVfjIdd5GXDeV+d7qn1p1VGsnwfzRKRYOr7n7/Dgk64OvF3zcNVDqMtCxoy0umJzBAbalkpR0VXjE1PYipeR+D6CoIbSkv3hximNzy/VnLbkfIEsVI3pdUsKzeYBWqT6zExipjpb6UbHMSptM+s8w/2B8NVVTCFJLA/9jE9EII= X-MS-TrafficTypeDiagnostic: HE1PR0802MB2556: X-Microsoft-Exchange-Diagnostics: 1; HE1PR0802MB2556; 25:HcTOsXBvaeHO3gHLsAvwqJ8hyllBJ/dwvbkejiTmN0dYPfp+T6Aajoc4HxwgH9RNhjGxXSKNq1jLJvWxM7G9Zk8Bv1bAeclUMyjf7mRTOO0l56nhabLh/RDBv5sODkFbsae5HLVbY+t9qeFr0cfj3VM/BUIIlnv1I1rxFEY5Zik5qQXSlFTxVKaVxbukWz6VgFgoeOhKB+hlmR0zcDRJPYVOHxh3KtS9aOTUbZeV+PRyE++aPMzbEth+TeW5dnhw6YExn2n3jh/DnB1KFTmbp2x7plfWFIVduO4afgC3w0YJBcQY7NPOQdgfd6fz2cuTUbWCX2BCxCohfqQaPDegbXA7EbIDo3+WzQ88PDez9/npS5xFkOrd4Wf5SiAJPMcM0L9tg0GRTfC+H6yncRQrgJNDd6Wsbc9/C9jnZyK6rWapwVhyjtHtBIIEJ1F26XeN78S3NiSWgm3XGsxi9IWM/FRKTG2wcep+BeVKsuDXba3FzmhiinYnDI6RJTkfK0g9K3VMw9JWRvkvggJ1/5tHx+zPrw6ZMvLMa9VZVpxH54PrnL4fATuv6bfIZZTmvi+NfgkyR5+VnbBXLQpAejF+hUXqY8rGrNJjRIQo8II16hP06vEU5b5CDecz2IIlO3SOE4DhJa5hVmpOhUOEzUMM7AV2bbYxszx337InVWw3qezutL4Q7JsUScETgc7WmuwgUP/rV0OG/QsIFtGlCeYEhbFnqjTkb9wCwbsdHUEJE6Lav+z9ogEwQe1N4OJOPTl2Qr1WSKPh0trvIqdRFrnrHhO2z8bwmckXNGyR3IQEQEXzwkywxFVnxwfC/TXQkkN9YKm824GBHgEYRkuUqNHtRG8W0Q4jndjEvGBMCxHwzW9VaaHffZzrzlgOcwx/espZ1JYvbrdwDO/5WM2ybdLQZZNEFCc++VtORhiQRJ4Q7lM= X-Microsoft-Exchange-Diagnostics: 1; HE1PR0802MB2556; 31:BgkcccOXvzxWoAtZYjCgcuX9Y5HdeFVL3HOcWKTu3j5SrCR65z8wPHMXC10bV8IoZG8agclqHG309vasfghZr8MWqjAn1xMJXYpLeMpQ0EzBzUaV+z5L55oSYxqtDGopSAsnhdPL6hWwEP088rYGMZ+79EbFXH99e3zK/RM/eFcE53scBMrxtkrzxdSLOdnj4jrkJkGu7FHXAyz9h/oNGlkXCslsXPyS0ieGD03KUSbve18UQcG7zoEmLnAY5dN57qrgYUCC63aLvlvBKOVUOzZ2g+IQLTEOIjGbWIoqBEO6N1gJxPqDsHfMVjIgBn6j2eOn79dSdip76D+mtPoqugczxVmthA2cXUeEvb/Ncitzelshs5YaHfxdBzsHErwYdUKDMUU/QJx0IlQC1uplodUXxKgZPzv2VkyNeRxTnMOhYU3r1DhNjJydYtnJeO59kBhhiTyZQG7ROxbU4O97eflGu3XNVcmMvLgm6Bl4pRuWMOuhqRO3eD2DZiZ1yjUfikegL+BlgBdSVjM62eYRVs4Wymctf5jUEmkMpLoZtdGGTbdO3YQsZglZBXMRnrusJlMboOaMF6PFggd2fKG9WoyerJegl7QWD9iSgGKzvHjwgsd20bYAklHEqkpRN/ki00DlLgTxh3B9fbUChrQGXr5YymvZkJHpYVp6ADtUkmE= X-Microsoft-Exchange-Diagnostics: 1; HE1PR0802MB2556; 20:yamf6bFslhiJdZIwe6MZMkRWB8HJ/s9DdbO47CSkEz3/4U1AgCJRIrACwDctqYprhV+73RqB0izDSHZs1E1atKzhZ2RyGL5Qgcg3oBJnJjCXYMpehiau9dHyde4i3/c99BWfF9zBzOvIzAAeHzYutHk2V77lFVwkDwGM0jXAPnVi3N36eRi3mNHjPs0dN5gwlUlNWJDESRopT2/Ff2yhtKshZcmPsUlyM4agY4wWuzPcTD8iWMUgq7ZbyEmWsHyJ2/tesZYUu0rEmLnu2LGOhwSdq2lW53rp1RD6ODtuoUUyqhAz1b2mHK0hCTNllTfpOLDyU04eJkS/Z2Q5NIL2tgHtvEIa0xOHvJXSjlSmBN9V95CuDU0ewc1K2ZfXrN+kOB2wE1zIIK5xJqSsD2OUptVeiGZqQSBv27lVwjbQhCU= X-Exchange-Antispam-Report-Test: UriScan:(133145235818549)(236129657087228)(148574349560750)(167848164394848); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(2017060910075)(5005006)(8121501046)(3002001)(100000703101)(100105400095)(10201501046)(93006095)(93001095)(6041248)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(20161123562025)(20161123560025)(20161123555025)(20161123564025)(6072148)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:HE1PR0802MB2556; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:HE1PR0802MB2556; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; HE1PR0802MB2556; 4:5C972EVfmKb5+/jUil+lg5wcGBtLvOJmeiY4qtQw?= =?us-ascii?Q?/2KhM1Edu1Vk2Rh6siUJ6ZaoifyXpFgwi+gxZTNkbcF6PMvZ5iLQVVF5Vvlb?= =?us-ascii?Q?I6nDSrou406PNWi5Lw8eVBQZUGqL3k2lhT2ZPyTs0wefbJnAb+N+syeYdmX0?= =?us-ascii?Q?p0cjJIJZ1mR3avxTIQ9oTjiwTNLzTWKuz1uM7zpoVbrurgF1FOsYy8mNx+zV?= =?us-ascii?Q?9km26vnrto3oLMk0WAa47HPfWCr6s1rwvuVJV+EiCYo7bK2ByvAwcKUkuYTt?= =?us-ascii?Q?0uMmM9CnA2CZKHLQ6bvmtjkyYrIdpQjPsX4jHaZ7FbtfB3QKHQQBMy+YVYlV?= =?us-ascii?Q?VWaYpQA7S+wwh3kg9I0TFCUher//oJ7iYPIsNTcmsebsM3b+lT8SRuFexPY2?= =?us-ascii?Q?FZCGE9E0LMJ6wXBmGVIJ3jrq+jPQzAUXzhLOtycDiuOpvmRqiwuWCjqQClnY?= =?us-ascii?Q?pSkbrevzJi0dZ55jiLLFQMhAdks9/2M35qVbyFtEVt90pv//y45E7lUZRCVw?= =?us-ascii?Q?HKTgj+XQigCPzl/fIPplH0TquW1c9ugVqLzxA1zv3t8LsGbFLaCYZloy+XYT?= =?us-ascii?Q?uGqdsbOHzZWbYrury0XXnIGGZCgef2El/IkHVHt0xZHa9ZPxG+LhAaGMos94?= =?us-ascii?Q?5LihJ37FKqpK4cd0B2lhxkUgk1eSodDyI5Y1j+aDrbdXlWXSCa61ReInj+6l?= =?us-ascii?Q?Hte/LikuptqS6YKCeda0znreX+szV65kCN0D6jE5EO1wsVqtPQvGjev80eeI?= =?us-ascii?Q?BAKktosEr5o1ZasSOwCqPgIut6BKWtgFS6qQsfznOGKlwTFhZtKSNjanXqlA?= =?us-ascii?Q?ZjVqazjJjC+v59oBxcxRHZYmE23udD2gdnhQ9Az4I+n5BLXeSFu6CO0J7riS?= =?us-ascii?Q?BQ+QgAyklITz5CR4AXBYqbKTsabKiaNEL73rnazlOwOBHoPh1ING3oLYxPrQ?= =?us-ascii?Q?/zDCfThAz7sXCoMPbirZZUdmfkuuc6mUv7sfAK+QuAK++fWWNd8hO30ne5yP?= =?us-ascii?Q?r4KQmwC50gSPJWoZBfka2+AK52JKsHnZOXEWLvjz+rgtd4XsHYTCVcw+DYr+?= =?us-ascii?Q?KFJ6mCRbt8SMjCddMY/ujKrDWdr1jmgOYuU9nRIdrHn12L8xAs/wd505xeL+?= =?us-ascii?Q?TAUiwjDqODljQqiEZA+TL67IV2pqDfSvHxpHTLa9fRFK/+ASbu/sbLvGGjlG?= =?us-ascii?Q?gWi0LlI/Da20Jhh1upYR9aj+/hm1ys7Bv91U1B+82GRqNv1FrDTV/gTaFlD9?= =?us-ascii?Q?iJHst8Anx8vUz9eZYc9M+MwAOOcf8I5xvAAIfjzbKfM7r9XEDmAjC/JR89Ok?= =?us-ascii?Q?3t7JJfKKc0PBdivO/6HJzwvq5pnY0bM/9h7ri0CVyDCg?= X-Forefront-PRVS: 0368E78B5B X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(7370300001)(4630300001)(6009001)(39400400002)(39410400002)(39840400002)(39450400003)(6666003)(478600001)(6486002)(5003940100001)(3846002)(38730400002)(50466002)(6506006)(110136004)(53416004)(6116002)(107886003)(33646002)(48376002)(2950100002)(6512007)(4326008)(53936002)(7350300001)(189998001)(8676002)(47776003)(66066001)(5660300001)(1076002)(50986999)(76176999)(305945005)(42186005)(7736002)(81166006)(86362001)(25786009)(50226002)(2906002)(36756003); DIR:OUT; SFP:1102; SCL:1; SRVR:HE1PR0802MB2556; H:pavelb-Z68P-DS3.sw.ru; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; HE1PR0802MB2556; 23:MJ3OgFFDqKNbGW3lesfuntxpu/nhObj46t05aAz?= =?us-ascii?Q?hkE9vvn96YjXDqnmTQn1hJuzyahqKHypmEFgJuyQDQHRVW9mUcBGQFyNdlPC?= =?us-ascii?Q?2mg3LLcnFVktuXtE1dhac4gcw9ThR/+l9kyvCA8C6GVuyIxbIpDOWqidiLUA?= =?us-ascii?Q?cUZ/i9tAAO+Acsb3GIWQUtTFXEnde+7dwxW5J4jSEwi5g1aluNNo+Vjg26Hr?= =?us-ascii?Q?M0fZKfccL8vL6vzp9SaOrh+4vuu46Wd7/itmmjIhFjkiw84jalcTcFAWljIo?= =?us-ascii?Q?7KV19+TGDO4UoUuPQslL5nX7/LpRa6Oj35vSq5QjLHYb2Q0hZSGcPYZ3cwGE?= =?us-ascii?Q?v+snWIkKc87ZDW4LqzMxulg3x00B4WgDZDlvJ8V1Emx0671nQ/6RunBV7se3?= =?us-ascii?Q?5KXxlDl/YEKKsnPBBpyPrvXbdH5a8+wKqroxRozN5Ij2i2Z7rBzPg9R0yTe8?= =?us-ascii?Q?FgAP/kMp8dVw9y4DmfXZqfKIzoxnPRnv7qi5V/Owxiy8qBaIcHMv16eH13oh?= =?us-ascii?Q?WRjFjsBDVbZiy/V0g+9BkTzyuPSaLfvGPT6k6NO/XLGmSmltwp8M89GXrlDL?= =?us-ascii?Q?agl1deJzYrDiCExfpk8W9Q7ujVn7egJu1FAjne2RLfHfnUZNEg/Z3M0VRyZr?= =?us-ascii?Q?ck63o0QqcM1eTr1SImMhbNNnanhMAQE436bM50EVrECyoLdG16OmOgNIQQIG?= =?us-ascii?Q?1vfwQTPU/lMp2qVprt6ylZHP4QeIA1YQz2XbpaDShqKWf1ldGeoMf/1+lFwc?= =?us-ascii?Q?uOQb1a+qU0zTK0EhNyWGy0Whg0wP2YdoTuHSm7lpcXlN2ISA5Dh7FQAJDoSW?= =?us-ascii?Q?bs9VDp//lEMD9lI9i8ODBf+MujtyhJvmoUVrLLr3L1Nwice5/yu79zAJaXLW?= =?us-ascii?Q?VXrY+sPKran1GEnfhWj951QaJyAfTl0s+5jkbDiI33vHNq01lhOfn7ViT5+l?= =?us-ascii?Q?2Ahx7a14az3q7c5A9br9K8Qbo1K8WR3Fn2z21rjM/0iQTc64Trc0O1autyhm?= =?us-ascii?Q?r+5Wpn3XhvJ0fOsgaEo5RtGkMW4HjtVp+HNfT5Ok7WarQrlYle78/LzVbkB8?= =?us-ascii?Q?g/tww+IryLZ4wIlYGWwMRDyMeOar9L6fi0VYEfWp3JXvA8yosZQ=3D=3D?= X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; HE1PR0802MB2556; 6:lafqR6lZOPxfv/fjIs1TBtH0gQPJFoOxCg8ifIza?= =?us-ascii?Q?1AA2VW1yGAt50pHxpLOohDUVC1S9THhPJ3ud9yFRpPXFIrXg2FT5h4gh20dx?= =?us-ascii?Q?x28pTTpQdRZXx/Js7a1CW5cRX0X32BTv2Jw506w775yGMffWm5EFonWu7ybi?= =?us-ascii?Q?d3vHfksVAaGjJ18OB0p1qnrYaCiMIEj1Z5LX2XYz7ufMlNz9V0rw2TYbCc/E?= =?us-ascii?Q?LF472/bJyGqrzdUs8gbC2iqcWMewSkJ+ZjwpW5YWQ2DeT36NwQ+eESHzCjh1?= =?us-ascii?Q?j8z9HEyt4z0K89ZO93/pvZ15Rr7PfDQQ9Zls/E33fnKIx6o5MSwFlwyHtcRR?= =?us-ascii?Q?nl+8we3Cwmona+CyVbBm8mqPHCZilwGVz+oyEe6hmqh6Kaj/XvPel1SSDkYc?= =?us-ascii?Q?mMyfiO6PolELxnvs8rF/GElw9cZWki6jdBhl10UexqcVStObopREAsiEw/a2?= =?us-ascii?Q?LoilKds/WpDOuKkGqBLYKQBMABnP+1j2Di/5HqX7kJKP/eysId8zc3MxImir?= =?us-ascii?Q?R20QDCPJeqTrMjVDXWVvkH1VAh9dJgUUuStl7h3r+w704MHM9sifkdH0XdQ8?= =?us-ascii?Q?9/B5t/sSEzviI+/msQbGFsMub8JyqzgWA2t1dSsjdzBC5cSG/Lm0iMy7flKi?= =?us-ascii?Q?Wi36lOwKoBobFcmoSQmfoGdrqcgRcs1z+/LB4XkBKRkWjP+k8Tqox056UFp+?= =?us-ascii?Q?UGJPQkrIGtI/JnXJzDAmsJlFJaZ3er6o5YpLfO4Kok7YK5j/fZ1LafAbP/fd?= =?us-ascii?Q?5pMYLfkphsNdKMogOOigBz9ECYcy5ZHkXCMA4UpXtZPRZZr/gEqidAYeQq6D?= =?us-ascii?Q?9JUbxOQDizT7NnjmT6eyMFXSpd3ATtpwV5kY0fVvouUmvKz7oR343SjozfQh?= =?us-ascii?Q?pewTzrLUliB/nNhNZNUfu0dz4hC9agadm5f/TXgNKHa6UX8VEkVXL/m5o8/C?= =?us-ascii?Q?ymAurgYpIfqoy+3sRZsr1mYpvqbxZExm5EG7AG7mWhRUfd+tIUV27UNTZMl6?= =?us-ascii?Q?K1A=3D?= X-Microsoft-Exchange-Diagnostics: 1; HE1PR0802MB2556; 5:Fd7+FuwLDWdysoLxhDE4YuKzIVeq4qO4xc7rpsiFXUAH/aCT/D8nzzHi4FNgaznpLl5tAZVsXKSWCEO2ormgL+OkigQGj8WmSiBQWDaCcQ1y4lxJnXth5siE4ypmVCdE7O1FX5Drdaty8ma2xhmV3pJUPVeDkOfHlvfRdkaiMLPXnxMQrfrK3aa9QJva9NiomgAYR8UsjskmaaJf0mbWANjcSDnDkLMUO7vurdfYirk7SADUw0OVes8h9C0AZMQU0mWF0QnnOaIlSIHEvN+ExnszKwBDRACkfDerJjW7pJRGC+6yRwbngg5+d12pMSajoqcehX1iqo9Ju8L9iUtlBhjxRqCBDzzpixrs5WJadE9PZUKDfpau8mtCHmihu6MOIGC95nGWmPdhF7AdyPZGw4Kw/TJBaOCRO5zPqXmvxYSuBvyNZbl/FX/tljmdFR6Ra2BqldMNQf99vZ96b8yIFilDqRQ0fqWCYZQfrLUCjn8oStAsoWz5cwa7V/Nt/xoY; 24:zUiBtAeDzcbVdZN52BoehxOUu4rSHrOF0FWMxE1YGpsD0y2p03SJQcmtyq+XnxvOwhl9rUPOzBgL538TDtSEN/HnIWCBKVeKw0VoH1e3HhI= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; HE1PR0802MB2556; 7:Fr0qhtxW8f7dqC0LKNrce1TivX4d1OCHdcaBzkVbnISNvUARx88H8zseC0LmBrBQzVj1tden/PiX8vQf7hZYBzOWmqWrnD5lrWEflTCLKat/LpY0JRnjrXn5s+e839X1LWQNjovsJpEAubFil2RnUc2PxClxW4MPpFIk+PUBglKNWTto92gI6t0R/E1W0N20S3ijZ8dPzc0yYIbHmC47tVwkP+bDajvskqhZDyVdR6gihkALXKnWKykPiygDHT/YI2IHue50Yvak4sUXh7NBwiUOv9pZIXPUEqYgg3193GEs4SKkAzbDo2yzli9pb6UMQcTAW2dUSC1RbRQa/xA+car5jbWDXg3cB2EoAW3naPSFjnhrhTDAI4gX2a7pqBYQEPG/NgCPRpL7LF0Pv3RCeVUoXrZNJsEoVJ0p1I5Bur83+cT8NyX9W7bA8qXnLhnPlYaHcJqEH/b1FT7EOL5yp55ArKLGl3538DM1uO2Es3A+stC5wrPfx+e6jhrmOUsnl1pbNGJyqywh3HOuhqLlGP3md4IQnLEe814bTHBpecKUIuDoo6bXVLdrkUw7/TpFxOtUfoYZSpCxf1BEEV5ZU6KKz/we/9zxNv2Lwhrd9KSymQJ2MhpoeS84khunTzhet/mYlJgQWmETYhoHXogOEqqX5jkZjg575vq5OqHEMutgFA0PjBhyErsUEaQh5st4nxbX8vokdZj5ehAg+9WPIT+scpwS9b9B1rlYwYlienGOcKhdpUC4lPYFg3W+7fKHtlMxNemSi6++OKUcNpRNMZuurTpaWKeTcFSqPOwJgrQ= X-Microsoft-Exchange-Diagnostics: 1; HE1PR0802MB2556; 20:4kpBFOiQFoPjr/3iE2Z1va6AeISDvrsX2OC/SDLICTmtkFHcc4/k6b5oCrn6XMSm9YOOV64ffufXYjqyxSI90skx/+eNmbXSR+I8YNIzwzUuu094xzVWuT6bm/s+yWq31XzGH5whKbm15C6uI08N82B7StSd34xsMj5PNAimfK4= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 14 Jul 2017 15:38:31.0368 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0802MB2556 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 40.107.2.115 Subject: [Qemu-devel] [PATCH v6 3/4] qcow2: add shrink image support X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: kwolf@redhat.com, pbutsykin@virtuozzo.com, armbru@redhat.com, mreitz@redhat.com, den@openvz.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This patch add shrinking of the image file for qcow2. As a result, this all= ows us to reduce the virtual image size and free up space on the disk without copying the image. Image can be fragmented and shrink is done by punching h= oles in the image file. Signed-off-by: Pavel Butsykin Reviewed-by: Max Reitz --- block/qcow2-cluster.c | 50 +++++++++++++++++++++ block/qcow2-refcount.c | 120 +++++++++++++++++++++++++++++++++++++++++++++= ++++ block/qcow2.c | 43 ++++++++++++++---- block/qcow2.h | 14 ++++++ qapi/block-core.json | 3 +- 5 files changed, 220 insertions(+), 10 deletions(-) diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c index f06c08f64c..405bc2e7af 100644 --- a/block/qcow2-cluster.c +++ b/block/qcow2-cluster.c @@ -32,6 +32,56 @@ #include "qemu/bswap.h" #include "trace.h" =20 +int qcow2_shrink_l1_table(BlockDriverState *bs, uint64_t exact_size) +{ + BDRVQcow2State *s =3D bs->opaque; + int new_l1_size, i, ret; + + if (exact_size >=3D s->l1_size) { + return 0; + } + + new_l1_size =3D exact_size; + +#ifdef DEBUG_ALLOC2 + fprintf(stderr, "shrink l1_table from %d to %d\n", s->l1_size, new_l1_= size); +#endif + + BLKDBG_EVENT(bs->file, BLKDBG_L1_SHRINK_WRITE_TABLE); + ret =3D bdrv_pwrite_zeroes(bs->file, s->l1_table_offset + + new_l1_size * sizeof(uint64_t), + (s->l1_size - new_l1_size) * sizeof(uint64_t)= , 0); + if (ret < 0) { + goto fail; + } + + ret =3D bdrv_flush(bs->file->bs); + if (ret < 0) { + goto fail; + } + + BLKDBG_EVENT(bs->file, BLKDBG_L1_SHRINK_FREE_L2_CLUSTERS); + for (i =3D s->l1_size - 1; i > new_l1_size - 1; i--) { + if ((s->l1_table[i] & L1E_OFFSET_MASK) =3D=3D 0) { + continue; + } + qcow2_free_clusters(bs, s->l1_table[i] & L1E_OFFSET_MASK, + s->cluster_size, QCOW2_DISCARD_ALWAYS); + s->l1_table[i] =3D 0; + } + return 0; + +fail: + /* + * If the write in the l1_table failed the image may contain partially + * overwritten the l1_table. In this case would be better to clear the + * l1_table in memory to avoid possible image corruption. + */ + memset(s->l1_table + exact_size, 0, + (s->l1_size - new_l1_size) * sizeof(uint64_t)); + return ret; +} + int qcow2_grow_l1_table(BlockDriverState *bs, uint64_t min_size, bool exact_size) { diff --git a/block/qcow2-refcount.c b/block/qcow2-refcount.c index bbe5a2b2cc..6f7c3132c6 100644 --- a/block/qcow2-refcount.c +++ b/block/qcow2-refcount.c @@ -29,6 +29,7 @@ #include "block/qcow2.h" #include "qemu/range.h" #include "qemu/bswap.h" +#include "qemu/cutils.h" =20 static int64_t alloc_clusters_noref(BlockDriverState *bs, uint64_t size); static int QEMU_WARN_UNUSED_RESULT update_refcount(BlockDriverState *bs, @@ -3061,3 +3062,122 @@ done: qemu_vfree(new_refblock); return ret; } + +static int qcow2_discard_refcount_block(BlockDriverState *bs, + uint64_t discard_block_offs) +{ + BDRVQcow2State *s =3D bs->opaque; + uint64_t refblock_offs =3D get_refblock_offset(s, discard_block_offs); + uint64_t cluster_index =3D discard_block_offs >> s->cluster_bits; + uint32_t block_index =3D cluster_index & (s->refcount_block_size - 1); + void *refblock; + int ret; + + assert(discard_block_offs !=3D 0); + + ret =3D qcow2_cache_get(bs, s->refcount_block_cache, refblock_offs, + &refblock); + if (ret < 0) { + return ret; + } + + if (s->get_refcount(refblock, block_index) !=3D 1) { + qcow2_signal_corruption(bs, true, -1, -1, "Invalid refcount:" + " refblock offset %#" PRIx64 + ", reftable index %u" + ", block offset %#" PRIx64 + ", refcount %#" PRIx64, + refblock_offs, + offset_to_reftable_index(s, discard_block_= offs), + discard_block_offs, + s->get_refcount(refblock, block_index)); + qcow2_cache_put(bs, s->refcount_block_cache, &refblock); + return -EINVAL; + } + s->set_refcount(refblock, block_index, 0); + + qcow2_cache_entry_mark_dirty(bs, s->refcount_block_cache, refblock); + + qcow2_cache_put(bs, s->refcount_block_cache, &refblock); + + if (cluster_index < s->free_cluster_index) { + s->free_cluster_index =3D cluster_index; + } + + refblock =3D qcow2_cache_is_table_offset(bs, s->refcount_block_cache, + discard_block_offs); + if (refblock) { + /* discard refblock from the cache if refblock is cached */ + qcow2_cache_discard(bs, s->refcount_block_cache, refblock); + } + update_refcount_discard(bs, discard_block_offs, s->cluster_size); + + return 0; +} + +int qcow2_shrink_reftable(BlockDriverState *bs) +{ + BDRVQcow2State *s =3D bs->opaque; + uint64_t *reftable_tmp =3D + g_malloc(s->refcount_table_size * sizeof(uint64_t)); + int i, ret; + + for (i =3D 0; i < s->refcount_table_size; i++) { + int64_t refblock_offs =3D s->refcount_table[i] & REFT_OFFSET_MASK; + void *refblock; + bool unused_block; + + if (refblock_offs =3D=3D 0) { + reftable_tmp[i] =3D 0; + continue; + } + ret =3D qcow2_cache_get(bs, s->refcount_block_cache, refblock_offs, + &refblock); + if (ret < 0) { + goto out; + } + + /* the refblock has own reference */ + if (i =3D=3D offset_to_reftable_index(s, refblock_offs)) { + uint64_t block_index =3D (refblock_offs >> s->cluster_bits) & + (s->refcount_block_size - 1); + uint64_t refcount =3D s->get_refcount(refblock, block_index); + + s->set_refcount(refblock, block_index, 0); + + unused_block =3D buffer_is_zero(refblock, s->cluster_size); + + s->set_refcount(refblock, block_index, refcount); + } else { + unused_block =3D buffer_is_zero(refblock, s->cluster_size); + } + qcow2_cache_put(bs, s->refcount_block_cache, &refblock); + + reftable_tmp[i] =3D unused_block ? 0 : cpu_to_be64(s->refcount_tab= le[i]); + } + + ret =3D bdrv_pwrite_sync(bs->file, s->refcount_table_offset, reftable_= tmp, + s->refcount_table_size * sizeof(uint64_t)); + /* + * If the write in the reftable failed the image may contain partially + * overwritten the reftable. In this case would be better to clear the + * reftable in memory to avoid possible image corruption. + */ + for (i =3D 0; i < s->refcount_table_size; i++) { + if (s->refcount_table[i] && !reftable_tmp[i]) { + if (ret =3D=3D 0) { + ret =3D qcow2_discard_refcount_block(bs, s->refcount_table= [i] & + REFT_OFFSET_MASK); + } + s->refcount_table[i] =3D 0; + } + } + + if (!s->cache_discards) { + qcow2_process_discards(bs, ret); + } + +out: + g_free(reftable_tmp); + return ret; +} diff --git a/block/qcow2.c b/block/qcow2.c index c144ea5620..bd281fdd04 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -3120,18 +3120,43 @@ static int qcow2_truncate(BlockDriverState *bs, int= 64_t offset, } =20 old_length =3D bs->total_sectors * 512; + new_l1_size =3D size_to_l1(s, offset); =20 - /* shrinking is currently not supported */ if (offset < old_length) { - error_setg(errp, "qcow2 doesn't support shrinking images yet"); - return -ENOTSUP; - } + if (prealloc !=3D PREALLOC_MODE_OFF) { + error_setg(errp, + "Preallocation can't be used for shrinking an image= "); + return -EINVAL; + } =20 - new_l1_size =3D size_to_l1(s, offset); - ret =3D qcow2_grow_l1_table(bs, new_l1_size, true); - if (ret < 0) { - error_setg_errno(errp, -ret, "Failed to grow the L1 table"); - return ret; + ret =3D qcow2_cluster_discard(bs, ROUND_UP(offset, s->cluster_size= ), + old_length - ROUND_UP(offset, + s->cluster_size), + QCOW2_DISCARD_ALWAYS, true); + if (ret < 0) { + error_setg_errno(errp, -ret, "Failed to discard cropped cluste= rs"); + return ret; + } + + ret =3D qcow2_shrink_l1_table(bs, new_l1_size); + if (ret < 0) { + error_setg_errno(errp, -ret, + "Failed to reduce the number of L2 tables"); + return ret; + } + + ret =3D qcow2_shrink_reftable(bs); + if (ret < 0) { + error_setg_errno(errp, -ret, + "Failed to discard unused refblocks"); + return ret; + } + } else { + ret =3D qcow2_grow_l1_table(bs, new_l1_size, true); + if (ret < 0) { + error_setg_errno(errp, -ret, "Failed to grow the L1 table"); + return ret; + } } =20 switch (prealloc) { diff --git a/block/qcow2.h b/block/qcow2.h index 52c374e9ed..5a289a81e2 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -521,6 +521,18 @@ static inline uint64_t refcount_diff(uint64_t r1, uint= 64_t r2) return r1 > r2 ? r1 - r2 : r2 - r1; } =20 +static inline +uint32_t offset_to_reftable_index(BDRVQcow2State *s, uint64_t offset) +{ + return offset >> (s->refcount_block_bits + s->cluster_bits); +} + +static inline uint64_t get_refblock_offset(BDRVQcow2State *s, uint64_t off= set) +{ + uint32_t index =3D offset_to_reftable_index(s, offset); + return s->refcount_table[index] & REFT_OFFSET_MASK; +} + /* qcow2.c functions */ int qcow2_backing_read1(BlockDriverState *bs, QEMUIOVector *qiov, int64_t sector_num, int nb_sectors); @@ -584,10 +596,12 @@ int qcow2_inc_refcounts_imrt(BlockDriverState *bs, Bd= rvCheckResult *res, int qcow2_change_refcount_order(BlockDriverState *bs, int refcount_order, BlockDriverAmendStatusCB *status_cb, void *cb_opaque, Error **errp); +int qcow2_shrink_reftable(BlockDriverState *bs); =20 /* qcow2-cluster.c functions */ int qcow2_grow_l1_table(BlockDriverState *bs, uint64_t min_size, bool exact_size); +int qcow2_shrink_l1_table(BlockDriverState *bs, uint64_t max_size); int qcow2_write_l1_entry(BlockDriverState *bs, int l1_index); int qcow2_decompress_cluster(BlockDriverState *bs, uint64_t cluster_offset= ); int qcow2_encrypt_sectors(BDRVQcow2State *s, int64_t sector_num, diff --git a/qapi/block-core.json b/qapi/block-core.json index c437aa50ef..99cef55b7c 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -2487,7 +2487,8 @@ 'cluster_alloc_bytes', 'cluster_free', 'flush_to_os', 'flush_to_disk', 'pwritev_rmw_head', 'pwritev_rmw_after_head', 'pwritev_rmw_tail', 'pwritev_rmw_after_tail', 'pwritev', - 'pwritev_zero', 'pwritev_done', 'empty_image_prepare' ] } + 'pwritev_zero', 'pwritev_done', 'empty_image_prepare', + 'l1_shrink_write_table', 'l1_shrink_free_l2_clusters' ] } =20 ## # @BlkdebugInjectErrorOptions: --=20 2.13.0