From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-alma10-1.taild15c8.ts.net [100.103.45.18]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CDE2D493648 for ; Sat, 22 Aug 2026 07:31:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=100.103.45.18 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787383882; cv=none; b=WDDgcm/XtywTvdRzLppavgGH2DpY2yv8ITubT+BtwqtsgzPax0F/E5JBEWYKCmap7hZP0jQf8mnFotHk79v+/uOndcTBiJjAhiaVsq2Uejme9Nip/G/flciSZ45omEQrCX22zAJOs019aS6ZxYoYHxx9c5RQrjBw/4caEhQyAY4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1787383882; c=relaxed/simple; bh=o3wJMaxfGi2sr0UgA77TBEVCj5c4fj8vsvyobIumIzg=; h=Message-ID:Date:MIME-Version:Cc:Subject:To:References:From: In-Reply-To:Content-Type; b=cCAChXc82KtSF1kd5pZVIIQgOzBhbZ+xj3+NQVzIbipoxAfnXyMhqM/It/Ppnlt1fX0irGM/zej7Pg/rjjs0CY6fw2Mf674LxGPfVOgw3XzUgJZrvd0Lh4+FFEaSazqhXlBTSyU8cC3ScJvCuH/A9AUB3zEQnR5l4aVahismr4g= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=YfvuZHCz; arc=none smtp.client-ip=100.103.45.18 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="YfvuZHCz" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 96CAB1F00A3A; Sat, 22 Aug 2026 07:31:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1787383880; bh=Dh4yj5g3DJLQv20sk/xYAThxnfnOnsHLIQvEYHkzTKw=; h=Date:Cc:Subject:To:References:From:In-Reply-To; b=YfvuZHCzOkpLyRMPEE5QNylEygOUv353gzCkc5zkmOu5stwuirfm8ZYoSFAh/uw2p AHFxkZarw700G7cL/QjfDywYLxv9dijiMV9HDKnFBj8pwSlto8aGEv/oDRLR/jLspX jjWwsTcA0Dxq0XJazT9FuvdXrwrg/R3OH5RqxEm8Yxfh3WUnH7Zqp3wfXtRCUNk3wr 16FoLToUnx9NjKexiiYM4EFNDvvLrqtsy3ewN6QUQWz8P4YSURR4yxxhjrYvsspq5a EEAF79p5bLfZ1EtDu2/EPOO97nrzykLqLW51+UplNK6jnAc6BLB76i/tttaEw2AKnr 50xAq9JTRk+IA== Message-ID: <55ce8604-aa44-4e77-ba07-80689567fcf2@kernel.org> Date: Sat, 22 Aug 2026 15:31:15 +0800 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Cc: chao@kernel.org, Daeho Jeong , kernel-team@android.com, linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, =?UTF-8?B?7KCV7ISg66+8?= Subject: Re: [f2fs-dev] [PATCH] f2fs: accurately adjust free_sections during free_segment_range To: Daeho Jeong , Yeongjin Gil References: <20260818171412.3201082-1-daeho43@gmail.com> <0e1162de-1ad4-4c24-a5c9-cd05c5b08cc0@kernel.org> <8c21e8cb-00ba-497b-94a8-55219e14653f@kernel.org> <001401dd3147$17b1f300$4715d900$@samsung.com> Content-Language: en-US From: Chao Yu In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 8/22/26 00:49, Daeho Jeong wrote: > On Fri, Aug 21, 2026 at 1:29 AM Yeongjin Gil wrote: >> >>> On Thu, Aug 20, 2026 at 6:19 AM Chao Yu wrote: >>>> >>>> On 8/20/26 02:26, Daeho Jeong wrote: >>>>> On Tue, Aug 18, 2026 at 8:57 PM Chao Yu wrote: >>>>>> >>>>>> On 8/19/26 01:14, Daeho Jeong wrote: >>>>>>> From: Daeho Jeong >>>>>>> >>>>>>> In free_segment_range(), MAIN_SECS(sbi) is temporarily reduced by >>>>>>> `secs` while valid blocks in the truncated range are evacuated by GC. >>>>>>> >>>>>>> However, if any sections within the truncated range were already >>>>>>> free, failing to deduct them from FREE_I(sbi)->free_sections leads >>>>>>> to an over-estimation of available space in the reduced main area, >>>>>>> causing inconsistent free section accounting. >>>>>> >>>>>> Can you please show me an example for above case? I didn't get it. >>>>> >>>>> Here is a concrete example explaining why this adjustment is needed: >>>> >>>> Thanks for the detailed explanation. >>>> >>>>> >>>>> Suppose: >>>>> - Total main sections: MAIN_SECS = 100 (sections 0 .. 99) >>>>> - Total free sections: free_sections = 30 >>>>> - We want to shrink the filesystem by 10 sections (secs = 10, range >>> 90 .. 99). >>>>> - Within the truncated range (sections 90 .. 99): >>>>> * 6 sections are already free (free_secmap bit is 0) >>>>> * 4 sections are in-use with valid blocks that need to be migrated >>> by GC. >>>>> When free_segment_range() enters: >>>>> 1. MAIN_SECS is temporarily reduced from 100 to 90 so that new block >>>>> allocations are constrained to sections 0 .. 89. >>>>> 2. The actual number of free sections available in the reduced range >>>>> (0 .. 89) is only 24 (30 - 6 = 24). >>>>> 3. Without this patch: >>>>> - free_sections remains 30 while MAIN_SECS is 90. >>>>> - During the subsequent GC migrations, free section checks (such as >>>>> has_not_enough_free_secs()) will over-estimate available space >>>>> by 6 >>>> >>>> But free_segment_range() won't call into has_not_enough_free_secs(), >>>> if I'm not missing anything. >>> >>> Oh, right. I missed it's FG_GC. >>> I think we can drop this patch. >>> >>> Thanks. >>> >> I wonder if the free-section adjustment could still be relevant >> to the SSR/LFS allocation decision during resize. >> >> Could you please also check whether free_sections may affect >> allocation through the following paths? >> >> free_segment_range() >> -> f2fs_allocate_segment_for_resize() >> -> f2fs_need_SSR() >> -> new_curseg() >> -> get_new_segment() >> >> Also, when a current segment becomes full during block migration: >> >> free_segment_range() >> -> f2fs_gc_range() >> -> do_garbage_collect() >> -> f2fs_allocate_data_block() >> -> need_new_seg() >> -> f2fs_need_SSR() >> -> new_curseg() >> -> get_new_segment() >> >> If free_sections still include free sections in the range being >> removed, f2fs_need_SSR() may choose LFS allocation instead of SSR. >> Since get_new_segment() searches only within the temporarily reduced >> MAIN_SECS range, it may fail to find a free section. >> >> Could you please confirm whether this case also needs to be handled? > > Thank you for pointing this out — this is a very sharp and valid observation! > > It makes sense to me. Chao, WDYT? Daeho, yeah, I think it's a good catch from Yeongjin. I suspect this is a bug, right? For example, f2fs has high BDF value: 0..85 are dirty sections, and has few valid blocks in each section 86..89 are free sections 90..99 are full sections When we migrate 90..99 to 0..89, if SSR can not used for such case, get_new_segment() may return -ENOSPC, and trigger the panic? Thanks, > >> >> Thanks, >>>> >>>> Not sure, maybe you mean other threads will call >>>> has_not_enough_free_secs(), are you worried about that we may miss >>> chances to call fggc earlier in below cases: >>>> >>>> f2fs_balance_fs -> has_enough_free_secs -> f2fs_gc? I guess it will >>>> blocked on gc_lock. >>> >>>> >>>>> sections in the active 0 .. 89 range. >>>>> - If free_segment_range() fails midway (e.g. -EAGAIN), >>> free_sections >>>>> accounting becomes inconsistent. >>>> >>>> Why free_sections accounting becomes inconsistent if >>>> free_segment_range() fails midway? >>>> >>>> Thanks, >>>> >>>>> With this patch: >>>>> - We count the 6 already-free sections in the truncated range (90 .. >>> 99) and >>>>> deduct them from free_sections upon entering (30 - 6 = 24), >>> perfectly >>>>> matching the actual free sections in the active range 0 .. 89. >>>>> - On exit, the deducted amount is restored, keeping free_sections >>> consistent >>>>> throughout the entire resize lifecycle. >>>>> >>>>> Hope this clarifies the scenario! >>>>> >>>>> Thanks, >>>>> >>>>>> >>>>>> BTW, it needs to rebase this patch on dev-test branch. >>>>>> >>>>>> Thanks, >>>>>> >>>>>>> >>>>>>> Fix this by calculating the number of already-free sections in the >>>>>>> truncated range under segmap_lock, deducting them from >>>>>>> free_sections upon entering free_segment_range(), and restoring them >>> under segmap_lock on exit. >>>>>>> >>>>>>> Signed-off-by: Daeho Jeong >>>>>>> Signed-off-by: Sunmin Jeong >>>>>>> --- >>>>>>> fs/f2fs/gc.c | 15 ++++++++++++++- >>>>>>> 1 file changed, 14 insertions(+), 1 deletion(-) >>>>>>> >>>>>>> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c index >>>>>>> 787133ee2eb2..f3a6fc6d08ae 100644 >>>>>>> --- a/fs/f2fs/gc.c >>>>>>> +++ b/fs/f2fs/gc.c >>>>>>> @@ -2200,8 +2200,9 @@ int f2fs_gc_range(struct f2fs_sb_info *sbi, >>>>>>> static int free_segment_range(struct f2fs_sb_info *sbi, >>>>>>> unsigned int secs, bool dry_run) >>>>>>> { >>>>>>> - unsigned int next_inuse, start, end; >>>>>>> + unsigned int secno, next_inuse, start, end, end_secno; >>>>>>> struct cp_control cpc = { CP_RESIZE, 0, 0, 0 }; >>>>>>> + unsigned int freed_secs = 0; >>>>>>> int gc_mode, gc_type; >>>>>>> int err = 0; >>>>>>> int type; >>>>>>> @@ -2210,6 +2211,7 @@ static int free_segment_range(struct >>> f2fs_sb_info *sbi, >>>>>>> MAIN_SECS(sbi) -= secs; >>>>>>> start = MAIN_SECS(sbi) * SEGS_PER_SEC(sbi); >>>>>>> end = MAIN_SEGS(sbi) - 1; >>>>>>> + end_secno = GET_SEC_FROM_SEG(sbi, end); >>>>>>> >>>>>>> mutex_lock(&DIRTY_I(sbi)->seglist_lock); >>>>>>> for (gc_mode = 0; gc_mode < MAX_GC_POLICY; gc_mode++) @@ >>>>>>> -2221,6 +2223,14 @@ static int free_segment_range(struct >>> f2fs_sb_info *sbi, >>>>>>> sbi->next_victim_seg[gc_type] = NULL_SEGNO; >>>>>>> mutex_unlock(&DIRTY_I(sbi)->seglist_lock); >>>>>>> >>>>>>> + spin_lock(&FREE_I(sbi)->segmap_lock); >>>>>>> + for (secno = MAIN_SECS(sbi); secno <= end_secno; secno++) { >>>>>>> + if (!test_bit(secno, FREE_I(sbi)->free_secmap)) >>>>>>> + freed_secs++; >>>>>>> + } >>>>>>> + FREE_I(sbi)->free_sections -= freed_secs; >>>>>>> + spin_unlock(&FREE_I(sbi)->segmap_lock); >>>>>>> + >>>>>>> /* Move out cursegs from the target range */ >>>>>>> for (type = CURSEG_HOT_DATA; type < NR_CURSEG_TYPE; type++) { >>>>>>> err = f2fs_allocate_segment_for_resize(sbi, type, >>>>>>> start, end); @@ -2245,6 +2255,9 @@ static int >>> free_segment_range(struct f2fs_sb_info *sbi, >>>>>>> f2fs_bug_on(sbi, 1); >>>>>>> } >>>>>>> out: >>>>>>> + spin_lock(&FREE_I(sbi)->segmap_lock); >>>>>>> + FREE_I(sbi)->free_sections += freed_secs; >>>>>>> + spin_unlock(&FREE_I(sbi)->segmap_lock); >>>>>>> MAIN_SECS(sbi) += secs; >>>>>>> return err; >>>>>>> } >>>>>> >>>> >>> >>> >>> _______________________________________________ >>> Linux-f2fs-devel mailing list >>> Linux-f2fs-devel@lists.sourceforge.net >>> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel >> >> 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 Received: from lists.sourceforge.net (lists.sourceforge.net [216.105.38.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 43679C5DF97 for ; Sat, 22 Aug 2026 07:31:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.sourceforge.net; s=beta; h=Content-Type:Content-Transfer-Encoding:Cc: Reply-To:From:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:Subject:In-Reply-To:References:To:MIME-Version:Date: Message-ID:Sender:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=8y+Ce/u/+t4ZufI5dkRag7BH5wr99Yme0Si8W7Fh0zc=; b=NNfIt1+s0H/vNN/6JraYcIGAFL kR3VXG6IwDoVToMQKzI20YouZLYo24+F9w1UClQF3UHWgjIg6fGjicwfiKHECi9ZZdCGmoyz6EYXf cyYPavbFq6LGSNdIv+Ty2GhT17jEbUPBae1gZqvRgERn0YB/tovNdI8CBMd1JZaa9qDQ=; Received: from [127.0.0.1] (helo=sfs-ml-2.v29.lw.sourceforge.com) by sfs-ml-2.v29.lw.sourceforge.com with esmtp (Exim 4.95) (envelope-from ) id 1wxgCd-0001vI-9B; Sat, 22 Aug 2026 07:31:44 +0000 Received: from [172.30.29.66] (helo=mx.sourceforge.net) by sfs-ml-2.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1wxgCM-0001v2-Qr for linux-f2fs-devel@lists.sourceforge.net; Sat, 22 Aug 2026 07:31:27 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=Content-Transfer-Encoding:Content-Type:In-Reply-To: From:References:To:Subject:Cc:MIME-Version:Date:Message-ID:Sender:Reply-To: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=Dh4yj5g3DJLQv20sk/xYAThxnfnOnsHLIQvEYHkzTKw=; b=RitRkR+FszfMIVJy0nQjGQLTxs WQi0j3MsoWKCQWaRbKi87ysadf/9GHyvkFARn/iNhXtvWXkS1N0UJAg5H93dvHkokZlpvRAcUGhVv ikD4gQ+3kDqOnlWDkqGffy5NGu8JTp7P1mdf4Vo//KVz2fExnUbyLKWxPnTFQgzwOv2Y=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=Content-Transfer-Encoding:Content-Type:In-Reply-To:From:References:To: Subject:Cc:MIME-Version:Date:Message-ID:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=Dh4yj5g3DJLQv20sk/xYAThxnfnOnsHLIQvEYHkzTKw=; b=ItwKDhKV1VSKIrTie78ApteKCi ZBzXDoFyywrH2FB2VzH4QUdO7aymNqsvnut8gbJEN2UuCGa5hVFI7lwsA+1Tee1NjWvqckSgKawWf VAwfdyqgeuwa/06IGj5y8lAEUzz+cyoe2Dle7FVKt2X/7XsIH1x2p75YdOxJ0aFHIovQ=; Received: from tor.source.kernel.org ([172.105.4.254]) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.95) id 1wxgCM-0002Yb-JC for linux-f2fs-devel@lists.sourceforge.net; Sat, 22 Aug 2026 07:31:27 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by tor.source.kernel.org (Postfix) with ESMTP id D908261126; Sat, 22 Aug 2026 07:31:20 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 96CAB1F00A3A; Sat, 22 Aug 2026 07:31:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1787383880; bh=Dh4yj5g3DJLQv20sk/xYAThxnfnOnsHLIQvEYHkzTKw=; h=Date:Cc:Subject:To:References:From:In-Reply-To; b=YfvuZHCzOkpLyRMPEE5QNylEygOUv353gzCkc5zkmOu5stwuirfm8ZYoSFAh/uw2p AHFxkZarw700G7cL/QjfDywYLxv9dijiMV9HDKnFBj8pwSlto8aGEv/oDRLR/jLspX jjWwsTcA0Dxq0XJazT9FuvdXrwrg/R3OH5RqxEm8Yxfh3WUnH7Zqp3wfXtRCUNk3wr 16FoLToUnx9NjKexiiYM4EFNDvvLrqtsy3ewN6QUQWz8P4YSURR4yxxhjrYvsspq5a EEAF79p5bLfZ1EtDu2/EPOO97nrzykLqLW51+UplNK6jnAc6BLB76i/tttaEw2AKnr 50xAq9JTRk+IA== Message-ID: <55ce8604-aa44-4e77-ba07-80689567fcf2@kernel.org> Date: Sat, 22 Aug 2026 15:31:15 +0800 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird To: Daeho Jeong , Yeongjin Gil References: <20260818171412.3201082-1-daeho43@gmail.com> <0e1162de-1ad4-4c24-a5c9-cd05c5b08cc0@kernel.org> <8c21e8cb-00ba-497b-94a8-55219e14653f@kernel.org> <001401dd3147$17b1f300$4715d900$@samsung.com> Content-Language: en-US In-Reply-To: X-Headers-End: 1wxgCM-0002Yb-JC Subject: Re: [f2fs-dev] [PATCH] f2fs: accurately adjust free_sections during free_segment_range X-BeenThere: linux-f2fs-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Chao Yu via Linux-f2fs-devel Reply-To: Chao Yu Cc: Daeho Jeong , linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, kernel-team@android.com Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net T24gOC8yMi8yNiAwMDo0OSwgRGFlaG8gSmVvbmcgd3JvdGU6Cj4gT24gRnJpLCBBdWcgMjEsIDIw MjYgYXQgMToyOeKAr0FNIFllb25namluIEdpbCA8eW91bmdqaW4uZ2lsQHNhbXN1bmcuY29tPiB3 cm90ZToKPj4KPj4+IE9uIFRodSwgQXVnIDIwLCAyMDI2IGF0IDY6MTnigK9BTSBDaGFvIFl1IDxj aGFvQGtlcm5lbC5vcmc+IHdyb3RlOgo+Pj4+Cj4+Pj4gT24gOC8yMC8yNiAwMjoyNiwgRGFlaG8g SmVvbmcgd3JvdGU6Cj4+Pj4+IE9uIFR1ZSwgQXVnIDE4LCAyMDI2IGF0IDg6NTfigK9QTSBDaGFv IFl1IDxjaGFvQGtlcm5lbC5vcmc+IHdyb3RlOgo+Pj4+Pj4KPj4+Pj4+IE9uIDgvMTkvMjYgMDE6 MTQsIERhZWhvIEplb25nIHdyb3RlOgo+Pj4+Pj4+IEZyb206IERhZWhvIEplb25nIDxkYWVob2pl b25nQGdvb2dsZS5jb20+Cj4+Pj4+Pj4KPj4+Pj4+PiBJbiBmcmVlX3NlZ21lbnRfcmFuZ2UoKSwg TUFJTl9TRUNTKHNiaSkgaXMgdGVtcG9yYXJpbHkgcmVkdWNlZCBieQo+Pj4+Pj4+IGBzZWNzYCB3 aGlsZSB2YWxpZCBibG9ja3MgaW4gdGhlIHRydW5jYXRlZCByYW5nZSBhcmUgZXZhY3VhdGVkIGJ5 IEdDLgo+Pj4+Pj4+Cj4+Pj4+Pj4gSG93ZXZlciwgaWYgYW55IHNlY3Rpb25zIHdpdGhpbiB0aGUg dHJ1bmNhdGVkIHJhbmdlIHdlcmUgYWxyZWFkeQo+Pj4+Pj4+IGZyZWUsIGZhaWxpbmcgdG8gZGVk dWN0IHRoZW0gZnJvbSBGUkVFX0koc2JpKS0+ZnJlZV9zZWN0aW9ucyBsZWFkcwo+Pj4+Pj4+IHRv IGFuIG92ZXItZXN0aW1hdGlvbiBvZiBhdmFpbGFibGUgc3BhY2UgaW4gdGhlIHJlZHVjZWQgbWFp biBhcmVhLAo+Pj4+Pj4+IGNhdXNpbmcgaW5jb25zaXN0ZW50IGZyZWUgc2VjdGlvbiBhY2NvdW50 aW5nLgo+Pj4+Pj4KPj4+Pj4+IENhbiB5b3UgcGxlYXNlIHNob3cgbWUgYW4gZXhhbXBsZSBmb3Ig YWJvdmUgY2FzZT8gSSBkaWRuJ3QgZ2V0IGl0Lgo+Pj4+Pgo+Pj4+PiBIZXJlIGlzIGEgY29uY3Jl dGUgZXhhbXBsZSBleHBsYWluaW5nIHdoeSB0aGlzIGFkanVzdG1lbnQgaXMgbmVlZGVkOgo+Pj4+ Cj4+Pj4gVGhhbmtzIGZvciB0aGUgZGV0YWlsZWQgZXhwbGFuYXRpb24uCj4+Pj4KPj4+Pj4KPj4+ Pj4gU3VwcG9zZToKPj4+Pj4gLSBUb3RhbCBtYWluIHNlY3Rpb25zOiBNQUlOX1NFQ1MgPSAxMDAg KHNlY3Rpb25zIDAgLi4gOTkpCj4+Pj4+IC0gVG90YWwgZnJlZSBzZWN0aW9uczogZnJlZV9zZWN0 aW9ucyA9IDMwCj4+Pj4+IC0gV2Ugd2FudCB0byBzaHJpbmsgdGhlIGZpbGVzeXN0ZW0gYnkgMTAg c2VjdGlvbnMgKHNlY3MgPSAxMCwgcmFuZ2UKPj4+IDkwIC4uIDk5KS4KPj4+Pj4gLSBXaXRoaW4g dGhlIHRydW5jYXRlZCByYW5nZSAoc2VjdGlvbnMgOTAgLi4gOTkpOgo+Pj4+PiAgICAgKiA2IHNl Y3Rpb25zIGFyZSBhbHJlYWR5IGZyZWUgKGZyZWVfc2VjbWFwIGJpdCBpcyAwKQo+Pj4+PiAgICAg KiA0IHNlY3Rpb25zIGFyZSBpbi11c2Ugd2l0aCB2YWxpZCBibG9ja3MgdGhhdCBuZWVkIHRvIGJl IG1pZ3JhdGVkCj4+PiBieSBHQy4KPj4+Pj4gV2hlbiBmcmVlX3NlZ21lbnRfcmFuZ2UoKSBlbnRl cnM6Cj4+Pj4+IDEuIE1BSU5fU0VDUyBpcyB0ZW1wb3JhcmlseSByZWR1Y2VkIGZyb20gMTAwIHRv IDkwIHNvIHRoYXQgbmV3IGJsb2NrCj4+Pj4+ICAgICAgYWxsb2NhdGlvbnMgYXJlIGNvbnN0cmFp bmVkIHRvIHNlY3Rpb25zIDAgLi4gODkuCj4+Pj4+IDIuIFRoZSBhY3R1YWwgbnVtYmVyIG9mIGZy ZWUgc2VjdGlvbnMgYXZhaWxhYmxlIGluIHRoZSByZWR1Y2VkIHJhbmdlCj4+Pj4+ICAgICAgKDAg Li4gODkpIGlzIG9ubHkgMjQgKDMwIC0gNiA9IDI0KS4KPj4+Pj4gMy4gV2l0aG91dCB0aGlzIHBh dGNoOgo+Pj4+PiAgICAgIC0gZnJlZV9zZWN0aW9ucyByZW1haW5zIDMwIHdoaWxlIE1BSU5fU0VD UyBpcyA5MC4KPj4+Pj4gICAgICAtIER1cmluZyB0aGUgc3Vic2VxdWVudCBHQyBtaWdyYXRpb25z LCBmcmVlIHNlY3Rpb24gY2hlY2tzIChzdWNoIGFzCj4+Pj4+ICAgICAgICBoYXNfbm90X2Vub3Vn aF9mcmVlX3NlY3MoKSkgd2lsbCBvdmVyLWVzdGltYXRlIGF2YWlsYWJsZSBzcGFjZQo+Pj4+PiBi eSA2Cj4+Pj4KPj4+PiBCdXQgZnJlZV9zZWdtZW50X3JhbmdlKCkgd29uJ3QgY2FsbCBpbnRvIGhh c19ub3RfZW5vdWdoX2ZyZWVfc2VjcygpLAo+Pj4+IGlmIEknbSBub3QgbWlzc2luZyBhbnl0aGlu Zy4KPj4+Cj4+PiBPaCwgcmlnaHQuIEkgbWlzc2VkIGl0J3MgRkdfR0MuCj4+PiBJIHRoaW5rIHdl IGNhbiBkcm9wIHRoaXMgcGF0Y2guCj4+Pgo+Pj4gVGhhbmtzLgo+Pj4KPj4gSSB3b25kZXIgaWYg dGhlIGZyZWUtc2VjdGlvbiBhZGp1c3RtZW50IGNvdWxkIHN0aWxsIGJlIHJlbGV2YW50Cj4+IHRv IHRoZSBTU1IvTEZTIGFsbG9jYXRpb24gZGVjaXNpb24gZHVyaW5nIHJlc2l6ZS4KPj4KPj4gQ291 bGQgeW91IHBsZWFzZSBhbHNvIGNoZWNrIHdoZXRoZXIgZnJlZV9zZWN0aW9ucyBtYXkgYWZmZWN0 Cj4+IGFsbG9jYXRpb24gdGhyb3VnaCB0aGUgZm9sbG93aW5nIHBhdGhzPwo+Pgo+PiAgICBmcmVl X3NlZ21lbnRfcmFuZ2UoKQo+PiAgICAgIC0+IGYyZnNfYWxsb2NhdGVfc2VnbWVudF9mb3JfcmVz aXplKCkKPj4gICAgICAgIC0+IGYyZnNfbmVlZF9TU1IoKQo+PiAgICAgICAgLT4gbmV3X2N1cnNl ZygpCj4+ICAgICAgICAgIC0+IGdldF9uZXdfc2VnbWVudCgpCj4+Cj4+IEFsc28sIHdoZW4gYSBj dXJyZW50IHNlZ21lbnQgYmVjb21lcyBmdWxsIGR1cmluZyBibG9jayBtaWdyYXRpb246Cj4+Cj4+ ICAgIGZyZWVfc2VnbWVudF9yYW5nZSgpCj4+ICAgICAgLT4gZjJmc19nY19yYW5nZSgpCj4+ICAg ICAgICAtPiBkb19nYXJiYWdlX2NvbGxlY3QoKQo+PiAgICAgICAgICAtPiBmMmZzX2FsbG9jYXRl X2RhdGFfYmxvY2soKQo+PiAgICAgICAgICAgIC0+IG5lZWRfbmV3X3NlZygpCj4+ICAgICAgICAg ICAgICAtPiBmMmZzX25lZWRfU1NSKCkKPj4gICAgICAgICAgICAgIC0+IG5ld19jdXJzZWcoKQo+ PiAgICAgICAgICAgICAgICAtPiBnZXRfbmV3X3NlZ21lbnQoKQo+Pgo+PiBJZiBmcmVlX3NlY3Rp b25zIHN0aWxsIGluY2x1ZGUgZnJlZSBzZWN0aW9ucyBpbiB0aGUgcmFuZ2UgYmVpbmcKPj4gcmVt b3ZlZCwgZjJmc19uZWVkX1NTUigpIG1heSBjaG9vc2UgTEZTIGFsbG9jYXRpb24gaW5zdGVhZCBv ZiBTU1IuCj4+IFNpbmNlIGdldF9uZXdfc2VnbWVudCgpIHNlYXJjaGVzIG9ubHkgd2l0aGluIHRo ZSB0ZW1wb3JhcmlseSByZWR1Y2VkCj4+IE1BSU5fU0VDUyByYW5nZSwgaXQgbWF5IGZhaWwgdG8g ZmluZCBhIGZyZWUgc2VjdGlvbi4KPj4KPj4gQ291bGQgeW91IHBsZWFzZSBjb25maXJtIHdoZXRo ZXIgdGhpcyBjYXNlIGFsc28gbmVlZHMgdG8gYmUgaGFuZGxlZD8KPiAKPiBUaGFuayB5b3UgZm9y IHBvaW50aW5nIHRoaXMgb3V0IOKAlCB0aGlzIGlzIGEgdmVyeSBzaGFycCBhbmQgdmFsaWQgb2Jz ZXJ2YXRpb24hCj4gCj4gSXQgbWFrZXMgc2Vuc2UgdG8gbWUuIENoYW8sIFdEWVQ/CgpEYWVobywg eWVhaCwgSSB0aGluayBpdCdzIGEgZ29vZCBjYXRjaCBmcm9tIFllb25namluLgoKSSBzdXNwZWN0 IHRoaXMgaXMgYSBidWcsIHJpZ2h0PwoKRm9yIGV4YW1wbGUsIGYyZnMgaGFzIGhpZ2ggQkRGIHZh bHVlOgowLi44NSBhcmUgZGlydHkgc2VjdGlvbnMsIGFuZCBoYXMgZmV3IHZhbGlkIGJsb2NrcyBp biBlYWNoIHNlY3Rpb24KODYuLjg5IGFyZSBmcmVlIHNlY3Rpb25zCjkwLi45OSBhcmUgZnVsbCBz ZWN0aW9ucwoKV2hlbiB3ZSBtaWdyYXRlIDkwLi45OSB0byAwLi44OSwgaWYgU1NSIGNhbiBub3Qg dXNlZCBmb3Igc3VjaCBjYXNlLApnZXRfbmV3X3NlZ21lbnQoKSBtYXkgcmV0dXJuIC1FTk9TUEMs IGFuZCB0cmlnZ2VyIHRoZSBwYW5pYz8KClRoYW5rcywKCj4gCj4+Cj4+IFRoYW5rcywKPj4+Pgo+ Pj4+IE5vdCBzdXJlLCBtYXliZSB5b3UgbWVhbiBvdGhlciB0aHJlYWRzIHdpbGwgY2FsbAo+Pj4+ IGhhc19ub3RfZW5vdWdoX2ZyZWVfc2VjcygpLCBhcmUgeW91IHdvcnJpZWQgYWJvdXQgdGhhdCB3 ZSBtYXkgbWlzcwo+Pj4gY2hhbmNlcyB0byBjYWxsIGZnZ2MgZWFybGllciBpbiBiZWxvdyBjYXNl czoKPj4+Pgo+Pj4+IGYyZnNfYmFsYW5jZV9mcyAtPiBoYXNfZW5vdWdoX2ZyZWVfc2VjcyAtPiBm MmZzX2djPyBJIGd1ZXNzIGl0IHdpbGwKPj4+PiBibG9ja2VkIG9uIGdjX2xvY2suCj4+Pgo+Pj4+ Cj4+Pj4+ICAgICAgICBzZWN0aW9ucyBpbiB0aGUgYWN0aXZlIDAgLi4gODkgcmFuZ2UuCj4+Pj4+ ICAgICAgLSBJZiBmcmVlX3NlZ21lbnRfcmFuZ2UoKSBmYWlscyBtaWR3YXkgKGUuZy4gLUVBR0FJ TiksCj4+PiBmcmVlX3NlY3Rpb25zCj4+Pj4+ICAgICAgICBhY2NvdW50aW5nIGJlY29tZXMgaW5j b25zaXN0ZW50Lgo+Pj4+Cj4+Pj4gV2h5IGZyZWVfc2VjdGlvbnMgYWNjb3VudGluZyBiZWNvbWVz IGluY29uc2lzdGVudCBpZgo+Pj4+IGZyZWVfc2VnbWVudF9yYW5nZSgpIGZhaWxzIG1pZHdheT8K Pj4+Pgo+Pj4+IFRoYW5rcywKPj4+Pgo+Pj4+PiBXaXRoIHRoaXMgcGF0Y2g6Cj4+Pj4+IC0gV2Ug Y291bnQgdGhlIDYgYWxyZWFkeS1mcmVlIHNlY3Rpb25zIGluIHRoZSB0cnVuY2F0ZWQgcmFuZ2Ug KDkwIC4uCj4+PiA5OSkgYW5kCj4+Pj4+ICAgICBkZWR1Y3QgdGhlbSBmcm9tIGZyZWVfc2VjdGlv bnMgdXBvbiBlbnRlcmluZyAoMzAgLSA2ID0gMjQpLAo+Pj4gcGVyZmVjdGx5Cj4+Pj4+ICAgICBt YXRjaGluZyB0aGUgYWN0dWFsIGZyZWUgc2VjdGlvbnMgaW4gdGhlIGFjdGl2ZSByYW5nZSAwIC4u IDg5Lgo+Pj4+PiAtIE9uIGV4aXQsIHRoZSBkZWR1Y3RlZCBhbW91bnQgaXMgcmVzdG9yZWQsIGtl ZXBpbmcgZnJlZV9zZWN0aW9ucwo+Pj4gY29uc2lzdGVudAo+Pj4+PiAgICAgdGhyb3VnaG91dCB0 aGUgZW50aXJlIHJlc2l6ZSBsaWZlY3ljbGUuCj4+Pj4+Cj4+Pj4+IEhvcGUgdGhpcyBjbGFyaWZp ZXMgdGhlIHNjZW5hcmlvIQo+Pj4+Pgo+Pj4+PiBUaGFua3MsCj4+Pj4+Cj4+Pj4+Pgo+Pj4+Pj4g QlRXLCBpdCBuZWVkcyB0byByZWJhc2UgdGhpcyBwYXRjaCBvbiBkZXYtdGVzdCBicmFuY2guCj4+ Pj4+Pgo+Pj4+Pj4gVGhhbmtzLAo+Pj4+Pj4KPj4+Pj4+Pgo+Pj4+Pj4+IEZpeCB0aGlzIGJ5IGNh bGN1bGF0aW5nIHRoZSBudW1iZXIgb2YgYWxyZWFkeS1mcmVlIHNlY3Rpb25zIGluIHRoZQo+Pj4+ Pj4+IHRydW5jYXRlZCByYW5nZSB1bmRlciBzZWdtYXBfbG9jaywgZGVkdWN0aW5nIHRoZW0gZnJv bQo+Pj4+Pj4+IGZyZWVfc2VjdGlvbnMgdXBvbiBlbnRlcmluZyBmcmVlX3NlZ21lbnRfcmFuZ2Uo KSwgYW5kIHJlc3RvcmluZyB0aGVtCj4+PiB1bmRlciBzZWdtYXBfbG9jayBvbiBleGl0Lgo+Pj4+ Pj4+Cj4+Pj4+Pj4gU2lnbmVkLW9mZi1ieTogRGFlaG8gSmVvbmcgPGRhZWhvamVvbmdAZ29vZ2xl LmNvbT4KPj4+Pj4+PiBTaWduZWQtb2ZmLWJ5OiBTdW5taW4gSmVvbmcgPHNfbWluLmplb25nQHNh bXN1bmcuY29tPgo+Pj4+Pj4+IC0tLQo+Pj4+Pj4+ICAgIGZzL2YyZnMvZ2MuYyB8IDE1ICsrKysr KysrKysrKysrLQo+Pj4+Pj4+ICAgIDEgZmlsZSBjaGFuZ2VkLCAxNCBpbnNlcnRpb25zKCspLCAx IGRlbGV0aW9uKC0pCj4+Pj4+Pj4KPj4+Pj4+PiBkaWZmIC0tZ2l0IGEvZnMvZjJmcy9nYy5jIGIv ZnMvZjJmcy9nYy5jIGluZGV4Cj4+Pj4+Pj4gNzg3MTMzZWUyZWIyLi5mM2E2ZmM2ZDA4YWUgMTAw NjQ0Cj4+Pj4+Pj4gLS0tIGEvZnMvZjJmcy9nYy5jCj4+Pj4+Pj4gKysrIGIvZnMvZjJmcy9nYy5j Cj4+Pj4+Pj4gQEAgLTIyMDAsOCArMjIwMCw5IEBAIGludCBmMmZzX2djX3JhbmdlKHN0cnVjdCBm MmZzX3NiX2luZm8gKnNiaSwKPj4+Pj4+PiAgICBzdGF0aWMgaW50IGZyZWVfc2VnbWVudF9yYW5n ZShzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksCj4+Pj4+Pj4gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2VjcywgYm9vbCBkcnlfcnVuKQo+Pj4+Pj4+ICAgIHsK Pj4+Pj4+PiAtICAgICB1bnNpZ25lZCBpbnQgbmV4dF9pbnVzZSwgc3RhcnQsIGVuZDsKPj4+Pj4+ PiArICAgICB1bnNpZ25lZCBpbnQgc2Vjbm8sIG5leHRfaW51c2UsIHN0YXJ0LCBlbmQsIGVuZF9z ZWNubzsKPj4+Pj4+PiAgICAgICAgIHN0cnVjdCBjcF9jb250cm9sIGNwYyA9IHsgQ1BfUkVTSVpF LCAwLCAwLCAwIH07Cj4+Pj4+Pj4gKyAgICAgdW5zaWduZWQgaW50IGZyZWVkX3NlY3MgPSAwOwo+ Pj4+Pj4+ICAgICAgICAgaW50IGdjX21vZGUsIGdjX3R5cGU7Cj4+Pj4+Pj4gICAgICAgICBpbnQg ZXJyID0gMDsKPj4+Pj4+PiAgICAgICAgIGludCB0eXBlOwo+Pj4+Pj4+IEBAIC0yMjEwLDYgKzIy MTEsNyBAQCBzdGF0aWMgaW50IGZyZWVfc2VnbWVudF9yYW5nZShzdHJ1Y3QKPj4+IGYyZnNfc2Jf aW5mbyAqc2JpLAo+Pj4+Pj4+ICAgICAgICAgTUFJTl9TRUNTKHNiaSkgLT0gc2VjczsKPj4+Pj4+ PiAgICAgICAgIHN0YXJ0ID0gTUFJTl9TRUNTKHNiaSkgKiBTRUdTX1BFUl9TRUMoc2JpKTsKPj4+ Pj4+PiAgICAgICAgIGVuZCA9IE1BSU5fU0VHUyhzYmkpIC0gMTsKPj4+Pj4+PiArICAgICBlbmRf c2Vjbm8gPSBHRVRfU0VDX0ZST01fU0VHKHNiaSwgZW5kKTsKPj4+Pj4+Pgo+Pj4+Pj4+ICAgICAg ICAgbXV0ZXhfbG9jaygmRElSVFlfSShzYmkpLT5zZWdsaXN0X2xvY2spOwo+Pj4+Pj4+ICAgICAg ICAgZm9yIChnY19tb2RlID0gMDsgZ2NfbW9kZSA8IE1BWF9HQ19QT0xJQ1k7IGdjX21vZGUrKykg QEAKPj4+Pj4+PiAtMjIyMSw2ICsyMjIzLDE0IEBAIHN0YXRpYyBpbnQgZnJlZV9zZWdtZW50X3Jh bmdlKHN0cnVjdAo+Pj4gZjJmc19zYl9pbmZvICpzYmksCj4+Pj4+Pj4gICAgICAgICAgICAgICAg ICAgICAgICAgc2JpLT5uZXh0X3ZpY3RpbV9zZWdbZ2NfdHlwZV0gPSBOVUxMX1NFR05POwo+Pj4+ Pj4+ICAgICAgICAgbXV0ZXhfdW5sb2NrKCZESVJUWV9JKHNiaSktPnNlZ2xpc3RfbG9jayk7Cj4+ Pj4+Pj4KPj4+Pj4+PiArICAgICBzcGluX2xvY2soJkZSRUVfSShzYmkpLT5zZWdtYXBfbG9jayk7 Cj4+Pj4+Pj4gKyAgICAgZm9yIChzZWNubyA9IE1BSU5fU0VDUyhzYmkpOyBzZWNubyA8PSBlbmRf c2Vjbm87IHNlY25vKyspIHsKPj4+Pj4+PiArICAgICAgICAgICAgIGlmICghdGVzdF9iaXQoc2Vj bm8sIEZSRUVfSShzYmkpLT5mcmVlX3NlY21hcCkpCj4+Pj4+Pj4gKyAgICAgICAgICAgICAgICAg ICAgIGZyZWVkX3NlY3MrKzsKPj4+Pj4+PiArICAgICB9Cj4+Pj4+Pj4gKyAgICAgRlJFRV9JKHNi aSktPmZyZWVfc2VjdGlvbnMgLT0gZnJlZWRfc2VjczsKPj4+Pj4+PiArICAgICBzcGluX3VubG9j aygmRlJFRV9JKHNiaSktPnNlZ21hcF9sb2NrKTsKPj4+Pj4+PiArCj4+Pj4+Pj4gICAgICAgICAv KiBNb3ZlIG91dCBjdXJzZWdzIGZyb20gdGhlIHRhcmdldCByYW5nZSAqLwo+Pj4+Pj4+ICAgICAg ICAgZm9yICh0eXBlID0gQ1VSU0VHX0hPVF9EQVRBOyB0eXBlIDwgTlJfQ1VSU0VHX1RZUEU7IHR5 cGUrKykgewo+Pj4+Pj4+ICAgICAgICAgICAgICAgICBlcnIgPSBmMmZzX2FsbG9jYXRlX3NlZ21l bnRfZm9yX3Jlc2l6ZShzYmksIHR5cGUsCj4+Pj4+Pj4gc3RhcnQsIGVuZCk7IEBAIC0yMjQ1LDYg KzIyNTUsOSBAQCBzdGF0aWMgaW50Cj4+PiBmcmVlX3NlZ21lbnRfcmFuZ2Uoc3RydWN0IGYyZnNf c2JfaW5mbyAqc2JpLAo+Pj4+Pj4+ICAgICAgICAgICAgICAgICBmMmZzX2J1Z19vbihzYmksIDEp Owo+Pj4+Pj4+ICAgICAgICAgfQo+Pj4+Pj4+ICAgIG91dDoKPj4+Pj4+PiArICAgICBzcGluX2xv Y2soJkZSRUVfSShzYmkpLT5zZWdtYXBfbG9jayk7Cj4+Pj4+Pj4gKyAgICAgRlJFRV9JKHNiaSkt PmZyZWVfc2VjdGlvbnMgKz0gZnJlZWRfc2VjczsKPj4+Pj4+PiArICAgICBzcGluX3VubG9jaygm RlJFRV9JKHNiaSktPnNlZ21hcF9sb2NrKTsKPj4+Pj4+PiAgICAgICAgIE1BSU5fU0VDUyhzYmkp ICs9IHNlY3M7Cj4+Pj4+Pj4gICAgICAgICByZXR1cm4gZXJyOwo+Pj4+Pj4+ICAgIH0KPj4+Pj4+ Cj4+Pj4KPj4+Cj4+Pgo+Pj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KPj4+IExpbnV4LWYyZnMtZGV2ZWwgbWFpbGluZyBsaXN0Cj4+PiBMaW51eC1mMmZz LWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldAo+Pj4gaHR0cHM6Ly9saXN0cy5zb3VyY2Vmb3Jn ZS5uZXQvbGlzdHMvbGlzdGluZm8vbGludXgtZjJmcy1kZXZlbAo+Pgo+PgoKCgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51eC1mMmZzLWRldmVsIG1h aWxpbmcgbGlzdApMaW51eC1mMmZzLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldApodHRwczov L2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9saW51eC1mMmZzLWRldmVsCg==