From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.remote-ip=100.103.45.18 ARC-Seal: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; cv=none; t=1794379230; b=rCbBXNeLfRpMaVZQMrBol8Kr+L5qHIEZwdTx9mP6VAFUrVyItXm3Kf5w9FiImgNgmZLj Lm8KG8oudo4r9f+QhXKT7Ht2JbOLRsb91ICWdvdEkg0iE3Mtu6Sj0hgFdwUK5aasV3sC0 l2wA6NoTLELeP23SzfjOwj6YOMvrXvBlv72cj0fKJXRHGGxPakYL+Ank2wAkt2w+un74H WDJPVVYT9boa3CDufEZAGVC5xm2Tk7TAAoTQIICFaxuAIL7By0Tsrlv1b+eXC/nW1r+Up kPglNI0nUFfgN2ajtw6leHlTO166jF2pTUaf+YO9jtBtOId1GSm3nqRxgAQ7fHee0Dw== ARC-Message-Signature: i=1; d=subspace.kernel.org; s=arc20261015; a=rsa-sha256; c=relaxed/relaxed; t=1794379230; h=Received:DKIM-Signature:Message-ID:Date:MIME-Version:User-Agent:Cc: Subject:To:References:Content-Language:From:In-Reply-To:Content-Type: Content-Transfer-Encoding; bh=HFGAcoTwQarl9DjE/7TGMN5ybSqD54sOEoOXZfnhnWM=; b=g848NgEpmxRr9ZWrfHAH+hG6lbeOTzVaGn66xxaeNj1XxYi3feuRfRKjhwXVUMd1JvAA hPl4VIa51Ah+s4O/h3CjKXzJpZnpvvyEr3bedaUMuepJXEoFQ9NBlFH+S5qU4m4dOJIkY 128VCkZKu8DmPNq6griDCy6TX4CfuHj6mGOxW7lOsqudlO+gofF/RSqOzAoXFNs5JMGbP RPn7OfImMc7DNcGS4hLAEcCYxmd4Di7tE+z53cRkH61cd8ETGdGODYF6cAvvYBbZ5zPOI R8YkUy+f3N0cjea24nnI1cKQlu0pqRgAf2DudaUYAcz9YB0+FOyeFGVU5NYPRVslYxA== ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=T3IfjteB; arc=none smtp.remote-ip=100.103.45.18 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2CC0E606A321 for ; Wed, 11 Nov 2026 06:40:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=T3IfjteB Received: by smtp.kernel.org (Postfix) with ESMTPSA id AF6F71F00A05; Wed, 11 Nov 2026 06:40:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1794379229; bh=HFGAcoTwQarl9DjE/7TGMN5ybSqD54sOEoOXZfnhnWM=; h=Date:Cc:Subject:To:References:From:In-Reply-To; b=T3IfjteBD1pOYxkaMnC1wtG5KM0tqevZx0ZpgdLpMSJLQ7e3viYE9yaSa/9cQ7NzM vL6MTWgEHPXkYmex1wkQXI0KDMy8Lc3Ww07fK7yODCqzO6suNas4SxAFhKns4mQc+T n+IR89O7aVWjk9ToESc0zpTdkrWVCyXILbEKkf7wIftcQc7s0KiHS+qFL6+uROWi85 gy28+72gt/3l2/syBVZSPa9Lm2K6THZ/DuiWgPKZzwmIFBa8HxNlW9KRmTfiLoJ3Cq J3ghjjwxeMqde+OaMvjkWwBXTgnIkd5lmQzZf3QKvVCzwUzKsDd9qiP6tfIIo4YwTd XMAKd0X0maKdQ== Message-ID: <31dfb7c7-5730-4ac5-b9ea-790ef42e14af@kernel.org> Date: Wed, 11 Nov 2026 14:40:25 +0800 X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Cc: chao@kernel.org, linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, kernel-team@android.com, Daeho Jeong Subject: Re: [f2fs-dev] [PATCH 07/20] f2fs: support subpage blocks in data write path and writeback To: Daeho Jeong References: <20261102193952.3002018-1-daeho43@gmail.com> <20261102193952.3002018-8-daeho43@gmail.com> <164909bf-39e8-421e-b9c6-f2bac0391f39@kernel.org> <79922b4f-dceb-40c7-913b-a9ac02664da4@kernel.org> Content-Language: en-US From: Chao Yu In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On 11/11/26 03:50, Daeho Jeong wrote: > On Tue, Nov 10, 2026 at 3:19 AM Chao Yu wrote: >> >> On 11/8/26 07:14, Daeho Jeong wrote: >>> On Thu, Nov 5, 2026 at 6:52 PM Chao Yu wrote: >>>> >>>> On 11/3/26 03:39, Daeho Jeong wrote: >>>>> From: Daeho Jeong >>>>> >>>>> With blocks smaller than PAGE_SIZE, a folio holds several blocks, so >>>>> write_begin, write_end and writeback have to handle individual blocks >>>>> instead of the whole folio. >>>>> >>>>> - Read, zero and reserve the blocks touched by a write per block in >>>>> write_begin, and mark only the written blocks dirty in write_end. >>>>> - Write back only the dirty blocks of a multi-block folio and complete >>>>> write I/O per block. In subpage mode every inode is written back by >>>>> f2fs_write_cache_folios(), which now handles dentry and quota folios >>>>> and checkpoint errors as f2fs_write_single_data_page() does. Both use >>>>> the new f2fs_cp_controlled_inode() and f2fs_wb_folio_action() helpers >>>>> for these rules. >>>>> It also resets the error for each folio, so that the remaining folios >>>>> are still written back after an error, as writeback_iter() expects >>>>> for integrity writeback, instead of redirtying them. >>>>> f2fs_write_folio_dirty_range() cleans up each block where it is >>>>> written or skipped, and advances last_disk_size only up to the last >>>>> block it submitted. On an error, it clears the dirty state of the >>>>> blocks before the failed one, so that only the failed block and the >>>>> ones after it are written again. >>>>> - Count inode dirty blocks per folio: add all blocks of a folio when >>>>> it is dirtied and remove them when it is cleaned, instead of counting >>>>> the dirty bits of the folio state. A multi-block folio can be dirtied >>>>> without a folio state, e.g. after a read of the whole folio or >>>>> through folio_mark_dirty(), and a state attached later starts with >>>>> dirty bits that were never counted, so the bit count cannot stay >>>>> balanced. A partially dirty folio is counted as fully dirty. >>>> >>>> Sorry, still I don't understand why we can not track dirty block count in folio, >>>> the count should be consistent w/ dirty bitmap in ffs (e.g. if there is x bits in >>>> bitmap is 1, the count should be x). >>>> >>>> IIUC, if large folio can track dirty page count, 16k-page should can track 4k >>>> dirty block as well? or is there any difference in subpage block feature, can you >>>> please explain more about this? >>> >>> Hi Chao, >> >> Hi Daeho, >> >> Thanks for the detailed explanation. >> >>> >>> Counting dirty bits needs the folio state on every dirty multi-block >>> folio, but a folio can be dirtied through ->dirty_folio(), which cannot >>> allocate it: ->dirty_folio() must not block and can be called under >>> the page table lock without the folio lock, and it has no range, so the >>> whole folio becomes dirty. E.g. a folio read by a single bio has no >>> folio state, and it can then be dirtied by GUP or mmap. When the folio >>> state is attached later, its dirty bits are set from PG_dirty, and >>> these bits were never counted, so clearing them unbalances the counter. >> >> I think for such case that GUP or mmap set folio dirty, since the entire folio >> is dirty: >> 1. w/o ffs, we can just increase reference w/ blks_per_folio. >> 2. w/ ffs, we can update fss dirty bitmap, and increase reference w/ blks count >> that they are not dirty previously. >> >>> >>> Large folios worked because the folio state was attached up front, but >>> in subpage mode every order-0 folio is a multi-block folio, and we >>> cannot attach it in every path that creates or dirties a folio. >>> Counting per folio adds and removes the same number when the folio is >>> dirtied and cleaned, so it always stays balanced. A partially dirty >>> folio is counted as fully dirty, but the counters are only compared >>> with thresholds such as min_fsync_blocks, and order-0 folios were >>> counted per page before, so this is enough. >> >> However there is a side-effect, F2FS_DIRTY_DENTS will not match the real >> dirty dentry block count? result in has_not_enough_free_secs() return >> true earlier and trigger unnecessary fggc? >> > > Hi Chao, > > In v1, I tried a simpler way to make it work first. Now, we could take the way Hi Daeho, Sure, it's doable to improve it this step by step. > you say. If a folio is counted as blks_per_folio without a folio state, and > the count is adjusted to its dirty bits when a folio state is attached, the > counter stays balanced. > > In v2, I'll count the dirty bits again: > - ->dirty_folio() marks the uptodate blocks within EOF dirty and counts the > newly dirty ones for a folio with a folio state, and counts > blks_per_folio for a folio without it. > - The updates made by f2fs itself mark and count only the blocks they > modify, and do not go through ->dirty_folio(). > - Attaching a folio state to a dirty folio converts its count to the dirty > bits. Looks good to me. > >>> >>>> >>>>> - Compressed and atomic files are not supported yet in subpage mode: >>>>> write_begin returns -EOPNOTSUPP for them. Inline data is converted >>>>> first. >>>>> >>>>> Some of these changes also apply to large folios when the block size >>>>> equals PAGE_SIZE. >>>>> >>>>> Signed-off-by: Daeho Jeong >>>>> --- >>>>> fs/f2fs/checkpoint.c | 39 +--- >>>>> fs/f2fs/data.c | 486 ++++++++++++++++++++++--------------------- >>>>> fs/f2fs/dir.c | 2 +- >>>>> fs/f2fs/f2fs.h | 1 - >>>>> fs/f2fs/file.c | 11 +- >>>>> fs/f2fs/gc.c | 11 +- >>>>> fs/f2fs/inline.c | 7 +- >>>>> fs/f2fs/node.c | 2 +- >>>>> 8 files changed, 275 insertions(+), 284 deletions(-) >>>>> >>>>> diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c >>>>> index 1060ee651756..a9a2b9d93231 100644 >>>>> --- a/fs/f2fs/checkpoint.c >>>>> +++ b/fs/f2fs/checkpoint.c >>>>> @@ -1324,46 +1324,21 @@ static void __remove_dirty_inode(struct inode *inode, enum inode_type type) >>>>> stat_dec_dirty_inode(F2FS_I_SB(inode), type); >>>>> } >>>>> >>>>> -/* >>>>> - * Account @nr dirty blocks (negative when dirtiness is cleared) for @inode. >>>>> - */ >>>>> -void f2fs_account_dirty_blocks(struct inode *inode, int nr) >>>>> +void f2fs_update_dirty_folio(struct inode *inode, struct folio *folio) >>>>> { >>>>> struct f2fs_sb_info *sbi = F2FS_I_SB(inode); >>>>> enum inode_type type = S_ISDIR(inode->i_mode) ? DIR_INODE : FILE_INODE; >>>>> + unsigned int nr_blocks = f2fs_blocks_per_folio(sbi, folio); >>>>> >>>>> - if (!nr) >>>>> - return; >>>>> - >>>>> - spin_lock(&sbi->inode_lock[type]); >>>>> - if (nr > 0) { >>>>> - if (type != FILE_INODE || test_opt(sbi, DATA_FLUSH)) >>>>> - __add_dirty_inode(inode, type); >>>>> - inode_add_dirty_blocks(inode, nr); >>>>> - } else { >>>>> - inode_sub_dirty_blocks(inode, -nr); >>>>> - __remove_dirty_inode(inode, type); >>>>> - } >>>>> - spin_unlock(&sbi->inode_lock[type]); >>>>> -} >>>>> - >>>>> -void f2fs_update_dirty_folio(struct inode *inode, struct folio *folio) >>>>> -{ >>>>> if (!S_ISDIR(inode->i_mode) && !S_ISREG(inode->i_mode) && >>>>> !S_ISLNK(inode->i_mode)) >>>>> return; >>>>> >>>>> - /* >>>>> - * Large folios have a subpage dirty bitmap, so defer their dirty accounting >>>>> - * to the f2fs_ffs_*subrange_dirty*() helpers. This avoids nesting >>>>> - * ffs->state_lock with the inode dirty list lock. >>>>> - */ >>>>> - if (f2fs_folio_has_ffs(folio)) { >>>>> - folio_set_f2fs_reference(folio); >>>>> - return; >>>>> - } >>>>> - >>>>> - f2fs_account_dirty_blocks(inode, 1); >>>>> + spin_lock(&sbi->inode_lock[type]); >>>>> + if (type != FILE_INODE || test_opt(sbi, DATA_FLUSH)) >>>>> + __add_dirty_inode(inode, type); >>>>> + inode_add_dirty_blocks(inode, nr_blocks); >>>>> + spin_unlock(&sbi->inode_lock[type]); >>>>> >>>>> folio_set_f2fs_reference(folio); >>>>> } >>>>> diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c >>>>> index 07b7aeb94350..41246f83b31d 100644 >>>>> --- a/fs/f2fs/data.c >>>>> +++ b/fs/f2fs/data.c >>>>> @@ -420,8 +420,7 @@ static void f2fs_write_end_bio(struct bio *bio) >>>>> >>>>> bio_for_each_folio_all(fi, bio) { >>>>> struct folio *folio = fi.folio; >>>>> - unsigned int nr_pages = fi.length >> PAGE_SHIFT; >>>>> - unsigned int npages = nr_pages; >>>>> + unsigned int nr_blocks = fi.length >> sbi->log_blocksize; >>>> >>>> F2FS_BYTES_TO_BLK(sbi, fi.length); >>>> >>>>> enum count_type type; >>>>> >>>>> #ifdef CONFIG_F2FS_FS_COMPRESSION >>>>> @@ -441,8 +440,7 @@ static void f2fs_write_end_bio(struct bio *bio) >>>>> } >>>>> } >>>>> >>>>> - while (nr_pages--) >>>>> - dec_cache_count(sbi, type); >>>>> + sub_cache_counts(sbi, type, nr_blocks); >>>>> >>>>> /* >>>>> * we should access sbi before folio_end_writeback() to >>>>> @@ -452,7 +450,7 @@ static void f2fs_write_end_bio(struct bio *bio) >>>>> wq_has_sleeper(&sbi->cp_wait)) >>>>> wake_up(&sbi->cp_wait); >>>>> >>>>> - f2fs_ffs_put_write_pending(folio, npages); >>>>> + f2fs_ffs_put_write_pending(folio, nr_blocks); >>>>> } >>>>> >>>>> bio_put(bio); >>>>> @@ -3023,7 +3021,7 @@ static void f2fs_clear_truncated_page_state(struct folio *folio, pgoff_t i) >>>>> { >>>>> struct f2fs_sb_info *sbi = F2FS_F_SB(folio); >>>>> >>>>> - if (f2fs_folio_has_ffs(folio)) { >>>>> + if (f2fs_is_multiblock_folio(sbi, folio)) { >>>>> f2fs_ffs_clear_subrange_uptodate(folio, >>>>> F2FS_BLK_TO_BYTES(sbi, i), F2FS_BLKSIZE(sbi)); >>>>> } else { >>>>> @@ -3051,21 +3049,6 @@ bool f2fs_ffs_test_blk_dirty(const struct folio *folio, pgoff_t index) >>>>> return test_bit(nr_blocks + offset, ffs->state); >>>>> } >>>>> >>>>> -static unsigned int __ffs_mark_subrange_dirty(struct folio *folio, >>>>> - struct f2fs_folio_state *ffs, size_t offset, size_t len) >>>>> -{ >>>>> - struct f2fs_sb_info *sbi = F2FS_F_SB(folio); >>>>> - unsigned int nr_blocks = f2fs_blocks_per_folio(sbi, folio); >>>>> - unsigned int start, end, before; >>>>> - >>>>> - start = F2FS_BYTES_TO_BLK(sbi, offset); >>>>> - end = min_t(unsigned int, F2FS_BLK_ALIGN(sbi, offset + len), nr_blocks); >>>>> - >>>>> - before = bitmap_weight(ffs->state, 2 * nr_blocks); >>>>> - bitmap_set(ffs->state, nr_blocks + start, end - start); >>>>> - return bitmap_weight(ffs->state, 2 * nr_blocks) - before; >>>>> -} >>>>> - >>>>> /* >>>>> * Mark the given range dirty for writeback. >>>>> * >>>>> @@ -3078,7 +3061,8 @@ void f2fs_ffs_mark_subrange_dirty(struct folio *folio, >>>>> { >>>>> struct f2fs_sb_info *sbi = F2FS_F_SB(folio); >>>>> struct f2fs_folio_state *ffs; >>>>> - unsigned int set; >>>>> + unsigned int nr_blocks; >>>>> + unsigned int start, end; >>>>> unsigned long flags; >>>>> >>>>> f2fs_bug_on(F2FS_F_SB(folio), offset + len > folio_size(folio)); >>>>> @@ -3087,13 +3071,13 @@ void f2fs_ffs_mark_subrange_dirty(struct folio *folio, >>>>> return; >>>>> >>>>> ffs = f2fs_ffs_find_or_alloc(folio); >>>>> + nr_blocks = f2fs_blocks_per_folio(sbi, folio); >>>>> + start = F2FS_BYTES_TO_BLK(sbi, offset); >>>>> + end = min_t(unsigned int, F2FS_BLK_ALIGN(sbi, offset + len), nr_blocks); >>>>> >>>>> spin_lock_irqsave(&ffs->state_lock, flags); >>>>> - set = __ffs_mark_subrange_dirty(folio, ffs, offset, len); >>>>> + bitmap_set(ffs->state, start + nr_blocks, end - start); >>>>> spin_unlock_irqrestore(&ffs->state_lock, flags); >>>>> - >>>>> - if (set) >>>>> - f2fs_account_dirty_blocks(folio->mapping->host, set); >>>>> } >>>>> >>>>> void f2fs_ffs_clear_subrange_uptodate(struct folio *folio, >>>>> @@ -3129,19 +3113,16 @@ void f2fs_ffs_clear_subrange_uptodate(struct folio *folio, >>>>> } >>>>> >>>>> static bool __ffs_clear_subrange_dirty(struct folio *folio, >>>>> - struct f2fs_folio_state *ffs, size_t offset, size_t len, >>>>> - unsigned int *cleared) >>>>> + struct f2fs_folio_state *ffs, size_t offset, size_t len) >>>>> { >>>>> struct f2fs_sb_info *sbi = F2FS_F_SB(folio); >>>>> unsigned int nr_blocks = f2fs_blocks_per_folio(sbi, folio); >>>>> - unsigned int start, end, before; >>>>> + unsigned int start, end; >>>>> >>>>> start = F2FS_BYTES_TO_BLK(sbi, offset); >>>>> end = min_t(unsigned int, F2FS_BLK_ALIGN(sbi, offset + len), nr_blocks); >>>>> >>>>> - before = bitmap_weight(ffs->state, 2 * nr_blocks); >>>>> bitmap_clear(ffs->state, nr_blocks + start, end - start); >>>>> - *cleared = before - bitmap_weight(ffs->state, 2 * nr_blocks); >>>>> return find_next_bit(ffs->state, 2 * nr_blocks, nr_blocks) < >>>>> 2 * nr_blocks; >>>>> } >>>>> @@ -3153,15 +3134,13 @@ static bool __ffs_clear_subrange_dirty(struct folio *folio, >>>>> * @len: byte length of the subrange >>>>> * >>>>> * Clear the dirty bits of the 4K subpages covered by [offset, offset + len), >>>>> - * account the cleared subpages against the inode dirty counters, and return >>>>> - * whether the folio still has any dirty subpage left. >>>>> + * and return whether the folio still has any dirty subpage left. >>>>> */ >>>>> bool f2fs_ffs_clear_subrange_dirty_and_test(struct folio *folio, size_t offset, >>>>> size_t len) >>>>> { >>>>> struct f2fs_folio_state *ffs; >>>>> unsigned long flags; >>>>> - unsigned int cleared = 0; >>>>> bool dirty; >>>>> >>>>> if (!f2fs_folio_has_ffs(folio)) { >>>>> @@ -3178,12 +3157,9 @@ bool f2fs_ffs_clear_subrange_dirty_and_test(struct folio *folio, size_t offset, >>>>> >>>>> ffs = f2fs_ffs_find_or_alloc(folio); >>>>> spin_lock_irqsave(&ffs->state_lock, flags); >>>>> - dirty = __ffs_clear_subrange_dirty(folio, ffs, offset, len, &cleared); >>>>> + dirty = __ffs_clear_subrange_dirty(folio, ffs, offset, len); >>>>> spin_unlock_irqrestore(&ffs->state_lock, flags); >>>>> >>>>> - if (cleared) >>>>> - f2fs_account_dirty_blocks(folio->mapping->host, -cleared); >>>>> - >>>>> return dirty; >>>>> } >>>>> >>>>> @@ -3943,7 +3919,7 @@ int f2fs_do_write_data_page(struct f2fs_io_info *fio) >>>>> static int f2fs_write_folio_dirty_range(struct folio *folio, int *submitted, >>>>> struct writeback_control *wbc, >>>>> enum iostat_type io_type, >>>>> - u64 *pos, u64 len) >>>>> + u64 start, u64 end) >>>>> { >>>>> struct inode *inode = folio->mapping->host; >>>>> struct f2fs_sb_info *sbi = F2FS_I_SB(inode); >>>>> @@ -3951,19 +3927,19 @@ static int f2fs_write_folio_dirty_range(struct folio *folio, int *submitted, >>>>> folio_test_f2fs_atomic(folio); >>>>> struct inode *dn_inode = atomic_commit ? >>>>> F2FS_I(inode)->cow_inode : inode; >>>>> - struct f2fs_folio_state *ffs = NULL; >>>>> - u64 folio_start = folio_pos(folio); >>>>> - pgoff_t start_idx = (*pos - folio_start) >> PAGE_SHIFT; >>>>> - pgoff_t end_idx = (*pos - folio_start + len - 1) >> PAGE_SHIFT; >>>>> + u64 pos = folio_pos(folio); >>>>> + pgoff_t start_idx = (start - pos) >> sbi->log_blocksize; >>>>> + pgoff_t end_idx = (end - 1 - pos) >> sbi->log_blocksize; >>>> >>>> F2FS_BYTES_TO_BLK(sbi, start - pos); >>>> F2FS_BYTES_TO_BLK(sbi, end - 1 - pos); >>>> >>>>> + pgoff_t last_idx = 0; >>>>> + pgoff_t i; >>>>> + int local_submitted = 0; >>>>> int err = 0; >>>>> >>>>> - for (pgoff_t i = start_idx; i <= end_idx && !err; i++) { >>>>> + for (i = start_idx; i <= end_idx; i++) { >>>>> struct dnode_of_data dn; >>>>> struct node_info ni; >>>>> - pgoff_t data_idx = folio->index + i; >>>>> + pgoff_t data_idx = f2fs_folio_lblk(sbi, folio) + i; >>>>> bool ipu_force = false; >>>>> - bool dn_held = false; >>>>> - bool submitted_blk = false; >>>>> struct f2fs_io_info fio = { >>>>> .sbi = sbi, >>>>> .ino = inode->i_ino, >>>>> @@ -3983,7 +3959,12 @@ static int f2fs_write_folio_dirty_range(struct folio *folio, int *submitted, >>>>> }; >>>>> >>>>> if (f2fs_folio_has_ffs(folio)) { >>>>> - ffs = (struct f2fs_folio_state *)folio->private; >>>>> + struct f2fs_folio_state *ffs = >>>>> + (struct f2fs_folio_state *)folio->private; >>>>> + >>>>> + /* Write only dirty blocks */ >>>>> + if (!f2fs_ffs_test_blk_dirty(folio, data_idx)) >>>>> + continue; >>>>> atomic_inc(&ffs->write_blocks_pending); >>>>> } >>>>> >>>>> @@ -3995,7 +3976,7 @@ static int f2fs_write_folio_dirty_range(struct folio *folio, int *submitted, >>>>> if (!f2fs_is_valid_blkaddr(sbi, fio.old_blkaddr, >>>>> DATA_GENERIC_ENHANCE)) { >>>>> err = -EFSCORRUPTED; >>>>> - goto block_done; >>>>> + goto skip_block; >>>>> } >>>>> ipu_force = true; >>>>> goto got_it; >>>>> @@ -4015,24 +3996,22 @@ static int f2fs_write_folio_dirty_range(struct folio *folio, int *submitted, >>>>> LOOKUP_NODE); >>>>> } >>>>> if (err && err != -ENOENT) >>>>> - goto block_done; >>>>> - dn_held = true; >>>>> + goto skip_block; >>>>> >>>>> - fio.old_blkaddr = dn.data_blkaddr; >>>>> - >>>>> - /* This page is already truncated */ >>>>> - if (err == -ENOENT || fio.old_blkaddr == NULL_ADDR) { >>>>> - f2fs_clear_truncated_page_state(folio, i); >>>>> + /* This block is already truncated */ >>>>> + if (err || dn.data_blkaddr == NULL_ADDR) { >>>>> err = 0; >>>>> - goto block_done; >>>>> + f2fs_clear_truncated_page_state(folio, i); >>>>> + goto skip_block; >>>>> } >>>>> >>>>> + fio.old_blkaddr = dn.data_blkaddr; >>>>> got_it: >>>>> if (__is_valid_data_blkaddr(fio.old_blkaddr) && >>>>> !f2fs_is_valid_blkaddr(sbi, fio.old_blkaddr, >>>>> DATA_GENERIC_ENHANCE)) { >>>>> err = -EFSCORRUPTED; >>>>> - goto block_done; >>>>> + goto skip_block; >>>>> } >>>>> >>>>> if (fio.meta_gc) >>>>> @@ -4042,61 +4021,109 @@ static int f2fs_write_folio_dirty_range(struct folio *folio, int *submitted, >>>>> (__is_valid_data_blkaddr(fio.old_blkaddr) && >>>>> need_inplace_update(&fio))) { >>>>> f2fs_put_dnode(&dn); >>>>> - dn_held = false; >>>>> err = f2fs_inplace_write_data(&fio); >>>>> - trace_f2fs_do_write_data_page(folio, IPU); >>>>> if (err) >>>>> - goto block_done; >>>>> + goto skip_block_no_dnode; >>>>> >>>>> - if (submitted) >>>>> - (*submitted)++; >>>>> - submitted_blk = true; >>>>> + local_submitted++; >>>>> + last_idx = data_idx; >>>>> set_inode_flag(inode, FI_UPDATE_WRITE); >>>>> - goto block_done; >>>>> + trace_f2fs_do_write_data_page(folio, IPU); >>>>> + continue; >>>>> } >>>>> >>>>> err = f2fs_get_node_info(sbi, dn.nid, &ni, false); >>>>> if (err) >>>>> - goto block_done; >>>>> + goto skip_block; >>>>> >>>>> fio.version = ni.version; >>>>> >>>>> f2fs_outplace_write_data(&dn, &fio); >>>>> - /* >>>>> - * The outplace write path failed to submit this block. >>>>> - */ >>>>> + f2fs_put_dnode(&dn); >>>>> + /* The outplace write path failed to submit this block. */ >>>>> if (!fio.submitted) { >>>>> err = -EIO; >>>>> - goto block_done; >>>>> + goto skip_block_no_dnode; >>>>> } >>>>> - if (submitted) >>>>> - (*submitted)++; >>>>> - submitted_blk = true; >>>>> + local_submitted++; >>>>> + last_idx = data_idx; >>>>> set_inode_flag(inode, FI_APPEND_WRITE); >>>>> trace_f2fs_do_write_data_page(folio, OPU); >>>>> -block_done: >>>>> - if (dn_held) >>>>> - f2fs_put_dnode(&dn); >>>>> + continue; >>>>> + >>>>> +skip_block: >>>>> + f2fs_put_dnode(&dn); >>>>> +skip_block_no_dnode: >>>>> + if (f2fs_folio_has_ffs(folio)) >>>>> + f2fs_ffs_put_write_pending(folio, 1); >>>>> + if (err) >>>>> + break; >>>>> + } >>>>> + >>>>> + if (err) { >>>>> /* >>>>> - * If this block was not submitted, roll back its >>>>> - * write pages pending. >>>>> + * The blocks before the failed one were written or skipped, so >>>>> + * keep only the failed block and the ones after it dirty. >>>>> */ >>>>> - if (!submitted_blk && ffs) >>>>> - f2fs_ffs_put_write_pending(folio, 1); >>>>> - if (!err) { >>>>> - *pos = ((loff_t)data_idx + 1) << PAGE_SHIFT; >>>>> - spin_lock(&F2FS_I(inode)->i_size_lock); >>>>> - if (F2FS_I(inode)->last_disk_size < *pos) >>>>> - F2FS_I(inode)->last_disk_size = *pos; >>>>> - spin_unlock(&F2FS_I(inode)->i_size_lock); >>>>> - } else { >>>>> - file_set_keep_isize(inode); >>>>> + if (i > start_idx) { >>>>> + size_t len = F2FS_BLK_TO_BYTES(sbi, i - start_idx); >>>>> + >>>>> + f2fs_ffs_clear_subrange_dirty_and_test(folio, >>>>> + start - pos, len); >>>>> } >>>>> + file_set_keep_isize(inode); >>>>> + } else if (local_submitted) { >>>>> + loff_t psize = (loff_t)(last_idx + 1) << sbi->log_blocksize; >>>> >>>> F2FS_BLK_TO_BYTES(sbi, last_idx + 1) >>>> >>>>> + >>>>> + if (psize > i_size_read(inode)) >>>>> + psize = i_size_read(inode); >>>> >>>> It seems an improvement, to avoid unnecessary inode write during fsync, can we fix >>>> f2fs_write_single_data_page as well? maybe it's better fix them all in a separated >>>> patch? >>> >>> Agreed. f2fs_write_single_data_page() and the compressed write path also >>> set last_disk_size beyond i_size. Besides the extra inode write, if >>> i_size grows to the recorded value later, f2fs_skip_inode_update() can >>> see last_disk_size == i_size even though the inode on disk still has >>> the old size. I will fix all of them in a separate patch. >>> >>>> >>>>> + >>>>> + spin_lock(&F2FS_I(inode)->i_size_lock); >>>>> + if (F2FS_I(inode)->last_disk_size < psize) >>>>> + F2FS_I(inode)->last_disk_size = psize; >>>>> + spin_unlock(&F2FS_I(inode)->i_size_lock); >>>>> } >>>>> >>>>> + if (submitted) >>>>> + *submitted = local_submitted; >>>>> return err; >>>>> } >>>>> >>>>> +/* Dentry and quota blocks are controlled by checkpoint. */ >>>>> +static bool f2fs_cp_controlled_inode(struct inode *inode) >>>>> +{ >>>>> + return S_ISDIR(inode->i_mode) || IS_NOQUOTA(inode); >>>>> +} >>>>> + >>>>> +enum f2fs_wb_action { >>>>> + F2FS_WB_WRITE, /* write back the folio */ >>>>> + F2FS_WB_REDIRTY, /* keep the folio dirty */ >>>>> + F2FS_WB_DROP, /* drop the dirty data */ >>>>> +}; >>>>> + >>>>> +/* Decide what to do with a dirty data folio before writing it back. */ >>>>> +static enum f2fs_wb_action f2fs_wb_folio_action(struct f2fs_sb_info *sbi, >>>>> + struct inode *inode) >>>>> +{ >>>>> + /* we should bypass data pages to proceed the kworker jobs */ >>>>> + if (unlikely(f2fs_cp_error(sbi))) { >>>>> + mapping_set_error(inode->i_mapping, -EIO); >>>>> + /* >>>>> + * Keep dirty dentry folios for the latest directory structure, >>>>> + * and keep data folios in remount-ro mode. >>>>> + */ >>>>> + if ((S_ISDIR(inode->i_mode) && >>>>> + !is_sbi_flag_set(sbi, SBI_IS_CLOSE)) || >>>>> + F2FS_OPTION(sbi).errors == MOUNT_ERRORS_READONLY) >>>>> + return F2FS_WB_REDIRTY; >>>>> + return F2FS_WB_DROP; >>>>> + } >>>>> + >>>>> + if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING))) >>>>> + return F2FS_WB_REDIRTY; >>>>> + return F2FS_WB_WRITE; >>>>> +} >>>>> + >>>>> int f2fs_write_single_data_page(struct folio *folio, int *submitted, >>>>> struct bio **bio, >>>>> sector_t *last_block, >>>>> @@ -4137,26 +4164,15 @@ int f2fs_write_single_data_page(struct folio *folio, int *submitted, >>>>> >>>>> trace_f2fs_writepage(folio, DATA); >>>>> >>>>> - /* we should bypass data pages to proceed the kworker jobs */ >>>>> - if (unlikely(f2fs_cp_error(sbi))) { >>>>> - mapping_set_error(folio->mapping, -EIO); >>>>> - /* >>>>> - * don't drop any dirty dentry pages for keeping lastest >>>>> - * directory structure. >>>>> - */ >>>>> - if (S_ISDIR(inode->i_mode) && >>>>> - !is_sbi_flag_set(sbi, SBI_IS_CLOSE)) >>>>> - goto redirty_out; >>>>> - >>>>> - /* keep data pages in remount-ro mode */ >>>>> - if (F2FS_OPTION(sbi).errors == MOUNT_ERRORS_READONLY) >>>>> - goto redirty_out; >>>>> + switch (f2fs_wb_folio_action(sbi, inode)) { >>>>> + case F2FS_WB_REDIRTY: >>>>> + goto redirty_out; >>>>> + case F2FS_WB_DROP: >>>>> goto out; >>>>> + case F2FS_WB_WRITE: >>>>> + break; >>>>> } >>>>> >>>>> - if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING))) >>>>> - goto redirty_out; >>>>> - >>>>> if (folio->index < end_index || >>>>> f2fs_verity_in_progress(inode) || >>>>> compr_blocks) >>>>> @@ -4172,8 +4188,7 @@ int f2fs_write_single_data_page(struct folio *folio, int *submitted, >>>>> >>>>> folio_zero_segment(folio, offset, folio_size(folio)); >>>>> write: >>>>> - /* Dentry/quota blocks are controlled by checkpoint */ >>>>> - if (S_ISDIR(inode->i_mode) || quota_inode) { >>>>> + if (f2fs_cp_controlled_inode(inode)) { >>>>> struct f2fs_lock_context lc; >>>>> >>>>> /* >>>>> @@ -4224,14 +4239,14 @@ int f2fs_write_single_data_page(struct folio *folio, int *submitted, >>>>> goto redirty_out; >>>>> >>>>> out: >>>>> - inode_dec_dirty_block(inode); >>>>> + inode_sub_dirty_blocks(inode, f2fs_blocks_per_folio(sbi, folio)); >>>>> if (err) { >>>>> folio_clear_uptodate(folio); >>>>> folio_clear_f2fs_gcing(folio); >>>>> } >>>>> folio_unlock(folio); >>>>> - if (!S_ISDIR(inode->i_mode) && !IS_NOQUOTA(inode) && >>>>> - !F2FS_I(inode)->wb_task && allow_balance) >>>>> + if (!f2fs_cp_controlled_inode(inode) && >>>>> + !F2FS_I(inode)->wb_task && allow_balance) >>>>> f2fs_balance_fs(sbi, need_balance_fs); >>>>> >>>>> if (unlikely(f2fs_cp_error(sbi))) { >>>>> @@ -4560,6 +4575,7 @@ static int f2fs_write_cache_folios(struct address_space *mapping, >>>>> int submitted = 0; >>>>> int nwritten = 0; >>>>> bool op_locked = false; >>>>> + bool node_locked = false; >>>>> bool retry = false; >>>>> >>>>> if (get_dirty_blocks(inode) <= SM_I(sbi)->min_hot_blocks) >>>>> @@ -4571,20 +4587,15 @@ static int f2fs_write_cache_folios(struct address_space *mapping, >>>>> struct f2fs_folio_state *ffs = NULL; >>>>> u64 isize; >>>>> size_t poff; >>>>> - size_t clear_len; >>>>> pgoff_t end_index; >>>>> bool verity_in_progress; >>>>> int folio_submitted = 0; >>>>> bool bias_added = false; >>>>> >>>>> submitted = 0; >>>>> + err = 0; >>>>> retry = false; >>>>> >>>>> - if (err) { >>>>> - folio_redirty_for_writepage(wbc, folio); >>>>> - goto retry_out; >>>>> - } >>>>> - >>>>> if (atomic_read(&sbi->wb_sync_req[DATA]) && >>>>> wbc->sync_mode == WB_SYNC_NONE) { >>>>> folio_redirty_for_writepage(wbc, folio); >>>>> @@ -4597,11 +4608,22 @@ static int f2fs_write_cache_folios(struct address_space *mapping, >>>>> goto retry_out; >>>>> } >>>>> >>>>> + if (f2fs_has_subpage_blocks(sbi) && >>>>> + (f2fs_compressed_file(inode) || f2fs_is_atomic_file(inode))) { >>>>> + WARN_ON_ONCE(1); >>>>> + mapping_set_error(mapping, -EOPNOTSUPP); >>>>> + folio_clear_dirty_for_io(folio); >>>>> + inode_sub_dirty_blocks(inode, f2fs_blocks_per_folio(sbi, folio)); >>>>> + err = -EOPNOTSUPP; >>>>> + goto retry_out; >>>>> + } >>>>> + >>>>> /* >>>>> * Writing back one large folio performs multiple block allocations, so >>>>> * best-effort balance the filesystem before writing it back. >>>>> */ >>>>> - if (!F2FS_I(inode)->wb_task && has_not_enough_free_secs(sbi, 0, 0)) { >>>>> + if (!f2fs_cp_controlled_inode(inode) && >>>>> + !F2FS_I(inode)->wb_task && has_not_enough_free_secs(sbi, 0, 0)) { >>>>> folio_redirty_for_writepage(wbc, folio); >>>>> retry = true; >>>>> folio_unlock(folio); >>>>> @@ -4636,31 +4658,39 @@ static int f2fs_write_cache_folios(struct address_space *mapping, >>>>> } >>>>> >>>>> /* >>>>> - * If cp_error is set, all subpages of this folio are not >>>>> - * written back unless the filesystem is mounted with >>>>> - * errors=remount-ro. The check is placed after the retry >>>>> - * block so it also covers cp_error being set while the folio >>>>> - * lock was dropped for f2fs_balance_fs() or for the trylock_op() >>>>> - * backoff. PG_dirty is clear at this point, so both the >>>>> - * redirty and the drop below leave a coherent state. >>>>> + * Checked after the retry block, so that it also covers cp_error >>>>> + * being set while the folio lock was dropped for f2fs_balance_fs() >>>>> + * or for the trylock_op() backoff. >>>>> */ >>>>> - if (unlikely(f2fs_cp_error(sbi))) { >>>>> - mapping_set_error(mapping, -EIO); >>>>> - if (F2FS_OPTION(sbi).errors == MOUNT_ERRORS_READONLY) { >>>>> - folio_redirty_for_writepage(wbc, folio); >>>>> - goto retry_out; >>>>> - } >>>>> - goto out; >>>>> + switch (f2fs_wb_folio_action(sbi, inode)) { >>>>> + case F2FS_WB_REDIRTY: >>>>> + folio_redirty_for_writepage(wbc, folio); >>>>> + goto retry_out; >>>>> + case F2FS_WB_DROP: >>>>> + f2fs_ffs_clear_subrange_dirty_and_test(folio, 0, >>>>> + folio_size(folio)); >>>>> + inode_sub_dirty_blocks(inode, f2fs_blocks_per_folio(sbi, folio)); >>>>> + goto retry_out; >>>>> + case F2FS_WB_WRITE: >>>>> + break; >>>>> } >>>>> >>>>> - /* To avoid dealing with the complexity for one subrange is in bio >>>>> - * while we trylock_op failed before writing another subrange. >>>>> - * Try to lock_op before any subrange write for the folio. >>>>> - */ >>>>> - if (!op_locked) { >>>>> + if (f2fs_cp_controlled_inode(inode)) { >>>>> + /* >>>>> + * Quota writes need node_write to avoid block >>>>> + * allocation during checkpoint. >>>>> + */ >>>>> + if (IS_NOQUOTA(inode)) { >>>>> + f2fs_down_read_trace(&sbi->node_write, &lc); >>>>> + node_locked = true; >>>>> + } >>>>> + } else { >>>>> + /* To avoid dealing with the complexity for one subrange is in bio >>>>> + * while we trylock_op failed before writing another subrange. >>>>> + * Try to lock_op before any subrange write for the folio. >>>>> + */ >>>>> if (!f2fs_trylock_op(sbi, &lc)) { >>>>> folio_redirty_for_writepage(wbc, folio); >>>>> - err = 0; >>>>> if (wbc->sync_mode != WB_SYNC_ALL) >>>>> goto retry_out; >>>>> >>>>> @@ -4690,59 +4720,34 @@ static int f2fs_write_cache_folios(struct address_space *mapping, >>>>> folio_start_writeback(folio); >>>>> >>>>> /* >>>>> - * PG_dirty was already cleared by writeback_iter(), and a >>>>> - * single-block folio has no ffs dirty bitmap, so the dirty >>>>> - * range cannot be derived. Write the whole folio. >>>>> + * PG_dirty was already cleared by writeback_iter(). A single-block >>>>> + * folio has no ffs, so its whole folio is written. >>>>> */ >>>>> - if (!folio_test_large(folio)) { >>>>> - err = f2fs_write_folio_dirty_range(folio, &submitted, >>>>> - wbc, io_type, &pos, end_pos - pos); >>>>> - folio_submitted += submitted; >>>>> - if (err) >>>>> - goto out; >>>>> - nwritten += submitted; >>>>> - goto written; >>>>> - } >>>>> - >>>>> - if (!f2fs_folio_has_ffs(folio)) { >>>>> - ffs = f2fs_ffs_find_or_alloc(folio); >>>>> - f2fs_ffs_mark_subrange_dirty(folio, 0, end_pos - pos); >>>>> - } else { >>>>> + if (f2fs_is_multiblock_folio(sbi, folio)) { >>>>> + if (!f2fs_folio_has_ffs(folio)) >>>>> + f2fs_ffs_mark_subrange_dirty(folio, 0, end_pos - pos); >>>>> ffs = (struct f2fs_folio_state *)folio->private; >>>>> + /* >>>>> + * Multiblock folios can be submitted as multiple bios, >>>>> + * which may complete while we are still submitting the >>>>> + * remaining dirty ranges. Hold a bias on >>>>> + * write_blocks_pending to prevent folio_end_writeback() >>>>> + * from being called early. >>>>> + */ >>>>> + if (!bias_added) { >>>>> + WARN_ON_ONCE(atomic_read(&ffs->write_blocks_pending) != 0); >>>>> + atomic_inc(&ffs->write_blocks_pending); >>>>> + bias_added = true; >>>>> + } >>>>> } >>>>> - /* >>>>> - * Large folios can be submitted as multiple bios, which may >>>>> - * complete while we are still submitting the remaining dirty >>>>> - * ranges. Hold a bias on write_blocks_pending to prevent >>>>> - * folio_end_writeback() from being called early. >>>>> - */ >>>>> - if (f2fs_folio_has_ffs(folio) && !bias_added) { >>>>> - WARN_ON_ONCE(atomic_read(&ffs->write_blocks_pending) != 0); >>>>> - atomic_inc(&ffs->write_blocks_pending); >>>>> - bias_added = true; >>>>> - } >>>>> - >>>>> - unsigned int from = 0, start, count; >>>>> - unsigned int nr_blocks = f2fs_blocks_per_folio(sbi, folio); >>>>> - unsigned int to_blk = min_t(unsigned int, >>>>> - F2FS_BLK_ALIGN(sbi, end_pos - folio_pos(folio)), >>>>> - nr_blocks); >>>>> >>>>> - while (f2fs_ffs_dirty_blk_range(folio, from, to_blk, >>>>> - &start, &count)) { >>>>> - submitted = 0; >>>>> - pos = folio_pos(folio) + F2FS_BLK_TO_BYTES(sbi, start); >>>>> - err = f2fs_write_folio_dirty_range(folio, &submitted, >>>>> - wbc, io_type, &pos, >>>>> - F2FS_BLK_TO_BYTES(sbi, count)); >>>>> - folio_submitted += submitted; >>>>> - nwritten += submitted; >>>>> - if (err) >>>>> - goto out; >>>>> - from = start + count; >>>>> - } >>>>> + err = f2fs_write_folio_dirty_range(folio, &submitted, wbc, io_type, >>>>> + pos, end_pos); >>>>> + folio_submitted += submitted; >>>>> + nwritten += submitted; >>>>> + if (err) >>>>> + goto out; >>>>> >>>>> -written: >>>>> /* If none of the subpages of a folio is submitted, keep the atomic flag */ >>>>> if (folio_submitted && >>>>> f2fs_is_atomic_file(inode) && >>>>> @@ -4750,26 +4755,12 @@ static int f2fs_write_cache_folios(struct address_space *mapping, >>>>> folio_clear_f2fs_atomic(folio); >>>>> >>>>> out: >>>>> - /* >>>>> - * Clear the dirty state of the subranges that were written back. >>>>> - * If some subranges are still dirty (e.g. the folio was only >>>>> - * partially written back), or if the writeback failed, the >>>>> - * folio must stay dirty so that the remaining subranges are >>>>> - * written back later. >>>>> - * >>>>> - * On success, clear dirty bits of the whole folio rather than >>>>> - * up to isize: subpages beyond EOF can still carry dirty bits >>>>> - * (e.g. fill_zero() w/ FALLOC_FL_KEEP_SIZE, BG_GC on blocks >>>>> - * beyond EOF, or f2fs_ffs_find_or_alloc() on a dirty folio), >>>>> - * they will never be written back, and would keep the folio >>>>> - * redirtied forever. >>>>> - */ >>>>> - clear_len = err ? pos - folio_pos(folio) : folio_size(folio); >>>>> - if (f2fs_ffs_clear_subrange_dirty_and_test(folio, 0, >>>>> - clear_len) || err) { >>>>> + if (!err) { >>>>> + f2fs_ffs_clear_subrange_dirty_and_test(folio, 0, >>>>> + folio_size(folio)); >>>>> + inode_sub_dirty_blocks(inode, f2fs_blocks_per_folio(sbi, folio)); >>>>> + } else { >>>>> folio_redirty_for_writepage(wbc, folio); >>>>> - } else if (!f2fs_folio_has_ffs(folio)) { >>>>> - inode_dec_dirty_block(inode); >>>>> } >>>>> >>>>> /* >>>>> @@ -4780,7 +4771,7 @@ static int f2fs_write_cache_folios(struct address_space *mapping, >>>>> f2fs_ffs_put_write_pending(folio, 1); >>>>> } else if (!folio_submitted && folio_test_writeback(folio)) { >>>>> /* >>>>> - * Order-0 folios take no bias, so end the writeback >>>>> + * Single-block folios take no bias, so end the writeback >>>>> * if nothing was submitted. >>>>> */ >>>>> folio_end_writeback(folio); >>>>> @@ -4792,6 +4783,11 @@ static int f2fs_write_cache_folios(struct address_space *mapping, >>>>> op_locked = false; >>>>> } >>>>> >>>>> + if (node_locked) { >>>>> + f2fs_up_read_trace(&sbi->node_write, &lc); >>>>> + node_locked = false; >>>>> + } >>>>> + >>>>> folio_unlock(folio); >>>>> } >>>>> >>>>> @@ -4872,10 +4868,10 @@ static int __f2fs_write_data_pages(struct address_space *mapping, >>>>> if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING))) >>>>> goto skip_write; >>>>> >>>>> - if ((S_ISDIR(inode->i_mode) || IS_NOQUOTA(inode)) && >>>>> - wbc->sync_mode == WB_SYNC_NONE && >>>>> - get_dirty_blocks(inode) < nr_caches_to_skip(sbi, DATA) && >>>>> - f2fs_available_free_memory(sbi, DIRTY_DENTS)) >>>>> + if (f2fs_cp_controlled_inode(inode) && >>>>> + wbc->sync_mode == WB_SYNC_NONE && >>>>> + get_dirty_blocks(inode) < nr_caches_to_skip(sbi, DATA) && >>>>> + f2fs_available_free_memory(sbi, DIRTY_DENTS)) >>>>> goto skip_write; >>>>> >>>>> /* skip writing in file defragment preparing stage */ >>>>> @@ -4902,7 +4898,7 @@ static int __f2fs_write_data_pages(struct address_space *mapping, >>>>> account_writeback(inode, true); >>>>> >>>>> blk_start_plug(&plug); >>>>> - if (mapping_large_folio_support(inode->i_mapping) && >>>>> + if (f2fs_has_multiblock_folios(inode) && >>>>> !f2fs_has_inline_data(inode)) >>>>> ret = f2fs_write_cache_folios(mapping, wbc, io_type); >>>>> else >>>>> @@ -5136,7 +5132,7 @@ static int prepare_atomic_write_begin(struct f2fs_sb_info *sbi, >>>>> int err = 0; >>>>> block_t ori_blk_addr = NULL_ADDR; >>>>> bool cow_has_reserved_block = false; >>>>> - bool append = ((loff_t)index << PAGE_SHIFT) >= i_size_read(inode); >>>>> + bool append = F2FS_BLK_TO_BYTES(sbi, index) >= i_size_read(inode); >>>>> >>>>> /* >>>>> * On the first attempt, an append write can skip the COW lookup and >>>>> @@ -5226,7 +5222,7 @@ static bool f2fs_balance_fs_folio_locked(struct folio *folio, >>>>> >>>>> static int prepare_large_folio_write_begin(struct inode *inode, >>>>> struct folio *folio, loff_t pos, >>>>> - unsigned int len) >>>>> + unsigned int len, bool *need_balance) >>>>> { >>>>> struct f2fs_sb_info *sbi = F2FS_I_SB(inode); >>>>> struct f2fs_folio_state *ffs; >>>>> @@ -5234,9 +5230,13 @@ static int prepare_large_folio_write_begin(struct inode *inode, >>>>> size_t need_off = ori_off; >>>>> int err = 0; >>>>> >>>>> + if (f2fs_has_subpage_blocks(sbi) && >>>>> + (f2fs_compressed_file(inode) || f2fs_is_atomic_file(inode))) >>>>> + return -EOPNOTSUPP; >>>>> + >>>>> /* >>>>> - * when the write did not come through f2fs_write_iter, we preallocate all >>>>> - * blocks in the write range here. >>>>> + * Reserve blocks without f2fs_balance_fs() since the folio is locked; >>>>> + * the caller balances after unlocking it if *need_balance is set. >>>> >>>> I think there is potential risk if we don't allow unlock -> f2fs_balance_fs, e.g. >>>> multiple threads call write_begin to write high order large folio concurrently will >>>> consume free blocks quickly, it may run out of free segments potentially w/o fggc. >>>> thoughts? >>> >>> f2fs_balance_fs() is still called. f2fs_write_begin() calls >>> f2fs_balance_fs_folio_locked() right after this, which unlocks the >>> folio, calls f2fs_balance_fs() and locks it again, under the same >>> condition (node_changed) as before. It is only moved to the caller, so >>> that the order-0 and multi-block paths balance in one place. I will >>> make the comment clearer in v2. >> >> Actually, what I meant is it changed >> from a. one f2fs_balance_fs() after one __reserve_data_block() >> to b. one f2fs_balance_fs() after in-batch __reserve_data_block() >> >> So in high order large folio, in prepare_large_folio_write_begin() we may reserve >> hundreds of blocks, and then a following f2fs_balance_fs(), which may be late, >> especially in a small size image, mutliple threads write high order folio concurrently, >> it may run out of free section, due to we missed to call f2fs_balance_fs() in time? >> >> Thanks, >> > > I see, you're right. It was changed because f2fs_vm_page_mkwrite() also > calls prepare_large_folio_write_begin() with subpage blocks, and it can > neither unlock the folio nor return -EAGAIN there. It calls > f2fs_balance_fs() before locking the folio, as before. Alright, will we suffer any issue once we unlock folio -> balance_fs -> lock folio -> continue? Maybe we need to do some tests on this mkwrite case w/ below scenario to check whether there is potential ENOSPC issue as well: - 4k block + 16k page + maybe enable large folio and unlimit max order - small sized image - less free section - multiple threads call mkwrite concurrently > > But there is no reason to change it for write_begin. In v2, I'll call > f2fs_balance_fs_folio_locked() after each __reserve_data_block() again when > it is called from f2fs_write_begin(), and skip it only for page_mkwrite. It makes sense to me. Thanks, > > Thanks, > >>> >>> Thanks, >>> >>>> >>>> Thanks, >>>> >>>>> */ >>>>> if (!is_inode_flag_set(inode, FI_PREALLOCATED_ALL) && >>>>> !IS_DEVICE_ALIASING(inode)) { >>>>> @@ -5252,9 +5252,7 @@ static int prepare_large_folio_write_begin(struct inode *inode, >>>>> &node_changed); >>>>> if (err) >>>>> return err; >>>>> - if (f2fs_balance_fs_folio_locked(folio, folio->mapping, >>>>> - node_changed)) >>>>> - return -EAGAIN; >>>>> + *need_balance |= node_changed; >>>>> } >>>>> } >>>>> >>>>> @@ -5266,8 +5264,12 @@ static int prepare_large_folio_write_begin(struct inode *inode, >>>>> if (folio_test_uptodate(folio) || len == folio_size(folio)) >>>>> return 0; >>>>> >>>>> + /* >>>>> + * Skip read if the write starts at a block boundary and reaches EOF, >>>>> + * and zero the rest of the folio instead. >>>>> + */ >>>>> if (!f2fs_verity_in_progress(inode) && >>>>> - !(pos & (PAGE_SIZE - 1)) && (pos + len) >= i_size_read(inode)) { >>>>> + !(pos & (F2FS_BLKSIZE(sbi) - 1)) && (pos + len) >= i_size_read(inode)) { >>>>> size_t zoff = ori_off + len; >>>>> >>>>> if (zoff < folio_size(folio)) >>>>> @@ -5281,7 +5283,8 @@ static int prepare_large_folio_write_begin(struct inode *inode, >>>>> while (find_next_valid_block(folio, ori_off, >>>>> &need_off, len)) { >>>>> struct dnode_of_data dn; >>>>> - pgoff_t index = folio->index + (need_off >> PAGE_SHIFT); >>>>> + pgoff_t index = f2fs_folio_lblk(sbi, folio) + >>>>> + F2FS_BYTES_TO_BLK(sbi, need_off); >>>>> block_t blkaddr; >>>>> >>>>> if (!f2fs_lookup_read_extent_cache_block(inode, index, >>>>> @@ -5297,12 +5300,13 @@ static int prepare_large_folio_write_begin(struct inode *inode, >>>>> f2fs_put_dnode(&dn); >>>>> >>>>> if (blkaddr == NEW_ADDR) { >>>>> - size_t off = offset_in_folio(folio, >>>>> - (loff_t)index << PAGE_SHIFT); >>>>> + size_t off = f2fs_folio_byte_offset(sbi, >>>>> + folio, index); >>>>> >>>>> - folio_zero_segment(folio, off, off + PAGE_SIZE); >>>>> + folio_zero_segment(folio, off, >>>>> + off + F2FS_BLKSIZE(sbi)); >>>>> f2fs_ffs_mark_subrange_uptodate(folio, off, >>>>> - PAGE_SIZE); >>>>> + F2FS_BLKSIZE(sbi)); >>>>> continue; >>>>> } >>>>> } >>>>> @@ -5401,12 +5405,18 @@ static int f2fs_write_begin(const struct kiocb *iocb, >>>>> goto fail; >>>>> } >>>>> >>>>> + if (f2fs_has_subpage_blocks(sbi) && >>>>> + (f2fs_compressed_file(inode) || f2fs_is_atomic_file(inode))) { >>>>> + err = -EOPNOTSUPP; >>>>> + goto fail; >>>>> + } >>>>> + >>>>> /* >>>>> * We should check this at this moment to avoid deadlock on inode page >>>>> * and #0 page. The locking rule for inline_data conversion should be: >>>>> * folio_lock(folio #0) -> folio_lock(inode_page) >>>>> */ >>>>> - if (index != 0) { >>>>> + if (index != 0 || f2fs_has_subpage_blocks(sbi)) { >>>>> err = f2fs_convert_inline_inode(inode); >>>>> if (err) >>>>> goto fail; >>>>> @@ -5469,17 +5479,19 @@ static int f2fs_write_begin(const struct kiocb *iocb, >>>>> */ >>>>> f2fs_folio_wait_writeback(folio, false, true); >>>>> >>>>> - if (f2fs_is_atomic_file(inode) && !folio_test_large(folio)) >>>>> + if (f2fs_is_atomic_file(inode) && !f2fs_is_multiblock_folio(sbi, folio)) { >>>>> err = prepare_atomic_write_begin(sbi, inode, folio->index, >>>>> &blkaddr, &need_balance, retried); >>>>> - else if (!folio_test_large(folio)) >>>>> + } else if (!f2fs_is_multiblock_folio(sbi, folio)) { >>>>> err = prepare_write_begin(sbi, folio, pos, blen, >>>>> &blkaddr, &need_balance); >>>>> - else if (f2fs_is_atomic_file(inode)) >>>>> + } else if (f2fs_is_atomic_file(inode)) { >>>>> err = prepare_large_folio_atomic_write_begin(inode, >>>>> mapping, folio, pos, len, retried); >>>>> - else >>>>> - err = prepare_large_folio_write_begin(inode, folio, pos, blen); >>>>> + } else { >>>>> + err = prepare_large_folio_write_begin(inode, folio, pos, blen, >>>>> + &need_balance); >>>>> + } >>>>> if (err) { >>>>> if (err == -EAGAIN) { >>>>> retried = true; >>>>> @@ -5495,7 +5507,7 @@ static int f2fs_write_begin(const struct kiocb *iocb, >>>>> goto repeat; >>>>> } >>>>> >>>>> - if (folio_test_large(folio)) >>>>> + if (f2fs_is_multiblock_folio(sbi, folio)) >>>>> return 0; >>>>> >>>>> if (blen == folio_size(folio) || folio_test_uptodate(folio)) >>>>> @@ -5565,7 +5577,7 @@ static int f2fs_write_end(const struct kiocb *iocb, >>>>> if (!folio_test_uptodate(folio)) { >>>>> if (unlikely(copied != len)) { >>>>> copied = 0; >>>>> - } else if (folio_test_large(folio)) { >>>>> + } else if (f2fs_is_multiblock_folio(F2FS_I_SB(inode), folio)) { >>>>> f2fs_ffs_mark_subrange_uptodate(folio, >>>>> offset_in_folio(folio, pos), len); >>>>> } else { >>>>> @@ -5590,7 +5602,7 @@ static int f2fs_write_end(const struct kiocb *iocb, >>>>> if (!copied) >>>>> goto unlock_out; >>>>> >>>>> - if (folio_test_large(folio)) >>>>> + if (f2fs_is_multiblock_folio(F2FS_I_SB(inode), folio)) >>>>> f2fs_ffs_mark_subrange_dirty(folio, offset_in_folio(folio, pos), >>>>> copied); >>>>> folio_mark_dirty(folio); >>>>> @@ -5642,6 +5654,9 @@ void f2fs_invalidate_folio(struct folio *folio, size_t offset, size_t length) >>>>> * dirty state. >>>>> */ >>>>> if (!dirty && folio_test_dirty(folio)) { >>>>> + inode_sub_dirty_blocks(inode, >>>>> + f2fs_blocks_per_folio(sbi, folio)); >>>>> + f2fs_remove_dirty_inode(inode); >>>>> f2fs_clear_page_cache_dirty_tag(folio); >>>>> folio_cancel_dirty(folio); >>>>> } >>>>> @@ -5650,11 +5665,8 @@ void f2fs_invalidate_folio(struct folio *folio, size_t offset, size_t length) >>>>> return; >>>>> } >>>>> >>>>> - if (f2fs_folio_has_ffs(folio)) { >>>>> - f2fs_ffs_clear_subrange_dirty_and_test(folio, 0, >>>>> - folio_size(folio)); >>>>> - } else if (folio_test_dirty(folio)) { >>>>> - inode_dec_dirty_block(inode); >>>>> + if (folio_test_dirty(folio)) { >>>>> + inode_sub_dirty_blocks(inode, f2fs_blocks_per_folio(sbi, folio)); >>>>> f2fs_remove_dirty_inode(inode); >>>>> } >>>>> >>>>> diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c >>>>> index aa3511c6f8fe..7f5dc2354a27 100644 >>>>> --- a/fs/f2fs/dir.c >>>>> +++ b/fs/f2fs/dir.c >>>>> @@ -979,9 +979,9 @@ void f2fs_delete_entry(struct f2fs_dir_entry *dentry, void *dentry_block, >>>>> if (!f2fs_has_subpage_blocks(sbi)) { >>>>> folio_clear_uptodate(folio); >>>>> folio_detach_private(folio); >>>>> - inode_dec_dirty_block(dir); >>>>> } >>>>> >>>>> + inode_sub_dirty_blocks(dir, f2fs_blocks_per_folio(sbi, folio)); >>>>> f2fs_remove_dirty_inode(dir); >>>>> } >>>>> keep_dirty: >>>>> diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h >>>>> index cf7294068415..aab1095ad5ff 100644 >>>>> --- a/fs/f2fs/f2fs.h >>>>> +++ b/fs/f2fs/f2fs.h >>>>> @@ -4457,7 +4457,6 @@ void f2fs_remove_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino); >>>>> int f2fs_recover_orphan_inodes(struct f2fs_sb_info *sbi); >>>>> int f2fs_get_valid_checkpoint(struct f2fs_sb_info *sbi); >>>>> void f2fs_update_dirty_folio(struct inode *inode, struct folio *folio); >>>>> -void f2fs_account_dirty_blocks(struct inode *inode, int nr); >>>>> void f2fs_remove_dirty_inode(struct inode *inode); >>>>> int f2fs_sync_dirty_inodes(struct f2fs_sb_info *sbi, enum inode_type type, >>>>> bool from_cp); >>>>> diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c >>>>> index 1ce4553b1d01..be548f39e33e 100644 >>>>> --- a/fs/f2fs/file.c >>>>> +++ b/fs/f2fs/file.c >>>>> @@ -5561,12 +5561,13 @@ static int f2fs_preallocate_blocks(struct kiocb *iocb, struct iov_iter *iter, >>>>> return ret; >>>>> } >>>>> >>>>> - if (!dio && mapping_large_folio_support(inode->i_mapping)) { >>>>> + if (!dio && f2fs_has_multiblock_folios(inode)) { >>>>> /* >>>>> - * Preallocate all blocks touched by a large-folio buffered write so >>>>> - * the regular write_begin path does not need to unlock the folio for >>>>> - * f2fs_balance_fs(). Rechecking large-folio state after unlock is >>>>> - * unreliable since partial truncation can split the folio. >>>>> + * Preallocate all blocks touched by a multiblock-folio buffered >>>>> + * write so the regular write_begin path does not need to unlock >>>>> + * the folio for f2fs_balance_fs(). Rechecking large-folio >>>>> + * state after unlock is unreliable since partial truncation can >>>>> + * split the folio. >>>>> */ >>>>> map.m_lblk = F2FS_BYTES_TO_BLK(sbi, pos); >>>>> map.m_len = F2FS_BLK_ALIGN(sbi, pos + count); >>>>> diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c >>>>> index 6c24001325b2..f041a036836e 100644 >>>>> --- a/fs/f2fs/gc.c >>>>> +++ b/fs/f2fs/gc.c >>>>> @@ -1608,13 +1608,12 @@ static int move_data_cache_block(struct inode *inode, block_t bidx, int gc_type, >>>>> f2fs_ffs_mark_subrange_dirty(folio, foff, F2FS_BLKSIZE(sbi)); >>>>> folio_mark_dirty(folio); >>>>> if (folio_clear_dirty_for_io(folio)) { >>>>> - if (!has_ffs) { >>>>> - inode_dec_dirty_block(inode); >>>>> - f2fs_remove_dirty_inode(inode); >>>>> - } else if (f2fs_ffs_clear_subrange_dirty_and_test(folio, >>>>> - foff, F2FS_BLKSIZE(sbi))) { >>>>> + inode_sub_dirty_blocks(inode, f2fs_blocks_per_folio(sbi, folio)); >>>>> + f2fs_remove_dirty_inode(inode); >>>>> + if (has_ffs && >>>>> + f2fs_ffs_clear_subrange_dirty_and_test(folio, foff, >>>>> + F2FS_BLKSIZE(sbi))) >>>>> folio_mark_dirty(folio); >>>>> - } >>>>> } >>>>> >>>>> folio_set_f2fs_gcing(folio); >>>>> diff --git a/fs/f2fs/inline.c b/fs/f2fs/inline.c >>>>> index ba0aff8e5643..757be9f8d069 100644 >>>>> --- a/fs/f2fs/inline.c >>>>> +++ b/fs/f2fs/inline.c >>>>> @@ -196,10 +196,15 @@ int f2fs_convert_inline_folio(struct dnode_of_data *dn, struct folio *folio) >>>>> folio_start_writeback(folio); >>>>> fio.old_blkaddr = dn->data_blkaddr; >>>>> set_inode_flag(dn->inode, FI_HOT_DATA); >>>>> + if (f2fs_is_multiblock_folio(fio.sbi, folio)) { >>>>> + struct f2fs_folio_state *ffs = f2fs_ffs_find_or_alloc(folio); >>>>> + >>>>> + atomic_inc(&ffs->write_blocks_pending); >>>>> + } >>>>> f2fs_outplace_write_data(dn, &fio); >>>>> f2fs_folio_wait_writeback(folio, true, true); >>>>> if (dirty) { >>>>> - inode_dec_dirty_block(dn->inode); >>>>> + inode_sub_dirty_blocks(dn->inode, f2fs_blocks_per_folio(fio.sbi, folio)); >>>>> f2fs_remove_dirty_inode(dn->inode); >>>>> } >>>>> >>>>> diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c >>>>> index c48b12208e20..b95bb5c27b0b 100644 >>>>> --- a/fs/f2fs/node.c >>>>> +++ b/fs/f2fs/node.c >>>>> @@ -1700,7 +1700,7 @@ static void flush_inline_data(struct f2fs_sb_info *sbi, nid_t ino) >>>>> goto folio_out; >>>>> >>>>> ret = f2fs_write_inline_data(inode, folio); >>>>> - inode_dec_dirty_block(inode); >>>>> + inode_sub_dirty_blocks(inode, f2fs_blocks_per_folio(sbi, folio)); >>>>> f2fs_remove_dirty_inode(inode); >>>>> if (ret) >>>>> folio_mark_dirty(folio); >>>> >> From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from lists.sourceforge.net (lists.sourceforge.net [216.105.38.7]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 53D5A606A320 for ; Wed, 11 Nov 2026 06:40:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key, unprotected) header.d=lists.sourceforge.net header.i=@lists.sourceforge.net header.a=rsa-sha256 header.s=beta header.b=XpHP60yH; dkim=fail reason="signature verification failed" (1024-bit key, unprotected) header.d=sourceforge.net header.i=@sourceforge.net header.a=rsa-sha256 header.s=x header.b=Gd5Titpy; dkim=fail reason="signature verification failed" (1024-bit key, unprotected) header.d=sf.net header.i=@sf.net header.a=rsa-sha256 header.s=x header.b=FR2a6LIY; dkim=neutral header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256 header.s=k20260515 header.b=T3IfjteB DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.sourceforge.net; s=beta; h=Content-Transfer-Encoding:Content-Type: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-Unsubscribe-Post: List-Owner; bh=nfCj/rMPd4yg98tBGK94VGL9WFV68QhYKT+Ncg2zYqg=; b=XpHP60yHQyxmxm r9YRmjU09W1fLyRmaie/4EV8qTkXHfw5rx4h166FLOzLYI63lqYOtbXhdQNbf5PI6qJzrXMh7icHs rZ5GrKqUo+20XyzqNQf3L6hPzVaWJYzGFBbxszuSjIcpJspuMrfWtbrYf601bOsMRwdTMyst5N5uU bS4=; Received: from [127.0.0.1] (helo=sfs-ml-3.v29.lw.sourceforge.com) by sfs-ml-3.v29.lw.sourceforge.com with esmtp (Exim 4.100.1) (envelope-from ) id 1xR20i-000000000ct-3gSA; Wed, 11 Nov 2026 06:40:44 +0000 Received: from [172.30.29.66] (helo=mx.sourceforge.net) by sfs-ml-3.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.100.1) (envelope-from ) id 1xR20g-000000000cm-2ArC for linux-f2fs-devel@lists.sourceforge.net; Wed, 11 Nov 2026 06:40:42 +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-Unsubscribe-Post:List-Subscribe:List-Post:List-Owner:List-Archive; bh=HFGAcoTwQarl9DjE/7TGMN5ybSqD54sOEoOXZfnhnWM=; b=Gd5Titpyr7oKiNz2KArDxFF24X y+kuCnnCpZrTt2JCl7DWMPvpigyU6f/8m73OB3x6bnEbwXMkOoeSkhEwC3Pd8soawequPrfS2BtxO 66+zO2/8BSx179VzngSiUA2o4gl4NNpbAo7mxV09LUoSaigCH/8iD7rKzDY+a+hq56Nw=; 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-Unsubscribe-Post: List-Subscribe:List-Post:List-Owner:List-Archive; bh=HFGAcoTwQarl9DjE/7TGMN5ybSqD54sOEoOXZfnhnWM=; b=FR2a6LIYJwDWrX3GJ4G/AYFgKo 2m4oF5RbMhnJEh3hMr/72cMJxX/Kqn9ME3PC1G++eMITv1ExTnUk+uo8NnJMQ8Q/eGsj4lxVSp40V GgdRxCjNkviEJqP6eagsnWslb336XS2AmGWhfzZW7u1fMEWtWnZPeEQlVa6+IaykCyUQ=; Received: from sea.source.kernel.org ([172.234.252.31]) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.100.1) id 1xR20Z-000000004WH-1GYf for linux-f2fs-devel@lists.sourceforge.net; Wed, 11 Nov 2026 06:40:42 +0000 Received: from smtp.kernel.org (quasi.space.kernel.org [100.103.45.18]) by sea.source.kernel.org (Postfix) with ESMTP id C504F40596; Wed, 11 Nov 2026 06:40:29 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id AF6F71F00A05; Wed, 11 Nov 2026 06:40:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel.org; s=k20260515; t=1794379229; bh=HFGAcoTwQarl9DjE/7TGMN5ybSqD54sOEoOXZfnhnWM=; h=Date:Cc:Subject:To:References:From:In-Reply-To; b=T3IfjteBD1pOYxkaMnC1wtG5KM0tqevZx0ZpgdLpMSJLQ7e3viYE9yaSa/9cQ7NzM vL6MTWgEHPXkYmex1wkQXI0KDMy8Lc3Ww07fK7yODCqzO6suNas4SxAFhKns4mQc+T n+IR89O7aVWjk9ToESc0zpTdkrWVCyXILbEKkf7wIftcQc7s0KiHS+qFL6+uROWi85 gy28+72gt/3l2/syBVZSPa9Lm2K6THZ/DuiWgPKZzwmIFBa8HxNlW9KRmTfiLoJ3Cq J3ghjjwxeMqde+OaMvjkWwBXTgnIkd5lmQzZf3QKvVCzwUzKsDd9qiP6tfIIo4YwTd XMAKd0X0maKdQ== Message-ID: <31dfb7c7-5730-4ac5-b9ea-790ef42e14af@kernel.org> Date: Wed, 11 Nov 2026 14:40:25 +0800 X-Archived-By: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird To: Daeho Jeong References: <20261102193952.3002018-1-daeho43@gmail.com> <20261102193952.3002018-8-daeho43@gmail.com> <164909bf-39e8-421e-b9c6-f2bac0391f39@kernel.org> <79922b4f-dceb-40c7-913b-a9ac02664da4@kernel.org> Content-Language: en-US In-Reply-To: X-Spam-Score: -0.2 (/) X-Headers-End: 1xR20Z-000000004WH-1GYf Subject: Re: [f2fs-dev] [PATCH 07/20] f2fs: support subpage blocks in data write path and writeback X-BeenThere: linux-f2fs-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Archive: List-Post: List-Help: List-Subscribe: , From: Chao Yu via Linux-f2fs-devel Reply-To: Chao Yu Cc: Daeho Jeong , kernel-team@android.com, linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 X-Spam-Status: No, score=-17.6 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_PASS,SPF_PASS, USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=4.0.1 X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on aws-us-west-2-korg-listserv-alma10-1 T24gMTEvMTEvMjYgMDM6NTAsIERhZWhvIEplb25nIHdyb3RlOgo+IE9uIFR1ZSwgTm92IDEwLCAy MDI2IGF0IDM6MTnigK9BTSBDaGFvIFl1IDxjaGFvQGtlcm5lbC5vcmc+IHdyb3RlOgo+Pgo+PiBP biAxMS84LzI2IDA3OjE0LCBEYWVobyBKZW9uZyB3cm90ZToKPj4+IE9uIFRodSwgTm92IDUsIDIw MjYgYXQgNjo1MuKAr1BNIENoYW8gWXUgPGNoYW9Aa2VybmVsLm9yZz4gd3JvdGU6Cj4+Pj4KPj4+ PiBPbiAxMS8zLzI2IDAzOjM5LCBEYWVobyBKZW9uZyB3cm90ZToKPj4+Pj4gRnJvbTogRGFlaG8g SmVvbmcgPGRhZWhvamVvbmdAZ29vZ2xlLmNvbT4KPj4+Pj4KPj4+Pj4gV2l0aCBibG9ja3Mgc21h bGxlciB0aGFuIFBBR0VfU0laRSwgYSBmb2xpbyBob2xkcyBzZXZlcmFsIGJsb2Nrcywgc28KPj4+ Pj4gd3JpdGVfYmVnaW4sIHdyaXRlX2VuZCBhbmQgd3JpdGViYWNrIGhhdmUgdG8gaGFuZGxlIGlu ZGl2aWR1YWwgYmxvY2tzCj4+Pj4+IGluc3RlYWQgb2YgdGhlIHdob2xlIGZvbGlvLgo+Pj4+Pgo+ Pj4+PiAtIFJlYWQsIHplcm8gYW5kIHJlc2VydmUgdGhlIGJsb2NrcyB0b3VjaGVkIGJ5IGEgd3Jp dGUgcGVyIGJsb2NrIGluCj4+Pj4+ICAgIHdyaXRlX2JlZ2luLCBhbmQgbWFyayBvbmx5IHRoZSB3 cml0dGVuIGJsb2NrcyBkaXJ0eSBpbiB3cml0ZV9lbmQuCj4+Pj4+IC0gV3JpdGUgYmFjayBvbmx5 IHRoZSBkaXJ0eSBibG9ja3Mgb2YgYSBtdWx0aS1ibG9jayBmb2xpbyBhbmQgY29tcGxldGUKPj4+ Pj4gICAgd3JpdGUgSS9PIHBlciBibG9jay4gSW4gc3VicGFnZSBtb2RlIGV2ZXJ5IGlub2RlIGlz IHdyaXR0ZW4gYmFjayBieQo+Pj4+PiAgICBmMmZzX3dyaXRlX2NhY2hlX2ZvbGlvcygpLCB3aGlj aCBub3cgaGFuZGxlcyBkZW50cnkgYW5kIHF1b3RhIGZvbGlvcwo+Pj4+PiAgICBhbmQgY2hlY2tw b2ludCBlcnJvcnMgYXMgZjJmc193cml0ZV9zaW5nbGVfZGF0YV9wYWdlKCkgZG9lcy4gQm90aCB1 c2UKPj4+Pj4gICAgdGhlIG5ldyBmMmZzX2NwX2NvbnRyb2xsZWRfaW5vZGUoKSBhbmQgZjJmc193 Yl9mb2xpb19hY3Rpb24oKSBoZWxwZXJzCj4+Pj4+ICAgIGZvciB0aGVzZSBydWxlcy4KPj4+Pj4g ICAgSXQgYWxzbyByZXNldHMgdGhlIGVycm9yIGZvciBlYWNoIGZvbGlvLCBzbyB0aGF0IHRoZSBy ZW1haW5pbmcgZm9saW9zCj4+Pj4+ICAgIGFyZSBzdGlsbCB3cml0dGVuIGJhY2sgYWZ0ZXIgYW4g ZXJyb3IsIGFzIHdyaXRlYmFja19pdGVyKCkgZXhwZWN0cwo+Pj4+PiAgICBmb3IgaW50ZWdyaXR5 IHdyaXRlYmFjaywgaW5zdGVhZCBvZiByZWRpcnR5aW5nIHRoZW0uCj4+Pj4+ICAgIGYyZnNfd3Jp dGVfZm9saW9fZGlydHlfcmFuZ2UoKSBjbGVhbnMgdXAgZWFjaCBibG9jayB3aGVyZSBpdCBpcwo+ Pj4+PiAgICB3cml0dGVuIG9yIHNraXBwZWQsIGFuZCBhZHZhbmNlcyBsYXN0X2Rpc2tfc2l6ZSBv bmx5IHVwIHRvIHRoZSBsYXN0Cj4+Pj4+ICAgIGJsb2NrIGl0IHN1Ym1pdHRlZC4gT24gYW4gZXJy b3IsIGl0IGNsZWFycyB0aGUgZGlydHkgc3RhdGUgb2YgdGhlCj4+Pj4+ICAgIGJsb2NrcyBiZWZv cmUgdGhlIGZhaWxlZCBvbmUsIHNvIHRoYXQgb25seSB0aGUgZmFpbGVkIGJsb2NrIGFuZCB0aGUK Pj4+Pj4gICAgb25lcyBhZnRlciBpdCBhcmUgd3JpdHRlbiBhZ2Fpbi4KPj4+Pj4gLSBDb3VudCBp bm9kZSBkaXJ0eSBibG9ja3MgcGVyIGZvbGlvOiBhZGQgYWxsIGJsb2NrcyBvZiBhIGZvbGlvIHdo ZW4KPj4+Pj4gICAgaXQgaXMgZGlydGllZCBhbmQgcmVtb3ZlIHRoZW0gd2hlbiBpdCBpcyBjbGVh bmVkLCBpbnN0ZWFkIG9mIGNvdW50aW5nCj4+Pj4+ICAgIHRoZSBkaXJ0eSBiaXRzIG9mIHRoZSBm b2xpbyBzdGF0ZS4gQSBtdWx0aS1ibG9jayBmb2xpbyBjYW4gYmUgZGlydGllZAo+Pj4+PiAgICB3 aXRob3V0IGEgZm9saW8gc3RhdGUsIGUuZy4gYWZ0ZXIgYSByZWFkIG9mIHRoZSB3aG9sZSBmb2xp byBvcgo+Pj4+PiAgICB0aHJvdWdoIGZvbGlvX21hcmtfZGlydHkoKSwgYW5kIGEgc3RhdGUgYXR0 YWNoZWQgbGF0ZXIgc3RhcnRzIHdpdGgKPj4+Pj4gICAgZGlydHkgYml0cyB0aGF0IHdlcmUgbmV2 ZXIgY291bnRlZCwgc28gdGhlIGJpdCBjb3VudCBjYW5ub3Qgc3RheQo+Pj4+PiAgICBiYWxhbmNl ZC4gQSBwYXJ0aWFsbHkgZGlydHkgZm9saW8gaXMgY291bnRlZCBhcyBmdWxseSBkaXJ0eS4KPj4+ Pgo+Pj4+IFNvcnJ5LCBzdGlsbCBJIGRvbid0IHVuZGVyc3RhbmQgd2h5IHdlIGNhbiBub3QgdHJh Y2sgZGlydHkgYmxvY2sgY291bnQgaW4gZm9saW8sCj4+Pj4gdGhlIGNvdW50IHNob3VsZCBiZSBj b25zaXN0ZW50IHcvIGRpcnR5IGJpdG1hcCBpbiBmZnMgKGUuZy4gaWYgdGhlcmUgaXMgeCBiaXRz IGluCj4+Pj4gYml0bWFwIGlzIDEsIHRoZSBjb3VudCBzaG91bGQgYmUgeCkuCj4+Pj4KPj4+PiBJ SVVDLCBpZiBsYXJnZSBmb2xpbyBjYW4gdHJhY2sgZGlydHkgcGFnZSBjb3VudCwgMTZrLXBhZ2Ug c2hvdWxkIGNhbiB0cmFjayA0awo+Pj4+IGRpcnR5IGJsb2NrIGFzIHdlbGw/IG9yIGlzIHRoZXJl IGFueSBkaWZmZXJlbmNlIGluIHN1YnBhZ2UgYmxvY2sgZmVhdHVyZSwgY2FuIHlvdQo+Pj4+IHBs ZWFzZSBleHBsYWluIG1vcmUgYWJvdXQgdGhpcz8KPj4+Cj4+PiBIaSBDaGFvLAo+Pgo+PiBIaSBE YWVobywKPj4KPj4gVGhhbmtzIGZvciB0aGUgZGV0YWlsZWQgZXhwbGFuYXRpb24uCj4+Cj4+Pgo+ Pj4gQ291bnRpbmcgZGlydHkgYml0cyBuZWVkcyB0aGUgZm9saW8gc3RhdGUgb24gZXZlcnkgZGly dHkgbXVsdGktYmxvY2sKPj4+IGZvbGlvLCBidXQgYSBmb2xpbyBjYW4gYmUgZGlydGllZCB0aHJv dWdoIC0+ZGlydHlfZm9saW8oKSwgd2hpY2ggY2Fubm90Cj4+PiBhbGxvY2F0ZSBpdDogLT5kaXJ0 eV9mb2xpbygpIG11c3Qgbm90IGJsb2NrIGFuZCBjYW4gYmUgY2FsbGVkIHVuZGVyCj4+PiB0aGUg cGFnZSB0YWJsZSBsb2NrIHdpdGhvdXQgdGhlIGZvbGlvIGxvY2ssIGFuZCBpdCBoYXMgbm8gcmFu Z2UsIHNvIHRoZQo+Pj4gd2hvbGUgZm9saW8gYmVjb21lcyBkaXJ0eS4gRS5nLiBhIGZvbGlvIHJl YWQgYnkgYSBzaW5nbGUgYmlvIGhhcyBubwo+Pj4gZm9saW8gc3RhdGUsIGFuZCBpdCBjYW4gdGhl biBiZSBkaXJ0aWVkIGJ5IEdVUCBvciBtbWFwLiBXaGVuIHRoZSBmb2xpbwo+Pj4gc3RhdGUgaXMg YXR0YWNoZWQgbGF0ZXIsIGl0cyBkaXJ0eSBiaXRzIGFyZSBzZXQgZnJvbSBQR19kaXJ0eSwgYW5k Cj4+PiB0aGVzZSBiaXRzIHdlcmUgbmV2ZXIgY291bnRlZCwgc28gY2xlYXJpbmcgdGhlbSB1bmJh bGFuY2VzIHRoZSBjb3VudGVyLgo+Pgo+PiBJIHRoaW5rIGZvciBzdWNoIGNhc2UgdGhhdCBHVVAg b3IgbW1hcCBzZXQgZm9saW8gZGlydHksIHNpbmNlIHRoZSBlbnRpcmUgZm9saW8KPj4gaXMgZGly dHk6Cj4+IDEuIHcvbyBmZnMsIHdlIGNhbiBqdXN0IGluY3JlYXNlIHJlZmVyZW5jZSB3LyBibGtz X3Blcl9mb2xpby4KPj4gMi4gdy8gZmZzLCB3ZSBjYW4gdXBkYXRlIGZzcyBkaXJ0eSBiaXRtYXAs IGFuZCBpbmNyZWFzZSByZWZlcmVuY2Ugdy8gYmxrcyBjb3VudAo+PiB0aGF0IHRoZXkgYXJlIG5v dCBkaXJ0eSBwcmV2aW91c2x5Lgo+Pgo+Pj4KPj4+IExhcmdlIGZvbGlvcyB3b3JrZWQgYmVjYXVz ZSB0aGUgZm9saW8gc3RhdGUgd2FzIGF0dGFjaGVkIHVwIGZyb250LCBidXQKPj4+IGluIHN1YnBh Z2UgbW9kZSBldmVyeSBvcmRlci0wIGZvbGlvIGlzIGEgbXVsdGktYmxvY2sgZm9saW8sIGFuZCB3 ZQo+Pj4gY2Fubm90IGF0dGFjaCBpdCBpbiBldmVyeSBwYXRoIHRoYXQgY3JlYXRlcyBvciBkaXJ0 aWVzIGEgZm9saW8uCj4+PiBDb3VudGluZyBwZXIgZm9saW8gYWRkcyBhbmQgcmVtb3ZlcyB0aGUg c2FtZSBudW1iZXIgd2hlbiB0aGUgZm9saW8gaXMKPj4+IGRpcnRpZWQgYW5kIGNsZWFuZWQsIHNv IGl0IGFsd2F5cyBzdGF5cyBiYWxhbmNlZC4gQSBwYXJ0aWFsbHkgZGlydHkKPj4+IGZvbGlvIGlz IGNvdW50ZWQgYXMgZnVsbHkgZGlydHksIGJ1dCB0aGUgY291bnRlcnMgYXJlIG9ubHkgY29tcGFy ZWQKPj4+IHdpdGggdGhyZXNob2xkcyBzdWNoIGFzIG1pbl9mc3luY19ibG9ja3MsIGFuZCBvcmRl ci0wIGZvbGlvcyB3ZXJlCj4+PiBjb3VudGVkIHBlciBwYWdlIGJlZm9yZSwgc28gdGhpcyBpcyBl bm91Z2guCj4+Cj4+IEhvd2V2ZXIgdGhlcmUgaXMgYSBzaWRlLWVmZmVjdCwgRjJGU19ESVJUWV9E RU5UUyB3aWxsIG5vdCBtYXRjaCB0aGUgcmVhbAo+PiBkaXJ0eSBkZW50cnkgYmxvY2sgY291bnQ/ IHJlc3VsdCBpbiBoYXNfbm90X2Vub3VnaF9mcmVlX3NlY3MoKSByZXR1cm4KPj4gdHJ1ZSBlYXJs aWVyIGFuZCB0cmlnZ2VyIHVubmVjZXNzYXJ5IGZnZ2M/Cj4+Cj4gCj4gSGkgQ2hhbywKPiAKPiBJ biB2MSwgSSB0cmllZCBhIHNpbXBsZXIgd2F5IHRvIG1ha2UgaXQgd29yayBmaXJzdC4gTm93LCB3 ZSBjb3VsZCB0YWtlIHRoZSB3YXkKCkhpIERhZWhvLAoKU3VyZSwgaXQncyBkb2FibGUgdG8gaW1w cm92ZSBpdCB0aGlzIHN0ZXAgYnkgc3RlcC4KCj4geW91IHNheS4gSWYgYSBmb2xpbyBpcyBjb3Vu dGVkIGFzIGJsa3NfcGVyX2ZvbGlvIHdpdGhvdXQgYSBmb2xpbyBzdGF0ZSwgYW5kCj4gdGhlIGNv dW50IGlzIGFkanVzdGVkIHRvIGl0cyBkaXJ0eSBiaXRzIHdoZW4gYSBmb2xpbyBzdGF0ZSBpcyBh dHRhY2hlZCwgdGhlCj4gY291bnRlciBzdGF5cyBiYWxhbmNlZC4KPiAKPiBJbiB2MiwgSSdsbCBj b3VudCB0aGUgZGlydHkgYml0cyBhZ2FpbjoKPiAtIC0+ZGlydHlfZm9saW8oKSBtYXJrcyB0aGUg dXB0b2RhdGUgYmxvY2tzIHdpdGhpbiBFT0YgZGlydHkgYW5kIGNvdW50cyB0aGUKPiAgIG5ld2x5 IGRpcnR5IG9uZXMgZm9yIGEgZm9saW8gd2l0aCBhIGZvbGlvIHN0YXRlLCBhbmQgY291bnRzCj4g ICBibGtzX3Blcl9mb2xpbyBmb3IgYSBmb2xpbyB3aXRob3V0IGl0Lgo+IC0gVGhlIHVwZGF0ZXMg bWFkZSBieSBmMmZzIGl0c2VsZiBtYXJrIGFuZCBjb3VudCBvbmx5IHRoZSBibG9ja3MgdGhleQo+ ICAgbW9kaWZ5LCBhbmQgZG8gbm90IGdvIHRocm91Z2ggLT5kaXJ0eV9mb2xpbygpLgo+IC0gQXR0 YWNoaW5nIGEgZm9saW8gc3RhdGUgdG8gYSBkaXJ0eSBmb2xpbyBjb252ZXJ0cyBpdHMgY291bnQg dG8gdGhlIGRpcnR5Cj4gICBiaXRzLgoKTG9va3MgZ29vZCB0byBtZS4KCj4gCj4+Pgo+Pj4+Cj4+ Pj4+IC0gQ29tcHJlc3NlZCBhbmQgYXRvbWljIGZpbGVzIGFyZSBub3Qgc3VwcG9ydGVkIHlldCBp biBzdWJwYWdlIG1vZGU6Cj4+Pj4+ICAgIHdyaXRlX2JlZ2luIHJldHVybnMgLUVPUE5PVFNVUFAg Zm9yIHRoZW0uIElubGluZSBkYXRhIGlzIGNvbnZlcnRlZAo+Pj4+PiAgICBmaXJzdC4KPj4+Pj4K Pj4+Pj4gU29tZSBvZiB0aGVzZSBjaGFuZ2VzIGFsc28gYXBwbHkgdG8gbGFyZ2UgZm9saW9zIHdo ZW4gdGhlIGJsb2NrIHNpemUKPj4+Pj4gZXF1YWxzIFBBR0VfU0laRS4KPj4+Pj4KPj4+Pj4gU2ln bmVkLW9mZi1ieTogRGFlaG8gSmVvbmcgPGRhZWhvamVvbmdAZ29vZ2xlLmNvbT4KPj4+Pj4gLS0t Cj4+Pj4+ICAgZnMvZjJmcy9jaGVja3BvaW50LmMgfCAgMzkgKy0tLQo+Pj4+PiAgIGZzL2YyZnMv ZGF0YS5jICAgICAgIHwgNDg2ICsrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0t LS0tLS0KPj4+Pj4gICBmcy9mMmZzL2Rpci5jICAgICAgICB8ICAgMiArLQo+Pj4+PiAgIGZzL2Yy ZnMvZjJmcy5oICAgICAgIHwgICAxIC0KPj4+Pj4gICBmcy9mMmZzL2ZpbGUuYyAgICAgICB8ICAx MSArLQo+Pj4+PiAgIGZzL2YyZnMvZ2MuYyAgICAgICAgIHwgIDExICstCj4+Pj4+ICAgZnMvZjJm cy9pbmxpbmUuYyAgICAgfCAgIDcgKy0KPj4+Pj4gICBmcy9mMmZzL25vZGUuYyAgICAgICB8ICAg MiArLQo+Pj4+PiAgIDggZmlsZXMgY2hhbmdlZCwgMjc1IGluc2VydGlvbnMoKyksIDI4NCBkZWxl dGlvbnMoLSkKPj4+Pj4KPj4+Pj4gZGlmZiAtLWdpdCBhL2ZzL2YyZnMvY2hlY2twb2ludC5jIGIv ZnMvZjJmcy9jaGVja3BvaW50LmMKPj4+Pj4gaW5kZXggMTA2MGVlNjUxNzU2Li5hOWEyYjlkOTMy MzEgMTAwNjQ0Cj4+Pj4+IC0tLSBhL2ZzL2YyZnMvY2hlY2twb2ludC5jCj4+Pj4+ICsrKyBiL2Zz L2YyZnMvY2hlY2twb2ludC5jCj4+Pj4+IEBAIC0xMzI0LDQ2ICsxMzI0LDIxIEBAIHN0YXRpYyB2 b2lkIF9fcmVtb3ZlX2RpcnR5X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGVudW0gaW5vZGVf dHlwZSB0eXBlKQo+Pj4+PiAgICAgICBzdGF0X2RlY19kaXJ0eV9pbm9kZShGMkZTX0lfU0IoaW5v ZGUpLCB0eXBlKTsKPj4+Pj4gICB9Cj4+Pj4+Cj4+Pj4+IC0vKgo+Pj4+PiAtICogQWNjb3VudCBA bnIgZGlydHkgYmxvY2tzIChuZWdhdGl2ZSB3aGVuIGRpcnRpbmVzcyBpcyBjbGVhcmVkKSBmb3Ig QGlub2RlLgo+Pj4+PiAtICovCj4+Pj4+IC12b2lkIGYyZnNfYWNjb3VudF9kaXJ0eV9ibG9ja3Mo c3RydWN0IGlub2RlICppbm9kZSwgaW50IG5yKQo+Pj4+PiArdm9pZCBmMmZzX3VwZGF0ZV9kaXJ0 eV9mb2xpbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKQo+Pj4+PiAg IHsKPj4+Pj4gICAgICAgc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpID0gRjJGU19JX1NCKGlub2Rl KTsKPj4+Pj4gICAgICAgZW51bSBpbm9kZV90eXBlIHR5cGUgPSBTX0lTRElSKGlub2RlLT5pX21v ZGUpID8gRElSX0lOT0RFIDogRklMRV9JTk9ERTsKPj4+Pj4gKyAgICAgdW5zaWduZWQgaW50IG5y X2Jsb2NrcyA9IGYyZnNfYmxvY2tzX3Blcl9mb2xpbyhzYmksIGZvbGlvKTsKPj4+Pj4KPj4+Pj4g LSAgICAgaWYgKCFucikKPj4+Pj4gLSAgICAgICAgICAgICByZXR1cm47Cj4+Pj4+IC0KPj4+Pj4g LSAgICAgc3Bpbl9sb2NrKCZzYmktPmlub2RlX2xvY2tbdHlwZV0pOwo+Pj4+PiAtICAgICBpZiAo bnIgPiAwKSB7Cj4+Pj4+IC0gICAgICAgICAgICAgaWYgKHR5cGUgIT0gRklMRV9JTk9ERSB8fCB0 ZXN0X29wdChzYmksIERBVEFfRkxVU0gpKQo+Pj4+PiAtICAgICAgICAgICAgICAgICAgICAgX19h ZGRfZGlydHlfaW5vZGUoaW5vZGUsIHR5cGUpOwo+Pj4+PiAtICAgICAgICAgICAgIGlub2RlX2Fk ZF9kaXJ0eV9ibG9ja3MoaW5vZGUsIG5yKTsKPj4+Pj4gLSAgICAgfSBlbHNlIHsKPj4+Pj4gLSAg ICAgICAgICAgICBpbm9kZV9zdWJfZGlydHlfYmxvY2tzKGlub2RlLCAtbnIpOwo+Pj4+PiAtICAg ICAgICAgICAgIF9fcmVtb3ZlX2RpcnR5X2lub2RlKGlub2RlLCB0eXBlKTsKPj4+Pj4gLSAgICAg fQo+Pj4+PiAtICAgICBzcGluX3VubG9jaygmc2JpLT5pbm9kZV9sb2NrW3R5cGVdKTsKPj4+Pj4g LX0KPj4+Pj4gLQo+Pj4+PiAtdm9pZCBmMmZzX3VwZGF0ZV9kaXJ0eV9mb2xpbyhzdHJ1Y3QgaW5v ZGUgKmlub2RlLCBzdHJ1Y3QgZm9saW8gKmZvbGlvKQo+Pj4+PiAtewo+Pj4+PiAgICAgICBpZiAo IVNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYgIVNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYKPj4+ Pj4gICAgICAgICAgICAgICAgICAgICAgICFTX0lTTE5LKGlub2RlLT5pX21vZGUpKQo+Pj4+PiAg ICAgICAgICAgICAgIHJldHVybjsKPj4+Pj4KPj4+Pj4gLSAgICAgLyoKPj4+Pj4gLSAgICAgICog TGFyZ2UgZm9saW9zIGhhdmUgYSBzdWJwYWdlIGRpcnR5IGJpdG1hcCwgc28gZGVmZXIgdGhlaXIg ZGlydHkgYWNjb3VudGluZwo+Pj4+PiAtICAgICAgKiB0byB0aGUgZjJmc19mZnNfKnN1YnJhbmdl X2RpcnR5KigpIGhlbHBlcnMuICBUaGlzIGF2b2lkcyBuZXN0aW5nCj4+Pj4+IC0gICAgICAqIGZm cy0+c3RhdGVfbG9jayB3aXRoIHRoZSBpbm9kZSBkaXJ0eSBsaXN0IGxvY2suCj4+Pj4+IC0gICAg ICAqLwo+Pj4+PiAtICAgICBpZiAoZjJmc19mb2xpb19oYXNfZmZzKGZvbGlvKSkgewo+Pj4+PiAt ICAgICAgICAgICAgIGZvbGlvX3NldF9mMmZzX3JlZmVyZW5jZShmb2xpbyk7Cj4+Pj4+IC0gICAg ICAgICAgICAgcmV0dXJuOwo+Pj4+PiAtICAgICB9Cj4+Pj4+IC0KPj4+Pj4gLSAgICAgZjJmc19h Y2NvdW50X2RpcnR5X2Jsb2Nrcyhpbm9kZSwgMSk7Cj4+Pj4+ICsgICAgIHNwaW5fbG9jaygmc2Jp LT5pbm9kZV9sb2NrW3R5cGVdKTsKPj4+Pj4gKyAgICAgaWYgKHR5cGUgIT0gRklMRV9JTk9ERSB8 fCB0ZXN0X29wdChzYmksIERBVEFfRkxVU0gpKQo+Pj4+PiArICAgICAgICAgICAgIF9fYWRkX2Rp cnR5X2lub2RlKGlub2RlLCB0eXBlKTsKPj4+Pj4gKyAgICAgaW5vZGVfYWRkX2RpcnR5X2Jsb2Nr cyhpbm9kZSwgbnJfYmxvY2tzKTsKPj4+Pj4gKyAgICAgc3Bpbl91bmxvY2soJnNiaS0+aW5vZGVf bG9ja1t0eXBlXSk7Cj4+Pj4+Cj4+Pj4+ICAgICAgIGZvbGlvX3NldF9mMmZzX3JlZmVyZW5jZShm b2xpbyk7Cj4+Pj4+ICAgfQo+Pj4+PiBkaWZmIC0tZ2l0IGEvZnMvZjJmcy9kYXRhLmMgYi9mcy9m MmZzL2RhdGEuYwo+Pj4+PiBpbmRleCAwN2I3YWViOTQzNTAuLjQxMjQ2ZjgzYjMxZCAxMDA2NDQK Pj4+Pj4gLS0tIGEvZnMvZjJmcy9kYXRhLmMKPj4+Pj4gKysrIGIvZnMvZjJmcy9kYXRhLmMKPj4+ Pj4gQEAgLTQyMCw4ICs0MjAsNyBAQCBzdGF0aWMgdm9pZCBmMmZzX3dyaXRlX2VuZF9iaW8oc3Ry dWN0IGJpbyAqYmlvKQo+Pj4+Pgo+Pj4+PiAgICAgICBiaW9fZm9yX2VhY2hfZm9saW9fYWxsKGZp LCBiaW8pIHsKPj4+Pj4gICAgICAgICAgICAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvID0gZmkuZm9s aW87Cj4+Pj4+IC0gICAgICAgICAgICAgdW5zaWduZWQgaW50IG5yX3BhZ2VzID0gZmkubGVuZ3Ro ID4+IFBBR0VfU0hJRlQ7Cj4+Pj4+IC0gICAgICAgICAgICAgdW5zaWduZWQgaW50IG5wYWdlcyA9 IG5yX3BhZ2VzOwo+Pj4+PiArICAgICAgICAgICAgIHVuc2lnbmVkIGludCBucl9ibG9ja3MgPSBm aS5sZW5ndGggPj4gc2JpLT5sb2dfYmxvY2tzaXplOwo+Pj4+Cj4+Pj4gRjJGU19CWVRFU19UT19C TEsoc2JpLCBmaS5sZW5ndGgpOwo+Pj4+Cj4+Pj4+ICAgICAgICAgICAgICAgZW51bSBjb3VudF90 eXBlIHR5cGU7Cj4+Pj4+Cj4+Pj4+ICAgI2lmZGVmIENPTkZJR19GMkZTX0ZTX0NPTVBSRVNTSU9O Cj4+Pj4+IEBAIC00NDEsOCArNDQwLDcgQEAgc3RhdGljIHZvaWQgZjJmc193cml0ZV9lbmRfYmlv KHN0cnVjdCBiaW8gKmJpbykKPj4+Pj4gICAgICAgICAgICAgICAgICAgICAgIH0KPj4+Pj4gICAg ICAgICAgICAgICB9Cj4+Pj4+Cj4+Pj4+IC0gICAgICAgICAgICAgd2hpbGUgKG5yX3BhZ2VzLS0p Cj4+Pj4+IC0gICAgICAgICAgICAgICAgICAgICBkZWNfY2FjaGVfY291bnQoc2JpLCB0eXBlKTsK Pj4+Pj4gKyAgICAgICAgICAgICBzdWJfY2FjaGVfY291bnRzKHNiaSwgdHlwZSwgbnJfYmxvY2tz KTsKPj4+Pj4KPj4+Pj4gICAgICAgICAgICAgICAvKgo+Pj4+PiAgICAgICAgICAgICAgICAqIHdl IHNob3VsZCBhY2Nlc3Mgc2JpIGJlZm9yZSBmb2xpb19lbmRfd3JpdGViYWNrKCkgdG8KPj4+Pj4g QEAgLTQ1Miw3ICs0NTAsNyBAQCBzdGF0aWMgdm9pZCBmMmZzX3dyaXRlX2VuZF9iaW8oc3RydWN0 IGJpbyAqYmlvKQo+Pj4+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cV9oYXNfc2xl ZXBlcigmc2JpLT5jcF93YWl0KSkKPj4+Pj4gICAgICAgICAgICAgICAgICAgICAgIHdha2VfdXAo JnNiaS0+Y3Bfd2FpdCk7Cj4+Pj4+Cj4+Pj4+IC0gICAgICAgICAgICAgZjJmc19mZnNfcHV0X3dy aXRlX3BlbmRpbmcoZm9saW8sIG5wYWdlcyk7Cj4+Pj4+ICsgICAgICAgICAgICAgZjJmc19mZnNf cHV0X3dyaXRlX3BlbmRpbmcoZm9saW8sIG5yX2Jsb2Nrcyk7Cj4+Pj4+ICAgICAgIH0KPj4+Pj4K Pj4+Pj4gICAgICAgYmlvX3B1dChiaW8pOwo+Pj4+PiBAQCAtMzAyMyw3ICszMDIxLDcgQEAgc3Rh dGljIHZvaWQgZjJmc19jbGVhcl90cnVuY2F0ZWRfcGFnZV9zdGF0ZShzdHJ1Y3QgZm9saW8gKmZv bGlvLCBwZ29mZl90IGkpCj4+Pj4+ICAgewo+Pj4+PiAgICAgICBzdHJ1Y3QgZjJmc19zYl9pbmZv ICpzYmkgPSBGMkZTX0ZfU0IoZm9saW8pOwo+Pj4+Pgo+Pj4+PiAtICAgICBpZiAoZjJmc19mb2xp b19oYXNfZmZzKGZvbGlvKSkgewo+Pj4+PiArICAgICBpZiAoZjJmc19pc19tdWx0aWJsb2NrX2Zv bGlvKHNiaSwgZm9saW8pKSB7Cj4+Pj4+ICAgICAgICAgICAgICAgZjJmc19mZnNfY2xlYXJfc3Vi cmFuZ2VfdXB0b2RhdGUoZm9saW8sCj4+Pj4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IEYyRlNfQkxLX1RPX0JZVEVTKHNiaSwgaSksIEYyRlNfQkxLU0laRShzYmkpKTsKPj4+Pj4gICAg ICAgfSBlbHNlIHsKPj4+Pj4gQEAgLTMwNTEsMjEgKzMwNDksNiBAQCBib29sIGYyZnNfZmZzX3Rl c3RfYmxrX2RpcnR5KGNvbnN0IHN0cnVjdCBmb2xpbyAqZm9saW8sIHBnb2ZmX3QgaW5kZXgpCj4+ Pj4+ICAgICAgIHJldHVybiB0ZXN0X2JpdChucl9ibG9ja3MgKyBvZmZzZXQsIGZmcy0+c3RhdGUp Owo+Pj4+PiAgIH0KPj4+Pj4KPj4+Pj4gLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19mZnNfbWFya19z dWJyYW5nZV9kaXJ0eShzdHJ1Y3QgZm9saW8gKmZvbGlvLAo+Pj4+PiAtICAgICAgICAgICAgICAg ICAgICAgc3RydWN0IGYyZnNfZm9saW9fc3RhdGUgKmZmcywgc2l6ZV90IG9mZnNldCwgc2l6ZV90 IGxlbikKPj4+Pj4gLXsKPj4+Pj4gLSAgICAgc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpID0gRjJG U19GX1NCKGZvbGlvKTsKPj4+Pj4gLSAgICAgdW5zaWduZWQgaW50IG5yX2Jsb2NrcyA9IGYyZnNf YmxvY2tzX3Blcl9mb2xpbyhzYmksIGZvbGlvKTsKPj4+Pj4gLSAgICAgdW5zaWduZWQgaW50IHN0 YXJ0LCBlbmQsIGJlZm9yZTsKPj4+Pj4gLQo+Pj4+PiAtICAgICBzdGFydCA9IEYyRlNfQllURVNf VE9fQkxLKHNiaSwgb2Zmc2V0KTsKPj4+Pj4gLSAgICAgZW5kID0gbWluX3QodW5zaWduZWQgaW50 LCBGMkZTX0JMS19BTElHTihzYmksIG9mZnNldCArIGxlbiksIG5yX2Jsb2Nrcyk7Cj4+Pj4+IC0K Pj4+Pj4gLSAgICAgYmVmb3JlID0gYml0bWFwX3dlaWdodChmZnMtPnN0YXRlLCAyICogbnJfYmxv Y2tzKTsKPj4+Pj4gLSAgICAgYml0bWFwX3NldChmZnMtPnN0YXRlLCBucl9ibG9ja3MgKyBzdGFy dCwgZW5kIC0gc3RhcnQpOwo+Pj4+PiAtICAgICByZXR1cm4gYml0bWFwX3dlaWdodChmZnMtPnN0 YXRlLCAyICogbnJfYmxvY2tzKSAtIGJlZm9yZTsKPj4+Pj4gLX0KPj4+Pj4gLQo+Pj4+PiAgIC8q Cj4+Pj4+ICAgICogTWFyayB0aGUgZ2l2ZW4gcmFuZ2UgZGlydHkgZm9yIHdyaXRlYmFjay4KPj4+ Pj4gICAgKgo+Pj4+PiBAQCAtMzA3OCw3ICszMDYxLDggQEAgdm9pZCBmMmZzX2Zmc19tYXJrX3N1 YnJhbmdlX2RpcnR5KHN0cnVjdCBmb2xpbyAqZm9saW8sCj4+Pj4+ICAgewo+Pj4+PiAgICAgICBz dHJ1Y3QgZjJmc19zYl9pbmZvICpzYmkgPSBGMkZTX0ZfU0IoZm9saW8pOwo+Pj4+PiAgICAgICBz dHJ1Y3QgZjJmc19mb2xpb19zdGF0ZSAqZmZzOwo+Pj4+PiAtICAgICB1bnNpZ25lZCBpbnQgc2V0 Owo+Pj4+PiArICAgICB1bnNpZ25lZCBpbnQgbnJfYmxvY2tzOwo+Pj4+PiArICAgICB1bnNpZ25l ZCBpbnQgc3RhcnQsIGVuZDsKPj4+Pj4gICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKPj4+Pj4K Pj4+Pj4gICAgICAgZjJmc19idWdfb24oRjJGU19GX1NCKGZvbGlvKSwgb2Zmc2V0ICsgbGVuID4g Zm9saW9fc2l6ZShmb2xpbykpOwo+Pj4+PiBAQCAtMzA4NywxMyArMzA3MSwxMyBAQCB2b2lkIGYy ZnNfZmZzX21hcmtfc3VicmFuZ2VfZGlydHkoc3RydWN0IGZvbGlvICpmb2xpbywKPj4+Pj4gICAg ICAgICAgICAgICByZXR1cm47Cj4+Pj4+Cj4+Pj4+ICAgICAgIGZmcyA9IGYyZnNfZmZzX2ZpbmRf b3JfYWxsb2MoZm9saW8pOwo+Pj4+PiArICAgICBucl9ibG9ja3MgPSBmMmZzX2Jsb2Nrc19wZXJf Zm9saW8oc2JpLCBmb2xpbyk7Cj4+Pj4+ICsgICAgIHN0YXJ0ID0gRjJGU19CWVRFU19UT19CTEso c2JpLCBvZmZzZXQpOwo+Pj4+PiArICAgICBlbmQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIEYyRlNf QkxLX0FMSUdOKHNiaSwgb2Zmc2V0ICsgbGVuKSwgbnJfYmxvY2tzKTsKPj4+Pj4KPj4+Pj4gICAg ICAgc3Bpbl9sb2NrX2lycXNhdmUoJmZmcy0+c3RhdGVfbG9jaywgZmxhZ3MpOwo+Pj4+PiAtICAg ICBzZXQgPSBfX2Zmc19tYXJrX3N1YnJhbmdlX2RpcnR5KGZvbGlvLCBmZnMsIG9mZnNldCwgbGVu KTsKPj4+Pj4gKyAgICAgYml0bWFwX3NldChmZnMtPnN0YXRlLCBzdGFydCArIG5yX2Jsb2Nrcywg ZW5kIC0gc3RhcnQpOwo+Pj4+PiAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmZnMtPnN0 YXRlX2xvY2ssIGZsYWdzKTsKPj4+Pj4gLQo+Pj4+PiAtICAgICBpZiAoc2V0KQo+Pj4+PiAtICAg ICAgICAgICAgIGYyZnNfYWNjb3VudF9kaXJ0eV9ibG9ja3MoZm9saW8tPm1hcHBpbmctPmhvc3Qs IHNldCk7Cj4+Pj4+ICAgfQo+Pj4+Pgo+Pj4+PiAgIHZvaWQgZjJmc19mZnNfY2xlYXJfc3VicmFu Z2VfdXB0b2RhdGUoc3RydWN0IGZvbGlvICpmb2xpbywKPj4+Pj4gQEAgLTMxMjksMTkgKzMxMTMs MTYgQEAgdm9pZCBmMmZzX2Zmc19jbGVhcl9zdWJyYW5nZV91cHRvZGF0ZShzdHJ1Y3QgZm9saW8g KmZvbGlvLAo+Pj4+PiAgIH0KPj4+Pj4KPj4+Pj4gICBzdGF0aWMgYm9vbCBfX2Zmc19jbGVhcl9z dWJyYW5nZV9kaXJ0eShzdHJ1Y3QgZm9saW8gKmZvbGlvLAo+Pj4+PiAtICAgICAgICAgICAgICAg ICAgICAgc3RydWN0IGYyZnNfZm9saW9fc3RhdGUgKmZmcywgc2l6ZV90IG9mZnNldCwgc2l6ZV90 IGxlbiwKPj4+Pj4gLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqY2xlYXJlZCkK Pj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBmMmZzX2ZvbGlvX3N0YXRlICpmZnMs IHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW4pCj4+Pj4+ICAgewo+Pj4+PiAgICAgICBzdHJ1Y3Qg ZjJmc19zYl9pbmZvICpzYmkgPSBGMkZTX0ZfU0IoZm9saW8pOwo+Pj4+PiAgICAgICB1bnNpZ25l ZCBpbnQgbnJfYmxvY2tzID0gZjJmc19ibG9ja3NfcGVyX2ZvbGlvKHNiaSwgZm9saW8pOwo+Pj4+ PiAtICAgICB1bnNpZ25lZCBpbnQgc3RhcnQsIGVuZCwgYmVmb3JlOwo+Pj4+PiArICAgICB1bnNp Z25lZCBpbnQgc3RhcnQsIGVuZDsKPj4+Pj4KPj4+Pj4gICAgICAgc3RhcnQgPSBGMkZTX0JZVEVT X1RPX0JMSyhzYmksIG9mZnNldCk7Cj4+Pj4+ICAgICAgIGVuZCA9IG1pbl90KHVuc2lnbmVkIGlu dCwgRjJGU19CTEtfQUxJR04oc2JpLCBvZmZzZXQgKyBsZW4pLCBucl9ibG9ja3MpOwo+Pj4+Pgo+ Pj4+PiAtICAgICBiZWZvcmUgPSBiaXRtYXBfd2VpZ2h0KGZmcy0+c3RhdGUsIDIgKiBucl9ibG9j a3MpOwo+Pj4+PiAgICAgICBiaXRtYXBfY2xlYXIoZmZzLT5zdGF0ZSwgbnJfYmxvY2tzICsgc3Rh cnQsIGVuZCAtIHN0YXJ0KTsKPj4+Pj4gLSAgICAgKmNsZWFyZWQgPSBiZWZvcmUgLSBiaXRtYXBf d2VpZ2h0KGZmcy0+c3RhdGUsIDIgKiBucl9ibG9ja3MpOwo+Pj4+PiAgICAgICByZXR1cm4gZmlu ZF9uZXh0X2JpdChmZnMtPnN0YXRlLCAyICogbnJfYmxvY2tzLCBucl9ibG9ja3MpIDwKPj4+Pj4g ICAgICAgICAgICAgICAgICAgICAgIDIgKiBucl9ibG9ja3M7Cj4+Pj4+ICAgfQo+Pj4+PiBAQCAt MzE1MywxNSArMzEzNCwxMyBAQCBzdGF0aWMgYm9vbCBfX2Zmc19jbGVhcl9zdWJyYW5nZV9kaXJ0 eShzdHJ1Y3QgZm9saW8gKmZvbGlvLAo+Pj4+PiAgICAqIEBsZW46IGJ5dGUgbGVuZ3RoIG9mIHRo ZSBzdWJyYW5nZQo+Pj4+PiAgICAqCj4+Pj4+ICAgICogQ2xlYXIgdGhlIGRpcnR5IGJpdHMgb2Yg dGhlIDRLIHN1YnBhZ2VzIGNvdmVyZWQgYnkgW29mZnNldCwgb2Zmc2V0ICsgbGVuKSwKPj4+Pj4g LSAqIGFjY291bnQgdGhlIGNsZWFyZWQgc3VicGFnZXMgYWdhaW5zdCB0aGUgaW5vZGUgZGlydHkg Y291bnRlcnMsIGFuZCByZXR1cm4KPj4+Pj4gLSAqIHdoZXRoZXIgdGhlIGZvbGlvIHN0aWxsIGhh cyBhbnkgZGlydHkgc3VicGFnZSBsZWZ0Lgo+Pj4+PiArICogYW5kIHJldHVybiB3aGV0aGVyIHRo ZSBmb2xpbyBzdGlsbCBoYXMgYW55IGRpcnR5IHN1YnBhZ2UgbGVmdC4KPj4+Pj4gICAgKi8KPj4+ Pj4gICBib29sIGYyZnNfZmZzX2NsZWFyX3N1YnJhbmdlX2RpcnR5X2FuZF90ZXN0KHN0cnVjdCBm b2xpbyAqZm9saW8sIHNpemVfdCBvZmZzZXQsCj4+Pj4+ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4pCj4+Pj4+ICAgewo+Pj4+PiAgICAgICBzdHJ1 Y3QgZjJmc19mb2xpb19zdGF0ZSAqZmZzOwo+Pj4+PiAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdz Owo+Pj4+PiAtICAgICB1bnNpZ25lZCBpbnQgY2xlYXJlZCA9IDA7Cj4+Pj4+ICAgICAgIGJvb2wg ZGlydHk7Cj4+Pj4+Cj4+Pj4+ICAgICAgIGlmICghZjJmc19mb2xpb19oYXNfZmZzKGZvbGlvKSkg ewo+Pj4+PiBAQCAtMzE3OCwxMiArMzE1Nyw5IEBAIGJvb2wgZjJmc19mZnNfY2xlYXJfc3VicmFu Z2VfZGlydHlfYW5kX3Rlc3Qoc3RydWN0IGZvbGlvICpmb2xpbywgc2l6ZV90IG9mZnNldCwKPj4+ Pj4KPj4+Pj4gICAgICAgZmZzID0gZjJmc19mZnNfZmluZF9vcl9hbGxvYyhmb2xpbyk7Cj4+Pj4+ ICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZmZnMtPnN0YXRlX2xvY2ssIGZsYWdzKTsKPj4+Pj4g LSAgICAgZGlydHkgPSBfX2Zmc19jbGVhcl9zdWJyYW5nZV9kaXJ0eShmb2xpbywgZmZzLCBvZmZz ZXQsIGxlbiwgJmNsZWFyZWQpOwo+Pj4+PiArICAgICBkaXJ0eSA9IF9fZmZzX2NsZWFyX3N1YnJh bmdlX2RpcnR5KGZvbGlvLCBmZnMsIG9mZnNldCwgbGVuKTsKPj4+Pj4gICAgICAgc3Bpbl91bmxv Y2tfaXJxcmVzdG9yZSgmZmZzLT5zdGF0ZV9sb2NrLCBmbGFncyk7Cj4+Pj4+Cj4+Pj4+IC0gICAg IGlmIChjbGVhcmVkKQo+Pj4+PiAtICAgICAgICAgICAgIGYyZnNfYWNjb3VudF9kaXJ0eV9ibG9j a3MoZm9saW8tPm1hcHBpbmctPmhvc3QsIC1jbGVhcmVkKTsKPj4+Pj4gLQo+Pj4+PiAgICAgICBy ZXR1cm4gZGlydHk7Cj4+Pj4+ICAgfQo+Pj4+Pgo+Pj4+PiBAQCAtMzk0Myw3ICszOTE5LDcgQEAg aW50IGYyZnNfZG9fd3JpdGVfZGF0YV9wYWdlKHN0cnVjdCBmMmZzX2lvX2luZm8gKmZpbykKPj4+ Pj4gICBzdGF0aWMgaW50IGYyZnNfd3JpdGVfZm9saW9fZGlydHlfcmFuZ2Uoc3RydWN0IGZvbGlv ICpmb2xpbywgaW50ICpzdWJtaXR0ZWQsCj4+Pj4+ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMsCj4+Pj4+ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBpb3N0YXRfdHlwZSBpb190eXBlLAo+ Pj4+PiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU2NCAqcG9zLCB1NjQg bGVuKQo+Pj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU2NCBzdGFy dCwgdTY0IGVuZCkKPj4+Pj4gICB7Cj4+Pj4+ICAgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUgPSBm b2xpby0+bWFwcGluZy0+aG9zdDsKPj4+Pj4gICAgICAgc3RydWN0IGYyZnNfc2JfaW5mbyAqc2Jp ID0gRjJGU19JX1NCKGlub2RlKTsKPj4+Pj4gQEAgLTM5NTEsMTkgKzM5MjcsMTkgQEAgc3RhdGlj IGludCBmMmZzX3dyaXRlX2ZvbGlvX2RpcnR5X3JhbmdlKHN0cnVjdCBmb2xpbyAqZm9saW8sIGlu dCAqc3VibWl0dGVkLAo+Pj4+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xpb190 ZXN0X2YyZnNfYXRvbWljKGZvbGlvKTsKPj4+Pj4gICAgICAgc3RydWN0IGlub2RlICpkbl9pbm9k ZSA9IGF0b21pY19jb21taXQgPwo+Pj4+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBG MkZTX0koaW5vZGUpLT5jb3dfaW5vZGUgOiBpbm9kZTsKPj4+Pj4gLSAgICAgc3RydWN0IGYyZnNf Zm9saW9fc3RhdGUgKmZmcyA9IE5VTEw7Cj4+Pj4+IC0gICAgIHU2NCBmb2xpb19zdGFydCA9IGZv bGlvX3Bvcyhmb2xpbyk7Cj4+Pj4+IC0gICAgIHBnb2ZmX3Qgc3RhcnRfaWR4ID0gKCpwb3MgLSBm b2xpb19zdGFydCkgPj4gUEFHRV9TSElGVDsKPj4+Pj4gLSAgICAgcGdvZmZfdCBlbmRfaWR4ID0g KCpwb3MgLSBmb2xpb19zdGFydCArIGxlbiAtIDEpID4+IFBBR0VfU0hJRlQ7Cj4+Pj4+ICsgICAg IHU2NCBwb3MgPSBmb2xpb19wb3MoZm9saW8pOwo+Pj4+PiArICAgICBwZ29mZl90IHN0YXJ0X2lk eCA9IChzdGFydCAtIHBvcykgPj4gc2JpLT5sb2dfYmxvY2tzaXplOwo+Pj4+PiArICAgICBwZ29m Zl90IGVuZF9pZHggPSAoZW5kIC0gMSAtIHBvcykgPj4gc2JpLT5sb2dfYmxvY2tzaXplOwo+Pj4+ Cj4+Pj4gRjJGU19CWVRFU19UT19CTEsoc2JpLCBzdGFydCAtIHBvcyk7Cj4+Pj4gRjJGU19CWVRF U19UT19CTEsoc2JpLCBlbmQgLSAxIC0gcG9zKTsKPj4+Pgo+Pj4+PiArICAgICBwZ29mZl90IGxh c3RfaWR4ID0gMDsKPj4+Pj4gKyAgICAgcGdvZmZfdCBpOwo+Pj4+PiArICAgICBpbnQgbG9jYWxf c3VibWl0dGVkID0gMDsKPj4+Pj4gICAgICAgaW50IGVyciA9IDA7Cj4+Pj4+Cj4+Pj4+IC0gICAg IGZvciAocGdvZmZfdCBpID0gc3RhcnRfaWR4OyBpIDw9IGVuZF9pZHggJiYgIWVycjsgaSsrKSB7 Cj4+Pj4+ICsgICAgIGZvciAoaSA9IHN0YXJ0X2lkeDsgaSA8PSBlbmRfaWR4OyBpKyspIHsKPj4+ Pj4gICAgICAgICAgICAgICBzdHJ1Y3QgZG5vZGVfb2ZfZGF0YSBkbjsKPj4+Pj4gICAgICAgICAg ICAgICBzdHJ1Y3Qgbm9kZV9pbmZvIG5pOwo+Pj4+PiAtICAgICAgICAgICAgIHBnb2ZmX3QgZGF0 YV9pZHggPSBmb2xpby0+aW5kZXggKyBpOwo+Pj4+PiArICAgICAgICAgICAgIHBnb2ZmX3QgZGF0 YV9pZHggPSBmMmZzX2ZvbGlvX2xibGsoc2JpLCBmb2xpbykgKyBpOwo+Pj4+PiAgICAgICAgICAg ICAgIGJvb2wgaXB1X2ZvcmNlID0gZmFsc2U7Cj4+Pj4+IC0gICAgICAgICAgICAgYm9vbCBkbl9o ZWxkID0gZmFsc2U7Cj4+Pj4+IC0gICAgICAgICAgICAgYm9vbCBzdWJtaXR0ZWRfYmxrID0gZmFs c2U7Cj4+Pj4+ICAgICAgICAgICAgICAgc3RydWN0IGYyZnNfaW9faW5mbyBmaW8gPSB7Cj4+Pj4+ ICAgICAgICAgICAgICAgICAgICAgICAuc2JpID0gc2JpLAo+Pj4+PiAgICAgICAgICAgICAgICAg ICAgICAgLmlubyA9IGlub2RlLT5pX2lubywKPj4+Pj4gQEAgLTM5ODMsNyArMzk1OSwxMiBAQCBz dGF0aWMgaW50IGYyZnNfd3JpdGVfZm9saW9fZGlydHlfcmFuZ2Uoc3RydWN0IGZvbGlvICpmb2xp bywgaW50ICpzdWJtaXR0ZWQsCj4+Pj4+ICAgICAgICAgICAgICAgfTsKPj4+Pj4KPj4+Pj4gICAg ICAgICAgICAgICBpZiAoZjJmc19mb2xpb19oYXNfZmZzKGZvbGlvKSkgewo+Pj4+PiAtICAgICAg ICAgICAgICAgICAgICAgZmZzID0gKHN0cnVjdCBmMmZzX2ZvbGlvX3N0YXRlICopZm9saW8tPnBy aXZhdGU7Cj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZjJmc19mb2xpb19zdGF0 ZSAqZmZzID0KPj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBmMmZz X2ZvbGlvX3N0YXRlICopZm9saW8tPnByaXZhdGU7Cj4+Pj4+ICsKPj4+Pj4gKyAgICAgICAgICAg ICAgICAgICAgIC8qIFdyaXRlIG9ubHkgZGlydHkgYmxvY2tzICovCj4+Pj4+ICsgICAgICAgICAg ICAgICAgICAgICBpZiAoIWYyZnNfZmZzX3Rlc3RfYmxrX2RpcnR5KGZvbGlvLCBkYXRhX2lkeCkp Cj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwo+Pj4+PiAgICAg ICAgICAgICAgICAgICAgICAgYXRvbWljX2luYygmZmZzLT53cml0ZV9ibG9ja3NfcGVuZGluZyk7 Cj4+Pj4+ICAgICAgICAgICAgICAgfQo+Pj4+Pgo+Pj4+PiBAQCAtMzk5NSw3ICszOTc2LDcgQEAg c3RhdGljIGludCBmMmZzX3dyaXRlX2ZvbGlvX2RpcnR5X3JhbmdlKHN0cnVjdCBmb2xpbyAqZm9s aW8sIGludCAqc3VibWl0dGVkLAo+Pj4+PiAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmMmZz X2lzX3ZhbGlkX2Jsa2FkZHIoc2JpLCBmaW8ub2xkX2Jsa2FkZHIsCj4+Pj4+ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRBX0dFTkVSSUNfRU5IQU5D RSkpIHsKPj4+Pj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gLUVGU0NPUlJV UFRFRDsKPj4+Pj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBibG9ja19kb25l Owo+Pj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHNraXBfYmxvY2s7Cj4+ Pj4+ICAgICAgICAgICAgICAgICAgICAgICB9Cj4+Pj4+ICAgICAgICAgICAgICAgICAgICAgICBp cHVfZm9yY2UgPSB0cnVlOwo+Pj4+PiAgICAgICAgICAgICAgICAgICAgICAgZ290byBnb3RfaXQ7 Cj4+Pj4+IEBAIC00MDE1LDI0ICszOTk2LDIyIEBAIHN0YXRpYyBpbnQgZjJmc193cml0ZV9mb2xp b19kaXJ0eV9yYW5nZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgKnN1Ym1pdHRlZCwKPj4+Pj4g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9PS1VQ X05PREUpOwo+Pj4+PiAgICAgICAgICAgICAgIH0KPj4+Pj4gICAgICAgICAgICAgICBpZiAoZXJy ICYmIGVyciAhPSAtRU5PRU5UKQo+Pj4+PiAtICAgICAgICAgICAgICAgICAgICAgZ290byBibG9j a19kb25lOwo+Pj4+PiAtICAgICAgICAgICAgIGRuX2hlbGQgPSB0cnVlOwo+Pj4+PiArICAgICAg ICAgICAgICAgICAgICAgZ290byBza2lwX2Jsb2NrOwo+Pj4+Pgo+Pj4+PiAtICAgICAgICAgICAg IGZpby5vbGRfYmxrYWRkciA9IGRuLmRhdGFfYmxrYWRkcjsKPj4+Pj4gLQo+Pj4+PiAtICAgICAg ICAgICAgIC8qIFRoaXMgcGFnZSBpcyBhbHJlYWR5IHRydW5jYXRlZCAqLwo+Pj4+PiAtICAgICAg ICAgICAgIGlmIChlcnIgPT0gLUVOT0VOVCB8fCBmaW8ub2xkX2Jsa2FkZHIgPT0gTlVMTF9BRERS KSB7Cj4+Pj4+IC0gICAgICAgICAgICAgICAgICAgICBmMmZzX2NsZWFyX3RydW5jYXRlZF9wYWdl X3N0YXRlKGZvbGlvLCBpKTsKPj4+Pj4gKyAgICAgICAgICAgICAvKiBUaGlzIGJsb2NrIGlzIGFs cmVhZHkgdHJ1bmNhdGVkICovCj4+Pj4+ICsgICAgICAgICAgICAgaWYgKGVyciB8fCBkbi5kYXRh X2Jsa2FkZHIgPT0gTlVMTF9BRERSKSB7Cj4+Pj4+ICAgICAgICAgICAgICAgICAgICAgICBlcnIg PSAwOwo+Pj4+PiAtICAgICAgICAgICAgICAgICAgICAgZ290byBibG9ja19kb25lOwo+Pj4+PiAr ICAgICAgICAgICAgICAgICAgICAgZjJmc19jbGVhcl90cnVuY2F0ZWRfcGFnZV9zdGF0ZShmb2xp bywgaSk7Cj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICBnb3RvIHNraXBfYmxvY2s7Cj4+Pj4+ ICAgICAgICAgICAgICAgfQo+Pj4+Pgo+Pj4+PiArICAgICAgICAgICAgIGZpby5vbGRfYmxrYWRk ciA9IGRuLmRhdGFfYmxrYWRkcjsKPj4+Pj4gICBnb3RfaXQ6Cj4+Pj4+ICAgICAgICAgICAgICAg aWYgKF9faXNfdmFsaWRfZGF0YV9ibGthZGRyKGZpby5vbGRfYmxrYWRkcikgJiYKPj4+Pj4gICAg ICAgICAgICAgICAgICAgIWYyZnNfaXNfdmFsaWRfYmxrYWRkcihzYmksIGZpby5vbGRfYmxrYWRk ciwKPj4+Pj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRBX0dF TkVSSUNfRU5IQU5DRSkpIHsKPj4+Pj4gICAgICAgICAgICAgICAgICAgICAgIGVyciA9IC1FRlND T1JSVVBURUQ7Cj4+Pj4+IC0gICAgICAgICAgICAgICAgICAgICBnb3RvIGJsb2NrX2RvbmU7Cj4+ Pj4+ICsgICAgICAgICAgICAgICAgICAgICBnb3RvIHNraXBfYmxvY2s7Cj4+Pj4+ICAgICAgICAg ICAgICAgfQo+Pj4+Pgo+Pj4+PiAgICAgICAgICAgICAgIGlmIChmaW8ubWV0YV9nYykKPj4+Pj4g QEAgLTQwNDIsNjEgKzQwMjEsMTA5IEBAIHN0YXRpYyBpbnQgZjJmc193cml0ZV9mb2xpb19kaXJ0 eV9yYW5nZShzdHJ1Y3QgZm9saW8gKmZvbGlvLCBpbnQgKnN1Ym1pdHRlZCwKPj4+Pj4gICAgICAg ICAgICAgICAgICAgKF9faXNfdmFsaWRfZGF0YV9ibGthZGRyKGZpby5vbGRfYmxrYWRkcikgJiYK Pj4+Pj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZF9pbnBs YWNlX3VwZGF0ZSgmZmlvKSkpIHsKPj4+Pj4gICAgICAgICAgICAgICAgICAgICAgIGYyZnNfcHV0 X2Rub2RlKCZkbik7Cj4+Pj4+IC0gICAgICAgICAgICAgICAgICAgICBkbl9oZWxkID0gZmFsc2U7 Cj4+Pj4+ICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBmMmZzX2lucGxhY2Vfd3JpdGVfZGF0 YSgmZmlvKTsKPj4+Pj4gLSAgICAgICAgICAgICAgICAgICAgIHRyYWNlX2YyZnNfZG9fd3JpdGVf ZGF0YV9wYWdlKGZvbGlvLCBJUFUpOwo+Pj4+PiAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVy cikKPj4+Pj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBibG9ja19kb25lOwo+ Pj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHNraXBfYmxvY2tfbm9fZG5v ZGU7Cj4+Pj4+Cj4+Pj4+IC0gICAgICAgICAgICAgICAgICAgICBpZiAoc3VibWl0dGVkKQo+Pj4+ PiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnN1Ym1pdHRlZCkrKzsKPj4+Pj4gLSAg ICAgICAgICAgICAgICAgICAgIHN1Ym1pdHRlZF9ibGsgPSB0cnVlOwo+Pj4+PiArICAgICAgICAg ICAgICAgICAgICAgbG9jYWxfc3VibWl0dGVkKys7Cj4+Pj4+ICsgICAgICAgICAgICAgICAgICAg ICBsYXN0X2lkeCA9IGRhdGFfaWR4Owo+Pj4+PiAgICAgICAgICAgICAgICAgICAgICAgc2V0X2lu b2RlX2ZsYWcoaW5vZGUsIEZJX1VQREFURV9XUklURSk7Cj4+Pj4+IC0gICAgICAgICAgICAgICAg ICAgICBnb3RvIGJsb2NrX2RvbmU7Cj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICB0cmFjZV9m MmZzX2RvX3dyaXRlX2RhdGFfcGFnZShmb2xpbywgSVBVKTsKPj4+Pj4gKyAgICAgICAgICAgICAg ICAgICAgIGNvbnRpbnVlOwo+Pj4+PiAgICAgICAgICAgICAgIH0KPj4+Pj4KPj4+Pj4gICAgICAg ICAgICAgICBlcnIgPSBmMmZzX2dldF9ub2RlX2luZm8oc2JpLCBkbi5uaWQsICZuaSwgZmFsc2Up Owo+Pj4+PiAgICAgICAgICAgICAgIGlmIChlcnIpCj4+Pj4+IC0gICAgICAgICAgICAgICAgICAg ICBnb3RvIGJsb2NrX2RvbmU7Cj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICBnb3RvIHNraXBf YmxvY2s7Cj4+Pj4+Cj4+Pj4+ICAgICAgICAgICAgICAgZmlvLnZlcnNpb24gPSBuaS52ZXJzaW9u Owo+Pj4+Pgo+Pj4+PiAgICAgICAgICAgICAgIGYyZnNfb3V0cGxhY2Vfd3JpdGVfZGF0YSgmZG4s ICZmaW8pOwo+Pj4+PiAtICAgICAgICAgICAgIC8qCj4+Pj4+IC0gICAgICAgICAgICAgICogVGhl IG91dHBsYWNlIHdyaXRlIHBhdGggZmFpbGVkIHRvIHN1Ym1pdCB0aGlzIGJsb2NrLgo+Pj4+PiAt ICAgICAgICAgICAgICAqLwo+Pj4+PiArICAgICAgICAgICAgIGYyZnNfcHV0X2Rub2RlKCZkbik7 Cj4+Pj4+ICsgICAgICAgICAgICAgLyogVGhlIG91dHBsYWNlIHdyaXRlIHBhdGggZmFpbGVkIHRv IHN1Ym1pdCB0aGlzIGJsb2NrLiAqLwo+Pj4+PiAgICAgICAgICAgICAgIGlmICghZmlvLnN1Ym1p dHRlZCkgewo+Pj4+PiAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gLUVJTzsKPj4+Pj4gLSAg ICAgICAgICAgICAgICAgICAgIGdvdG8gYmxvY2tfZG9uZTsKPj4+Pj4gKyAgICAgICAgICAgICAg ICAgICAgIGdvdG8gc2tpcF9ibG9ja19ub19kbm9kZTsKPj4+Pj4gICAgICAgICAgICAgICB9Cj4+ Pj4+IC0gICAgICAgICAgICAgaWYgKHN1Ym1pdHRlZCkKPj4+Pj4gLSAgICAgICAgICAgICAgICAg ICAgICgqc3VibWl0dGVkKSsrOwo+Pj4+PiAtICAgICAgICAgICAgIHN1Ym1pdHRlZF9ibGsgPSB0 cnVlOwo+Pj4+PiArICAgICAgICAgICAgIGxvY2FsX3N1Ym1pdHRlZCsrOwo+Pj4+PiArICAgICAg ICAgICAgIGxhc3RfaWR4ID0gZGF0YV9pZHg7Cj4+Pj4+ICAgICAgICAgICAgICAgc2V0X2lub2Rl X2ZsYWcoaW5vZGUsIEZJX0FQUEVORF9XUklURSk7Cj4+Pj4+ICAgICAgICAgICAgICAgdHJhY2Vf ZjJmc19kb193cml0ZV9kYXRhX3BhZ2UoZm9saW8sIE9QVSk7Cj4+Pj4+IC1ibG9ja19kb25lOgo+ Pj4+PiAtICAgICAgICAgICAgIGlmIChkbl9oZWxkKQo+Pj4+PiAtICAgICAgICAgICAgICAgICAg ICAgZjJmc19wdXRfZG5vZGUoJmRuKTsKPj4+Pj4gKyAgICAgICAgICAgICBjb250aW51ZTsKPj4+ Pj4gKwo+Pj4+PiArc2tpcF9ibG9jazoKPj4+Pj4gKyAgICAgICAgICAgICBmMmZzX3B1dF9kbm9k ZSgmZG4pOwo+Pj4+PiArc2tpcF9ibG9ja19ub19kbm9kZToKPj4+Pj4gKyAgICAgICAgICAgICBp ZiAoZjJmc19mb2xpb19oYXNfZmZzKGZvbGlvKSkKPj4+Pj4gKyAgICAgICAgICAgICAgICAgICAg IGYyZnNfZmZzX3B1dF93cml0ZV9wZW5kaW5nKGZvbGlvLCAxKTsKPj4+Pj4gKyAgICAgICAgICAg ICBpZiAoZXJyKQo+Pj4+PiArICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cj4+Pj4+ICsgICAg IH0KPj4+Pj4gKwo+Pj4+PiArICAgICBpZiAoZXJyKSB7Cj4+Pj4+ICAgICAgICAgICAgICAgLyoK Pj4+Pj4gLSAgICAgICAgICAgICAgKiBJZiB0aGlzIGJsb2NrIHdhcyBub3Qgc3VibWl0dGVkLCBy b2xsIGJhY2sgaXRzCj4+Pj4+IC0gICAgICAgICAgICAgICogd3JpdGUgcGFnZXMgcGVuZGluZy4K Pj4+Pj4gKyAgICAgICAgICAgICAgKiBUaGUgYmxvY2tzIGJlZm9yZSB0aGUgZmFpbGVkIG9uZSB3 ZXJlIHdyaXR0ZW4gb3Igc2tpcHBlZCwgc28KPj4+Pj4gKyAgICAgICAgICAgICAgKiBrZWVwIG9u bHkgdGhlIGZhaWxlZCBibG9jayBhbmQgdGhlIG9uZXMgYWZ0ZXIgaXQgZGlydHkuCj4+Pj4+ICAg ICAgICAgICAgICAgICovCj4+Pj4+IC0gICAgICAgICAgICAgaWYgKCFzdWJtaXR0ZWRfYmxrICYm IGZmcykKPj4+Pj4gLSAgICAgICAgICAgICAgICAgICAgIGYyZnNfZmZzX3B1dF93cml0ZV9wZW5k aW5nKGZvbGlvLCAxKTsKPj4+Pj4gLSAgICAgICAgICAgICBpZiAoIWVycikgewo+Pj4+PiAtICAg ICAgICAgICAgICAgICAgICAgKnBvcyA9ICgobG9mZl90KWRhdGFfaWR4ICsgMSkgPDwgUEFHRV9T SElGVDsKPj4+Pj4gLSAgICAgICAgICAgICAgICAgICAgIHNwaW5fbG9jaygmRjJGU19JKGlub2Rl KS0+aV9zaXplX2xvY2spOwo+Pj4+PiAtICAgICAgICAgICAgICAgICAgICAgaWYgKEYyRlNfSShp bm9kZSktPmxhc3RfZGlza19zaXplIDwgKnBvcykKPj4+Pj4gLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgRjJGU19JKGlub2RlKS0+bGFzdF9kaXNrX3NpemUgPSAqcG9zOwo+Pj4+PiAtICAg ICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2soJkYyRlNfSShpbm9kZSktPmlfc2l6ZV9sb2Nr KTsKPj4+Pj4gLSAgICAgICAgICAgICB9IGVsc2Ugewo+Pj4+PiAtICAgICAgICAgICAgICAgICAg ICAgZmlsZV9zZXRfa2VlcF9pc2l6ZShpbm9kZSk7Cj4+Pj4+ICsgICAgICAgICAgICAgaWYgKGkg PiBzdGFydF9pZHgpIHsKPj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4gPSBG MkZTX0JMS19UT19CWVRFUyhzYmksIGkgLSBzdGFydF9pZHgpOwo+Pj4+PiArCj4+Pj4+ICsgICAg ICAgICAgICAgICAgICAgICBmMmZzX2Zmc19jbGVhcl9zdWJyYW5nZV9kaXJ0eV9hbmRfdGVzdChm b2xpbywKPj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHN0YXJ0IC0gcG9zLCBsZW4pOwo+Pj4+PiAgICAgICAgICAgICAgIH0K Pj4+Pj4gKyAgICAgICAgICAgICBmaWxlX3NldF9rZWVwX2lzaXplKGlub2RlKTsKPj4+Pj4gKyAg ICAgfSBlbHNlIGlmIChsb2NhbF9zdWJtaXR0ZWQpIHsKPj4+Pj4gKyAgICAgICAgICAgICBsb2Zm X3QgcHNpemUgPSAobG9mZl90KShsYXN0X2lkeCArIDEpIDw8IHNiaS0+bG9nX2Jsb2Nrc2l6ZTsK Pj4+Pgo+Pj4+IEYyRlNfQkxLX1RPX0JZVEVTKHNiaSwgbGFzdF9pZHggKyAxKQo+Pj4+Cj4+Pj4+ ICsKPj4+Pj4gKyAgICAgICAgICAgICBpZiAocHNpemUgPiBpX3NpemVfcmVhZChpbm9kZSkpCj4+ Pj4+ICsgICAgICAgICAgICAgICAgICAgICBwc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKPj4+ Pgo+Pj4+IEl0IHNlZW1zIGFuIGltcHJvdmVtZW50LCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBpbm9k ZSB3cml0ZSBkdXJpbmcgZnN5bmMsIGNhbiB3ZSBmaXgKPj4+PiBmMmZzX3dyaXRlX3NpbmdsZV9k YXRhX3BhZ2UgYXMgd2VsbD8gbWF5YmUgaXQncyBiZXR0ZXIgZml4IHRoZW0gYWxsIGluIGEgc2Vw YXJhdGVkCj4+Pj4gcGF0Y2g/Cj4+Pgo+Pj4gQWdyZWVkLiBmMmZzX3dyaXRlX3NpbmdsZV9kYXRh X3BhZ2UoKSBhbmQgdGhlIGNvbXByZXNzZWQgd3JpdGUgcGF0aCBhbHNvCj4+PiBzZXQgbGFzdF9k aXNrX3NpemUgYmV5b25kIGlfc2l6ZS4gQmVzaWRlcyB0aGUgZXh0cmEgaW5vZGUgd3JpdGUsIGlm Cj4+PiBpX3NpemUgZ3Jvd3MgdG8gdGhlIHJlY29yZGVkIHZhbHVlIGxhdGVyLCBmMmZzX3NraXBf aW5vZGVfdXBkYXRlKCkgY2FuCj4+PiBzZWUgbGFzdF9kaXNrX3NpemUgPT0gaV9zaXplIGV2ZW4g dGhvdWdoIHRoZSBpbm9kZSBvbiBkaXNrIHN0aWxsIGhhcwo+Pj4gdGhlIG9sZCBzaXplLiBJIHdp bGwgZml4IGFsbCBvZiB0aGVtIGluIGEgc2VwYXJhdGUgcGF0Y2guCj4+Pgo+Pj4+Cj4+Pj4+ICsK Pj4+Pj4gKyAgICAgICAgICAgICBzcGluX2xvY2soJkYyRlNfSShpbm9kZSktPmlfc2l6ZV9sb2Nr KTsKPj4+Pj4gKyAgICAgICAgICAgICBpZiAoRjJGU19JKGlub2RlKS0+bGFzdF9kaXNrX3NpemUg PCBwc2l6ZSkKPj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgIEYyRlNfSShpbm9kZSktPmxhc3Rf ZGlza19zaXplID0gcHNpemU7Cj4+Pj4+ICsgICAgICAgICAgICAgc3Bpbl91bmxvY2soJkYyRlNf SShpbm9kZSktPmlfc2l6ZV9sb2NrKTsKPj4+Pj4gICAgICAgfQo+Pj4+Pgo+Pj4+PiArICAgICBp ZiAoc3VibWl0dGVkKQo+Pj4+PiArICAgICAgICAgICAgICpzdWJtaXR0ZWQgPSBsb2NhbF9zdWJt aXR0ZWQ7Cj4+Pj4+ICAgICAgIHJldHVybiBlcnI7Cj4+Pj4+ICAgfQo+Pj4+Pgo+Pj4+PiArLyog RGVudHJ5IGFuZCBxdW90YSBibG9ja3MgYXJlIGNvbnRyb2xsZWQgYnkgY2hlY2twb2ludC4gKi8K Pj4+Pj4gK3N0YXRpYyBib29sIGYyZnNfY3BfY29udHJvbGxlZF9pbm9kZShzdHJ1Y3QgaW5vZGUg Kmlub2RlKQo+Pj4+PiArewo+Pj4+PiArICAgICByZXR1cm4gU19JU0RJUihpbm9kZS0+aV9tb2Rl KSB8fCBJU19OT1FVT1RBKGlub2RlKTsKPj4+Pj4gK30KPj4+Pj4gKwo+Pj4+PiArZW51bSBmMmZz X3diX2FjdGlvbiB7Cj4+Pj4+ICsgICAgIEYyRlNfV0JfV1JJVEUsICAgICAgICAgIC8qIHdyaXRl IGJhY2sgdGhlIGZvbGlvICovCj4+Pj4+ICsgICAgIEYyRlNfV0JfUkVESVJUWSwgICAgICAgIC8q IGtlZXAgdGhlIGZvbGlvIGRpcnR5ICovCj4+Pj4+ICsgICAgIEYyRlNfV0JfRFJPUCwgICAgICAg ICAgIC8qIGRyb3AgdGhlIGRpcnR5IGRhdGEgKi8KPj4+Pj4gK307Cj4+Pj4+ICsKPj4+Pj4gKy8q IERlY2lkZSB3aGF0IHRvIGRvIHdpdGggYSBkaXJ0eSBkYXRhIGZvbGlvIGJlZm9yZSB3cml0aW5n IGl0IGJhY2suICovCj4+Pj4+ICtzdGF0aWMgZW51bSBmMmZzX3diX2FjdGlvbiBmMmZzX3diX2Zv bGlvX2FjdGlvbihzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmksCj4+Pj4+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlKQo+Pj4+ PiArewo+Pj4+PiArICAgICAvKiB3ZSBzaG91bGQgYnlwYXNzIGRhdGEgcGFnZXMgdG8gcHJvY2Vl ZCB0aGUga3dvcmtlciBqb2JzICovCj4+Pj4+ICsgICAgIGlmICh1bmxpa2VseShmMmZzX2NwX2Vy cm9yKHNiaSkpKSB7Cj4+Pj4+ICsgICAgICAgICAgICAgbWFwcGluZ19zZXRfZXJyb3IoaW5vZGUt PmlfbWFwcGluZywgLUVJTyk7Cj4+Pj4+ICsgICAgICAgICAgICAgLyoKPj4+Pj4gKyAgICAgICAg ICAgICAgKiBLZWVwIGRpcnR5IGRlbnRyeSBmb2xpb3MgZm9yIHRoZSBsYXRlc3QgZGlyZWN0b3J5 IHN0cnVjdHVyZSwKPj4+Pj4gKyAgICAgICAgICAgICAgKiBhbmQga2VlcCBkYXRhIGZvbGlvcyBp biByZW1vdW50LXJvIG1vZGUuCj4+Pj4+ICsgICAgICAgICAgICAgICovCj4+Pj4+ICsgICAgICAg ICAgICAgaWYgKChTX0lTRElSKGlub2RlLT5pX21vZGUpICYmCj4+Pj4+ICsgICAgICAgICAgICAg ICAgICAhaXNfc2JpX2ZsYWdfc2V0KHNiaSwgU0JJX0lTX0NMT1NFKSkgfHwKPj4+Pj4gKyAgICAg ICAgICAgICAgICAgRjJGU19PUFRJT04oc2JpKS5lcnJvcnMgPT0gTU9VTlRfRVJST1JTX1JFQURP TkxZKQo+Pj4+PiArICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEYyRlNfV0JfUkVESVJUWTsK Pj4+Pj4gKyAgICAgICAgICAgICByZXR1cm4gRjJGU19XQl9EUk9QOwo+Pj4+PiArICAgICB9Cj4+ Pj4+ICsKPj4+Pj4gKyAgICAgaWYgKHVubGlrZWx5KGlzX3NiaV9mbGFnX3NldChzYmksIFNCSV9Q T1JfRE9JTkcpKSkKPj4+Pj4gKyAgICAgICAgICAgICByZXR1cm4gRjJGU19XQl9SRURJUlRZOwo+ Pj4+PiArICAgICByZXR1cm4gRjJGU19XQl9XUklURTsKPj4+Pj4gK30KPj4+Pj4gKwo+Pj4+PiAg IGludCBmMmZzX3dyaXRlX3NpbmdsZV9kYXRhX3BhZ2Uoc3RydWN0IGZvbGlvICpmb2xpbywgaW50 ICpzdWJtaXR0ZWQsCj4+Pj4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBi aW8gKipiaW8sCj4+Pj4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rvcl90ICps YXN0X2Jsb2NrLAo+Pj4+PiBAQCAtNDEzNywyNiArNDE2NCwxNSBAQCBpbnQgZjJmc193cml0ZV9z aW5nbGVfZGF0YV9wYWdlKHN0cnVjdCBmb2xpbyAqZm9saW8sIGludCAqc3VibWl0dGVkLAo+Pj4+ Pgo+Pj4+PiAgICAgICB0cmFjZV9mMmZzX3dyaXRlcGFnZShmb2xpbywgREFUQSk7Cj4+Pj4+Cj4+ Pj4+IC0gICAgIC8qIHdlIHNob3VsZCBieXBhc3MgZGF0YSBwYWdlcyB0byBwcm9jZWVkIHRoZSBr d29ya2VyIGpvYnMgKi8KPj4+Pj4gLSAgICAgaWYgKHVubGlrZWx5KGYyZnNfY3BfZXJyb3Ioc2Jp KSkpIHsKPj4+Pj4gLSAgICAgICAgICAgICBtYXBwaW5nX3NldF9lcnJvcihmb2xpby0+bWFwcGlu ZywgLUVJTyk7Cj4+Pj4+IC0gICAgICAgICAgICAgLyoKPj4+Pj4gLSAgICAgICAgICAgICAgKiBk b24ndCBkcm9wIGFueSBkaXJ0eSBkZW50cnkgcGFnZXMgZm9yIGtlZXBpbmcgbGFzdGVzdAo+Pj4+ PiAtICAgICAgICAgICAgICAqIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCj4+Pj4+IC0gICAgICAgICAg ICAgICovCj4+Pj4+IC0gICAgICAgICAgICAgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgJiYK Pj4+Pj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzX3NiaV9mbGFnX3NldChzYmks IFNCSV9JU19DTE9TRSkpCj4+Pj4+IC0gICAgICAgICAgICAgICAgICAgICBnb3RvIHJlZGlydHlf b3V0Owo+Pj4+PiAtCj4+Pj4+IC0gICAgICAgICAgICAgLyoga2VlcCBkYXRhIHBhZ2VzIGluIHJl bW91bnQtcm8gbW9kZSAqLwo+Pj4+PiAtICAgICAgICAgICAgIGlmIChGMkZTX09QVElPTihzYmkp LmVycm9ycyA9PSBNT1VOVF9FUlJPUlNfUkVBRE9OTFkpCj4+Pj4+IC0gICAgICAgICAgICAgICAg ICAgICBnb3RvIHJlZGlydHlfb3V0Owo+Pj4+PiArICAgICBzd2l0Y2ggKGYyZnNfd2JfZm9saW9f YWN0aW9uKHNiaSwgaW5vZGUpKSB7Cj4+Pj4+ICsgICAgIGNhc2UgRjJGU19XQl9SRURJUlRZOgo+ Pj4+PiArICAgICAgICAgICAgIGdvdG8gcmVkaXJ0eV9vdXQ7Cj4+Pj4+ICsgICAgIGNhc2UgRjJG U19XQl9EUk9QOgo+Pj4+PiAgICAgICAgICAgICAgIGdvdG8gb3V0Owo+Pj4+PiArICAgICBjYXNl IEYyRlNfV0JfV1JJVEU6Cj4+Pj4+ICsgICAgICAgICAgICAgYnJlYWs7Cj4+Pj4+ICAgICAgIH0K Pj4+Pj4KPj4+Pj4gLSAgICAgaWYgKHVubGlrZWx5KGlzX3NiaV9mbGFnX3NldChzYmksIFNCSV9Q T1JfRE9JTkcpKSkKPj4+Pj4gLSAgICAgICAgICAgICBnb3RvIHJlZGlydHlfb3V0Owo+Pj4+PiAt Cj4+Pj4+ICAgICAgIGlmIChmb2xpby0+aW5kZXggPCBlbmRfaW5kZXggfHwKPj4+Pj4gICAgICAg ICAgICAgICAgICAgICAgIGYyZnNfdmVyaXR5X2luX3Byb2dyZXNzKGlub2RlKSB8fAo+Pj4+PiAg ICAgICAgICAgICAgICAgICAgICAgY29tcHJfYmxvY2tzKQo+Pj4+PiBAQCAtNDE3Miw4ICs0MTg4 LDcgQEAgaW50IGYyZnNfd3JpdGVfc2luZ2xlX2RhdGFfcGFnZShzdHJ1Y3QgZm9saW8gKmZvbGlv LCBpbnQgKnN1Ym1pdHRlZCwKPj4+Pj4KPj4+Pj4gICAgICAgZm9saW9femVyb19zZWdtZW50KGZv bGlvLCBvZmZzZXQsIGZvbGlvX3NpemUoZm9saW8pKTsKPj4+Pj4gICB3cml0ZToKPj4+Pj4gLSAg ICAgLyogRGVudHJ5L3F1b3RhIGJsb2NrcyBhcmUgY29udHJvbGxlZCBieSBjaGVja3BvaW50ICov Cj4+Pj4+IC0gICAgIGlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8IHF1b3RhX2lub2RlKSB7 Cj4+Pj4+ICsgICAgIGlmIChmMmZzX2NwX2NvbnRyb2xsZWRfaW5vZGUoaW5vZGUpKSB7Cj4+Pj4+ ICAgICAgICAgICAgICAgc3RydWN0IGYyZnNfbG9ja19jb250ZXh0IGxjOwo+Pj4+Pgo+Pj4+PiAg ICAgICAgICAgICAgIC8qCj4+Pj4+IEBAIC00MjI0LDE0ICs0MjM5LDE0IEBAIGludCBmMmZzX3dy aXRlX3NpbmdsZV9kYXRhX3BhZ2Uoc3RydWN0IGZvbGlvICpmb2xpbywgaW50ICpzdWJtaXR0ZWQs Cj4+Pj4+ICAgICAgICAgICAgICAgZ290byByZWRpcnR5X291dDsKPj4+Pj4KPj4+Pj4gICBvdXQ6 Cj4+Pj4+IC0gICAgIGlub2RlX2RlY19kaXJ0eV9ibG9jayhpbm9kZSk7Cj4+Pj4+ICsgICAgIGlu b2RlX3N1Yl9kaXJ0eV9ibG9ja3MoaW5vZGUsIGYyZnNfYmxvY2tzX3Blcl9mb2xpbyhzYmksIGZv bGlvKSk7Cj4+Pj4+ICAgICAgIGlmIChlcnIpIHsKPj4+Pj4gICAgICAgICAgICAgICBmb2xpb19j bGVhcl91cHRvZGF0ZShmb2xpbyk7Cj4+Pj4+ICAgICAgICAgICAgICAgZm9saW9fY2xlYXJfZjJm c19nY2luZyhmb2xpbyk7Cj4+Pj4+ICAgICAgIH0KPj4+Pj4gICAgICAgZm9saW9fdW5sb2NrKGZv bGlvKTsKPj4+Pj4gLSAgICAgaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpICYmICFJU19OT1FV T1RBKGlub2RlKSAmJgo+Pj4+PiAtICAgICAgICAgICAgICAgICAgICAgIUYyRlNfSShpbm9kZSkt PndiX3Rhc2sgJiYgYWxsb3dfYmFsYW5jZSkKPj4+Pj4gKyAgICAgaWYgKCFmMmZzX2NwX2NvbnRy b2xsZWRfaW5vZGUoaW5vZGUpICYmCj4+Pj4+ICsgICAgICAgICAhRjJGU19JKGlub2RlKS0+d2Jf dGFzayAmJiBhbGxvd19iYWxhbmNlKQo+Pj4+PiAgICAgICAgICAgICAgIGYyZnNfYmFsYW5jZV9m cyhzYmksIG5lZWRfYmFsYW5jZV9mcyk7Cj4+Pj4+Cj4+Pj4+ICAgICAgIGlmICh1bmxpa2VseShm MmZzX2NwX2Vycm9yKHNiaSkpKSB7Cj4+Pj4+IEBAIC00NTYwLDYgKzQ1NzUsNyBAQCBzdGF0aWMg aW50IGYyZnNfd3JpdGVfY2FjaGVfZm9saW9zKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5n LAo+Pj4+PiAgICAgICBpbnQgc3VibWl0dGVkID0gMDsKPj4+Pj4gICAgICAgaW50IG53cml0dGVu ID0gMDsKPj4+Pj4gICAgICAgYm9vbCBvcF9sb2NrZWQgPSBmYWxzZTsKPj4+Pj4gKyAgICAgYm9v bCBub2RlX2xvY2tlZCA9IGZhbHNlOwo+Pj4+PiAgICAgICBib29sIHJldHJ5ID0gZmFsc2U7Cj4+ Pj4+Cj4+Pj4+ICAgICAgIGlmIChnZXRfZGlydHlfYmxvY2tzKGlub2RlKSA8PSBTTV9JKHNiaSkt Pm1pbl9ob3RfYmxvY2tzKQo+Pj4+PiBAQCAtNDU3MSwyMCArNDU4NywxNSBAQCBzdGF0aWMgaW50 IGYyZnNfd3JpdGVfY2FjaGVfZm9saW9zKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAo+ Pj4+PiAgICAgICAgICAgICAgIHN0cnVjdCBmMmZzX2ZvbGlvX3N0YXRlICpmZnMgPSBOVUxMOwo+ Pj4+PiAgICAgICAgICAgICAgIHU2NCBpc2l6ZTsKPj4+Pj4gICAgICAgICAgICAgICBzaXplX3Qg cG9mZjsKPj4+Pj4gLSAgICAgICAgICAgICBzaXplX3QgY2xlYXJfbGVuOwo+Pj4+PiAgICAgICAg ICAgICAgIHBnb2ZmX3QgZW5kX2luZGV4Owo+Pj4+PiAgICAgICAgICAgICAgIGJvb2wgdmVyaXR5 X2luX3Byb2dyZXNzOwo+Pj4+PiAgICAgICAgICAgICAgIGludCBmb2xpb19zdWJtaXR0ZWQgPSAw Owo+Pj4+PiAgICAgICAgICAgICAgIGJvb2wgYmlhc19hZGRlZCA9IGZhbHNlOwo+Pj4+Pgo+Pj4+ PiAgICAgICAgICAgICAgIHN1Ym1pdHRlZCA9IDA7Cj4+Pj4+ICsgICAgICAgICAgICAgZXJyID0g MDsKPj4+Pj4gICAgICAgICAgICAgICByZXRyeSA9IGZhbHNlOwo+Pj4+Pgo+Pj4+PiAtICAgICAg ICAgICAgIGlmIChlcnIpIHsKPj4+Pj4gLSAgICAgICAgICAgICAgICAgICAgIGZvbGlvX3JlZGly dHlfZm9yX3dyaXRlcGFnZSh3YmMsIGZvbGlvKTsKPj4+Pj4gLSAgICAgICAgICAgICAgICAgICAg IGdvdG8gcmV0cnlfb3V0Owo+Pj4+PiAtICAgICAgICAgICAgIH0KPj4+Pj4gLQo+Pj4+PiAgICAg ICAgICAgICAgIGlmIChhdG9taWNfcmVhZCgmc2JpLT53Yl9zeW5jX3JlcVtEQVRBXSkgJiYKPj4+ Pj4gICAgICAgICAgICAgICAgICAgd2JjLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19OT05FKSB7Cj4+ Pj4+ICAgICAgICAgICAgICAgICAgICAgICBmb2xpb19yZWRpcnR5X2Zvcl93cml0ZXBhZ2Uod2Jj LCBmb2xpbyk7Cj4+Pj4+IEBAIC00NTk3LDExICs0NjA4LDIyIEBAIHN0YXRpYyBpbnQgZjJmc193 cml0ZV9jYWNoZV9mb2xpb3Moc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCj4+Pj4+ICAg ICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHJ5X291dDsKPj4+Pj4gICAgICAgICAgICAgICB9 Cj4+Pj4+Cj4+Pj4+ICsgICAgICAgICAgICAgaWYgKGYyZnNfaGFzX3N1YnBhZ2VfYmxvY2tzKHNi aSkgJiYKPj4+Pj4gKyAgICAgICAgICAgICAgICAgKGYyZnNfY29tcHJlc3NlZF9maWxlKGlub2Rl KSB8fCBmMmZzX2lzX2F0b21pY19maWxlKGlub2RlKSkpIHsKPj4+Pj4gKyAgICAgICAgICAgICAg ICAgICAgIFdBUk5fT05fT05DRSgxKTsKPj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgIG1hcHBp bmdfc2V0X2Vycm9yKG1hcHBpbmcsIC1FT1BOT1RTVVBQKTsKPj4+Pj4gKyAgICAgICAgICAgICAg ICAgICAgIGZvbGlvX2NsZWFyX2RpcnR5X2Zvcl9pbyhmb2xpbyk7Cj4+Pj4+ICsgICAgICAgICAg ICAgICAgICAgICBpbm9kZV9zdWJfZGlydHlfYmxvY2tzKGlub2RlLCBmMmZzX2Jsb2Nrc19wZXJf Zm9saW8oc2JpLCBmb2xpbykpOwo+Pj4+PiArICAgICAgICAgICAgICAgICAgICAgZXJyID0gLUVP UE5PVFNVUFA7Cj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHJ5X291dDsKPj4+ Pj4gKyAgICAgICAgICAgICB9Cj4+Pj4+ICsKPj4+Pj4gICAgICAgICAgICAgICAvKgo+Pj4+PiAg ICAgICAgICAgICAgICAqIFdyaXRpbmcgYmFjayBvbmUgbGFyZ2UgZm9saW8gcGVyZm9ybXMgbXVs dGlwbGUgYmxvY2sgYWxsb2NhdGlvbnMsIHNvCj4+Pj4+ICAgICAgICAgICAgICAgICogYmVzdC1l ZmZvcnQgYmFsYW5jZSB0aGUgZmlsZXN5c3RlbSBiZWZvcmUgd3JpdGluZyBpdCBiYWNrLgo+Pj4+ PiAgICAgICAgICAgICAgICAqLwo+Pj4+PiAtICAgICAgICAgICAgIGlmICghRjJGU19JKGlub2Rl KS0+d2JfdGFzayAmJiBoYXNfbm90X2Vub3VnaF9mcmVlX3NlY3Moc2JpLCAwLCAwKSkgewo+Pj4+ PiArICAgICAgICAgICAgIGlmICghZjJmc19jcF9jb250cm9sbGVkX2lub2RlKGlub2RlKSAmJgo+ Pj4+PiArICAgICAgICAgICAgICAgICAhRjJGU19JKGlub2RlKS0+d2JfdGFzayAmJiBoYXNfbm90 X2Vub3VnaF9mcmVlX3NlY3Moc2JpLCAwLCAwKSkgewo+Pj4+PiAgICAgICAgICAgICAgICAgICAg ICAgZm9saW9fcmVkaXJ0eV9mb3Jfd3JpdGVwYWdlKHdiYywgZm9saW8pOwo+Pj4+PiAgICAgICAg ICAgICAgICAgICAgICAgcmV0cnkgPSB0cnVlOwo+Pj4+PiAgICAgICAgICAgICAgICAgICAgICAg Zm9saW9fdW5sb2NrKGZvbGlvKTsKPj4+Pj4gQEAgLTQ2MzYsMzEgKzQ2NTgsMzkgQEAgc3RhdGlj IGludCBmMmZzX3dyaXRlX2NhY2hlX2ZvbGlvcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGlu ZywKPj4+Pj4gICAgICAgICAgICAgICB9Cj4+Pj4+Cj4+Pj4+ICAgICAgICAgICAgICAgLyoKPj4+ Pj4gLSAgICAgICAgICAgICAgKiBJZiBjcF9lcnJvciBpcyBzZXQsIGFsbCBzdWJwYWdlcyBvZiB0 aGlzIGZvbGlvIGFyZSBub3QKPj4+Pj4gLSAgICAgICAgICAgICAgKiB3cml0dGVuIGJhY2sgdW5s ZXNzIHRoZSBmaWxlc3lzdGVtIGlzIG1vdW50ZWQgd2l0aAo+Pj4+PiAtICAgICAgICAgICAgICAq IGVycm9ycz1yZW1vdW50LXJvLiAgVGhlIGNoZWNrIGlzIHBsYWNlZCBhZnRlciB0aGUgcmV0cnkK Pj4+Pj4gLSAgICAgICAgICAgICAgKiBibG9jayBzbyBpdCBhbHNvIGNvdmVycyBjcF9lcnJvciBi ZWluZyBzZXQgd2hpbGUgdGhlIGZvbGlvCj4+Pj4+IC0gICAgICAgICAgICAgICogbG9jayB3YXMg ZHJvcHBlZCBmb3IgZjJmc19iYWxhbmNlX2ZzKCkgb3IgZm9yIHRoZSB0cnlsb2NrX29wKCkKPj4+ Pj4gLSAgICAgICAgICAgICAgKiBiYWNrb2ZmLiAgUEdfZGlydHkgaXMgY2xlYXIgYXQgdGhpcyBw b2ludCwgc28gYm90aCB0aGUKPj4+Pj4gLSAgICAgICAgICAgICAgKiByZWRpcnR5IGFuZCB0aGUg ZHJvcCBiZWxvdyBsZWF2ZSBhIGNvaGVyZW50IHN0YXRlLgo+Pj4+PiArICAgICAgICAgICAgICAq IENoZWNrZWQgYWZ0ZXIgdGhlIHJldHJ5IGJsb2NrLCBzbyB0aGF0IGl0IGFsc28gY292ZXJzIGNw X2Vycm9yCj4+Pj4+ICsgICAgICAgICAgICAgICogYmVpbmcgc2V0IHdoaWxlIHRoZSBmb2xpbyBs b2NrIHdhcyBkcm9wcGVkIGZvciBmMmZzX2JhbGFuY2VfZnMoKQo+Pj4+PiArICAgICAgICAgICAg ICAqIG9yIGZvciB0aGUgdHJ5bG9ja19vcCgpIGJhY2tvZmYuCj4+Pj4+ICAgICAgICAgICAgICAg ICovCj4+Pj4+IC0gICAgICAgICAgICAgaWYgKHVubGlrZWx5KGYyZnNfY3BfZXJyb3Ioc2JpKSkp IHsKPj4+Pj4gLSAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdfc2V0X2Vycm9yKG1hcHBpbmcs IC1FSU8pOwo+Pj4+PiAtICAgICAgICAgICAgICAgICAgICAgaWYgKEYyRlNfT1BUSU9OKHNiaSku ZXJyb3JzID09IE1PVU5UX0VSUk9SU19SRUFET05MWSkgewo+Pj4+PiAtICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBmb2xpb19yZWRpcnR5X2Zvcl93cml0ZXBhZ2Uod2JjLCBmb2xpbyk7Cj4+ Pj4+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmV0cnlfb3V0Owo+Pj4+PiAt ICAgICAgICAgICAgICAgICAgICAgfQo+Pj4+PiAtICAgICAgICAgICAgICAgICAgICAgZ290byBv dXQ7Cj4+Pj4+ICsgICAgICAgICAgICAgc3dpdGNoIChmMmZzX3diX2ZvbGlvX2FjdGlvbihzYmks IGlub2RlKSkgewo+Pj4+PiArICAgICAgICAgICAgIGNhc2UgRjJGU19XQl9SRURJUlRZOgo+Pj4+ PiArICAgICAgICAgICAgICAgICAgICAgZm9saW9fcmVkaXJ0eV9mb3Jfd3JpdGVwYWdlKHdiYywg Zm9saW8pOwo+Pj4+PiArICAgICAgICAgICAgICAgICAgICAgZ290byByZXRyeV9vdXQ7Cj4+Pj4+ ICsgICAgICAgICAgICAgY2FzZSBGMkZTX1dCX0RST1A6Cj4+Pj4+ICsgICAgICAgICAgICAgICAg ICAgICBmMmZzX2Zmc19jbGVhcl9zdWJyYW5nZV9kaXJ0eV9hbmRfdGVzdChmb2xpbywgMCwKPj4+ Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGlvX3Np emUoZm9saW8pKTsKPj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgIGlub2RlX3N1Yl9kaXJ0eV9i bG9ja3MoaW5vZGUsIGYyZnNfYmxvY2tzX3Blcl9mb2xpbyhzYmksIGZvbGlvKSk7Cj4+Pj4+ICsg ICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHJ5X291dDsKPj4+Pj4gKyAgICAgICAgICAgICBj YXNlIEYyRlNfV0JfV1JJVEU6Cj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICBicmVhazsKPj4+ Pj4gICAgICAgICAgICAgICB9Cj4+Pj4+Cj4+Pj4+IC0gICAgICAgICAgICAgLyogVG8gYXZvaWQg ZGVhbGluZyB3aXRoIHRoZSBjb21wbGV4aXR5IGZvciBvbmUgc3VicmFuZ2UgaXMgaW4gYmlvCj4+ Pj4+IC0gICAgICAgICAgICAgICogd2hpbGUgd2UgdHJ5bG9ja19vcCBmYWlsZWQgYmVmb3JlIHdy aXRpbmcgYW5vdGhlciBzdWJyYW5nZS4KPj4+Pj4gLSAgICAgICAgICAgICAgKiBUcnkgdG8gbG9j a19vcCBiZWZvcmUgYW55IHN1YnJhbmdlIHdyaXRlIGZvciB0aGUgZm9saW8uCj4+Pj4+IC0gICAg ICAgICAgICAgICovCj4+Pj4+IC0gICAgICAgICAgICAgaWYgKCFvcF9sb2NrZWQpIHsKPj4+Pj4g KyAgICAgICAgICAgICBpZiAoZjJmc19jcF9jb250cm9sbGVkX2lub2RlKGlub2RlKSkgewo+Pj4+ PiArICAgICAgICAgICAgICAgICAgICAgLyoKPj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAq IFF1b3RhIHdyaXRlcyBuZWVkIG5vZGVfd3JpdGUgdG8gYXZvaWQgYmxvY2sKPj4+Pj4gKyAgICAg ICAgICAgICAgICAgICAgICAqIGFsbG9jYXRpb24gZHVyaW5nIGNoZWNrcG9pbnQuCj4+Pj4+ICsg ICAgICAgICAgICAgICAgICAgICAgKi8KPj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgIGlmIChJ U19OT1FVT1RBKGlub2RlKSkgewo+Pj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBm MmZzX2Rvd25fcmVhZF90cmFjZSgmc2JpLT5ub2RlX3dyaXRlLCAmbGMpOwo+Pj4+PiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBub2RlX2xvY2tlZCA9IHRydWU7Cj4+Pj4+ICsgICAgICAg ICAgICAgICAgICAgICB9Cj4+Pj4+ICsgICAgICAgICAgICAgfSBlbHNlIHsKPj4+Pj4gKyAgICAg ICAgICAgICAgICAgICAgIC8qIFRvIGF2b2lkIGRlYWxpbmcgd2l0aCB0aGUgY29tcGxleGl0eSBm b3Igb25lIHN1YnJhbmdlIGlzIGluIGJpbwo+Pj4+PiArICAgICAgICAgICAgICAgICAgICAgICog d2hpbGUgd2UgdHJ5bG9ja19vcCBmYWlsZWQgYmVmb3JlIHdyaXRpbmcgYW5vdGhlciBzdWJyYW5n ZS4KPj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAqIFRyeSB0byBsb2NrX29wIGJlZm9yZSBh bnkgc3VicmFuZ2Ugd3JpdGUgZm9yIHRoZSBmb2xpby4KPj4+Pj4gKyAgICAgICAgICAgICAgICAg ICAgICAqLwo+Pj4+PiAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmMmZzX3RyeWxvY2tfb3Ao c2JpLCAmbGMpKSB7Cj4+Pj4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGlvX3Jl ZGlydHlfZm9yX3dyaXRlcGFnZSh3YmMsIGZvbGlvKTsKPj4+Pj4gLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgZXJyID0gMDsKPj4+Pj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg aWYgKHdiYy0+c3luY19tb2RlICE9IFdCX1NZTkNfQUxMKQo+Pj4+PiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmV0cnlfb3V0Owo+Pj4+Pgo+Pj4+PiBAQCAtNDY5 MCw1OSArNDcyMCwzNCBAQCBzdGF0aWMgaW50IGYyZnNfd3JpdGVfY2FjaGVfZm9saW9zKHN0cnVj dCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAo+Pj4+PiAgICAgICAgICAgICAgIGZvbGlvX3N0YXJ0 X3dyaXRlYmFjayhmb2xpbyk7Cj4+Pj4+Cj4+Pj4+ICAgICAgICAgICAgICAgLyoKPj4+Pj4gLSAg ICAgICAgICAgICAgKiBQR19kaXJ0eSB3YXMgYWxyZWFkeSBjbGVhcmVkIGJ5IHdyaXRlYmFja19p dGVyKCksIGFuZCBhCj4+Pj4+IC0gICAgICAgICAgICAgICogc2luZ2xlLWJsb2NrIGZvbGlvIGhh cyBubyBmZnMgZGlydHkgYml0bWFwLCBzbyB0aGUgZGlydHkKPj4+Pj4gLSAgICAgICAgICAgICAg KiByYW5nZSBjYW5ub3QgYmUgZGVyaXZlZC4gV3JpdGUgdGhlIHdob2xlIGZvbGlvLgo+Pj4+PiAr ICAgICAgICAgICAgICAqIFBHX2RpcnR5IHdhcyBhbHJlYWR5IGNsZWFyZWQgYnkgd3JpdGViYWNr X2l0ZXIoKS4gQSBzaW5nbGUtYmxvY2sKPj4+Pj4gKyAgICAgICAgICAgICAgKiBmb2xpbyBoYXMg bm8gZmZzLCBzbyBpdHMgd2hvbGUgZm9saW8gaXMgd3JpdHRlbi4KPj4+Pj4gICAgICAgICAgICAg ICAgKi8KPj4+Pj4gLSAgICAgICAgICAgICBpZiAoIWZvbGlvX3Rlc3RfbGFyZ2UoZm9saW8pKSB7 Cj4+Pj4+IC0gICAgICAgICAgICAgICAgICAgICBlcnIgPSBmMmZzX3dyaXRlX2ZvbGlvX2RpcnR5 X3JhbmdlKGZvbGlvLCAmc3VibWl0dGVkLAo+Pj4+PiAtICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHdiYywgaW9fdHlwZSwgJnBvcywgZW5kX3BvcyAtIHBvcyk7Cj4+Pj4+IC0g ICAgICAgICAgICAgICAgICAgICBmb2xpb19zdWJtaXR0ZWQgKz0gc3VibWl0dGVkOwo+Pj4+PiAt ICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikKPj4+Pj4gLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZ290byBvdXQ7Cj4+Pj4+IC0gICAgICAgICAgICAgICAgICAgICBud3JpdHRlbiAr PSBzdWJtaXR0ZWQ7Cj4+Pj4+IC0gICAgICAgICAgICAgICAgICAgICBnb3RvIHdyaXR0ZW47Cj4+ Pj4+IC0gICAgICAgICAgICAgfQo+Pj4+PiAtCj4+Pj4+IC0gICAgICAgICAgICAgaWYgKCFmMmZz X2ZvbGlvX2hhc19mZnMoZm9saW8pKSB7Cj4+Pj4+IC0gICAgICAgICAgICAgICAgICAgICBmZnMg PSBmMmZzX2Zmc19maW5kX29yX2FsbG9jKGZvbGlvKTsKPj4+Pj4gLSAgICAgICAgICAgICAgICAg ICAgIGYyZnNfZmZzX21hcmtfc3VicmFuZ2VfZGlydHkoZm9saW8sIDAsIGVuZF9wb3MgLSBwb3Mp Owo+Pj4+PiAtICAgICAgICAgICAgIH0gZWxzZSB7Cj4+Pj4+ICsgICAgICAgICAgICAgaWYgKGYy ZnNfaXNfbXVsdGlibG9ja19mb2xpbyhzYmksIGZvbGlvKSkgewo+Pj4+PiArICAgICAgICAgICAg ICAgICAgICAgaWYgKCFmMmZzX2ZvbGlvX2hhc19mZnMoZm9saW8pKQo+Pj4+PiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBmMmZzX2Zmc19tYXJrX3N1YnJhbmdlX2RpcnR5KGZvbGlvLCAw LCBlbmRfcG9zIC0gcG9zKTsKPj4+Pj4gICAgICAgICAgICAgICAgICAgICAgIGZmcyA9IChzdHJ1 Y3QgZjJmc19mb2xpb19zdGF0ZSAqKWZvbGlvLT5wcml2YXRlOwo+Pj4+PiArICAgICAgICAgICAg ICAgICAgICAgLyoKPj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAqIE11bHRpYmxvY2sgZm9s aW9zIGNhbiBiZSBzdWJtaXR0ZWQgYXMgbXVsdGlwbGUgYmlvcywKPj4+Pj4gKyAgICAgICAgICAg ICAgICAgICAgICAqIHdoaWNoIG1heSBjb21wbGV0ZSB3aGlsZSB3ZSBhcmUgc3RpbGwgc3VibWl0 dGluZyB0aGUKPj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAqIHJlbWFpbmluZyBkaXJ0eSBy YW5nZXMuICBIb2xkIGEgYmlhcyBvbgo+Pj4+PiArICAgICAgICAgICAgICAgICAgICAgICogd3Jp dGVfYmxvY2tzX3BlbmRpbmcgdG8gcHJldmVudCBmb2xpb19lbmRfd3JpdGViYWNrKCkKPj4+Pj4g KyAgICAgICAgICAgICAgICAgICAgICAqIGZyb20gYmVpbmcgY2FsbGVkIGVhcmx5Lgo+Pj4+PiAr ICAgICAgICAgICAgICAgICAgICAgICovCj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICBpZiAo IWJpYXNfYWRkZWQpIHsKPj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0FSTl9P Tl9PTkNFKGF0b21pY19yZWFkKCZmZnMtPndyaXRlX2Jsb2Nrc19wZW5kaW5nKSAhPSAwKTsKPj4+ Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRvbWljX2luYygmZmZzLT53cml0ZV9i bG9ja3NfcGVuZGluZyk7Cj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpYXNf YWRkZWQgPSB0cnVlOwo+Pj4+PiArICAgICAgICAgICAgICAgICAgICAgfQo+Pj4+PiAgICAgICAg ICAgICAgIH0KPj4+Pj4gLSAgICAgICAgICAgICAvKgo+Pj4+PiAtICAgICAgICAgICAgICAqIExh cmdlIGZvbGlvcyBjYW4gYmUgc3VibWl0dGVkIGFzIG11bHRpcGxlIGJpb3MsIHdoaWNoIG1heQo+ Pj4+PiAtICAgICAgICAgICAgICAqIGNvbXBsZXRlIHdoaWxlIHdlIGFyZSBzdGlsbCBzdWJtaXR0 aW5nIHRoZSByZW1haW5pbmcgZGlydHkKPj4+Pj4gLSAgICAgICAgICAgICAgKiByYW5nZXMuICBI b2xkIGEgYmlhcyBvbiB3cml0ZV9ibG9ja3NfcGVuZGluZyB0byBwcmV2ZW50Cj4+Pj4+IC0gICAg ICAgICAgICAgICogZm9saW9fZW5kX3dyaXRlYmFjaygpIGZyb20gYmVpbmcgY2FsbGVkIGVhcmx5 Lgo+Pj4+PiAtICAgICAgICAgICAgICAqLwo+Pj4+PiAtICAgICAgICAgICAgIGlmIChmMmZzX2Zv bGlvX2hhc19mZnMoZm9saW8pICYmICFiaWFzX2FkZGVkKSB7Cj4+Pj4+IC0gICAgICAgICAgICAg ICAgICAgICBXQVJOX09OX09OQ0UoYXRvbWljX3JlYWQoJmZmcy0+d3JpdGVfYmxvY2tzX3BlbmRp bmcpICE9IDApOwo+Pj4+PiAtICAgICAgICAgICAgICAgICAgICAgYXRvbWljX2luYygmZmZzLT53 cml0ZV9ibG9ja3NfcGVuZGluZyk7Cj4+Pj4+IC0gICAgICAgICAgICAgICAgICAgICBiaWFzX2Fk ZGVkID0gdHJ1ZTsKPj4+Pj4gLSAgICAgICAgICAgICB9Cj4+Pj4+IC0KPj4+Pj4gLSAgICAgICAg ICAgICB1bnNpZ25lZCBpbnQgZnJvbSA9IDAsIHN0YXJ0LCBjb3VudDsKPj4+Pj4gLSAgICAgICAg ICAgICB1bnNpZ25lZCBpbnQgbnJfYmxvY2tzID0gZjJmc19ibG9ja3NfcGVyX2ZvbGlvKHNiaSwg Zm9saW8pOwo+Pj4+PiAtICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0b19ibGsgPSBtaW5fdCh1 bnNpZ25lZCBpbnQsCj4+Pj4+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYyRlNfQkxL X0FMSUdOKHNiaSwgZW5kX3BvcyAtIGZvbGlvX3Bvcyhmb2xpbykpLAo+Pj4+PiAtICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBucl9ibG9ja3MpOwo+Pj4+Pgo+Pj4+PiAtICAgICAgICAgICAg IHdoaWxlIChmMmZzX2Zmc19kaXJ0eV9ibGtfcmFuZ2UoZm9saW8sIGZyb20sIHRvX2JsaywKPj4+ Pj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydCwg JmNvdW50KSkgewo+Pj4+PiAtICAgICAgICAgICAgICAgICAgICAgc3VibWl0dGVkID0gMDsKPj4+ Pj4gLSAgICAgICAgICAgICAgICAgICAgIHBvcyA9IGZvbGlvX3Bvcyhmb2xpbykgKyBGMkZTX0JM S19UT19CWVRFUyhzYmksIHN0YXJ0KTsKPj4+Pj4gLSAgICAgICAgICAgICAgICAgICAgIGVyciA9 IGYyZnNfd3JpdGVfZm9saW9fZGlydHlfcmFuZ2UoZm9saW8sICZzdWJtaXR0ZWQsCj4+Pj4+IC0g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2JjLCBpb190eXBlLCAmcG9zLAo+ Pj4+PiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYyRlNfQkxLX1RPX0JZ VEVTKHNiaSwgY291bnQpKTsKPj4+Pj4gLSAgICAgICAgICAgICAgICAgICAgIGZvbGlvX3N1Ym1p dHRlZCArPSBzdWJtaXR0ZWQ7Cj4+Pj4+IC0gICAgICAgICAgICAgICAgICAgICBud3JpdHRlbiAr PSBzdWJtaXR0ZWQ7Cj4+Pj4+IC0gICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKQo+Pj4+PiAt ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKPj4+Pj4gLSAgICAgICAgICAg ICAgICAgICAgIGZyb20gPSBzdGFydCArIGNvdW50Owo+Pj4+PiAtICAgICAgICAgICAgIH0KPj4+ Pj4gKyAgICAgICAgICAgICBlcnIgPSBmMmZzX3dyaXRlX2ZvbGlvX2RpcnR5X3JhbmdlKGZvbGlv LCAmc3VibWl0dGVkLCB3YmMsIGlvX3R5cGUsCj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MsIGVuZF9wb3MpOwo+Pj4+PiArICAgICAgICAg ICAgIGZvbGlvX3N1Ym1pdHRlZCArPSBzdWJtaXR0ZWQ7Cj4+Pj4+ICsgICAgICAgICAgICAgbndy aXR0ZW4gKz0gc3VibWl0dGVkOwo+Pj4+PiArICAgICAgICAgICAgIGlmIChlcnIpCj4+Pj4+ICsg ICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKPj4+Pj4KPj4+Pj4gLXdyaXR0ZW46Cj4+Pj4+ ICAgICAgICAgICAgICAgLyogSWYgbm9uZSBvZiB0aGUgc3VicGFnZXMgb2YgYSBmb2xpbyBpcyBz dWJtaXR0ZWQsIGtlZXAgdGhlIGF0b21pYyBmbGFnICovCj4+Pj4+ICAgICAgICAgICAgICAgaWYg KGZvbGlvX3N1Ym1pdHRlZCAmJgo+Pj4+PiAgICAgICAgICAgICAgICAgICBmMmZzX2lzX2F0b21p Y19maWxlKGlub2RlKSAmJgo+Pj4+PiBAQCAtNDc1MCwyNiArNDc1NSwxMiBAQCBzdGF0aWMgaW50 IGYyZnNfd3JpdGVfY2FjaGVfZm9saW9zKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAo+ Pj4+PiAgICAgICAgICAgICAgICAgICAgICAgZm9saW9fY2xlYXJfZjJmc19hdG9taWMoZm9saW8p Owo+Pj4+Pgo+Pj4+PiAgIG91dDoKPj4+Pj4gLSAgICAgICAgICAgICAvKgo+Pj4+PiAtICAgICAg ICAgICAgICAqIENsZWFyIHRoZSBkaXJ0eSBzdGF0ZSBvZiB0aGUgc3VicmFuZ2VzIHRoYXQgd2Vy ZSB3cml0dGVuIGJhY2suCj4+Pj4+IC0gICAgICAgICAgICAgICogSWYgc29tZSBzdWJyYW5nZXMg YXJlIHN0aWxsIGRpcnR5IChlLmcuIHRoZSBmb2xpbyB3YXMgb25seQo+Pj4+PiAtICAgICAgICAg ICAgICAqIHBhcnRpYWxseSB3cml0dGVuIGJhY2spLCBvciBpZiB0aGUgd3JpdGViYWNrIGZhaWxl ZCwgdGhlCj4+Pj4+IC0gICAgICAgICAgICAgICogZm9saW8gbXVzdCBzdGF5IGRpcnR5IHNvIHRo YXQgdGhlIHJlbWFpbmluZyBzdWJyYW5nZXMgYXJlCj4+Pj4+IC0gICAgICAgICAgICAgICogd3Jp dHRlbiBiYWNrIGxhdGVyLgo+Pj4+PiAtICAgICAgICAgICAgICAqCj4+Pj4+IC0gICAgICAgICAg ICAgICogT24gc3VjY2VzcywgY2xlYXIgZGlydHkgYml0cyBvZiB0aGUgd2hvbGUgZm9saW8gcmF0 aGVyIHRoYW4KPj4+Pj4gLSAgICAgICAgICAgICAgKiB1cCB0byBpc2l6ZTogc3VicGFnZXMgYmV5 b25kIEVPRiBjYW4gc3RpbGwgY2FycnkgZGlydHkgYml0cwo+Pj4+PiAtICAgICAgICAgICAgICAq IChlLmcuIGZpbGxfemVybygpIHcvIEZBTExPQ19GTF9LRUVQX1NJWkUsIEJHX0dDIG9uIGJsb2Nr cwo+Pj4+PiAtICAgICAgICAgICAgICAqIGJleW9uZCBFT0YsIG9yIGYyZnNfZmZzX2ZpbmRfb3Jf YWxsb2MoKSBvbiBhIGRpcnR5IGZvbGlvKSwKPj4+Pj4gLSAgICAgICAgICAgICAgKiB0aGV5IHdp bGwgbmV2ZXIgYmUgd3JpdHRlbiBiYWNrLCBhbmQgd291bGQga2VlcCB0aGUgZm9saW8KPj4+Pj4g LSAgICAgICAgICAgICAgKiByZWRpcnRpZWQgZm9yZXZlci4KPj4+Pj4gLSAgICAgICAgICAgICAg Ki8KPj4+Pj4gLSAgICAgICAgICAgICBjbGVhcl9sZW4gPSBlcnIgPyBwb3MgLSBmb2xpb19wb3Mo Zm9saW8pIDogZm9saW9fc2l6ZShmb2xpbyk7Cj4+Pj4+IC0gICAgICAgICAgICAgaWYgKGYyZnNf ZmZzX2NsZWFyX3N1YnJhbmdlX2RpcnR5X2FuZF90ZXN0KGZvbGlvLCAwLAo+Pj4+PiAtICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJfbGVuKSB8fCBlcnIp IHsKPj4+Pj4gKyAgICAgICAgICAgICBpZiAoIWVycikgewo+Pj4+PiArICAgICAgICAgICAgICAg ICAgICAgZjJmc19mZnNfY2xlYXJfc3VicmFuZ2VfZGlydHlfYW5kX3Rlc3QoZm9saW8sIDAsCj4+ Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xpb19z aXplKGZvbGlvKSk7Cj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICBpbm9kZV9zdWJfZGlydHlf YmxvY2tzKGlub2RlLCBmMmZzX2Jsb2Nrc19wZXJfZm9saW8oc2JpLCBmb2xpbykpOwo+Pj4+PiAr ICAgICAgICAgICAgIH0gZWxzZSB7Cj4+Pj4+ICAgICAgICAgICAgICAgICAgICAgICBmb2xpb19y ZWRpcnR5X2Zvcl93cml0ZXBhZ2Uod2JjLCBmb2xpbyk7Cj4+Pj4+IC0gICAgICAgICAgICAgfSBl bHNlIGlmICghZjJmc19mb2xpb19oYXNfZmZzKGZvbGlvKSkgewo+Pj4+PiAtICAgICAgICAgICAg ICAgICAgICAgaW5vZGVfZGVjX2RpcnR5X2Jsb2NrKGlub2RlKTsKPj4+Pj4gICAgICAgICAgICAg ICB9Cj4+Pj4+Cj4+Pj4+ICAgICAgICAgICAgICAgLyoKPj4+Pj4gQEAgLTQ3ODAsNyArNDc3MSw3 IEBAIHN0YXRpYyBpbnQgZjJmc193cml0ZV9jYWNoZV9mb2xpb3Moc3RydWN0IGFkZHJlc3Nfc3Bh Y2UgKm1hcHBpbmcsCj4+Pj4+ICAgICAgICAgICAgICAgICAgICAgICBmMmZzX2Zmc19wdXRfd3Jp dGVfcGVuZGluZyhmb2xpbywgMSk7Cj4+Pj4+ICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZm9s aW9fc3VibWl0dGVkICYmIGZvbGlvX3Rlc3Rfd3JpdGViYWNrKGZvbGlvKSkgewo+Pj4+PiAgICAg ICAgICAgICAgICAgICAgICAgLyoKPj4+Pj4gLSAgICAgICAgICAgICAgICAgICAgICAqIE9yZGVy LTAgZm9saW9zIHRha2Ugbm8gYmlhcywgc28gZW5kIHRoZSB3cml0ZWJhY2sKPj4+Pj4gKyAgICAg ICAgICAgICAgICAgICAgICAqIFNpbmdsZS1ibG9jayBmb2xpb3MgdGFrZSBubyBiaWFzLCBzbyBl bmQgdGhlIHdyaXRlYmFjawo+Pj4+PiAgICAgICAgICAgICAgICAgICAgICAgICogaWYgbm90aGlu ZyB3YXMgc3VibWl0dGVkLgo+Pj4+PiAgICAgICAgICAgICAgICAgICAgICAgICovCj4+Pj4+ICAg ICAgICAgICAgICAgICAgICAgICBmb2xpb19lbmRfd3JpdGViYWNrKGZvbGlvKTsKPj4+Pj4gQEAg LTQ3OTIsNiArNDc4MywxMSBAQCBzdGF0aWMgaW50IGYyZnNfd3JpdGVfY2FjaGVfZm9saW9zKHN0 cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAo+Pj4+PiAgICAgICAgICAgICAgICAgICAgICAg b3BfbG9ja2VkID0gZmFsc2U7Cj4+Pj4+ICAgICAgICAgICAgICAgfQo+Pj4+Pgo+Pj4+PiArICAg ICAgICAgICAgIGlmIChub2RlX2xvY2tlZCkgewo+Pj4+PiArICAgICAgICAgICAgICAgICAgICAg ZjJmc191cF9yZWFkX3RyYWNlKCZzYmktPm5vZGVfd3JpdGUsICZsYyk7Cj4+Pj4+ICsgICAgICAg ICAgICAgICAgICAgICBub2RlX2xvY2tlZCA9IGZhbHNlOwo+Pj4+PiArICAgICAgICAgICAgIH0K Pj4+Pj4gKwo+Pj4+PiAgICAgICAgICAgICAgIGZvbGlvX3VubG9jayhmb2xpbyk7Cj4+Pj4+ICAg ICAgIH0KPj4+Pj4KPj4+Pj4gQEAgLTQ4NzIsMTAgKzQ4NjgsMTAgQEAgc3RhdGljIGludCBfX2Yy ZnNfd3JpdGVfZGF0YV9wYWdlcyhzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKPj4+Pj4g ICAgICAgaWYgKHVubGlrZWx5KGlzX3NiaV9mbGFnX3NldChzYmksIFNCSV9QT1JfRE9JTkcpKSkK Pj4+Pj4gICAgICAgICAgICAgICBnb3RvIHNraXBfd3JpdGU7Cj4+Pj4+Cj4+Pj4+IC0gICAgIGlm ICgoU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fCBJU19OT1FVT1RBKGlub2RlKSkgJiYKPj4+Pj4g LSAgICAgICAgICAgICAgICAgICAgIHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfTk9ORSAmJgo+ Pj4+PiAtICAgICAgICAgICAgICAgICAgICAgZ2V0X2RpcnR5X2Jsb2Nrcyhpbm9kZSkgPCBucl9j YWNoZXNfdG9fc2tpcChzYmksIERBVEEpICYmCj4+Pj4+IC0gICAgICAgICAgICAgICAgICAgICBm MmZzX2F2YWlsYWJsZV9mcmVlX21lbW9yeShzYmksIERJUlRZX0RFTlRTKSkKPj4+Pj4gKyAgICAg aWYgKGYyZnNfY3BfY29udHJvbGxlZF9pbm9kZShpbm9kZSkgJiYKPj4+Pj4gKyAgICAgICAgIHdi Yy0+c3luY19tb2RlID09IFdCX1NZTkNfTk9ORSAmJgo+Pj4+PiArICAgICAgICAgZ2V0X2RpcnR5 X2Jsb2Nrcyhpbm9kZSkgPCBucl9jYWNoZXNfdG9fc2tpcChzYmksIERBVEEpICYmCj4+Pj4+ICsg ICAgICAgICBmMmZzX2F2YWlsYWJsZV9mcmVlX21lbW9yeShzYmksIERJUlRZX0RFTlRTKSkKPj4+ Pj4gICAgICAgICAgICAgICBnb3RvIHNraXBfd3JpdGU7Cj4+Pj4+Cj4+Pj4+ICAgICAgIC8qIHNr aXAgd3JpdGluZyBpbiBmaWxlIGRlZnJhZ21lbnQgcHJlcGFyaW5nIHN0YWdlICovCj4+Pj4+IEBA IC00OTAyLDcgKzQ4OTgsNyBAQCBzdGF0aWMgaW50IF9fZjJmc193cml0ZV9kYXRhX3BhZ2VzKHN0 cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAo+Pj4+PiAgICAgICBhY2NvdW50X3dyaXRlYmFj ayhpbm9kZSwgdHJ1ZSk7Cj4+Pj4+Cj4+Pj4+ICAgICAgIGJsa19zdGFydF9wbHVnKCZwbHVnKTsK Pj4+Pj4gLSAgICAgaWYgKG1hcHBpbmdfbGFyZ2VfZm9saW9fc3VwcG9ydChpbm9kZS0+aV9tYXBw aW5nKSAmJgo+Pj4+PiArICAgICBpZiAoZjJmc19oYXNfbXVsdGlibG9ja19mb2xpb3MoaW5vZGUp ICYmCj4+Pj4+ICAgICAgICAgICAhZjJmc19oYXNfaW5saW5lX2RhdGEoaW5vZGUpKQo+Pj4+PiAg ICAgICAgICAgICAgIHJldCA9IGYyZnNfd3JpdGVfY2FjaGVfZm9saW9zKG1hcHBpbmcsIHdiYywg aW9fdHlwZSk7Cj4+Pj4+ICAgICAgIGVsc2UKPj4+Pj4gQEAgLTUxMzYsNyArNTEzMiw3IEBAIHN0 YXRpYyBpbnQgcHJlcGFyZV9hdG9taWNfd3JpdGVfYmVnaW4oc3RydWN0IGYyZnNfc2JfaW5mbyAq c2JpLAo+Pj4+PiAgICAgICBpbnQgZXJyID0gMDsKPj4+Pj4gICAgICAgYmxvY2tfdCBvcmlfYmxr X2FkZHIgPSBOVUxMX0FERFI7Cj4+Pj4+ICAgICAgIGJvb2wgY293X2hhc19yZXNlcnZlZF9ibG9j ayA9IGZhbHNlOwo+Pj4+PiAtICAgICBib29sIGFwcGVuZCA9ICgobG9mZl90KWluZGV4IDw8IFBB R0VfU0hJRlQpID49IGlfc2l6ZV9yZWFkKGlub2RlKTsKPj4+Pj4gKyAgICAgYm9vbCBhcHBlbmQg PSBGMkZTX0JMS19UT19CWVRFUyhzYmksIGluZGV4KSA+PSBpX3NpemVfcmVhZChpbm9kZSk7Cj4+ Pj4+Cj4+Pj4+ICAgICAgIC8qCj4+Pj4+ICAgICAgICAqIE9uIHRoZSBmaXJzdCBhdHRlbXB0LCBh biBhcHBlbmQgd3JpdGUgY2FuIHNraXAgdGhlIENPVyBsb29rdXAgYW5kCj4+Pj4+IEBAIC01MjI2 LDcgKzUyMjIsNyBAQCBzdGF0aWMgYm9vbCBmMmZzX2JhbGFuY2VfZnNfZm9saW9fbG9ja2VkKHN0 cnVjdCBmb2xpbyAqZm9saW8sCj4+Pj4+Cj4+Pj4+ICAgc3RhdGljIGludCBwcmVwYXJlX2xhcmdl X2ZvbGlvX3dyaXRlX2JlZ2luKHN0cnVjdCBpbm9kZSAqaW5vZGUsCj4+Pj4+ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBsb2ZmX3Qg cG9zLAo+Pj4+PiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWdu ZWQgaW50IGxlbikKPj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHVuc2lnbmVkIGludCBsZW4sIGJvb2wgKm5lZWRfYmFsYW5jZSkKPj4+Pj4gICB7Cj4+Pj4+ICAg ICAgIHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSA9IEYyRlNfSV9TQihpbm9kZSk7Cj4+Pj4+ICAg ICAgIHN0cnVjdCBmMmZzX2ZvbGlvX3N0YXRlICpmZnM7Cj4+Pj4+IEBAIC01MjM0LDkgKzUyMzAs MTMgQEAgc3RhdGljIGludCBwcmVwYXJlX2xhcmdlX2ZvbGlvX3dyaXRlX2JlZ2luKHN0cnVjdCBp bm9kZSAqaW5vZGUsCj4+Pj4+ICAgICAgIHNpemVfdCBuZWVkX29mZiA9IG9yaV9vZmY7Cj4+Pj4+ ICAgICAgIGludCBlcnIgPSAwOwo+Pj4+Pgo+Pj4+PiArICAgICBpZiAoZjJmc19oYXNfc3VicGFn ZV9ibG9ja3Moc2JpKSAmJgo+Pj4+PiArICAgICAgICAgKGYyZnNfY29tcHJlc3NlZF9maWxlKGlu b2RlKSB8fCBmMmZzX2lzX2F0b21pY19maWxlKGlub2RlKSkpCj4+Pj4+ICsgICAgICAgICAgICAg cmV0dXJuIC1FT1BOT1RTVVBQOwo+Pj4+PiArCj4+Pj4+ICAgICAgIC8qCj4+Pj4+IC0gICAgICAq IHdoZW4gdGhlIHdyaXRlIGRpZCBub3QgY29tZSB0aHJvdWdoIGYyZnNfd3JpdGVfaXRlciwgd2Ug cHJlYWxsb2NhdGUgYWxsCj4+Pj4+IC0gICAgICAqIGJsb2NrcyBpbiB0aGUgd3JpdGUgcmFuZ2Ug aGVyZS4KPj4+Pj4gKyAgICAgICogUmVzZXJ2ZSBibG9ja3Mgd2l0aG91dCBmMmZzX2JhbGFuY2Vf ZnMoKSBzaW5jZSB0aGUgZm9saW8gaXMgbG9ja2VkOwo+Pj4+PiArICAgICAgKiB0aGUgY2FsbGVy IGJhbGFuY2VzIGFmdGVyIHVubG9ja2luZyBpdCBpZiAqbmVlZF9iYWxhbmNlIGlzIHNldC4KPj4+ Pgo+Pj4+IEkgdGhpbmsgdGhlcmUgaXMgcG90ZW50aWFsIHJpc2sgaWYgd2UgZG9uJ3QgYWxsb3cg dW5sb2NrIC0+IGYyZnNfYmFsYW5jZV9mcywgZS5nLgo+Pj4+IG11bHRpcGxlIHRocmVhZHMgY2Fs bCB3cml0ZV9iZWdpbiB0byB3cml0ZSBoaWdoIG9yZGVyIGxhcmdlIGZvbGlvIGNvbmN1cnJlbnRs eSB3aWxsCj4+Pj4gY29uc3VtZSBmcmVlIGJsb2NrcyBxdWlja2x5LCBpdCBtYXkgcnVuIG91dCBv ZiBmcmVlIHNlZ21lbnRzIHBvdGVudGlhbGx5IHcvbyBmZ2djLgo+Pj4+IHRob3VnaHRzPwo+Pj4K Pj4+IGYyZnNfYmFsYW5jZV9mcygpIGlzIHN0aWxsIGNhbGxlZC4gZjJmc193cml0ZV9iZWdpbigp IGNhbGxzCj4+PiBmMmZzX2JhbGFuY2VfZnNfZm9saW9fbG9ja2VkKCkgcmlnaHQgYWZ0ZXIgdGhp cywgd2hpY2ggdW5sb2NrcyB0aGUKPj4+IGZvbGlvLCBjYWxscyBmMmZzX2JhbGFuY2VfZnMoKSBh bmQgbG9ja3MgaXQgYWdhaW4sIHVuZGVyIHRoZSBzYW1lCj4+PiBjb25kaXRpb24gKG5vZGVfY2hh bmdlZCkgYXMgYmVmb3JlLiBJdCBpcyBvbmx5IG1vdmVkIHRvIHRoZSBjYWxsZXIsIHNvCj4+PiB0 aGF0IHRoZSBvcmRlci0wIGFuZCBtdWx0aS1ibG9jayBwYXRocyBiYWxhbmNlIGluIG9uZSBwbGFj ZS4gSSB3aWxsCj4+PiBtYWtlIHRoZSBjb21tZW50IGNsZWFyZXIgaW4gdjIuCj4+Cj4+IEFjdHVh bGx5LCB3aGF0IEkgbWVhbnQgaXMgaXQgY2hhbmdlZAo+PiBmcm9tIGEuIG9uZSBmMmZzX2JhbGFu Y2VfZnMoKSBhZnRlciBvbmUgX19yZXNlcnZlX2RhdGFfYmxvY2soKQo+PiB0byBiLiBvbmUgZjJm c19iYWxhbmNlX2ZzKCkgYWZ0ZXIgaW4tYmF0Y2ggX19yZXNlcnZlX2RhdGFfYmxvY2soKQo+Pgo+ PiBTbyBpbiBoaWdoIG9yZGVyIGxhcmdlIGZvbGlvLCBpbiBwcmVwYXJlX2xhcmdlX2ZvbGlvX3dy aXRlX2JlZ2luKCkgd2UgbWF5IHJlc2VydmUKPj4gaHVuZHJlZHMgb2YgYmxvY2tzLCBhbmQgdGhl biBhIGZvbGxvd2luZyBmMmZzX2JhbGFuY2VfZnMoKSwgd2hpY2ggbWF5IGJlIGxhdGUsCj4+IGVz cGVjaWFsbHkgaW4gYSBzbWFsbCBzaXplIGltYWdlLCBtdXRsaXBsZSB0aHJlYWRzIHdyaXRlIGhp Z2ggb3JkZXIgZm9saW8gY29uY3VycmVudGx5LAo+PiBpdCBtYXkgcnVuIG91dCBvZiBmcmVlIHNl Y3Rpb24sIGR1ZSB0byB3ZSBtaXNzZWQgdG8gY2FsbCBmMmZzX2JhbGFuY2VfZnMoKSBpbiB0aW1l Pwo+Pgo+PiBUaGFua3MsCj4+Cj4gCj4gSSBzZWUsIHlvdSdyZSByaWdodC4gSXQgd2FzIGNoYW5n ZWQgYmVjYXVzZSBmMmZzX3ZtX3BhZ2VfbWt3cml0ZSgpIGFsc28KPiBjYWxscyBwcmVwYXJlX2xh cmdlX2ZvbGlvX3dyaXRlX2JlZ2luKCkgd2l0aCBzdWJwYWdlIGJsb2NrcywgYW5kIGl0IGNhbgo+ IG5laXRoZXIgdW5sb2NrIHRoZSBmb2xpbyBub3IgcmV0dXJuIC1FQUdBSU4gdGhlcmUuIEl0IGNh bGxzCj4gZjJmc19iYWxhbmNlX2ZzKCkgYmVmb3JlIGxvY2tpbmcgdGhlIGZvbGlvLCBhcyBiZWZv cmUuCgpBbHJpZ2h0LCB3aWxsIHdlIHN1ZmZlciBhbnkgaXNzdWUgb25jZSB3ZSB1bmxvY2sgZm9s aW8gLT4gYmFsYW5jZV9mcyAtPiBsb2NrIGZvbGlvCi0+IGNvbnRpbnVlPwoKTWF5YmUgd2UgbmVl ZCB0byBkbyBzb21lIHRlc3RzIG9uIHRoaXMgbWt3cml0ZSBjYXNlIHcvIGJlbG93IHNjZW5hcmlv IHRvIGNoZWNrIHdoZXRoZXIKdGhlcmUgaXMgcG90ZW50aWFsIEVOT1NQQyBpc3N1ZSBhcyB3ZWxs OgotIDRrIGJsb2NrICsgMTZrIHBhZ2UgKyBtYXliZSBlbmFibGUgbGFyZ2UgZm9saW8gYW5kIHVu bGltaXQgbWF4IG9yZGVyCi0gc21hbGwgc2l6ZWQgaW1hZ2UKLSBsZXNzIGZyZWUgc2VjdGlvbgot IG11bHRpcGxlIHRocmVhZHMgY2FsbCBta3dyaXRlIGNvbmN1cnJlbnRseQoKPiAKPiBCdXQgdGhl cmUgaXMgbm8gcmVhc29uIHRvIGNoYW5nZSBpdCBmb3Igd3JpdGVfYmVnaW4uIEluIHYyLCBJJ2xs IGNhbGwKPiBmMmZzX2JhbGFuY2VfZnNfZm9saW9fbG9ja2VkKCkgYWZ0ZXIgZWFjaCBfX3Jlc2Vy dmVfZGF0YV9ibG9jaygpIGFnYWluIHdoZW4KPiBpdCBpcyBjYWxsZWQgZnJvbSBmMmZzX3dyaXRl X2JlZ2luKCksIGFuZCBza2lwIGl0IG9ubHkgZm9yIHBhZ2VfbWt3cml0ZS4KCkl0IG1ha2VzIHNl bnNlIHRvIG1lLgoKVGhhbmtzLAoKPiAKPiBUaGFua3MsCj4gCj4+Pgo+Pj4gVGhhbmtzLAo+Pj4K Pj4+Pgo+Pj4+IFRoYW5rcywKPj4+Pgo+Pj4+PiAgICAgICAgKi8KPj4+Pj4gICAgICAgaWYgKCFp c19pbm9kZV9mbGFnX3NldChpbm9kZSwgRklfUFJFQUxMT0NBVEVEX0FMTCkgJiYKPj4+Pj4gICAg ICAgICAgICFJU19ERVZJQ0VfQUxJQVNJTkcoaW5vZGUpKSB7Cj4+Pj4+IEBAIC01MjUyLDkgKzUy NTIsNyBAQCBzdGF0aWMgaW50IHByZXBhcmVfbGFyZ2VfZm9saW9fd3JpdGVfYmVnaW4oc3RydWN0 IGlub2RlICppbm9kZSwKPj4+Pj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICZub2RlX2NoYW5nZWQpOwo+Pj4+PiAgICAgICAgICAgICAgICAgICAgICAg aWYgKGVycikKPj4+Pj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsK Pj4+Pj4gLSAgICAgICAgICAgICAgICAgICAgIGlmIChmMmZzX2JhbGFuY2VfZnNfZm9saW9fbG9j a2VkKGZvbGlvLCBmb2xpby0+bWFwcGluZywKPj4+Pj4gLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVfY2hhbmdlZCkpCj4+Pj4+IC0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOwo+Pj4+PiArICAgICAgICAgICAgICAg ICAgICAgKm5lZWRfYmFsYW5jZSB8PSBub2RlX2NoYW5nZWQ7Cj4+Pj4+ICAgICAgICAgICAgICAg fQo+Pj4+PiAgICAgICB9Cj4+Pj4+Cj4+Pj4+IEBAIC01MjY2LDggKzUyNjQsMTIgQEAgc3RhdGlj IGludCBwcmVwYXJlX2xhcmdlX2ZvbGlvX3dyaXRlX2JlZ2luKHN0cnVjdCBpbm9kZSAqaW5vZGUs Cj4+Pj4+ICAgICAgIGlmIChmb2xpb190ZXN0X3VwdG9kYXRlKGZvbGlvKSB8fCBsZW4gPT0gZm9s aW9fc2l6ZShmb2xpbykpCj4+Pj4+ICAgICAgICAgICAgICAgcmV0dXJuIDA7Cj4+Pj4+Cj4+Pj4+ ICsgICAgIC8qCj4+Pj4+ICsgICAgICAqIFNraXAgcmVhZCBpZiB0aGUgd3JpdGUgc3RhcnRzIGF0 IGEgYmxvY2sgYm91bmRhcnkgYW5kIHJlYWNoZXMgRU9GLAo+Pj4+PiArICAgICAgKiBhbmQgemVy byB0aGUgcmVzdCBvZiB0aGUgZm9saW8gaW5zdGVhZC4KPj4+Pj4gKyAgICAgICovCj4+Pj4+ICAg ICAgIGlmICghZjJmc192ZXJpdHlfaW5fcHJvZ3Jlc3MoaW5vZGUpICYmCj4+Pj4+IC0gICAgICAg ICAhKHBvcyAmIChQQUdFX1NJWkUgLSAxKSkgJiYgKHBvcyArIGxlbikgPj0gaV9zaXplX3JlYWQo aW5vZGUpKSB7Cj4+Pj4+ICsgICAgICAgICAhKHBvcyAmIChGMkZTX0JMS1NJWkUoc2JpKSAtIDEp KSAmJiAocG9zICsgbGVuKSA+PSBpX3NpemVfcmVhZChpbm9kZSkpIHsKPj4+Pj4gICAgICAgICAg ICAgICBzaXplX3Qgem9mZiA9IG9yaV9vZmYgKyBsZW47Cj4+Pj4+Cj4+Pj4+ICAgICAgICAgICAg ICAgaWYgKHpvZmYgPCBmb2xpb19zaXplKGZvbGlvKSkKPj4+Pj4gQEAgLTUyODEsNyArNTI4Myw4 IEBAIHN0YXRpYyBpbnQgcHJlcGFyZV9sYXJnZV9mb2xpb193cml0ZV9iZWdpbihzdHJ1Y3QgaW5v ZGUgKmlub2RlLAo+Pj4+PiAgICAgICB3aGlsZSAoZmluZF9uZXh0X3ZhbGlkX2Jsb2NrKGZvbGlv LCBvcmlfb2ZmLAo+Pj4+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZWVk X29mZiwgbGVuKSkgewo+Pj4+PiAgICAgICAgICAgICAgIHN0cnVjdCBkbm9kZV9vZl9kYXRhIGRu Owo+Pj4+PiAtICAgICAgICAgICAgIHBnb2ZmX3QgaW5kZXggPSBmb2xpby0+aW5kZXggKyAobmVl ZF9vZmYgPj4gUEFHRV9TSElGVCk7Cj4+Pj4+ICsgICAgICAgICAgICAgcGdvZmZfdCBpbmRleCA9 IGYyZnNfZm9saW9fbGJsayhzYmksIGZvbGlvKSArCj4+Pj4+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIEYyRlNfQllURVNfVE9fQkxLKHNiaSwgbmVlZF9vZmYpOwo+Pj4+PiAgICAgICAg ICAgICAgIGJsb2NrX3QgYmxrYWRkcjsKPj4+Pj4KPj4+Pj4gICAgICAgICAgICAgICBpZiAoIWYy ZnNfbG9va3VwX3JlYWRfZXh0ZW50X2NhY2hlX2Jsb2NrKGlub2RlLCBpbmRleCwKPj4+Pj4gQEAg LTUyOTcsMTIgKzUzMDAsMTMgQEAgc3RhdGljIGludCBwcmVwYXJlX2xhcmdlX2ZvbGlvX3dyaXRl X2JlZ2luKHN0cnVjdCBpbm9kZSAqaW5vZGUsCj4+Pj4+ICAgICAgICAgICAgICAgICAgICAgICBm MmZzX3B1dF9kbm9kZSgmZG4pOwo+Pj4+Pgo+Pj4+PiAgICAgICAgICAgICAgICAgICAgICAgaWYg KGJsa2FkZHIgPT0gTkVXX0FERFIpIHsKPj4+Pj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgc2l6ZV90IG9mZiA9IG9mZnNldF9pbl9mb2xpbyhmb2xpbywKPj4+Pj4gLSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9mZl90KWlu ZGV4IDw8IFBBR0VfU0hJRlQpOwo+Pj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz aXplX3Qgb2ZmID0gZjJmc19mb2xpb19ieXRlX29mZnNldChzYmksCj4+Pj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9saW8s IGluZGV4KTsKPj4+Pj4KPj4+Pj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9saW9f emVyb19zZWdtZW50KGZvbGlvLCBvZmYsIG9mZiArIFBBR0VfU0laRSk7Cj4+Pj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGZvbGlvX3plcm9fc2VnbWVudChmb2xpbywgb2ZmLAo+Pj4+ PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICsg RjJGU19CTEtTSVpFKHNiaSkpOwo+Pj4+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBm MmZzX2Zmc19tYXJrX3N1YnJhbmdlX3VwdG9kYXRlKGZvbGlvLCBvZmYsCj4+Pj4+IC0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdF X1NJWkUpOwo+Pj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgRjJGU19CTEtTSVpFKHNiaSkpOwo+Pj4+PiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBjb250aW51ZTsKPj4+Pj4gICAgICAgICAgICAgICAgICAgICAgIH0K Pj4+Pj4gICAgICAgICAgICAgICB9Cj4+Pj4+IEBAIC01NDAxLDEyICs1NDA1LDE4IEBAIHN0YXRp YyBpbnQgZjJmc193cml0ZV9iZWdpbihjb25zdCBzdHJ1Y3Qga2lvY2IgKmlvY2IsCj4+Pj4+ICAg ICAgICAgICAgICAgZ290byBmYWlsOwo+Pj4+PiAgICAgICB9Cj4+Pj4+Cj4+Pj4+ICsgICAgIGlm IChmMmZzX2hhc19zdWJwYWdlX2Jsb2NrcyhzYmkpICYmCj4+Pj4+ICsgICAgICAgICAoZjJmc19j b21wcmVzc2VkX2ZpbGUoaW5vZGUpIHx8IGYyZnNfaXNfYXRvbWljX2ZpbGUoaW5vZGUpKSkgewo+ Pj4+PiArICAgICAgICAgICAgIGVyciA9IC1FT1BOT1RTVVBQOwo+Pj4+PiArICAgICAgICAgICAg IGdvdG8gZmFpbDsKPj4+Pj4gKyAgICAgfQo+Pj4+PiArCj4+Pj4+ICAgICAgIC8qCj4+Pj4+ICAg ICAgICAqIFdlIHNob3VsZCBjaGVjayB0aGlzIGF0IHRoaXMgbW9tZW50IHRvIGF2b2lkIGRlYWRs b2NrIG9uIGlub2RlIHBhZ2UKPj4+Pj4gICAgICAgICogYW5kICMwIHBhZ2UuIFRoZSBsb2NraW5n IHJ1bGUgZm9yIGlubGluZV9kYXRhIGNvbnZlcnNpb24gc2hvdWxkIGJlOgo+Pj4+PiAgICAgICAg KiBmb2xpb19sb2NrKGZvbGlvICMwKSAtPiBmb2xpb19sb2NrKGlub2RlX3BhZ2UpCj4+Pj4+ICAg ICAgICAqLwo+Pj4+PiAtICAgICBpZiAoaW5kZXggIT0gMCkgewo+Pj4+PiArICAgICBpZiAoaW5k ZXggIT0gMCB8fCBmMmZzX2hhc19zdWJwYWdlX2Jsb2NrcyhzYmkpKSB7Cj4+Pj4+ICAgICAgICAg ICAgICAgZXJyID0gZjJmc19jb252ZXJ0X2lubGluZV9pbm9kZShpbm9kZSk7Cj4+Pj4+ICAgICAg ICAgICAgICAgaWYgKGVycikKPj4+Pj4gICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsK Pj4+Pj4gQEAgLTU0NjksMTcgKzU0NzksMTkgQEAgc3RhdGljIGludCBmMmZzX3dyaXRlX2JlZ2lu KGNvbnN0IHN0cnVjdCBraW9jYiAqaW9jYiwKPj4+Pj4gICAgICAgICovCj4+Pj4+ICAgICAgIGYy ZnNfZm9saW9fd2FpdF93cml0ZWJhY2soZm9saW8sIGZhbHNlLCB0cnVlKTsKPj4+Pj4KPj4+Pj4g LSAgICAgaWYgKGYyZnNfaXNfYXRvbWljX2ZpbGUoaW5vZGUpICYmICFmb2xpb190ZXN0X2xhcmdl KGZvbGlvKSkKPj4+Pj4gKyAgICAgaWYgKGYyZnNfaXNfYXRvbWljX2ZpbGUoaW5vZGUpICYmICFm MmZzX2lzX211bHRpYmxvY2tfZm9saW8oc2JpLCBmb2xpbykpIHsKPj4+Pj4gICAgICAgICAgICAg ICBlcnIgPSBwcmVwYXJlX2F0b21pY193cml0ZV9iZWdpbihzYmksIGlub2RlLCBmb2xpby0+aW5k ZXgsCj4+Pj4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsa2FkZHIs ICZuZWVkX2JhbGFuY2UsIHJldHJpZWQpOwo+Pj4+PiAtICAgICBlbHNlIGlmICghZm9saW9fdGVz dF9sYXJnZShmb2xpbykpCj4+Pj4+ICsgICAgIH0gZWxzZSBpZiAoIWYyZnNfaXNfbXVsdGlibG9j a19mb2xpbyhzYmksIGZvbGlvKSkgewo+Pj4+PiAgICAgICAgICAgICAgIGVyciA9IHByZXBhcmVf d3JpdGVfYmVnaW4oc2JpLCBmb2xpbywgcG9zLCBibGVuLAo+Pj4+PiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICZibGthZGRyLCAmbmVlZF9iYWxhbmNlKTsKPj4+Pj4gLSAg ICAgZWxzZSBpZiAoZjJmc19pc19hdG9taWNfZmlsZShpbm9kZSkpCj4+Pj4+ICsgICAgIH0gZWxz ZSBpZiAoZjJmc19pc19hdG9taWNfZmlsZShpbm9kZSkpIHsKPj4+Pj4gICAgICAgICAgICAgICBl cnIgPSBwcmVwYXJlX2xhcmdlX2ZvbGlvX2F0b21pY193cml0ZV9iZWdpbihpbm9kZSwKPj4+Pj4g ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nLCBmb2xpbywgcG9z LCBsZW4sIHJldHJpZWQpOwo+Pj4+PiAtICAgICBlbHNlCj4+Pj4+IC0gICAgICAgICAgICAgZXJy ID0gcHJlcGFyZV9sYXJnZV9mb2xpb193cml0ZV9iZWdpbihpbm9kZSwgZm9saW8sIHBvcywgYmxl bik7Cj4+Pj4+ICsgICAgIH0gZWxzZSB7Cj4+Pj4+ICsgICAgICAgICAgICAgZXJyID0gcHJlcGFy ZV9sYXJnZV9mb2xpb193cml0ZV9iZWdpbihpbm9kZSwgZm9saW8sIHBvcywgYmxlbiwKPj4+Pj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZWVk X2JhbGFuY2UpOwo+Pj4+PiArICAgICB9Cj4+Pj4+ICAgICAgIGlmIChlcnIpIHsKPj4+Pj4gICAg ICAgICAgICAgICBpZiAoZXJyID09IC1FQUdBSU4pIHsKPj4+Pj4gICAgICAgICAgICAgICAgICAg ICAgIHJldHJpZWQgPSB0cnVlOwo+Pj4+PiBAQCAtNTQ5NSw3ICs1NTA3LDcgQEAgc3RhdGljIGlu dCBmMmZzX3dyaXRlX2JlZ2luKGNvbnN0IHN0cnVjdCBraW9jYiAqaW9jYiwKPj4+Pj4gICAgICAg ICAgICAgICBnb3RvIHJlcGVhdDsKPj4+Pj4gICAgICAgfQo+Pj4+Pgo+Pj4+PiAtICAgICBpZiAo Zm9saW9fdGVzdF9sYXJnZShmb2xpbykpCj4+Pj4+ICsgICAgIGlmIChmMmZzX2lzX211bHRpYmxv Y2tfZm9saW8oc2JpLCBmb2xpbykpCj4+Pj4+ICAgICAgICAgICAgICAgcmV0dXJuIDA7Cj4+Pj4+ Cj4+Pj4+ICAgICAgIGlmIChibGVuID09IGZvbGlvX3NpemUoZm9saW8pIHx8IGZvbGlvX3Rlc3Rf dXB0b2RhdGUoZm9saW8pKQo+Pj4+PiBAQCAtNTU2NSw3ICs1NTc3LDcgQEAgc3RhdGljIGludCBm MmZzX3dyaXRlX2VuZChjb25zdCBzdHJ1Y3Qga2lvY2IgKmlvY2IsCj4+Pj4+ICAgICAgIGlmICgh Zm9saW9fdGVzdF91cHRvZGF0ZShmb2xpbykpIHsKPj4+Pj4gICAgICAgICAgICAgICBpZiAodW5s aWtlbHkoY29waWVkICE9IGxlbikpIHsKPj4+Pj4gICAgICAgICAgICAgICAgICAgICAgIGNvcGll ZCA9IDA7Cj4+Pj4+IC0gICAgICAgICAgICAgfSBlbHNlIGlmIChmb2xpb190ZXN0X2xhcmdlKGZv bGlvKSkgewo+Pj4+PiArICAgICAgICAgICAgIH0gZWxzZSBpZiAoZjJmc19pc19tdWx0aWJsb2Nr X2ZvbGlvKEYyRlNfSV9TQihpbm9kZSksIGZvbGlvKSkgewo+Pj4+PiAgICAgICAgICAgICAgICAg ICAgICAgZjJmc19mZnNfbWFya19zdWJyYW5nZV91cHRvZGF0ZShmb2xpbywKPj4+Pj4gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfaW5fZm9saW8oZm9saW8sIHBv cyksIGxlbik7Cj4+Pj4+ICAgICAgICAgICAgICAgfSBlbHNlIHsKPj4+Pj4gQEAgLTU1OTAsNyAr NTYwMiw3IEBAIHN0YXRpYyBpbnQgZjJmc193cml0ZV9lbmQoY29uc3Qgc3RydWN0IGtpb2NiICpp b2NiLAo+Pj4+PiAgICAgICBpZiAoIWNvcGllZCkKPj4+Pj4gICAgICAgICAgICAgICBnb3RvIHVu bG9ja19vdXQ7Cj4+Pj4+Cj4+Pj4+IC0gICAgIGlmIChmb2xpb190ZXN0X2xhcmdlKGZvbGlvKSkK Pj4+Pj4gKyAgICAgaWYgKGYyZnNfaXNfbXVsdGlibG9ja19mb2xpbyhGMkZTX0lfU0IoaW5vZGUp LCBmb2xpbykpCj4+Pj4+ICAgICAgICAgICAgICAgZjJmc19mZnNfbWFya19zdWJyYW5nZV9kaXJ0 eShmb2xpbywgb2Zmc2V0X2luX2ZvbGlvKGZvbGlvLCBwb3MpLAo+Pj4+PiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcGll ZCk7Cj4+Pj4+ICAgICAgIGZvbGlvX21hcmtfZGlydHkoZm9saW8pOwo+Pj4+PiBAQCAtNTY0Miw2 ICs1NjU0LDkgQEAgdm9pZCBmMmZzX2ludmFsaWRhdGVfZm9saW8oc3RydWN0IGZvbGlvICpmb2xp bywgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbmd0aCkKPj4+Pj4gICAgICAgICAgICAgICAgKiBk aXJ0eSBzdGF0ZS4KPj4+Pj4gICAgICAgICAgICAgICAgKi8KPj4+Pj4gICAgICAgICAgICAgICBp ZiAoIWRpcnR5ICYmIGZvbGlvX3Rlc3RfZGlydHkoZm9saW8pKSB7Cj4+Pj4+ICsgICAgICAgICAg ICAgICAgICAgICBpbm9kZV9zdWJfZGlydHlfYmxvY2tzKGlub2RlLAo+Pj4+PiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYyZnNfYmxvY2tzX3Blcl9mb2xpbyhzYmksIGZv bGlvKSk7Cj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICBmMmZzX3JlbW92ZV9kaXJ0eV9pbm9k ZShpbm9kZSk7Cj4+Pj4+ICAgICAgICAgICAgICAgICAgICAgICBmMmZzX2NsZWFyX3BhZ2VfY2Fj aGVfZGlydHlfdGFnKGZvbGlvKTsKPj4+Pj4gICAgICAgICAgICAgICAgICAgICAgIGZvbGlvX2Nh bmNlbF9kaXJ0eShmb2xpbyk7Cj4+Pj4+ICAgICAgICAgICAgICAgfQo+Pj4+PiBAQCAtNTY1MCwx MSArNTY2NSw4IEBAIHZvaWQgZjJmc19pbnZhbGlkYXRlX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9s aW8sIHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpCj4+Pj4+ICAgICAgICAgICAgICAgcmV0 dXJuOwo+Pj4+PiAgICAgICB9Cj4+Pj4+Cj4+Pj4+IC0gICAgIGlmIChmMmZzX2ZvbGlvX2hhc19m ZnMoZm9saW8pKSB7Cj4+Pj4+IC0gICAgICAgICAgICAgZjJmc19mZnNfY2xlYXJfc3VicmFuZ2Vf ZGlydHlfYW5kX3Rlc3QoZm9saW8sIDAsCj4+Pj4+IC0gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGlvX3NpemUoZm9saW8pKTsKPj4+Pj4gLSAg ICAgfSBlbHNlIGlmIChmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSkgewo+Pj4+PiAtICAgICAgICAg ICAgIGlub2RlX2RlY19kaXJ0eV9ibG9jayhpbm9kZSk7Cj4+Pj4+ICsgICAgIGlmIChmb2xpb190 ZXN0X2RpcnR5KGZvbGlvKSkgewo+Pj4+PiArICAgICAgICAgICAgIGlub2RlX3N1Yl9kaXJ0eV9i bG9ja3MoaW5vZGUsIGYyZnNfYmxvY2tzX3Blcl9mb2xpbyhzYmksIGZvbGlvKSk7Cj4+Pj4+ICAg ICAgICAgICAgICAgZjJmc19yZW1vdmVfZGlydHlfaW5vZGUoaW5vZGUpOwo+Pj4+PiAgICAgICB9 Cj4+Pj4+Cj4+Pj4+IGRpZmYgLS1naXQgYS9mcy9mMmZzL2Rpci5jIGIvZnMvZjJmcy9kaXIuYwo+ Pj4+PiBpbmRleCBhYTM1MTFjNmY4ZmUuLjdmNWRjMjM1NGEyNyAxMDA2NDQKPj4+Pj4gLS0tIGEv ZnMvZjJmcy9kaXIuYwo+Pj4+PiArKysgYi9mcy9mMmZzL2Rpci5jCj4+Pj4+IEBAIC05NzksOSAr OTc5LDkgQEAgdm9pZCBmMmZzX2RlbGV0ZV9lbnRyeShzdHJ1Y3QgZjJmc19kaXJfZW50cnkgKmRl bnRyeSwgdm9pZCAqZGVudHJ5X2Jsb2NrLAo+Pj4+PiAgICAgICAgICAgICAgIGlmICghZjJmc19o YXNfc3VicGFnZV9ibG9ja3Moc2JpKSkgewo+Pj4+PiAgICAgICAgICAgICAgICAgICAgICAgZm9s aW9fY2xlYXJfdXB0b2RhdGUoZm9saW8pOwo+Pj4+PiAgICAgICAgICAgICAgICAgICAgICAgZm9s aW9fZGV0YWNoX3ByaXZhdGUoZm9saW8pOwo+Pj4+PiAtICAgICAgICAgICAgICAgICAgICAgaW5v ZGVfZGVjX2RpcnR5X2Jsb2NrKGRpcik7Cj4+Pj4+ICAgICAgICAgICAgICAgfQo+Pj4+Pgo+Pj4+ PiArICAgICAgICAgICAgIGlub2RlX3N1Yl9kaXJ0eV9ibG9ja3MoZGlyLCBmMmZzX2Jsb2Nrc19w ZXJfZm9saW8oc2JpLCBmb2xpbykpOwo+Pj4+PiAgICAgICAgICAgICAgIGYyZnNfcmVtb3ZlX2Rp cnR5X2lub2RlKGRpcik7Cj4+Pj4+ICAgICAgIH0KPj4+Pj4gICBrZWVwX2RpcnR5Ogo+Pj4+PiBk aWZmIC0tZ2l0IGEvZnMvZjJmcy9mMmZzLmggYi9mcy9mMmZzL2YyZnMuaAo+Pj4+PiBpbmRleCBj ZjcyOTQwNjg0MTUuLmFhYjEwOTVhZDVmZiAxMDA2NDQKPj4+Pj4gLS0tIGEvZnMvZjJmcy9mMmZz LmgKPj4+Pj4gKysrIGIvZnMvZjJmcy9mMmZzLmgKPj4+Pj4gQEAgLTQ0NTcsNyArNDQ1Nyw2IEBA IHZvaWQgZjJmc19yZW1vdmVfb3JwaGFuX2lub2RlKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSwg bmlkX3QgaW5vKTsKPj4+Pj4gICBpbnQgZjJmc19yZWNvdmVyX29ycGhhbl9pbm9kZXMoc3RydWN0 IGYyZnNfc2JfaW5mbyAqc2JpKTsKPj4+Pj4gICBpbnQgZjJmc19nZXRfdmFsaWRfY2hlY2twb2lu dChzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmkpOwo+Pj4+PiAgIHZvaWQgZjJmc191cGRhdGVfZGly dHlfZm9saW8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZvbGlvICpmb2xpbyk7Cj4+Pj4+ IC12b2lkIGYyZnNfYWNjb3VudF9kaXJ0eV9ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgaW50 IG5yKTsKPj4+Pj4gICB2b2lkIGYyZnNfcmVtb3ZlX2RpcnR5X2lub2RlKHN0cnVjdCBpbm9kZSAq aW5vZGUpOwo+Pj4+PiAgIGludCBmMmZzX3N5bmNfZGlydHlfaW5vZGVzKHN0cnVjdCBmMmZzX3Ni X2luZm8gKnNiaSwgZW51bSBpbm9kZV90eXBlIHR5cGUsCj4+Pj4+ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tX2Nw KTsKPj4+Pj4gZGlmZiAtLWdpdCBhL2ZzL2YyZnMvZmlsZS5jIGIvZnMvZjJmcy9maWxlLmMKPj4+ Pj4gaW5kZXggMWNlNDU1M2IxZDAxLi5iZTU0OGYzOWUzM2UgMTAwNjQ0Cj4+Pj4+IC0tLSBhL2Zz L2YyZnMvZmlsZS5jCj4+Pj4+ICsrKyBiL2ZzL2YyZnMvZmlsZS5jCj4+Pj4+IEBAIC01NTYxLDEy ICs1NTYxLDEzIEBAIHN0YXRpYyBpbnQgZjJmc19wcmVhbGxvY2F0ZV9ibG9ja3Moc3RydWN0IGtp b2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsCj4+Pj4+ICAgICAgICAgICAgICAgICAg ICAgICByZXR1cm4gcmV0Owo+Pj4+PiAgICAgICB9Cj4+Pj4+Cj4+Pj4+IC0gICAgIGlmICghZGlv ICYmIG1hcHBpbmdfbGFyZ2VfZm9saW9fc3VwcG9ydChpbm9kZS0+aV9tYXBwaW5nKSkgewo+Pj4+ PiArICAgICBpZiAoIWRpbyAmJiBmMmZzX2hhc19tdWx0aWJsb2NrX2ZvbGlvcyhpbm9kZSkpIHsK Pj4+Pj4gICAgICAgICAgICAgICAvKgo+Pj4+PiAtICAgICAgICAgICAgICAqIFByZWFsbG9jYXRl IGFsbCBibG9ja3MgdG91Y2hlZCBieSBhIGxhcmdlLWZvbGlvIGJ1ZmZlcmVkIHdyaXRlIHNvCj4+ Pj4+IC0gICAgICAgICAgICAgICogdGhlIHJlZ3VsYXIgd3JpdGVfYmVnaW4gcGF0aCBkb2VzIG5v dCBuZWVkIHRvIHVubG9jayB0aGUgZm9saW8gZm9yCj4+Pj4+IC0gICAgICAgICAgICAgICogZjJm c19iYWxhbmNlX2ZzKCkuICBSZWNoZWNraW5nIGxhcmdlLWZvbGlvIHN0YXRlIGFmdGVyIHVubG9j ayBpcwo+Pj4+PiAtICAgICAgICAgICAgICAqIHVucmVsaWFibGUgc2luY2UgcGFydGlhbCB0cnVu Y2F0aW9uIGNhbiBzcGxpdCB0aGUgZm9saW8uCj4+Pj4+ICsgICAgICAgICAgICAgICogUHJlYWxs b2NhdGUgYWxsIGJsb2NrcyB0b3VjaGVkIGJ5IGEgbXVsdGlibG9jay1mb2xpbyBidWZmZXJlZAo+ Pj4+PiArICAgICAgICAgICAgICAqIHdyaXRlIHNvIHRoZSByZWd1bGFyIHdyaXRlX2JlZ2luIHBh dGggZG9lcyBub3QgbmVlZCB0byB1bmxvY2sKPj4+Pj4gKyAgICAgICAgICAgICAgKiB0aGUgZm9s aW8gZm9yIGYyZnNfYmFsYW5jZV9mcygpLiAgUmVjaGVja2luZyBsYXJnZS1mb2xpbwo+Pj4+PiAr ICAgICAgICAgICAgICAqIHN0YXRlIGFmdGVyIHVubG9jayBpcyB1bnJlbGlhYmxlIHNpbmNlIHBh cnRpYWwgdHJ1bmNhdGlvbiBjYW4KPj4+Pj4gKyAgICAgICAgICAgICAgKiBzcGxpdCB0aGUgZm9s aW8uCj4+Pj4+ICAgICAgICAgICAgICAgICovCj4+Pj4+ICAgICAgICAgICAgICAgbWFwLm1fbGJs ayA9IEYyRlNfQllURVNfVE9fQkxLKHNiaSwgcG9zKTsKPj4+Pj4gICAgICAgICAgICAgICBtYXAu bV9sZW4gPSBGMkZTX0JMS19BTElHTihzYmksIHBvcyArIGNvdW50KTsKPj4+Pj4gZGlmZiAtLWdp dCBhL2ZzL2YyZnMvZ2MuYyBiL2ZzL2YyZnMvZ2MuYwo+Pj4+PiBpbmRleCA2YzI0MDAxMzI1YjIu LmYwNDFhMDM2ODM2ZSAxMDA2NDQKPj4+Pj4gLS0tIGEvZnMvZjJmcy9nYy5jCj4+Pj4+ICsrKyBi L2ZzL2YyZnMvZ2MuYwo+Pj4+PiBAQCAtMTYwOCwxMyArMTYwOCwxMiBAQCBzdGF0aWMgaW50IG1v dmVfZGF0YV9jYWNoZV9ibG9jayhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBibG9ja190IGJpZHgsIGlu dCBnY190eXBlLAo+Pj4+PiAgICAgICAgICAgICAgICAgICAgICAgZjJmc19mZnNfbWFya19zdWJy YW5nZV9kaXJ0eShmb2xpbywgZm9mZiwgRjJGU19CTEtTSVpFKHNiaSkpOwo+Pj4+PiAgICAgICAg ICAgICAgIGZvbGlvX21hcmtfZGlydHkoZm9saW8pOwo+Pj4+PiAgICAgICAgICAgICAgIGlmIChm b2xpb19jbGVhcl9kaXJ0eV9mb3JfaW8oZm9saW8pKSB7Cj4+Pj4+IC0gICAgICAgICAgICAgICAg ICAgICBpZiAoIWhhc19mZnMpIHsKPj4+Pj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg aW5vZGVfZGVjX2RpcnR5X2Jsb2NrKGlub2RlKTsKPj4+Pj4gLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZjJmc19yZW1vdmVfZGlydHlfaW5vZGUoaW5vZGUpOwo+Pj4+PiAtICAgICAgICAg ICAgICAgICAgICAgfSBlbHNlIGlmIChmMmZzX2Zmc19jbGVhcl9zdWJyYW5nZV9kaXJ0eV9hbmRf dGVzdChmb2xpbywKPj4+Pj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGZvZmYsIEYyRlNfQkxLU0laRShzYmkpKSkgewo+Pj4+PiArICAgICAgICAgICAgICAg ICAgICAgaW5vZGVfc3ViX2RpcnR5X2Jsb2Nrcyhpbm9kZSwgZjJmc19ibG9ja3NfcGVyX2ZvbGlv KHNiaSwgZm9saW8pKTsKPj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgIGYyZnNfcmVtb3ZlX2Rp cnR5X2lub2RlKGlub2RlKTsKPj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNfZmZz ICYmCj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgZjJmc19mZnNfY2xlYXJfc3VicmFu Z2VfZGlydHlfYW5kX3Rlc3QoZm9saW8sIGZvZmYsCj4+Pj4+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYyRlNfQkxLU0laRShzYmkpKSkKPj4+ Pj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9saW9fbWFya19kaXJ0eShmb2xpbyk7 Cj4+Pj4+IC0gICAgICAgICAgICAgICAgICAgICB9Cj4+Pj4+ICAgICAgICAgICAgICAgfQo+Pj4+ Pgo+Pj4+PiAgICAgICAgICAgICAgIGZvbGlvX3NldF9mMmZzX2djaW5nKGZvbGlvKTsKPj4+Pj4g ZGlmZiAtLWdpdCBhL2ZzL2YyZnMvaW5saW5lLmMgYi9mcy9mMmZzL2lubGluZS5jCj4+Pj4+IGlu ZGV4IGJhMGFmZjhlNTY0My4uNzU3YmU5ZjhkMDY5IDEwMDY0NAo+Pj4+PiAtLS0gYS9mcy9mMmZz L2lubGluZS5jCj4+Pj4+ICsrKyBiL2ZzL2YyZnMvaW5saW5lLmMKPj4+Pj4gQEAgLTE5NiwxMCAr MTk2LDE1IEBAIGludCBmMmZzX2NvbnZlcnRfaW5saW5lX2ZvbGlvKHN0cnVjdCBkbm9kZV9vZl9k YXRhICpkbiwgc3RydWN0IGZvbGlvICpmb2xpbykKPj4+Pj4gICAgICAgZm9saW9fc3RhcnRfd3Jp dGViYWNrKGZvbGlvKTsKPj4+Pj4gICAgICAgZmlvLm9sZF9ibGthZGRyID0gZG4tPmRhdGFfYmxr YWRkcjsKPj4+Pj4gICAgICAgc2V0X2lub2RlX2ZsYWcoZG4tPmlub2RlLCBGSV9IT1RfREFUQSk7 Cj4+Pj4+ICsgICAgIGlmIChmMmZzX2lzX211bHRpYmxvY2tfZm9saW8oZmlvLnNiaSwgZm9saW8p KSB7Cj4+Pj4+ICsgICAgICAgICAgICAgc3RydWN0IGYyZnNfZm9saW9fc3RhdGUgKmZmcyA9IGYy ZnNfZmZzX2ZpbmRfb3JfYWxsb2MoZm9saW8pOwo+Pj4+PiArCj4+Pj4+ICsgICAgICAgICAgICAg YXRvbWljX2luYygmZmZzLT53cml0ZV9ibG9ja3NfcGVuZGluZyk7Cj4+Pj4+ICsgICAgIH0KPj4+ Pj4gICAgICAgZjJmc19vdXRwbGFjZV93cml0ZV9kYXRhKGRuLCAmZmlvKTsKPj4+Pj4gICAgICAg ZjJmc19mb2xpb193YWl0X3dyaXRlYmFjayhmb2xpbywgdHJ1ZSwgdHJ1ZSk7Cj4+Pj4+ICAgICAg IGlmIChkaXJ0eSkgewo+Pj4+PiAtICAgICAgICAgICAgIGlub2RlX2RlY19kaXJ0eV9ibG9jayhk bi0+aW5vZGUpOwo+Pj4+PiArICAgICAgICAgICAgIGlub2RlX3N1Yl9kaXJ0eV9ibG9ja3MoZG4t Pmlub2RlLCBmMmZzX2Jsb2Nrc19wZXJfZm9saW8oZmlvLnNiaSwgZm9saW8pKTsKPj4+Pj4gICAg ICAgICAgICAgICBmMmZzX3JlbW92ZV9kaXJ0eV9pbm9kZShkbi0+aW5vZGUpOwo+Pj4+PiAgICAg ICB9Cj4+Pj4+Cj4+Pj4+IGRpZmYgLS1naXQgYS9mcy9mMmZzL25vZGUuYyBiL2ZzL2YyZnMvbm9k ZS5jCj4+Pj4+IGluZGV4IGM0OGIxMjIwOGUyMC4uYjk1YmI1YzI3YjBiIDEwMDY0NAo+Pj4+PiAt LS0gYS9mcy9mMmZzL25vZGUuYwo+Pj4+PiArKysgYi9mcy9mMmZzL25vZGUuYwo+Pj4+PiBAQCAt MTcwMCw3ICsxNzAwLDcgQEAgc3RhdGljIHZvaWQgZmx1c2hfaW5saW5lX2RhdGEoc3RydWN0IGYy ZnNfc2JfaW5mbyAqc2JpLCBuaWRfdCBpbm8pCj4+Pj4+ICAgICAgICAgICAgICAgZ290byBmb2xp b19vdXQ7Cj4+Pj4+Cj4+Pj4+ICAgICAgIHJldCA9IGYyZnNfd3JpdGVfaW5saW5lX2RhdGEoaW5v ZGUsIGZvbGlvKTsKPj4+Pj4gLSAgICAgaW5vZGVfZGVjX2RpcnR5X2Jsb2NrKGlub2RlKTsKPj4+ Pj4gKyAgICAgaW5vZGVfc3ViX2RpcnR5X2Jsb2Nrcyhpbm9kZSwgZjJmc19ibG9ja3NfcGVyX2Zv bGlvKHNiaSwgZm9saW8pKTsKPj4+Pj4gICAgICAgZjJmc19yZW1vdmVfZGlydHlfaW5vZGUoaW5v ZGUpOwo+Pj4+PiAgICAgICBpZiAocmV0KQo+Pj4+PiAgICAgICAgICAgICAgIGZvbGlvX21hcmtf ZGlydHkoZm9saW8pOwo+Pj4+Cj4+CgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCkxpbnV4LWYyZnMtZGV2ZWwgbWFpbGluZyBsaXN0CkxpbnV4LWYyZnMt ZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0Cmh0dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0 L2xpc3RzL2xpc3RpbmZvL2xpbnV4LWYyZnMtZGV2ZWwK