From nobody Wed Nov 5 09:27:46 2025 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 1499438016682877.6340819351587; Fri, 7 Jul 2017 07:33:36 -0700 (PDT) Received: from localhost ([::1]:56845 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dTUK5-0002V5-40 for importer@patchew.org; Fri, 07 Jul 2017 10:33:33 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49016) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dTUI1-0001HD-Ns for qemu-devel@nongnu.org; Fri, 07 Jul 2017 10:31:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dTUI0-0007nX-9M for qemu-devel@nongnu.org; Fri, 07 Jul 2017 10:31:25 -0400 Received: from mail-db5eur01on0108.outbound.protection.outlook.com ([104.47.2.108]:22112 helo=EUR01-DB5-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 1dTUHt-0007iV-3O; Fri, 07 Jul 2017 10:31:17 -0400 Received: from pavelb-Z68P-DS3.sw.ru (195.214.232.6) by AM5PR0802MB2546.eurprd08.prod.outlook.com (2603:10a6:203:a0::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1240.13; Fri, 7 Jul 2017 14:31:09 +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=IL2bDft3j7TZm5b1yCEQj9bN3t3pM+t2h7WG5GdvP7M=; b=Uy/k86807B8DzjdYBTTvPfbFsYcMH+DrsFNkh6U02k9MBS2XT7PIUGKXnQ46XT+rFfK6YdwaI9haOHtZQSlOi/nqkoUzPtiV+YKbEMt/9i4U/Yn7JxZoBsRdnQLC0vB+8QxgHkS+RYEy7G+cWQX9P8ePi0UnNgoN8QZRhip1CnY= 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, 7 Jul 2017 17:30:27 +0300 Message-Id: <20170707143028.692-4-pbutsykin@virtuozzo.com> X-Mailer: git-send-email 2.13.0 In-Reply-To: <20170707143028.692-1-pbutsykin@virtuozzo.com> References: <20170707143028.692-1-pbutsykin@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: KL1P15301CA0023.APCP153.PROD.OUTLOOK.COM (2603:1096:802:2::33) To AM5PR0802MB2546.eurprd08.prod.outlook.com (2603:10a6:203:a0::22) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: cae90093-aaba-4d2e-105d-08d4c544d267 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:AM5PR0802MB2546; X-Microsoft-Exchange-Diagnostics: 1; AM5PR0802MB2546; 3:ktyLgfnBvUiU1sVz7+m5OCdQ7BxV0o4KwK6MOAhUJJKyhJxRvteqhBdNiB9UtitCY7TUYNJmR876HRST9TQyEtniEFVwetMEtnHbuV6iL12nDKkPpSi4p6k14xv7HwJiE3DAXCDZG/P6UTUfyQ7uAChz439Y/Zc3+kG2iyVs7NpnyltR744gNKSuePneyXk26iVUBrHRnecarjrhy4ZGu82OYQjXqU63ZCAob386cfI2FexswE1fyOEIlQKdLAhyZdfA+X21HAdqoFIHjnMk9rVnNWG8lUZYtXVDD8VDeDJ+A7Gzhg8H2OCZLGDRA8WolANRlGRrQUE/IkYz93WRRvIZkTBzVhVSdzK64+qxNqWJs0mqa8nmDFoCjYhqsNQlKrwrTA6cBZsUcfrzV3c5j5fj9GWG7mcrMNaDTqt9q1z6MqDe9xu12Kk0z96BoV0NUbr/JJ5C/1tYsWkGMcroCdl27eIcrubq3V5LxQL3M1WG5/UPxCxa4COF9pVVpo998iRFo+iSnfs09Jcabw1cSSAbIHIuhY+QAgcZbR+clHOuQ3dupJ5p+/hxONDJXoo2xhW2zPMSJhrkjAdQuk00qSTvDlkb9WjMe4Krxizbyzhf+VNbjvEP3+WnzdANI8/1FUY1Ex4QFj0GAKCO6aoF9lSbJpdYmCH0OXVyOAgsmw2mDJyVVUakUZRy6Eua4VSZ8GnwrhHcvtQoAIcOy32JDFBKoNVSl5GVH9cuSckDZb2TBp9xSj0SWJFrtuMlssUo X-MS-TrafficTypeDiagnostic: AM5PR0802MB2546: X-Microsoft-Exchange-Diagnostics: 1; AM5PR0802MB2546; 25:DEkK1mPmNaZkFccw7TSQ/pb1vJbIsV61QF/IluNF3tWK+Pog7TG/oLPZlq5VklVX0NiyuNFWNJQLZes/uYqkNx4WNA++LSnt8lKefCgpu/mCSURTsirqg6X35keonjJ/lUmJPb2t/qiJt7by/AtOWENUYPN313qJoB0PvAAinJB499lBOLDJ/ZkFta9eVtT6QGPVZzHkSg7U5R+U5A2/UippBDIFanrs/mfGkhHlAkrVVioWss3P8Egnbx48xnG8l69rVEUeKCtZxlXZcRrVSrcwujKywSZMkaKnQHThptV2owdXJepUfNGsU0OL4oEWT+yckcGpwrm47g5GncIpdPjbIowC1SIbQHgrm03GD/om+TWGfksHU1MJOVFUU+6xz0AS2tChyMshSe4I4PYUOtA/xuhC+V7GqV11GxEq9TA400f/y/ECbSrcIAKetp1pfQw/4MXp1U093z8i1t31khEj77Ci6QladZ919XgBCr9CF8VgHKKM5YV0RQU4mx8IARYAsOjX5L1drKnguQlllN2ByBY7e+0gcGxp10u0cOajnfTIqzuJMQfrKDZ4jhsNk09u5xCCzScdGGN8eySNJo0+eaFQLmUEQvdIJt+mJND+NW7LeEK2aIDHtBb/L9LCohiTo1ChCGz0k2977otj7reurv8wAN8XvfQqpRAbkyVLWyUlQPhQvhdXOwCADlEkLuWxha11HN6sskVKhf2mDcaRD1EGnbCOihQ+VlHeKkYnm1J0j3bGlCbUmMQgwqRQ0ClPVUpus6g1VmYM5ZG6OlLd2HFMkZ1ZdHeB8hRByiyTy3f5+v6gCRUb7P8Nks87TIKJdpV1NgyYgY4D+BPZyV5RNraOvwIdUUtm8Udlq5wAnktHFFzN9zh/IWbv5c6Jq/kbyK3ZakhQuvPZFFN19TdVWr4H0A2z9G2l2HkiN5Q= X-Microsoft-Exchange-Diagnostics: 1; AM5PR0802MB2546; 31:PCuDV/NWvVgF6MAeVolfUlnVfo+zkDMEMwhQd5MBqkZCtxpMmJBZ1N+/OctdP8oIAOaQPBsZi9nuSBqgquyVh0ERc1X5Nbr0Pq/TkQGlYzNrrCyp+VgGvK3G/SIHNpccKP+TO7m9wKZbdCYldzoEYl8OmQBK1jQWcdvuOdVqNAeLrbpqYhS9sM9ImGydA02AonV7b+NrJfgcABQY/fWJGt9paf3iEPLxWvmxuHuEtvnDZBXsSUKgTfpXnrw6ES2j0gq67UWjYqI78vazL9PHcrMKR7MOUyFl29mKuV2EduSsMmruB/kmLIzGdUtz/bPc0Y5UNkF4UjANy/EzvSNeWkGPawI1Pz1dbvhXMNl3C9eBX2H+qDjnJuEKAlSkSj/KnC5vUiuqV/FGt4z7csINypSHeD4siT+txXKK3b21XBJrmoyRLccg8uqhwl91dam9FOJnlivbFwf3dFC+vSlO7RZ3O/J/++rNqtaj0eZnm0sm+9/pR2+RFU7o3g+Oj7N2MKTkyVtLhcDUrPOekGCowrwqPVXSL7ARCpKMX6NWOqTDsAWHeo6BDuED9tAFe3gktQQ1ruCKdei+ADlRinfT/Psfzy3H4b8wjHA93fV3LozYcua3dodSR3Cae34WzJ6ykESTqnymptyWa0x7+839qo8fzK8ws3aBowva1Wokm0Y= X-Microsoft-Exchange-Diagnostics: 1; AM5PR0802MB2546; 20:Z/+v1bS4Ed+oqBNKKkDn4v1JP1XL5b0MolanbxfapEar1E3N0jNEjzI4aZ8PpVrONl2mgsVAKTRvcHYMhf9akoqljdTo8L4HTbVT/43Oj3cVn7nS9useADwvs2BEOmET0M6FdiXAl7eg2r1VMSjaFlm8ZPd0k/Zu/15FP4lC21qHLYmqBuRMiCHJxrPSX4sqk9sEH9n4TJth2PXhytg2/i6046SD3KxoEoap/eL+BeMyvP3q5xPvj8z3VewsdKMbbtp2JaIGbWMKLnmBXhR0O0gcQEeio3/TIl68852vv3DlktHdn2wFi8Y3mO2QGEVU3scC1CDBVuvpNHTz3fx0xzbsdikVT35GzuAn+RIC6QWECQxkgtzMQ27aaWSnlqVHLmBzRVzvIy5RUJ28i87NY07BKWvfPXZmW0B3sJ7pQ/w= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(133145235818549)(236129657087228)(148574349560750)(167848164394848); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(8121501046)(5005006)(2017060910064)(93006095)(93001095)(10201501046)(100000703101)(100105400095)(3002001)(6041248)(20161123555025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(20161123562025)(20161123564025)(20161123560025)(6072148)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:AM5PR0802MB2546; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:AM5PR0802MB2546; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; AM5PR0802MB2546; 4:lUOEomwaAmmpfNT7gZYSPOB5soa3hEJsqW7IbgzP?= =?us-ascii?Q?jBCjVd6z+6MjVT50YHnExChcwBgUR5R0QR8BoZEcvM+lPjDU1CggsA3tsS3C?= =?us-ascii?Q?BCK0Lx/Q5aji+qQQMHWQxgVeHvqchh1/GjSNCGWSVAC8CfMVB1hb1Dqn4WFx?= =?us-ascii?Q?Lza/WIn130yNNyREmhoErMBi2GL+kKZHGejdHfsMRrO6+rViuiy+O9BbSP1c?= =?us-ascii?Q?pE6/b35szABusVp9Mdq9nc6poghKFpvnGaIPvUMZne6ntrhY7+R8CdVube7v?= =?us-ascii?Q?UF4isxOUIFn8ju2g5NpajHAVl6u/1ym37VNuVwGH47De4j3UJQb5sPLczege?= =?us-ascii?Q?q81buSWUVJjDmS5ct06IyQ49yiAOdiX6uKs/71E10AUJAs+iP0NC4oOhr1Wh?= =?us-ascii?Q?izsC4Yaz79wqRh86ne30MwyfFQMFUX2GRV+57KjOqQlzv3lHghIJ4XlPxMY0?= =?us-ascii?Q?0DFwtT6hkV3/j7dNGttMI1yqFiZgrCpIItgfR6RkdtUSA650fFaNUiz8fHWZ?= =?us-ascii?Q?ZEM2Wjar+cTPPtKE5WXkDwiHzmOULt6lTsUFWQKnOcWsOTIcBtfjESDONfme?= =?us-ascii?Q?Ayj4Nm7KXYskKTzNQXuTgJFAQxErXwDOu/lFs6BucZmtC3my7XoMal5LRYBz?= =?us-ascii?Q?uKx4TYOigpSAM7IPbcpDGdnQk/vd5teUZszdBWD/3/KSKSx40fufxyIxNwsl?= =?us-ascii?Q?Auuw1enihAPM6XDAcoIvSXLw1eGF+WA7seN9GLSHfumHbupDH1FtcVvydvFN?= =?us-ascii?Q?aTjV65F2N3IWk/g5l6mFkQqxVq/ItpiJDkg7TTV7nBZQJO72IPkqXxkDs+8G?= =?us-ascii?Q?XPJ6rqaqaCNj48/oprp0oPlcwrqH0h8qFsxXGlRhMY6toIgl+jAjV+2OpG0z?= =?us-ascii?Q?iGGGAruqpTDPce33U7fmYmo82D0wANqG+mZqfrLjJHP7zEAFfw7GddDbyaN3?= =?us-ascii?Q?xCzTjhhhos/9exSJAa7Aind8+oDOVapMRbYmLJkJFXiD50x1Ib9AEb4avqY/?= =?us-ascii?Q?WCfxJe9KB+xgV/T9h2yY/O5NryPyNl3AYxAYX+ko8lozbW6XiteN6p6ijOIP?= =?us-ascii?Q?YgzBOL4zbA/1iymnyTzeGvI8FWZ3cDeT2+dtlVg7ZK0O8ZYavIg5hy51LakF?= =?us-ascii?Q?6NyCqtZwn3afMYP5rcv2yZAttj6iYFdTyBJwwA+cjufgKsCgI8JWXoea8uGP?= =?us-ascii?Q?Kqop68qBC9E7AHA1s443XY+lahtR8tSDmarNqEDeOONUsB7Bd+JFzpua2jh/?= =?us-ascii?Q?+kDHPpoJZ3KJCHc8KaCpkikrwO2lfJtuviQcucCfC8SW2j7cnjIuPL4EH7e5?= =?us-ascii?Q?LUw9xaT9k9hcf4fGElPM7qP9dypJuoPI2UsKMwj7lQFy?= X-Forefront-PRVS: 0361212EA8 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(4630300001)(6009001)(39410400002)(39840400002)(39450400003)(39400400002)(81166006)(36756003)(53416004)(8676002)(42186005)(50226002)(5003940100001)(189998001)(33646002)(6666003)(2950100002)(5660300001)(1076002)(47776003)(76176999)(50986999)(6512007)(25786009)(48376002)(50466002)(305945005)(3846002)(7736002)(6486002)(53936002)(86362001)(575784001)(66066001)(6506006)(6116002)(38730400002)(478600001)(107886003)(110136004)(4326008)(2906002); DIR:OUT; SFP:1102; SCL:1; SRVR:AM5PR0802MB2546; H:pavelb-Z68P-DS3.sw.ru; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; AM5PR0802MB2546; 23:pESnGfeQrPhXc47BiSDCNsX84eVCBWDJyMnWINm?= =?us-ascii?Q?/2ZFywRIs26a3Gl+1YLL/Hldx8ONqNQcsuS53zpAfyD6i4+X+wTImBVco0p2?= =?us-ascii?Q?Vr1MzzYh7S7lOS2vUpft7BPuPNPN+JGaZnlS8MtDXrrFQxFcVAPSEe6//fcQ?= =?us-ascii?Q?2kU1z0GHAc0Hr3ob1ysedfPidP+BdwDswwcxV8NaIgVCy0BBtrNzsXCgt+yz?= =?us-ascii?Q?IzuSMDMaNmRSbR4NvZBSHr44XiP8BFbz9i7JAE2N2q3+S+usAUaaojC2ZEPc?= =?us-ascii?Q?6xtml5hSMX/d0vYqCYJNMMnzcWCsJ7UBNoYXTHl+fMh2JPvij2dqRI7SgAKz?= =?us-ascii?Q?aFXy29DuewPfyvDAHrsJ3AKEjEnLOW2db3b7vvCxnJ0PjxJjtyNf94CDVdYS?= =?us-ascii?Q?rDior5rXSNQQnUl/bNOx5EqIdTMXglg/lGTXuDawOsBxuSDgFVg8W7ZS72rv?= =?us-ascii?Q?PB9MkBKats8YCO/axRhWWKP+3jIp0xtJ+DF5Ee/GUIhzs6J1BxNJxqWChkqE?= =?us-ascii?Q?DMOpO3XBCnU10s2+NyvzjfiUIRvFIn1t/YbANhZCGbbgW9JZvmgbVsQiMAa8?= =?us-ascii?Q?rA8kwuy/TeiTGOysSlnWksr0mXW49VKAvoxyX8lRf6nuqzIePogEH2I8FVFX?= =?us-ascii?Q?vHHMVO90+MEofrhE8qbf+KJOYlUa9DAHWYeclstuoF/LKbrUvdpk5epQ5FEH?= =?us-ascii?Q?FuTGsjsQ2Lvf87DyilETqSRd966QR3VSNn1zNl5fLLOQ6Bkk9jbuCRiGBKwB?= =?us-ascii?Q?PRKzyfh1RkvZ0bTLw9pR5Bk8/M8GUtMJP+DPmmstu8s+hNo9KV+w8jLWhsQO?= =?us-ascii?Q?XoQoK6nfGwJyjUDyeon5EuLczD+qIoP0MFqxa3vmaKlyLBGUnl6ODonghYS5?= =?us-ascii?Q?FcSPAW/Can0wYyjXhvZOFucKtE7l62HnMUjZFul4fXgWk23iH7aR4ij7aeZL?= =?us-ascii?Q?3Gt/RWOIjuudhM3txykmZ1/ftQs9n3aXIV3BdaOJNEiiKiHtWpMGkU6uncNN?= =?us-ascii?Q?cFNN7aDGTw2T/Rssbr0qmTgNYXcwCfpqbqxem9OVRpX0co5UJxAEQQBCnQ+6?= =?us-ascii?Q?xNJjForIr2JOu9VtkyLGAY+4r6aw1?= X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; AM5PR0802MB2546; 6:VGWhaadwsKgD1ELTrpUNT77f0MsjFJ1tHVWjLDS4?= =?us-ascii?Q?/fZiCbpt6QNvzFOj116kZFluhG0aqmuDrohXpaU3W0cKF9UE3ZqGxEaDHkwF?= =?us-ascii?Q?gnI5w4qAJw4Uze+Hgu+4t0+8qN6bpjUBwfwtMciqdf3Bo5jKsUTOIfE7XcLI?= =?us-ascii?Q?84C+exbusfKcer/FHY7rp2NtPvJitjFgbZCu6YDY4MAsWEh9w09v+aio7e3n?= =?us-ascii?Q?00By0D1DNQ1dhfk04eSnrbJq79i8eWZJ2IITC1YxNYZYe8pe6HP0TgHJeTWp?= =?us-ascii?Q?SEbyRMmRNnYF7jzRHgLMBG782XekxhRUij/76Qyxcf9uM6ozn6c5CngG/Brc?= =?us-ascii?Q?zsDqp03ZPFoBLfYayThVvKELmL6q7uX6z2C+JtKF1nVeOf28emJ7HVeFvJFL?= =?us-ascii?Q?d6YbgkmgPA05rn4C5vp1nxDW6prbCoB3GuyA/DnEaDZfWcTixuexZciOeDEe?= =?us-ascii?Q?6Cx2O5YzO30sBuc3W1i/tYkA15zdoCTHQJouSKDkcy2V6z2VIir2DmdFQhj4?= =?us-ascii?Q?M8jamnlGbMHzJA6/OtAyqK1R0ApMze/UvuzRf0ERUzJ+bySfOdZZMv81oeWA?= =?us-ascii?Q?E0o1qPR/YUfpadYNOtVu8LLvK4XMNIMGOY94wJ+1ujQPr+P5iqUmS+v1jP8J?= =?us-ascii?Q?48wLrG2yIKqCAhQsSvgD7g5fraiA3z0rCDhCNMk+9Xh0cXz6nQ6qDsBC8AaS?= =?us-ascii?Q?cUH5UCfw8IhmGXE5SfVo2kAcYdpNaJDGVusPtLksdUQ8TSGnKgPts9WuhwR5?= =?us-ascii?Q?die2Mi+1tegEA9ZOwQHIhsPlsxzl9muovps33GIY5/23dF2KrhMqPb9Jx50a?= =?us-ascii?Q?5jTg19v2jzIQdDlE+WzDwJW1HVQ2LIM06v8rZljPnpejUHRuDaA9fVJZVd+m?= =?us-ascii?Q?aqQqaT85tEshxWa2l/MOuy5M3R13WIEuX9WKFlsKbikb3ZUYQ8lHW/a+tm2Z?= =?us-ascii?Q?Uu+8WVrU4Ehik4aKR3tGAtAp6l2p2vD/I+VNMyZQ5WeZUW2DqvF+lV+Cbcvh?= =?us-ascii?Q?5do=3D?= X-Microsoft-Exchange-Diagnostics: 1; AM5PR0802MB2546; 5:I+loOtnZE5tvzDjGhs/XfJL+afupXd43oBtwwbaxggq5yzwCozrGrO/Qujg0/6mNsjsPn0//ry3lgL/jJL6kIQhkOgMTwrg4vAFhiWISf2RwO0nHGq3MtmNS2kDDJg/dybGkiKcePIr7ZRTbbCBZUvTVJ4lO/CKDGknKQwYNkVpxKSK+OTggjbKN7EyTMnmyOAY6YhAPtFFE531MQ0OZ/XGIAdbzaEj9/3W9be5eJ6BDSj3PsMqxKBfBLUeCimCGrP6aZ7OR28cYNtaexWlziIJQLI6zpQAlWTf3TJYCsHy3R/TTwchoFUlOGSc8Sxk1ZYou8STjkJ5a7A7pKseqF32ELVugEKj05laB9cYxpLRQ602D/LwrDAWjjctgk2cO56CBTbzzcjg5gEmqm2iTz2CXY6DSfqaDHJPntd6Yuc1M2iZ2+GE9vKplwwgCZHkX/omau1tEvsBqrFMfHWPD7fQoVWJa/Kp96gqtCce/hUB6ECS5VW1ZTM/fFjONLkhT; 24:8Je3gKBkh2RX3BQXLdAKa1LvzvOj8PVXtR0cAZ878x6y+QS6dAyFB94xd0wsKYkrkEvTA41B9gKWOafvfoHl8CXnkdVdzXabRiKfF5U4zq0= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; AM5PR0802MB2546; 7:pzjX/bN42cgdfKYg2ln8ZevVvnAQnGx9xnPidEdbnIkPspqgFYLPpQeO49oJZqbSF5PYA1AdzCAa8g8SbRrXEnp1UxJOGl1pCt86FqjrKwqLTr2dGB6sniimZPe+nGxezoQS0A5FQb6dEHw0akbskuSlNVqIjUIwtO9Y8TPgUckGLSccgbUbXForScDQUA7wATzX7pcL5V8gEZ56I8GqMSvWWUasqHkTGn5odv36m93oksqvIQLzSrPKPKR04Jj/AOSdk0xIZVTvpzojDGidsy8qwfSJaCJ/w2/akFz8pzxMgN7+ylkkkJ6qOASf7kXS1dl2898yeE2g/2x4tU8EGNwnVBykSwdB0BFnrL2yifh7V26WY04UDbJtbECEPcl3METHlxNdXSeAwBg6Lnz8T2Q3wFZFF5R1a85rAEcdFp3Ec38Ae24Tqf+oQIhAJ8fQKtzyWmvABJEvjEusGhFP/tr15xe4N+Qzctc2kRugnMMvYYxwTyvSzN1w8/DDO4dEmTgjtkqWLUuiYjb7agDnaSOdrI9qXfe7SDiHgmhS1qAZyhe3txmmgywUb2Zafr5XOmLLxzo1Mu4vYnaNEuH2rJp7g0Ner+p6yAzqaSS2bC+Zhw/u4e4rVU+L82c7Ytc+zEhsv2HEPCMNkOKtzxScC6ySFrD8oMaMSb8ZSxXn0Ds46aUMCnbHj1AHC1HNGWWXthbCEIk3FYEdL3KI685MqykdZIMnjtO0XIGic8LQttCUeT9K17PaXP3oWeuC+j/Hxnob8d2UxMzME1BGk/Jex419fnME8M92BLKHnaYDAuk= X-Microsoft-Exchange-Diagnostics: 1; AM5PR0802MB2546; 20:ev+xrsWQxaeKd1cPUuleT53Wgg5C5iLx9SlyPLlqiQ/M7KVXq4YPrH5K6s3j6+2REqgKn6BuREQoQQHjthE81cJWT53SAsXhtOP81H4gp31qfvB19GuwKLhPR+RsKBX9ZhNb0OK/uNRh6t5eDMa8UqT0DgfAm4uYRSfUicCKexw= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jul 2017 14:31:09.6062 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM5PR0802MB2546 X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 104.47.2.108 Subject: [Qemu-devel] [PATCH v3 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 | 40 +++++++++++++++++++ block/qcow2-refcount.c | 103 +++++++++++++++++++++++++++++++++++++++++++++= ++++ block/qcow2.c | 42 +++++++++++++++----- block/qcow2.h | 14 +++++++ qapi/block-core.json | 3 +- 5 files changed, 191 insertions(+), 11 deletions(-) diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c index 3d341fd9cb..04d48878af 100644 --- a/block/qcow2-cluster.c +++ b/block/qcow2-cluster.c @@ -32,6 +32,46 @@ #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 + + sizeof(uint64_t) * new_l1_size, + (s->l1_size - new_l1_size) * sizeof(uint64_t)= , 0); + if (ret < 0) { + return ret; + } + + ret =3D bdrv_flush(bs->file->bs); + if (ret < 0) { + return ret; + } + + 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; +} + 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 0141c9cbe7..443fca6a98 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, @@ -2945,3 +2946,105 @@ done: qemu_vfree(new_refblock); return ret; } + +int qcow2_shrink_reftable(BlockDriverState *bs) +{ + BDRVQcow2State *s =3D bs->opaque; + uint64_t *reftable_tmp =3D + g_try_malloc(sizeof(uint64_t) * s->refcount_table_size); + int i, ret; + + if (s->refcount_table_size && reftable_tmp =3D=3D NULL) { + return -ENOMEM; + } + + 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, + sizeof(uint64_t) * s->refcount_table_size); + if (ret < 0) { + goto out; + } + + for (i =3D 0; i < s->refcount_table_size; i++) { + if (s->refcount_table[i] && !reftable_tmp[i]) { + uint64_t discard_offs =3D s->refcount_table[i] & REFT_OFFSET_M= ASK; + uint64_t refblock_offs =3D get_refblock_offset(s, discard_offs= ); + uint64_t cluster_index =3D discard_offs >> s->cluster_bits; + uint32_t block_index =3D cluster_index & (s->refcount_block_si= ze - 1); + void *refblock; + + assert(discard_offs !=3D 0); + + ret =3D qcow2_cache_get(bs, s->refcount_block_cache, refblock_= offs, + &refblock); + if (ret < 0) { + goto out; + } + + if (s->get_refcount(refblock, block_index) !=3D 1) { + qcow2_cache_put(bs, s->refcount_block_cache, &refblock); + ret =3D -EINVAL; + goto out; + } + s->set_refcount(refblock, block_index, 0); + + qcow2_cache_entry_mark_dirty(bs, s->refcount_block_cache, refb= lock); + + 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_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_offs, s->cluster_size); + 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 2f94f0326e..c7506ed971 100644 --- a/block/qcow2.c +++ b/block/qcow2.c @@ -2589,6 +2589,7 @@ static int qcow2_truncate(BlockDriverState *bs, int64= _t offset, Error **errp) { BDRVQcow2State *s =3D bs->opaque; int64_t new_l1_size; + uint64_t total_size; int ret; =20 if (offset & 511) { @@ -2602,17 +2603,38 @@ static int qcow2_truncate(BlockDriverState *bs, int= 64_t offset, Error **errp) return -ENOTSUP; } =20 - /* shrinking is currently not supported */ - if (offset < bs->total_sectors * 512) { - error_setg(errp, "qcow2 doesn't support shrinking images yet"); - return -ENOTSUP; - } - 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; + total_size =3D bs->total_sectors << BDRV_SECTOR_BITS; + + if (offset < total_size) { + ret =3D qcow2_cluster_discard(bs, ROUND_UP(offset, s->cluster_size= ), + total_size - 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 /* write updated header.size */ diff --git a/block/qcow2.h b/block/qcow2.h index bf6691dbd0..82e83dc0d5 100644 --- a/block/qcow2.h +++ b/block/qcow2.h @@ -488,6 +488,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); @@ -538,10 +550,12 @@ int qcow2_pre_write_overlap_check(BlockDriverState *b= s, int ign, int64_t offset, 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 f85c2235c7..bcbffa3339 100644 --- a/qapi/block-core.json +++ b/qapi/block-core.json @@ -2372,7 +2372,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