From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.3 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,MSGID_FROM_MTA_HEADER,NICE_REPLY_A, SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 936DFC2B9F7 for ; Wed, 26 May 2021 05:12:08 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5EFB5613C3 for ; Wed, 26 May 2021 05:12:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230007AbhEZFNi (ORCPT ); Wed, 26 May 2021 01:13:38 -0400 Received: from userp2120.oracle.com ([156.151.31.85]:58502 "EHLO userp2120.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229522AbhEZFNh (ORCPT ); Wed, 26 May 2021 01:13:37 -0400 Received: from pps.filterd (userp2120.oracle.com [127.0.0.1]) by userp2120.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 14Q59uUS017219; Wed, 26 May 2021 05:11:59 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=subject : to : cc : references : from : message-id : date : in-reply-to : content-type : content-transfer-encoding : mime-version; s=corp-2020-01-29; bh=gzXPgwKP/+fh8ysHumLq9lb+ANH9vl4GxfCMXp2Skqc=; b=hQLe4+nfd+MPuGXyxq4JCeuANCSeP6KFUXBBFF8gQj+Qi0J6tWhwse1XhOfeDGTCFlvG b6/JjQ6lWBsoTOBBsTYbUmwNSjhirBsyharDT53kJSmpf973sU3FsqLbFRQLKAR8ayY2 wgy9brRhLVmKwruLN5qtj8QwslfL+plGaRYFUKVueTh/JJRRa2bCNnzWD5VU/aYA6xUU 5si3RxEV/ocT1ewB3az8ceqDI9eus5rAhZX/XTPVkEmbtgV2iLQdV36YEPJgwTcbIxo/ Zu5OHuifFuP4TiOVrkfyo5pEj5DcIKxBd6omLEzjBjqp4Q1WqIomIEnSYKD+I3NR7pHv jg== Received: from aserp3020.oracle.com (aserp3020.oracle.com [141.146.126.70]) by userp2120.oracle.com with ESMTP id 38ptkp7s9x-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 May 2021 05:11:58 +0000 Received: from pps.filterd (aserp3020.oracle.com [127.0.0.1]) by aserp3020.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 14Q54tME103855; Wed, 26 May 2021 05:11:58 GMT Received: from nam11-dm6-obe.outbound.protection.outlook.com (mail-dm6nam11lp2175.outbound.protection.outlook.com [104.47.57.175]) by aserp3020.oracle.com with ESMTP id 38rehbw36k-2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 May 2021 05:11:58 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=iaFaUu54tmuVj5jcSByYhn+UxXfNqzF6UhS1TqFtAAQ5JCjTGJphPBKzp6UjiGeSsWXGY07SVAwKH0JsQ5kdM6x3BbyY4WcVhD/xUPgae+yL6iF1m8jObBCg/f5mRxfG2JE2c7P21Id6h+sJzFkXW2JEKosleUpjdPYBTPXiTJbqnBR0K3XU1dgXmiwcxr717+jGfUie/IyNwXKOEkypV5+cVLN58jcSAS3MiV3Ml1P+qCufuXv/najw815amuiQGjflOZFVp15l2HOP3ZZdexSJJEfyLRMKKBkpNsx5sPq+QO+LrtjsEhryD7Y9oNJKkuZGe6LrYfB1BIZRphP+3A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=gzXPgwKP/+fh8ysHumLq9lb+ANH9vl4GxfCMXp2Skqc=; b=l8gyYqwnPL38IZ6agrXlOEtDckr93dE9JcVjkUWxfKjHSP5CVhkhzkvsqkKzK8e+JCIJrJgsl2d5VeEte3HRC0QehiCdOrr/yaSNeG1andgABWTNorcAostxU47KFwWe8QWPRFeyedSVbJivdy5u3ohfeXUxlT1lfyMMsr/FMbmZ3lVbqku0pAz6CSDkPAJJmOpFkOZ6VLtLV7pj6/eKwhi38EDf2Iuh40cY3yOK0etRStuCHljokTQ9bK/L3DhTn7xPkI3pNfX7SeAB4m9/wIMyRYEKS0E5ebnK8HKtwNgcEZ9DmYSfwpkiZjbvxq0+Zro0bFgE7AZRyhQRlTZEPQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oracle.com; dmarc=pass action=none header.from=oracle.com; dkim=pass header.d=oracle.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.onmicrosoft.com; s=selector2-oracle-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=gzXPgwKP/+fh8ysHumLq9lb+ANH9vl4GxfCMXp2Skqc=; b=HzYfcrrzbGo9Rs/1RiuDrqwRV47Rv3wLC0itVr9z1cXIhNlVhI/8Phhk5RyzLFuHCw1L6VivP2fI0JIYtyfDiBjxeGzEZUzLoOCSxBrMiLbfG30UAiiWWBfmYvJfSk3Ez9RINpqRwfIJQ5AWnhVbEGb8yGhFIjFElAwHcvTgcWk= Authentication-Results: vger.kernel.org; dkim=none (message not signed) header.d=none;vger.kernel.org; dmarc=none action=none header.from=oracle.com; Received: from SJ0PR10MB4752.namprd10.prod.outlook.com (2603:10b6:a03:2d7::19) by BYAPR10MB2599.namprd10.prod.outlook.com (2603:10b6:a02:b2::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4150.26; Wed, 26 May 2021 05:11:55 +0000 Received: from SJ0PR10MB4752.namprd10.prod.outlook.com ([fe80::4519:4046:5549:95d9]) by SJ0PR10MB4752.namprd10.prod.outlook.com ([fe80::4519:4046:5549:95d9%6]) with mapi id 15.20.4150.027; Wed, 26 May 2021 05:11:55 +0000 Subject: Re: [PATCH v2] ocfs2: fix data corruption by fallocate To: Joseph Qi , ocfs2-devel@oss.oracle.com Cc: jack@suse.cz, linux-fsdevel@vger.kernel.org References: <20210521233612.75185-1-junxiao.bi@oracle.com> <35a1d32b-b8d7-ea9b-d28c-6b4fd837605d@linux.alibaba.com> <8aa90f5d-e4db-5107-1d3c-383294871196@oracle.com> <21d8b289-541d-50f5-6f86-de3ee69c56c5@linux.alibaba.com> <35283832-3294-19e0-6542-d1f925711fe8@oracle.com> From: Junxiao Bi Message-ID: <297dcd1e-c741-007e-8f53-77eba9656e74@oracle.com> Date: Tue, 25 May 2021 22:10:33 -0700 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.10.2 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US X-Originating-IP: [73.231.9.254] X-ClientProxiedBy: BY5PR13CA0022.namprd13.prod.outlook.com (2603:10b6:a03:180::35) To SJ0PR10MB4752.namprd10.prod.outlook.com (2603:10b6:a03:2d7::19) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from dhcp-10-159-238-224.vpn.oracle.com (73.231.9.254) by BY5PR13CA0022.namprd13.prod.outlook.com (2603:10b6:a03:180::35) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4173.12 via Frontend Transport; Wed, 26 May 2021 05:11:55 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: af4e0a79-5d1f-4cf6-34c6-08d92004c7e5 X-MS-TrafficTypeDiagnostic: BYAPR10MB2599: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:5516; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: C8DAZrITBvQX9lQ4YR2Dtbmy/S36CMlqXP6Cguxmcc+gUL04NjbkzyG8hpORCfdxfCzX+8RWX4c66ubXl6uR86M3hjpLEDYQFnKNlztN3kScSNfp6ozMwf+nr3XjfuYvmHIHOc0s1sosaTtFQdXlPNhmEsbjiTi0H6pWAOqgIGf/QTwz/TtYvg+nfVjNg7/9oRoZX4EJf8qwS9mQeeWzGjEvMK6jMiZRKPn4NPNLspPfB4dImSBxgw0UY0mkv/vg5Gsf+3CHNJdXHOoAB5q5nzyQ5UD809L+Acjo4Wl1dGaxtHCKuK2PVZhvh3tbRYSMeAmrSAfV8tsluMX9Z0Eja3cQ7dte/vkvrQ1JMYAsJSl4HAqT7NpmN+VdCzXss+9aosLujwKiYZfZYyb2vfw4ZVYwAlIyPUrx0WI2m4WjP13o4J9CoaGDmF8TsYQNj8KVnotbcQPEY/M+0nOSZbhLjR55Bvnsf1U5EhV59uP+oL0ycKR6hyyz38ljPVSsehvYfv0ny1rirykgjR1PDX0YtoPmTXgYInYXMDcXEJNPk3Ezhr7NEl8zLx+yWEGf3vapLfzBGCb56yyxbPiFprYAOcScx3a5zjEEMfOQ+taPU1eA4rWF00OcvCXaTq1ieIGg0KITZkO8P5R75B6PyfSVkgmgIUyNnjjClLgdPq1jJDhl+6dIbSXJ3kKOS1HmsDvmiUkxA53P/fLyXYcbzaw2VlLyK3gugUBZ3YeP2WKtMhF4fJj372J2s6En5Bcdr/mKDLHQ7iNBLkLVCAwV0+qdHZLmJpfjpyyw0VbU53O8FoTD3SfCT2W6CNEbfMm3tk1c X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SJ0PR10MB4752.namprd10.prod.outlook.com;PTR:;CAT:NONE;SFS:(136003)(39860400002)(346002)(396003)(366004)(376002)(16526019)(186003)(26005)(316002)(956004)(31696002)(2616005)(44832011)(966005)(38100700002)(6486002)(86362001)(478600001)(53546011)(66946007)(66556008)(2906002)(31686004)(8936002)(66476007)(5660300002)(8676002)(83380400001)(7696005)(4326008)(36756003)(6666004)(43740500002)(45980500001);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData: =?utf-8?B?eG1Kc2Nlb1orOHJSenpoTXJIUVMyU25TOEw5YjlwYTJ4QWhFWnVwK0Y2dmlM?= =?utf-8?B?VUlhRUdTUFFMQ2FtVTlSaFBKK1M0Uk03S0Fjc1Z4Nm9XZlNBMVJiUkwxdUN6?= =?utf-8?B?VEt6OHFGNDVyVjNFTktLU3BaSHpPbHM3SFRZMnFoa3hTak9lcEJGMmJTckdZ?= =?utf-8?B?SDY0OVp1NDB5aTVrWlNhZURUOE9lSEtSaitMdFlxdzdNYnJzZFhQS20wMUh1?= =?utf-8?B?R1kzdXZZUndWLzFZWGJ5VGNsNk5EV3ZORjJsM1VaQ25XU0ZxMXIyaUE5QmdS?= =?utf-8?B?RW9Eb0Q1NUpRSjBKZ09IU3ZTcEI2VHVmdWREWTFyVUtLcllJYWo3NUFoTE5G?= =?utf-8?B?QmVkcmpFeEo2QXpzdm1xTDNNTk1IU1RrYXk5YmNFUzl4K3p1ZFlKSmEzMHM0?= =?utf-8?B?VDBUejhvUHVwdlNYaWZKWE1LRkp5a1pSczQzSlFrZVcxVTliRHVGeStlZUs1?= =?utf-8?B?dnFGWnBwR0JVZDBJN0Q2NDlHVDhmZ1BLSVVvUzlhUml0K0dJaW5pNnFEUEw0?= =?utf-8?B?S2wxVkZORnVtUk9BNWFROXo2RXMxc1hVbm4vbEw5VmNLR0JXbjEwNkZ3ZWUw?= =?utf-8?B?NVlWaVdZeWZDMi91VGtpc0ZOZEhVaHBqVmttUGkrWUF4U3hveURuMTNQSk1V?= =?utf-8?B?VkVzRFpQNjVnNFFJSTh6N0RJN2hndUYxcHNhbkpGOS9NMGdYSGRLUGQ2dVlS?= =?utf-8?B?MFhJTHFBTCtvbkNMcHdqU3pOMjZLM2RCeDFCZGhJU09QUjNjNThDRzBRTkk3?= =?utf-8?B?dFIyOU5ZajRsRStqamk1VThFRUZMV3lkY09JQ0d1eG9wTXZIV3lUanplMDAr?= =?utf-8?B?VjJxaGpWZFJVVFpjRWMwSitEdVNYVlNxdUdOVU13UklLSzVmM2ZZdHVLaVha?= =?utf-8?B?ZTJteElFTEh4WDY3T1pzQnhXa1JmTFhlQytMSlAwSTVOTExPNGVuR0JPZ3Zv?= =?utf-8?B?MWNZalR2NXRuMU9DVUFEeHNSRHRhVks3UWM0V2pzNGR3Q0ttNFVuK1gwZTQ1?= =?utf-8?B?YTlYempyc2ZhVDJoRHovRjZCOEV1NjU5NkQ3WjIyM2xaQUlkTkxrbTBpR3FZ?= =?utf-8?B?ZE03cTZGVXd4clJDL2dzeUlEMEJqRjBVOG15RGFTeTlkM3hobnMrdlV2OWkv?= =?utf-8?B?UUxQek5KVUJlZTBpenBIZTdKQXo0VE5GVm9NNDFqbTJTRUJMak8xRWVrL1hI?= =?utf-8?B?bFRIaXpMTGV6MUpQN1gyL0EzbWVTSlJ2c1R2Q0s4ZWNFVkl1ZFBPY3gwWGdV?= =?utf-8?B?QmlQa3RGcVlMNEhpVHN3NVhJVFpUT0ZabzA0UkxrNzJKdWxCSERORkQ2cEdH?= =?utf-8?B?NU1EWmJ1MklLQXI3Y1UyMC9CTXF0TmFDOUFSaTBuZTBlcU8zNXljczJhbmo2?= =?utf-8?B?NHVvOGYrQ0NSZTZIa2NIYmlFemk4RHF1VGdXbUc5NjZoVXlFS3RrRXdpUjRj?= =?utf-8?B?WHRRamtqdnF4czVJSWxkemNzNnZGaFdnbENlNjRjbzFkQjdmWDFkY09PaTJK?= =?utf-8?B?b0VZWHdvMXhSWXVuYjlNMk5OcnMrNitjTDNrYzRNeGNLL0xpc2xlQmlHR3dN?= =?utf-8?B?RDE2aEJjanM4bDdRTCtxRVZNL0lFak5YSFU5V1hUKzMxcnVIbFF3MmRLY05Y?= =?utf-8?B?aFFrS0Z1OHdUdXRxSDcxYTRvRUNpdzNrdnN5QlQ3SDJUdWRybGpYUndQZGQx?= =?utf-8?B?VjY2eVVFT3FTWUdickg4N2NRNFpoYm9mS1BFcVVhTitOZlRINldvb0F3YkUy?= =?utf-8?Q?muldxGU4XeFGZGYJYVQuOMtpXvHGIr8M9hqMuXy?= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: af4e0a79-5d1f-4cf6-34c6-08d92004c7e5 X-MS-Exchange-CrossTenant-AuthSource: SJ0PR10MB4752.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 May 2021 05:11:55.7292 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: JbLJJXjnyTS1M42Jkk5L0fW+/aIEL0edAIaE29sHVVvuvc2zF1jCacvoWC+HdUnzV5LTerNcfvNK+Ez75qz7SQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BYAPR10MB2599 X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=9995 signatures=668682 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 spamscore=0 adultscore=0 mlxscore=0 mlxlogscore=999 malwarescore=0 phishscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2104190000 definitions=main-2105260033 X-Proofpoint-GUID: D8MpP2fN3__en3zpUv5JbqWsSx0AJBGf X-Proofpoint-ORIG-GUID: D8MpP2fN3__en3zpUv5JbqWsSx0AJBGf X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=9995 signatures=668682 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 impostorscore=0 mlxscore=0 suspectscore=0 bulkscore=0 adultscore=0 mlxlogscore=999 phishscore=0 malwarescore=0 clxscore=1015 lowpriorityscore=0 spamscore=0 priorityscore=1501 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2104190000 definitions=main-2105260033 Precedence: bulk List-ID: X-Mailing-List: linux-fsdevel@vger.kernel.org After moving there, i_size_write will be protected by ip_alloc_sem, ocfs2_dio_end_io_write will update i_size without holding inode lock, but it does holding ip_alloc_sem. Thanks, Junxiao. On 5/25/21 7:11 PM, Joseph Qi wrote: > Can we simply replace i_size_read() with 'orig_isize' and leave isize > update along with other dirty inode operations? > I think this makes more comfortable for the dirty inode transaction. > > Thanks, > Joseph > > On 5/26/21 1:58 AM, Junxiao Bi wrote: >> I would like make the following change to the patch, is that ok to you? >> >> diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c >> index 17469fc7b20e..775657943057 100644 >> --- a/fs/ocfs2/file.c >> +++ b/fs/ocfs2/file.c >> @@ -1999,9 +1999,12 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode, >>         } >> >>         /* zeroout eof blocks in the cluster. */ >> -       if (!ret && change_size && orig_isize < size) >> +       if (!ret && change_size && orig_isize < size) { >>                 ret = ocfs2_zeroout_partial_cluster(inode, orig_isize, >>                                         size - orig_isize); >> +               if (!ret) >> +                       i_size_write(inode, size); >> +       } >>         up_write(&OCFS2_I(inode)->ip_alloc_sem); >>         if (ret) { >>                 mlog_errno(ret); >> @@ -2018,9 +2021,6 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode, >>                 goto out_inode_unlock; >>         } >> >> -       if (change_size && i_size_read(inode) < size) >> -               i_size_write(inode, size); >> - >>         inode->i_ctime = inode->i_mtime = current_time(inode); >>         ret = ocfs2_mark_inode_dirty(handle, inode, di_bh); >>         if (ret < 0) >> >> Thanks, >> >> Junxiao. >> >> On 5/24/21 7:04 PM, Joseph Qi wrote: >>> Thanks for the explanations. >>> A tiny cleanup, we can use 'orig_isize' instead of i_size_read() later >>> in __ocfs2_change_file_space(). >>> Other looks good to me. >>> Reviewed-by: Joseph Qi >>> >>> On 5/25/21 12:23 AM, Junxiao Bi wrote: >>>> That will not work, buffer write zero first, then update i_size, in between writeback could be kicked in and clear those dirty buffers because they were out of i_size. Beside that, OCFS2_IOC_RESVSP64 was never doing right job, it didn't take care eof blocks in the last cluster, that made even a simple fallocate to extend file size could cause corruption. This patch fixed both issues. >>>> >>>> Thanks, >>>> >>>> Junxiao. >>>> >>>> On 5/23/21 4:52 AM, Joseph Qi wrote: >>>>> Hi Junxiao, >>>>> If change_size is true (!FALLOC_FL_KEEP_SIZE), it will update isize >>>>> in __ocfs2_change_file_space(). Why do we have to zeroout first? >>>>> >>>>> Thanks, >>>>> Joseph >>>>> >>>>> On 5/22/21 7:36 AM, Junxiao Bi wrote: >>>>>> When fallocate punches holes out of inode size, if original isize is in >>>>>> the middle of last cluster, then the part from isize to the end of the >>>>>> cluster will be zeroed with buffer write, at that time isize is not >>>>>> yet updated to match the new size, if writeback is kicked in, it will >>>>>> invoke ocfs2_writepage()->block_write_full_page() where the pages out >>>>>> of inode size will be dropped. That will cause file corruption. Fix >>>>>> this by zero out eof blocks when extending the inode size. >>>>>> >>>>>> Running the following command with qemu-image 4.2.1 can get a corrupted >>>>>> coverted image file easily. >>>>>> >>>>>>       qemu-img convert -p -t none -T none -f qcow2 $qcow_image \ >>>>>>                -O qcow2 -o compat=1.1 $qcow_image.conv >>>>>> >>>>>> The usage of fallocate in qemu is like this, it first punches holes out of >>>>>> inode size, then extend the inode size. >>>>>> >>>>>>       fallocate(11, FALLOC_FL_KEEP_SIZE|FALLOC_FL_PUNCH_HOLE, 2276196352, 65536) = 0 >>>>>>       fallocate(11, 0, 2276196352, 65536) = 0 >>>>>> >>>>>> v1: https://www.spinics.net/lists/linux-fsdevel/msg193999.html >>>>>> >>>>>> Cc: >>>>>> Cc: Jan Kara >>>>>> Signed-off-by: Junxiao Bi >>>>>> --- >>>>>> >>>>>> Changes in v2: >>>>>> - suggested by Jan Kara, using sb_issue_zeroout to zero eof blocks in disk directly. >>>>>> >>>>>>    fs/ocfs2/file.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- >>>>>>    1 file changed, 47 insertions(+), 2 deletions(-) >>>>>> >>>>>> diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c >>>>>> index f17c3d33fb18..17469fc7b20e 100644 >>>>>> --- a/fs/ocfs2/file.c >>>>>> +++ b/fs/ocfs2/file.c >>>>>> @@ -1855,6 +1855,45 @@ int ocfs2_remove_inode_range(struct inode *inode, >>>>>>        return ret; >>>>>>    } >>>>>>    +/* >>>>>> + * zero out partial blocks of one cluster. >>>>>> + * >>>>>> + * start: file offset where zero starts, will be made upper block aligned. >>>>>> + * len: it will be trimmed to the end of current cluster if "start + len" >>>>>> + *      is bigger than it. >>>>>> + */ >>>>>> +static int ocfs2_zeroout_partial_cluster(struct inode *inode, >>>>>> +                    u64 start, u64 len) >>>>>> +{ >>>>>> +    int ret; >>>>>> +    u64 start_block, end_block, nr_blocks; >>>>>> +    u64 p_block, offset; >>>>>> +    u32 cluster, p_cluster, nr_clusters; >>>>>> +    struct super_block *sb = inode->i_sb; >>>>>> +    u64 end = ocfs2_align_bytes_to_clusters(sb, start); >>>>>> + >>>>>> +    if (start + len < end) >>>>>> +        end = start + len; >>>>>> + >>>>>> +    start_block = ocfs2_blocks_for_bytes(sb, start); >>>>>> +    end_block = ocfs2_blocks_for_bytes(sb, end); >>>>>> +    nr_blocks = end_block - start_block; >>>>>> +    if (!nr_blocks) >>>>>> +        return 0; >>>>>> + >>>>>> +    cluster = ocfs2_bytes_to_clusters(sb, start); >>>>>> +    ret = ocfs2_get_clusters(inode, cluster, &p_cluster, >>>>>> +                &nr_clusters, NULL); >>>>>> +    if (ret) >>>>>> +        return ret; >>>>>> +    if (!p_cluster) >>>>>> +        return 0; >>>>>> + >>>>>> +    offset = start_block - ocfs2_clusters_to_blocks(sb, cluster); >>>>>> +    p_block = ocfs2_clusters_to_blocks(sb, p_cluster) + offset; >>>>>> +    return sb_issue_zeroout(sb, p_block, nr_blocks, GFP_NOFS); >>>>>> +} >>>>>> + >>>>>>    /* >>>>>>     * Parts of this function taken from xfs_change_file_space() >>>>>>     */ >>>>>> @@ -1865,7 +1904,7 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode, >>>>>>    { >>>>>>        int ret; >>>>>>        s64 llen; >>>>>> -    loff_t size; >>>>>> +    loff_t size, orig_isize; >>>>>>        struct ocfs2_super *osb = OCFS2_SB(inode->i_sb); >>>>>>        struct buffer_head *di_bh = NULL; >>>>>>        handle_t *handle; >>>>>> @@ -1896,6 +1935,7 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode, >>>>>>            goto out_inode_unlock; >>>>>>        } >>>>>>    +    orig_isize = i_size_read(inode); >>>>>>        switch (sr->l_whence) { >>>>>>        case 0: /*SEEK_SET*/ >>>>>>            break; >>>>>> @@ -1903,7 +1943,7 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode, >>>>>>            sr->l_start += f_pos; >>>>>>            break; >>>>>>        case 2: /*SEEK_END*/ >>>>>> -        sr->l_start += i_size_read(inode); >>>>>> +        sr->l_start += orig_isize; >>>>>>            break; >>>>>>        default: >>>>>>            ret = -EINVAL; >>>>>> @@ -1957,6 +1997,11 @@ static int __ocfs2_change_file_space(struct file *file, struct inode *inode, >>>>>>        default: >>>>>>            ret = -EINVAL; >>>>>>        } >>>>>> + >>>>>> +    /* zeroout eof blocks in the cluster. */ >>>>>> +    if (!ret && change_size && orig_isize < size) >>>>>> +        ret = ocfs2_zeroout_partial_cluster(inode, orig_isize, >>>>>> +                    size - orig_isize); >>>>>>        up_write(&OCFS2_I(inode)->ip_alloc_sem); >>>>>>        if (ret) { >>>>>>            mlog_errno(ret); >>>>>> From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.6 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,MSGID_FROM_MTA_HEADER, NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C15AEC2B9F7 for ; Wed, 26 May 2021 05:18:22 +0000 (UTC) Received: from aserp2120.oracle.com (aserp2120.oracle.com [141.146.126.78]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 32EBD6135F for ; Wed, 26 May 2021 05:18:22 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 32EBD6135F Authentication-Results: mail.kernel.org; dmarc=pass (p=none dis=none) header.from=oracle.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=ocfs2-devel-bounces@oss.oracle.com Received: from pps.filterd (aserp2120.oracle.com [127.0.0.1]) by aserp2120.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 14Q5F83q195111; Wed, 26 May 2021 05:18:21 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=to : references : from : message-id : date : in-reply-to : mime-version : cc : subject : list-id : list-unsubscribe : list-archive : list-post : list-help : list-subscribe : content-type : content-transfer-encoding : sender; s=corp-2020-01-29; bh=mF50NsnIGy8KUB1NSWGFxR4iA3jjlA5xInLJ017SGWs=; b=fDuiARlmO1qslwVxmxdmDoziMZzJd3CMN5rffZSSgqCKbpUeOE94j94a9U3mW+uYLXrN 7zzVhOeZWLlSYnbFu7hfpTKvA89QjQQ9G3L69aufVxkCI58GD7XMWqXhTrAs0F3Qt3I0 RrgwEo6BHVkqn42JKjiSolMuRWlHMSadgXBKHzscYVXJWe2qKOw1mkC4ngmquy0jmVUf eIaf9EAJdHXGh1fEo7ahR/NydDA03ZuXYV5FY1RhcO2CfNHG3U2ygxjiz1gaoFWOn4U5 2o7JfGjNHdRBi9ZKauGY9/4X6KPbCbLxRnKkq9cxY+VL0+eyOGqj0l5LuBKhpXn4pJr/ XA== Received: from userp3030.oracle.com (userp3030.oracle.com [156.151.31.80]) by aserp2120.oracle.com with ESMTP id 38rne43dw8-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 26 May 2021 05:18:20 +0000 Received: from pps.filterd (userp3030.oracle.com [127.0.0.1]) by userp3030.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 14Q5FI0M058814; Wed, 26 May 2021 05:18:20 GMT Received: from oss.oracle.com (oss-old-reserved.oracle.com [137.254.22.2]) by userp3030.oracle.com with ESMTP id 38pq2uxt1e-1 (version=TLSv1 cipher=AES256-SHA bits=256 verify=NO); Wed, 26 May 2021 05:18:19 +0000 Received: from localhost ([127.0.0.1] helo=lb-oss.oracle.com) by oss.oracle.com with esmtp (Exim 4.63) (envelope-from ) id 1lllpo-0005OK-R9; Tue, 25 May 2021 22:12:00 -0700 Received: from aserp3020.oracle.com ([141.146.126.70]) by oss.oracle.com with esmtp (Exim 4.63) (envelope-from ) id 1lllpl-0005Nu-Lq for ocfs2-devel@oss.oracle.com; Tue, 25 May 2021 22:11:57 -0700 Received: from pps.filterd (aserp3020.oracle.com [127.0.0.1]) by aserp3020.oracle.com (8.16.0.42/8.16.0.42) with SMTP id 14Q54tMD103855 for ; Wed, 26 May 2021 05:11:57 GMT Received: from nam11-dm6-obe.outbound.protection.outlook.com (mail-dm6nam11lp2175.outbound.protection.outlook.com [104.47.57.175]) by aserp3020.oracle.com with ESMTP id 38rehbw36k-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK) for ; Wed, 26 May 2021 05:11:57 +0000 Authentication-Results: vger.kernel.org; dkim=none (message not signed) header.d=none; vger.kernel.org; dmarc=none action=none header.from=oracle.com; Received: from SJ0PR10MB4752.namprd10.prod.outlook.com (2603:10b6:a03:2d7::19) by BYAPR10MB2599.namprd10.prod.outlook.com (2603:10b6:a02:b2::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4150.26; Wed, 26 May 2021 05:11:55 +0000 Received: from SJ0PR10MB4752.namprd10.prod.outlook.com ([fe80::4519:4046:5549:95d9]) by SJ0PR10MB4752.namprd10.prod.outlook.com ([fe80::4519:4046:5549:95d9%6]) with mapi id 15.20.4150.027; Wed, 26 May 2021 05:11:55 +0000 To: Joseph Qi , ocfs2-devel@oss.oracle.com References: <20210521233612.75185-1-junxiao.bi@oracle.com> <35a1d32b-b8d7-ea9b-d28c-6b4fd837605d@linux.alibaba.com> <8aa90f5d-e4db-5107-1d3c-383294871196@oracle.com> <21d8b289-541d-50f5-6f86-de3ee69c56c5@linux.alibaba.com> <35283832-3294-19e0-6542-d1f925711fe8@oracle.com> From: Junxiao Bi Message-ID: <297dcd1e-c741-007e-8f53-77eba9656e74@oracle.com> Date: Tue, 25 May 2021 22:10:33 -0700 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:78.0) Gecko/20100101 Thunderbird/78.10.2 In-Reply-To: Content-Language: en-US X-Originating-IP: [73.231.9.254] X-ClientProxiedBy: BY5PR13CA0022.namprd13.prod.outlook.com (2603:10b6:a03:180::35) To SJ0PR10MB4752.namprd10.prod.outlook.com (2603:10b6:a03:2d7::19) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from dhcp-10-159-238-224.vpn.oracle.com (73.231.9.254) by BY5PR13CA0022.namprd13.prod.outlook.com (2603:10b6:a03:180::35) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4173.12 via Frontend Transport; Wed, 26 May 2021 05:11:55 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: af4e0a79-5d1f-4cf6-34c6-08d92004c7e5 X-MS-TrafficTypeDiagnostic: BYAPR10MB2599: X-MS-Exchange-Transport-Forked: True X-Oracle-Tenancy: 1 X-MS-Oob-TLC-OOBClassifiers: OLM:5516; X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: slL8QFQX5neDLIkOoN/ONQxiswmkb+VZTulrrqKgh5f3o7+CSyZD8FgvDLCuEgVTmbMjTvbwpvK+Pwiomob4mLB9RBB6Fd/cSL7leSlQ4FaXhMTLgzh/Ri4ge2DliB6D5irUU8VaNBOMHa/iJF8DqKsJPkXhtfj55ReGJSmbxqZynpskTe9hJx9tXd4lbehGfjPMudF52w06rPGWfEnqWzxLDvBrTzD7as8nOUkd7Imlm38irW2w0EoNlmNZftEy6geCgAy7Abv1PeIHHOQJtg/+HZg8IyNhGFU3nQHPFPz2v6FFgutQwsN5pdfVulRvhCoVzUuKflyZZH5B46yrPaOglWq7eCVPgjYwldD3VJaJqisNIVieqfc0+zYdqeWnWxpWBy4xCxDOQcNuMO+h9eGrRvM/pIKKWOKlav0j1D/whjiZnfddli3mWR27xX/Ce/OnO6fGT1zRB6pB6zf8iRqE5PmT2dLrb6NRpZBWWeYxbmrW1ozZ2E20g5dq2emq98Io/d8wvCwaluxeQWhY6UgR6gQfnexSCbSYv0PAKqcCSMSbrkRqSuVVmAsxqw5sG4iiKzNVPXCZoi1j0IuOtUK/KkyCjSKc3SxdiS0BXkZVEwHC4TvD/QGKZj8Gjrhh2ZN6cxu2DMDd84G6WL1lJzMgsWZGuIFYARj8i7VZJV8= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:-1; SRV:; IPV:NLI; SFV:SKI; H:SJ0PR10MB4752.namprd10.prod.outlook.com; PTR:; CAT:NONE; SFS:; DIR:INB; X-MS-Exchange-AntiSpam-MessageData: =?utf-8?B?dGRQL1RpRFRhYnJJQUN0ajVXT3FKdVRtaDg2VENuYVQyRFJzeVQ3VkJjdTh4?= =?utf-8?B?WEorVFlLYlhnUjd1bWU0bzZDSTFiMnB5OTV2VE1YQll4OHdOR1JqQ1ZqSks2?= =?utf-8?B?clRndzZTV1hmSEg2SXpab1pPWmxuS2owWUY4SGVnNkpBajJJRTlnMWZDZkw0?= =?utf-8?B?aE1OOW91UVVOMXFRVFhkZHZPUFZXdE1zYWpJdjgxdHpDVjJzNE1ldyt0K0Nw?= =?utf-8?B?WEN5QldrMTBZS2RHczdqelUvcEhDenVsQ25wc1pDMnVRa2VvL2xLUzVGVzli?= =?utf-8?B?Q1RwcVRvZnd1dUEyWXI0QUN4bzd1YU8wMXdMSlhYdXN6WVcydXh6eU1vOENV?= =?utf-8?B?bFNack1VazFFek5CY2JrSGZhSzNSbkZZaWlXOEtNL1hOdFY4Mkp4M2I5b3Bj?= =?utf-8?B?VEIyUktuQkxyYU5aMno3YnRsaHF4NUxINmxxMmNjYTNUNkNrODBPdFJTMEN6?= =?utf-8?B?Y3c0YnlqcUcvWlowRnl4b1VmVC9HSGo5RmhFZXErSDRtRzIzS0N4L1hzZWhG?= =?utf-8?B?MUtoTlYxK0o2Zk1JUTZCRk9VVkRta2JWeEwya3hFeWxLYXhaUnNvQzByUUg3?= =?utf-8?B?QmJVcEp2Mzd1MnB4UUNPVHRGcGhtMTEyZW5xVTlrSTJtdTY1Z3FWSFNuVDJM?= =?utf-8?B?b0ZYUHdLQk4xT3EzZ0hKQUlZeW1ZaWR2Q0k1OXdYZTJmTldNZllseUFrUTNh?= =?utf-8?B?amlWd3kvckxMV2grMjV5dG0ycGxVSXJPMy9WenFpRGhva3padHQzVDcrVEE1?= =?utf-8?B?Q0JBb1cweFI3bkExZDM0VVBNcmI1OTU4VGFjTlQ4KzdXWFdUbXlySnB3NmRy?= =?utf-8?B?YWxRU0RZKy9uMHBWWjNhZzYxbXhwWE5ERGVRZEpkbEZxaW94MWRwWEFYQXhD?= =?utf-8?B?RGkxbVIvUEE3ZEpjYkJoTDU4anFWd204cU12TnVKV1NHaExuM1Avb1hsUWF5?= =?utf-8?B?Z1QvK2t1K0ZhTUdLUEYzYnhpRVFpdURrZnJ5ZHlTL0owbnpRSkZqRGl5WTVD?= =?utf-8?B?VFRmNXFKZnFCcGFQaWRSZllBKy9jS0lJdWhoeUZyeWJidCs4Vllrak05ZENm?= =?utf-8?B?ZVR6YXA1SHZ2SElHOHE2ZlZoRGFvZWN5VWRJeTBJbVJ5TWhlQ3UxTE5lT1VD?= =?utf-8?B?ODNZUDRtZnBIeHk2VE5VZ3p5dGI0WWlhQUUzeFgwd0UxU09tR2NkanR6NG9K?= =?utf-8?B?UGRUSW1ibjV0TTV2NkRsVTZVUGlmZkJ2c3Z1dnRjRmdsNDdIMnpqdHRrRC9D?= =?utf-8?B?T0JES0l1ZXpCYWxIUjhFb1pPVDMwODdsT1lGQ0ZZTU9ELzFXRk5DYlNkNzdI?= =?utf-8?B?WVpWOVMvSk5qKzRFcUhJME96VDRrNG1QREJjRitYdHUweU1TVjhXNzFueGlt?= =?utf-8?B?SC83YTJnSmowcXNQL2NTZnJVMFRJUEZWajBoem5yeXUwZ2tPcnRTVklGMUQx?= =?utf-8?B?ZXZlSFJrYlc5YXlvcjE0UFFKaEx3b0ltakZ3eU5aK3JoSmQrMWJTbExNODJY?= =?utf-8?B?TXN3N2tBMVRyajBXUmF5YTVHUE9KY2ZQNmlTUHRzRUtGVFAxQUJ5MnhzKzc3?= =?utf-8?B?VlE1bkZyTlRNczJTOFdMeFJMUjB5MmlrSkFOSVhEWHNidTkzSGVxQWpZSUNJ?= =?utf-8?B?ZTB3cURtQ2p4bUlQa0MxRUtpVzNBa3BMTFNPUkE1NnFXR3lZcFQ3QXlIaWVL?= =?utf-8?B?MHp0enVmek5RaVdyZDZZb3R3V0RBTzJTVE00TmV5YWVINFpacjVraXlkbGdL?= =?utf-8?Q?Bho58ENdRo3EFSoSvHvEDPT7OFY1PfbxiX4AByP?= X-OriginatorOrg: oracle.com X-MS-Exchange-CrossTenant-Network-Message-Id: af4e0a79-5d1f-4cf6-34c6-08d92004c7e5 X-MS-Exchange-CrossTenant-AuthSource: SJ0PR10MB4752.namprd10.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 May 2021 05:11:55.7292 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 4e2c6054-71cb-48f1-bd6c-3a9705aca71b X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: JbLJJXjnyTS1M42Jkk5L0fW+/aIEL0edAIaE29sHVVvuvc2zF1jCacvoWC+HdUnzV5LTerNcfvNK+Ez75qz7SQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: BYAPR10MB2599 X-MS-Exchange-CrossPremises-AuthSource: SJ0PR10MB4752.namprd10.prod.outlook.com X-MS-Exchange-CrossPremises-AuthAs: Internal X-MS-Exchange-CrossPremises-AuthMechanism: 14 X-MS-Exchange-CrossPremises-Mapi-Admin-Submission: X-MS-Exchange-CrossPremises-MessageSource: StoreDriver X-MS-Exchange-CrossPremises-BCC: X-MS-Exchange-CrossPremises-OriginalClientIPAddress: 73.231.9.254 X-MS-Exchange-CrossPremises-TransportTrafficType: Email X-MS-Exchange-CrossPremises-Antispam-ScanContext: DIR:Originating;SFV:SKI;SKIP:0; X-MS-Exchange-CrossPremises-SCL: -1 X-MS-Exchange-CrossPremises-Processed-By-Journaling: Journal Agent X-OrganizationHeadersPreserved: BYAPR10MB2599.namprd10.prod.outlook.com X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=9995 signatures=668682 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 spamscore=0 adultscore=0 mlxscore=0 mlxlogscore=999 malwarescore=0 phishscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2104190000 definitions=main-2105260033 X-MIME-Autoconverted: from 8bit to base64 by aserp3020.oracle.com id 14Q54tMD103855 Cc: linux-fsdevel@vger.kernel.org, jack@suse.cz Subject: Re: [Ocfs2-devel] [PATCH v2] ocfs2: fix data corruption by fallocate X-BeenThere: ocfs2-devel@oss.oracle.com X-Mailman-Version: 2.1.9 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: ocfs2-devel-bounces@oss.oracle.com Errors-To: ocfs2-devel-bounces@oss.oracle.com X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=9995 signatures=668682 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 phishscore=0 malwarescore=0 spamscore=0 adultscore=0 bulkscore=0 mlxlogscore=999 suspectscore=0 mlxscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2104190000 definitions=main-2105260034 X-Proofpoint-ORIG-GUID: 3aBdCU4ToBiGQ848iRAVJj0BcfoVc0vb X-Proofpoint-GUID: 3aBdCU4ToBiGQ848iRAVJj0BcfoVc0vb X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=9995 signatures=668682 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 bulkscore=0 phishscore=0 mlxlogscore=999 spamscore=0 mlxscore=0 priorityscore=1501 lowpriorityscore=0 impostorscore=0 adultscore=0 clxscore=1011 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2104190000 definitions=main-2105260034 QWZ0ZXIgbW92aW5nIHRoZXJlLCBpX3NpemVfd3JpdGUgd2lsbCBiZSBwcm90ZWN0ZWQgYnkgaXBf YWxsb2Nfc2VtLCANCm9jZnMyX2Rpb19lbmRfaW9fd3JpdGUgd2lsbCB1cGRhdGUgaV9zaXplIHdp dGhvdXQgaG9sZGluZyBpbm9kZSBsb2NrLCANCmJ1dCBpdCBkb2VzIGhvbGRpbmcgaXBfYWxsb2Nf c2VtLg0KDQpUaGFua3MsDQoNCkp1bnhpYW8uDQoNCk9uIDUvMjUvMjEgNzoxMSBQTSwgSm9zZXBo IFFpIHdyb3RlOg0KPiBDYW4gd2Ugc2ltcGx5IHJlcGxhY2UgaV9zaXplX3JlYWQoKSB3aXRoICdv cmlnX2lzaXplJyBhbmQgbGVhdmUgaXNpemUNCj4gdXBkYXRlIGFsb25nIHdpdGggb3RoZXIgZGly dHkgaW5vZGUgb3BlcmF0aW9ucz8NCj4gSSB0aGluayB0aGlzIG1ha2VzIG1vcmUgY29tZm9ydGFi bGUgZm9yIHRoZSBkaXJ0eSBpbm9kZSB0cmFuc2FjdGlvbi4NCj4NCj4gVGhhbmtzLA0KPiBKb3Nl cGgNCj4NCj4gT24gNS8yNi8yMSAxOjU4IEFNLCBKdW54aWFvIEJpIHdyb3RlOg0KPj4gSSB3b3Vs ZCBsaWtlIG1ha2UgdGhlIGZvbGxvd2luZyBjaGFuZ2UgdG8gdGhlIHBhdGNoLCBpcyB0aGF0IG9r IHRvIHlvdT8NCj4+DQo+PiBkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZmlsZS5jIGIvZnMvb2NmczIv ZmlsZS5jDQo+PiBpbmRleCAxNzQ2OWZjN2IyMGUuLjc3NTY1Nzk0MzA1NyAxMDA2NDQNCj4+IC0t LSBhL2ZzL29jZnMyL2ZpbGUuYw0KPj4gKysrIGIvZnMvb2NmczIvZmlsZS5jDQo+PiBAQCAtMTk5 OSw5ICsxOTk5LDEyIEBAIHN0YXRpYyBpbnQgX19vY2ZzMl9jaGFuZ2VfZmlsZV9zcGFjZShzdHJ1 Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGlub2RlICppbm9kZSwNCj4+ICDCoMKgwqDCoMKgwqDCoCB9 DQo+Pg0KPj4gIMKgwqDCoMKgwqDCoMKgIC8qIHplcm9vdXQgZW9mIGJsb2NrcyBpbiB0aGUgY2x1 c3Rlci4gKi8NCj4+IC3CoMKgwqDCoMKgwqAgaWYgKCFyZXQgJiYgY2hhbmdlX3NpemUgJiYgb3Jp Z19pc2l6ZSA8IHNpemUpDQo+PiArwqDCoMKgwqDCoMKgIGlmICghcmV0ICYmIGNoYW5nZV9zaXpl ICYmIG9yaWdfaXNpemUgPCBzaXplKSB7DQo+PiAgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHJldCA9IG9jZnMyX3plcm9vdXRfcGFydGlhbF9jbHVzdGVyKGlub2RlLCBvcmlnX2lzaXpl LA0KPj4gIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzaXplIC0gb3JpZ19pc2l6ZSk7DQo+PiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoIXJldCkNCj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpX3NpemVfd3JpdGUoaW5vZGUsIHNpemUpOw0K Pj4gK8KgwqDCoMKgwqDCoCB9DQo+PiAgwqDCoMKgwqDCoMKgwqAgdXBfd3JpdGUoJk9DRlMyX0ko aW5vZGUpLT5pcF9hbGxvY19zZW0pOw0KPj4gIMKgwqDCoMKgwqDCoMKgIGlmIChyZXQpIHsNCj4+ ICDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbWxvZ19lcnJubyhyZXQpOw0KPj4gQEAg LTIwMTgsOSArMjAyMSw2IEBAIHN0YXRpYyBpbnQgX19vY2ZzMl9jaGFuZ2VfZmlsZV9zcGFjZShz dHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGlub2RlICppbm9kZSwNCj4+ICDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgZ290byBvdXRfaW5vZGVfdW5sb2NrOw0KPj4gIMKgwqDCoMKgwqDC oMKgIH0NCj4+DQo+PiAtwqDCoMKgwqDCoMKgIGlmIChjaGFuZ2Vfc2l6ZSAmJiBpX3NpemVfcmVh ZChpbm9kZSkgPCBzaXplKQ0KPj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaV9zaXpl X3dyaXRlKGlub2RlLCBzaXplKTsNCj4+IC0NCj4+ICDCoMKgwqDCoMKgwqDCoCBpbm9kZS0+aV9j dGltZSA9IGlub2RlLT5pX210aW1lID0gY3VycmVudF90aW1lKGlub2RlKTsNCj4+ICDCoMKgwqDC oMKgwqDCoCByZXQgPSBvY2ZzMl9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUsIGRpX2Jo KTsNCj4+ICDCoMKgwqDCoMKgwqDCoCBpZiAocmV0IDwgMCkNCj4+DQo+PiBUaGFua3MsDQo+Pg0K Pj4gSnVueGlhby4NCj4+DQo+PiBPbiA1LzI0LzIxIDc6MDQgUE0sIEpvc2VwaCBRaSB3cm90ZToN Cj4+PiBUaGFua3MgZm9yIHRoZSBleHBsYW5hdGlvbnMuDQo+Pj4gQSB0aW55IGNsZWFudXAsIHdl IGNhbiB1c2UgJ29yaWdfaXNpemUnIGluc3RlYWQgb2YgaV9zaXplX3JlYWQoKSBsYXRlcg0KPj4+ IGluIF9fb2NmczJfY2hhbmdlX2ZpbGVfc3BhY2UoKS4NCj4+PiBPdGhlciBsb29rcyBnb29kIHRv IG1lLg0KPj4+IFJldmlld2VkLWJ5OiBKb3NlcGggUWkgPGpvc2VwaC5xaUBsaW51eC5hbGliYWJh LmNvbT4NCj4+Pg0KPj4+IE9uIDUvMjUvMjEgMTI6MjMgQU0sIEp1bnhpYW8gQmkgd3JvdGU6DQo+ Pj4+IFRoYXQgd2lsbCBub3Qgd29yaywgYnVmZmVyIHdyaXRlIHplcm8gZmlyc3QsIHRoZW4gdXBk YXRlIGlfc2l6ZSwgaW4gYmV0d2VlbiB3cml0ZWJhY2sgY291bGQgYmUga2lja2VkIGluIGFuZCBj bGVhciB0aG9zZSBkaXJ0eSBidWZmZXJzIGJlY2F1c2UgdGhleSB3ZXJlIG91dCBvZiBpX3NpemUu IEJlc2lkZSB0aGF0LCBPQ0ZTMl9JT0NfUkVTVlNQNjQgd2FzIG5ldmVyIGRvaW5nIHJpZ2h0IGpv YiwgaXQgZGlkbid0IHRha2UgY2FyZSBlb2YgYmxvY2tzIGluIHRoZSBsYXN0IGNsdXN0ZXIsIHRo YXQgbWFkZSBldmVuIGEgc2ltcGxlIGZhbGxvY2F0ZSB0byBleHRlbmQgZmlsZSBzaXplIGNvdWxk IGNhdXNlIGNvcnJ1cHRpb24uIFRoaXMgcGF0Y2ggZml4ZWQgYm90aCBpc3N1ZXMuDQo+Pj4+DQo+ Pj4+IFRoYW5rcywNCj4+Pj4NCj4+Pj4gSnVueGlhby4NCj4+Pj4NCj4+Pj4gT24gNS8yMy8yMSA0 OjUyIEFNLCBKb3NlcGggUWkgd3JvdGU6DQo+Pj4+PiBIaSBKdW54aWFvLA0KPj4+Pj4gSWYgY2hh bmdlX3NpemUgaXMgdHJ1ZSAoIUZBTExPQ19GTF9LRUVQX1NJWkUpLCBpdCB3aWxsIHVwZGF0ZSBp c2l6ZQ0KPj4+Pj4gaW4gX19vY2ZzMl9jaGFuZ2VfZmlsZV9zcGFjZSgpLiBXaHkgZG8gd2UgaGF2 ZSB0byB6ZXJvb3V0IGZpcnN0Pw0KPj4+Pj4NCj4+Pj4+IFRoYW5rcywNCj4+Pj4+IEpvc2VwaA0K Pj4+Pj4NCj4+Pj4+IE9uIDUvMjIvMjEgNzozNiBBTSwgSnVueGlhbyBCaSB3cm90ZToNCj4+Pj4+ PiBXaGVuIGZhbGxvY2F0ZSBwdW5jaGVzIGhvbGVzIG91dCBvZiBpbm9kZSBzaXplLCBpZiBvcmln aW5hbCBpc2l6ZSBpcyBpbg0KPj4+Pj4+IHRoZSBtaWRkbGUgb2YgbGFzdCBjbHVzdGVyLCB0aGVu IHRoZSBwYXJ0IGZyb20gaXNpemUgdG8gdGhlIGVuZCBvZiB0aGUNCj4+Pj4+PiBjbHVzdGVyIHdp bGwgYmUgemVyb2VkIHdpdGggYnVmZmVyIHdyaXRlLCBhdCB0aGF0IHRpbWUgaXNpemUgaXMgbm90 DQo+Pj4+Pj4geWV0IHVwZGF0ZWQgdG8gbWF0Y2ggdGhlIG5ldyBzaXplLCBpZiB3cml0ZWJhY2sg aXMga2lja2VkIGluLCBpdCB3aWxsDQo+Pj4+Pj4gaW52b2tlIG9jZnMyX3dyaXRlcGFnZSgpLT5i bG9ja193cml0ZV9mdWxsX3BhZ2UoKSB3aGVyZSB0aGUgcGFnZXMgb3V0DQo+Pj4+Pj4gb2YgaW5v ZGUgc2l6ZSB3aWxsIGJlIGRyb3BwZWQuIFRoYXQgd2lsbCBjYXVzZSBmaWxlIGNvcnJ1cHRpb24u IEZpeA0KPj4+Pj4+IHRoaXMgYnkgemVybyBvdXQgZW9mIGJsb2NrcyB3aGVuIGV4dGVuZGluZyB0 aGUgaW5vZGUgc2l6ZS4NCj4+Pj4+Pg0KPj4+Pj4+IFJ1bm5pbmcgdGhlIGZvbGxvd2luZyBjb21t YW5kIHdpdGggcWVtdS1pbWFnZSA0LjIuMSBjYW4gZ2V0IGEgY29ycnVwdGVkDQo+Pj4+Pj4gY292 ZXJ0ZWQgaW1hZ2UgZmlsZSBlYXNpbHkuDQo+Pj4+Pj4NCj4+Pj4+PiAgwqDCoMKgwqDCoCBxZW11 LWltZyBjb252ZXJ0IC1wIC10IG5vbmUgLVQgbm9uZSAtZiBxY293MiAkcWNvd19pbWFnZSBcDQo+ Pj4+Pj4gIMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLU8gcWNvdzIgLW8gY29tcGF0PTEu MSAkcWNvd19pbWFnZS5jb252DQo+Pj4+Pj4NCj4+Pj4+PiBUaGUgdXNhZ2Ugb2YgZmFsbG9jYXRl IGluIHFlbXUgaXMgbGlrZSB0aGlzLCBpdCBmaXJzdCBwdW5jaGVzIGhvbGVzIG91dCBvZg0KPj4+ Pj4+IGlub2RlIHNpemUsIHRoZW4gZXh0ZW5kIHRoZSBpbm9kZSBzaXplLg0KPj4+Pj4+DQo+Pj4+ Pj4gIMKgwqDCoMKgwqAgZmFsbG9jYXRlKDExLCBGQUxMT0NfRkxfS0VFUF9TSVpFfEZBTExPQ19G TF9QVU5DSF9IT0xFLCAyMjc2MTk2MzUyLCA2NTUzNikgPSAwDQo+Pj4+Pj4gIMKgwqDCoMKgwqAg ZmFsbG9jYXRlKDExLCAwLCAyMjc2MTk2MzUyLCA2NTUzNikgPSAwDQo+Pj4+Pj4NCj4+Pj4+PiB2 MTogaHR0cHM6Ly93d3cuc3Bpbmljcy5uZXQvbGlzdHMvbGludXgtZnNkZXZlbC9tc2cxOTM5OTku aHRtbA0KPj4+Pj4+DQo+Pj4+Pj4gQ2M6IDxzdGFibGVAdmdlci5rZXJuZWwub3JnPg0KPj4+Pj4+ IENjOiBKYW4gS2FyYSA8amFja0BzdXNlLmN6Pg0KPj4+Pj4+IFNpZ25lZC1vZmYtYnk6IEp1bnhp YW8gQmkgPGp1bnhpYW8uYmlAb3JhY2xlLmNvbT4NCj4+Pj4+PiAtLS0NCj4+Pj4+Pg0KPj4+Pj4+ IENoYW5nZXMgaW4gdjI6DQo+Pj4+Pj4gLSBzdWdnZXN0ZWQgYnkgSmFuIEthcmEsIHVzaW5nIHNi X2lzc3VlX3plcm9vdXQgdG8gemVybyBlb2YgYmxvY2tzIGluIGRpc2sgZGlyZWN0bHkuDQo+Pj4+ Pj4NCj4+Pj4+PiAgwqDCoCBmcy9vY2ZzMi9maWxlLmMgfCA0OSArKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tDQo+Pj4+Pj4gIMKgwqAgMSBmaWxlIGNoYW5n ZWQsIDQ3IGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0pDQo+Pj4+Pj4NCj4+Pj4+PiBkaWZm IC0tZ2l0IGEvZnMvb2NmczIvZmlsZS5jIGIvZnMvb2NmczIvZmlsZS5jDQo+Pj4+Pj4gaW5kZXgg ZjE3YzNkMzNmYjE4Li4xNzQ2OWZjN2IyMGUgMTAwNjQ0DQo+Pj4+Pj4gLS0tIGEvZnMvb2NmczIv ZmlsZS5jDQo+Pj4+Pj4gKysrIGIvZnMvb2NmczIvZmlsZS5jDQo+Pj4+Pj4gQEAgLTE4NTUsNiAr MTg1NSw0NSBAQCBpbnQgb2NmczJfcmVtb3ZlX2lub2RlX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5v ZGUsDQo+Pj4+Pj4gIMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Ow0KPj4+Pj4+ICDCoMKgIH0NCj4+ Pj4+PiAgwqDCoCArLyoNCj4+Pj4+PiArICogemVybyBvdXQgcGFydGlhbCBibG9ja3Mgb2Ygb25l IGNsdXN0ZXIuDQo+Pj4+Pj4gKyAqDQo+Pj4+Pj4gKyAqIHN0YXJ0OiBmaWxlIG9mZnNldCB3aGVy ZSB6ZXJvIHN0YXJ0cywgd2lsbCBiZSBtYWRlIHVwcGVyIGJsb2NrIGFsaWduZWQuDQo+Pj4+Pj4g KyAqIGxlbjogaXQgd2lsbCBiZSB0cmltbWVkIHRvIHRoZSBlbmQgb2YgY3VycmVudCBjbHVzdGVy IGlmICJzdGFydCArIGxlbiINCj4+Pj4+PiArICrCoMKgwqDCoMKgIGlzIGJpZ2dlciB0aGFuIGl0 Lg0KPj4+Pj4+ICsgKi8NCj4+Pj4+PiArc3RhdGljIGludCBvY2ZzMl96ZXJvb3V0X3BhcnRpYWxf Y2x1c3RlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLA0KPj4+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCB1NjQgc3RhcnQsIHU2NCBsZW4pDQo+Pj4+Pj4gK3sNCj4+Pj4+ PiArwqDCoMKgIGludCByZXQ7DQo+Pj4+Pj4gK8KgwqDCoCB1NjQgc3RhcnRfYmxvY2ssIGVuZF9i bG9jaywgbnJfYmxvY2tzOw0KPj4+Pj4+ICvCoMKgwqAgdTY0IHBfYmxvY2ssIG9mZnNldDsNCj4+ Pj4+PiArwqDCoMKgIHUzMiBjbHVzdGVyLCBwX2NsdXN0ZXIsIG5yX2NsdXN0ZXJzOw0KPj4+Pj4+ ICvCoMKgwqAgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOw0KPj4+Pj4+ICvC oMKgwqAgdTY0IGVuZCA9IG9jZnMyX2FsaWduX2J5dGVzX3RvX2NsdXN0ZXJzKHNiLCBzdGFydCk7 DQo+Pj4+Pj4gKw0KPj4+Pj4+ICvCoMKgwqAgaWYgKHN0YXJ0ICsgbGVuIDwgZW5kKQ0KPj4+Pj4+ ICvCoMKgwqDCoMKgwqDCoCBlbmQgPSBzdGFydCArIGxlbjsNCj4+Pj4+PiArDQo+Pj4+Pj4gK8Kg wqDCoCBzdGFydF9ibG9jayA9IG9jZnMyX2Jsb2Nrc19mb3JfYnl0ZXMoc2IsIHN0YXJ0KTsNCj4+ Pj4+PiArwqDCoMKgIGVuZF9ibG9jayA9IG9jZnMyX2Jsb2Nrc19mb3JfYnl0ZXMoc2IsIGVuZCk7 DQo+Pj4+Pj4gK8KgwqDCoCBucl9ibG9ja3MgPSBlbmRfYmxvY2sgLSBzdGFydF9ibG9jazsNCj4+ Pj4+PiArwqDCoMKgIGlmICghbnJfYmxvY2tzKQ0KPj4+Pj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1 cm4gMDsNCj4+Pj4+PiArDQo+Pj4+Pj4gK8KgwqDCoCBjbHVzdGVyID0gb2NmczJfYnl0ZXNfdG9f Y2x1c3RlcnMoc2IsIHN0YXJ0KTsNCj4+Pj4+PiArwqDCoMKgIHJldCA9IG9jZnMyX2dldF9jbHVz dGVycyhpbm9kZSwgY2x1c3RlciwgJnBfY2x1c3RlciwNCj4+Pj4+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgICZucl9jbHVzdGVycywgTlVMTCk7DQo+Pj4+Pj4gK8KgwqDCoCBpZiAo cmV0KQ0KPj4+Pj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Ow0KPj4+Pj4+ICvCoMKgwqAg aWYgKCFwX2NsdXN0ZXIpDQo+Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAwOw0KPj4+Pj4+ ICsNCj4+Pj4+PiArwqDCoMKgIG9mZnNldCA9IHN0YXJ0X2Jsb2NrIC0gb2NmczJfY2x1c3RlcnNf dG9fYmxvY2tzKHNiLCBjbHVzdGVyKTsNCj4+Pj4+PiArwqDCoMKgIHBfYmxvY2sgPSBvY2ZzMl9j bHVzdGVyc190b19ibG9ja3Moc2IsIHBfY2x1c3RlcikgKyBvZmZzZXQ7DQo+Pj4+Pj4gK8KgwqDC oCByZXR1cm4gc2JfaXNzdWVfemVyb291dChzYiwgcF9ibG9jaywgbnJfYmxvY2tzLCBHRlBfTk9G Uyk7DQo+Pj4+Pj4gK30NCj4+Pj4+PiArDQo+Pj4+Pj4gIMKgwqAgLyoNCj4+Pj4+PiAgwqDCoMKg ICogUGFydHMgb2YgdGhpcyBmdW5jdGlvbiB0YWtlbiBmcm9tIHhmc19jaGFuZ2VfZmlsZV9zcGFj ZSgpDQo+Pj4+Pj4gIMKgwqDCoCAqLw0KPj4+Pj4+IEBAIC0xODY1LDcgKzE5MDQsNyBAQCBzdGF0 aWMgaW50IF9fb2NmczJfY2hhbmdlX2ZpbGVfc3BhY2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVj dCBpbm9kZSAqaW5vZGUsDQo+Pj4+Pj4gIMKgwqAgew0KPj4+Pj4+ICDCoMKgwqDCoMKgwqAgaW50 IHJldDsNCj4+Pj4+PiAgwqDCoMKgwqDCoMKgIHM2NCBsbGVuOw0KPj4+Pj4+IC3CoMKgwqAgbG9m Zl90IHNpemU7DQo+Pj4+Pj4gK8KgwqDCoCBsb2ZmX3Qgc2l6ZSwgb3JpZ19pc2l6ZTsNCj4+Pj4+ PiAgwqDCoMKgwqDCoMKgIHN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUt Pmlfc2IpOw0KPj4+Pj4+ICDCoMKgwqDCoMKgwqAgc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCA9 IE5VTEw7DQo+Pj4+Pj4gIMKgwqDCoMKgwqDCoCBoYW5kbGVfdCAqaGFuZGxlOw0KPj4+Pj4+IEBA IC0xODk2LDYgKzE5MzUsNyBAQCBzdGF0aWMgaW50IF9fb2NmczJfY2hhbmdlX2ZpbGVfc3BhY2Uo c3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsDQo+Pj4+Pj4gIMKgwqDCoMKg wqDCoMKgwqDCoMKgIGdvdG8gb3V0X2lub2RlX3VubG9jazsNCj4+Pj4+PiAgwqDCoMKgwqDCoMKg IH0NCj4+Pj4+PiAgwqDCoCArwqDCoMKgIG9yaWdfaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7 DQo+Pj4+Pj4gIMKgwqDCoMKgwqDCoCBzd2l0Y2ggKHNyLT5sX3doZW5jZSkgew0KPj4+Pj4+ICDC oMKgwqDCoMKgwqAgY2FzZSAwOiAvKlNFRUtfU0VUKi8NCj4+Pj4+PiAgwqDCoMKgwqDCoMKgwqDC oMKgwqAgYnJlYWs7DQo+Pj4+Pj4gQEAgLTE5MDMsNyArMTk0Myw3IEBAIHN0YXRpYyBpbnQgX19v Y2ZzMl9jaGFuZ2VfZmlsZV9zcGFjZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGlub2RlICpp bm9kZSwNCj4+Pj4+PiAgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3ItPmxfc3RhcnQgKz0gZl9wb3M7 DQo+Pj4+Pj4gIMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOw0KPj4+Pj4+ICDCoMKgwqDCoMKg wqAgY2FzZSAyOiAvKlNFRUtfRU5EKi8NCj4+Pj4+PiAtwqDCoMKgwqDCoMKgwqAgc3ItPmxfc3Rh cnQgKz0gaV9zaXplX3JlYWQoaW5vZGUpOw0KPj4+Pj4+ICvCoMKgwqDCoMKgwqDCoCBzci0+bF9z dGFydCArPSBvcmlnX2lzaXplOw0KPj4+Pj4+ICDCoMKgwqDCoMKgwqDCoMKgwqDCoCBicmVhazsN Cj4+Pj4+PiAgwqDCoMKgwqDCoMKgIGRlZmF1bHQ6DQo+Pj4+Pj4gIMKgwqDCoMKgwqDCoMKgwqDC oMKgIHJldCA9IC1FSU5WQUw7DQo+Pj4+Pj4gQEAgLTE5NTcsNiArMTk5NywxMSBAQCBzdGF0aWMg aW50IF9fb2NmczJfY2hhbmdlX2ZpbGVfc3BhY2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBp bm9kZSAqaW5vZGUsDQo+Pj4+Pj4gIMKgwqDCoMKgwqDCoCBkZWZhdWx0Og0KPj4+Pj4+ICDCoMKg wqDCoMKgwqDCoMKgwqDCoCByZXQgPSAtRUlOVkFMOw0KPj4+Pj4+ICDCoMKgwqDCoMKgwqAgfQ0K Pj4+Pj4+ICsNCj4+Pj4+PiArwqDCoMKgIC8qIHplcm9vdXQgZW9mIGJsb2NrcyBpbiB0aGUgY2x1 c3Rlci4gKi8NCj4+Pj4+PiArwqDCoMKgIGlmICghcmV0ICYmIGNoYW5nZV9zaXplICYmIG9yaWdf aXNpemUgPCBzaXplKQ0KPj4+Pj4+ICvCoMKgwqDCoMKgwqDCoCByZXQgPSBvY2ZzMl96ZXJvb3V0 X3BhcnRpYWxfY2x1c3Rlcihpbm9kZSwgb3JpZ19pc2l6ZSwNCj4+Pj4+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc2l6ZSAtIG9yaWdfaXNpemUpOw0KPj4+Pj4+ICDC oMKgwqDCoMKgwqAgdXBfd3JpdGUoJk9DRlMyX0koaW5vZGUpLT5pcF9hbGxvY19zZW0pOw0KPj4+ Pj4+ICDCoMKgwqDCoMKgwqAgaWYgKHJldCkgew0KPj4+Pj4+ICDCoMKgwqDCoMKgwqDCoMKgwqDC oCBtbG9nX2Vycm5vKHJldCk7DQo+Pj4+Pj4NCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCk9jZnMyLWRldmVsIG1haWxpbmcgbGlzdApPY2ZzMi1kZXZlbEBv c3Mub3JhY2xlLmNvbQpodHRwczovL29zcy5vcmFjbGUuY29tL21haWxtYW4vbGlzdGluZm8vb2Nm czItZGV2ZWw=