From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D2A46C63798 for ; Thu, 26 Nov 2020 05:05:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 742942173E for ; Thu, 26 Nov 2020 05:05:04 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="h/62M8sU" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387725AbgKZFEy (ORCPT ); Thu, 26 Nov 2020 00:04:54 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35036 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725846AbgKZFEy (ORCPT ); Thu, 26 Nov 2020 00:04:54 -0500 Received: from mail-lj1-x241.google.com (mail-lj1-x241.google.com [IPv6:2a00:1450:4864:20::241]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1F6D4C0613D4 for ; Wed, 25 Nov 2020 21:04:54 -0800 (PST) Received: by mail-lj1-x241.google.com with SMTP id o24so895162ljj.6 for ; Wed, 25 Nov 2020 21:04:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=mr3M1d7Ya09mmBd3mIMV36AOJTbJZ2AUv7On7VuvZMU=; b=h/62M8sU3UOxjLgc+vBM2+wz/Q84zR3ff4HEJtjVR03ogQykCuuLy3p9pfkxPD+NoY CCPytUNGT8YfiemZw2uUaKx+ueYkQhSpfjQJa7g/b84AbtS4dQyt2f0TSRwn3whjvIh1 9RevpJAuQg6m3YseXJaSq2bRMTlNwJwlat7tZI9SN9Zheenlt+NBGx70CyxlQhKs21fB sOiyakUT75dDpMe3Zke0sli6rm7VH1dpL/ziH9CssuYvQz8eZ9D6xapfhDD+BClcW388 qmodGWlPR1SUwEn2GYPiURHIFayPGE33Xdj8WCjqbby9flQ0uywpTZmi1bTc99gc3x3e HQYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=mr3M1d7Ya09mmBd3mIMV36AOJTbJZ2AUv7On7VuvZMU=; b=CAvsIhkpmvUl/EL9vsAORosR0aIBj9xwDE+peD1DSJJP3FtoSc09rtAlRH4o9N8k3j 19ynx8AoI0DFCFglQHnkA4uiXan9wdWfu7eh/Jy2jqH8+QtoozWUbpOBdU5COXtNS9Xk Wn0UIebC0fjpkE7xszpXEFGIDerAvArVjhOLj0eMGd7hbluuMD4+mlImuPsvxibBtkOz UXJbxkLeaXilthXdWIpP1a9C8+3r7SrpJ4q7zQazWQH/JIwZMR/FBdsy2t9hUo74BmCm H6iV4wlaM0OWSI5BF1vM9D80KzN1el9IPEFZedoczDhc/MdgfxyrmgEtO1SYIaFBKq5t NIjg== X-Gm-Message-State: AOAM5310Td+GKI3ptNdamh8Yc0uQOrz7+qi8r7XMx/bcXnDUxmpSOhN0 4U38tSTiZOdEoZy2EFDxaJ9VTHNGpSFvFfcNQec= X-Google-Smtp-Source: ABdhPJwjVuQc61XMORu7AUTTxJMiEc5ih+wtpxWk2GC1VJ+qApPujEh+mNysVmCrPMC4Rp5hsZK/8bxC6nag+l9vkkA= X-Received: by 2002:a2e:9707:: with SMTP id r7mr531976lji.265.1606367092479; Wed, 25 Nov 2020 21:04:52 -0800 (PST) MIME-Version: 1.0 References: <20201123031751.36811-1-daeho43@gmail.com> <20201123031751.36811-2-daeho43@gmail.com> <5b3cb83d-5d0f-c1ca-2cff-f28372dec48e@huawei.com> In-Reply-To: <5b3cb83d-5d0f-c1ca-2cff-f28372dec48e@huawei.com> From: Daeho Jeong Date: Thu, 26 Nov 2020 14:04:41 +0900 Message-ID: Subject: Re: [f2fs-dev] [PATCH 2/2] f2fs: add F2FS_IOC_DECOMPRESS_FILE and F2FS_IOC_COMPRESS_FILE To: Chao Yu Cc: linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, kernel-team@android.com, Daeho Jeong Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Eric, do_page_cache_ra() is defined in mm/internal.h for internal use between in mm, so we cannot use this one right now. So, I think we could use page_cache_ra_unbounded(), because we already check i_size boundary on our own. What do you think? 2020=EB=85=84 11=EC=9B=94 24=EC=9D=BC (=ED=99=94) =EC=98=A4=ED=9B=84 12:05,= Chao Yu =EB=8B=98=EC=9D=B4 =EC=9E=91=EC=84=B1: > > On 2020/11/23 11:17, Daeho Jeong wrote: > > From: Daeho Jeong > > > > Added two ioctl to decompress/compress explicitly the compression > > enabled file in "compress_mode=3Duser-based" mount option. > > > > Using these two ioctls, the users can make a control of compression > > and decompression of their files. > > > > Signed-off-by: Daeho Jeong > > --- > > fs/f2fs/file.c | 181 +++++++++++++++++++++++++++++++++++++= - > > include/uapi/linux/f2fs.h | 2 + > > 2 files changed, 182 insertions(+), 1 deletion(-) > > > > diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c > > index be8db06aca27..e8f142470e87 100644 > > --- a/fs/f2fs/file.c > > +++ b/fs/f2fs/file.c > > @@ -4026,6 +4026,180 @@ static int f2fs_ioc_set_compress_option(struct = file *filp, unsigned long arg) > > return ret; > > } > > > > +static int redirty_blocks(struct inode *inode, pgoff_t page_idx, int l= en) > > +{ > > + DEFINE_READAHEAD(ractl, NULL, inode->i_mapping, page_idx); > > + struct f2fs_sb_info *sbi =3D F2FS_I_SB(inode); > > + struct address_space *mapping =3D inode->i_mapping; > > + struct page *page; > > + pgoff_t redirty_idx =3D page_idx; > > + int i, page_len =3D 0, ret =3D 0; > > + > > + page_cache_ra_unbounded(&ractl, len, 0); > > + > > + for (i =3D 0; i < len; i++, page_idx++) { > > + page =3D read_cache_page(mapping, page_idx, NULL, NULL); > > + if (IS_ERR(page)) { > > + ret =3D PTR_ERR(page); > > + f2fs_warn(sbi, "%s: inode (%lu) : page_index (%lu= ) " > > + "couldn't be read (errno:%d).\n", > > + __func__, inode->i_ino, page_idx, ret); > > This is a common error case during calling read_cache_page(), IMO, this l= ooks > more like a debug log, so I prefer to print nothing here, or at least usi= ng > f2fs_debug() instead. > > > + break; > > + } > > + page_len++; > > + } > > + > > + for (i =3D 0; i < page_len; i++, redirty_idx++) { > > + page =3D find_lock_page(mapping, redirty_idx); > > + if (!page) { > > + ret =3D -ENOENT; > > + f2fs_warn(sbi, "%s: inode (%lu) : page_index (%lu= ) " > > + "couldn't be found (errno:%d).\n", > > + __func__, inode->i_ino, redirty_idx, ret)= ; > > Ditto. > > > + } > > + set_page_dirty(page); > > + f2fs_put_page(page, 1); > > + f2fs_put_page(page, 0); > > + } > > + > > + return ret; > > +} > > + > > +static int f2fs_ioc_decompress_file(struct file *filp, unsigned long a= rg) > > +{ > > + struct inode *inode =3D file_inode(filp); > > + struct f2fs_sb_info *sbi =3D F2FS_I_SB(inode); > > + struct f2fs_inode_info *fi =3D F2FS_I(inode); > > + pgoff_t page_idx =3D 0, last_idx; > > + int cluster_size =3D F2FS_I(inode)->i_cluster_size; > > + int count, ret; > > + > > + if (!f2fs_sb_has_compression(sbi)) > > + return -EOPNOTSUPP; > > + > > + if (!(filp->f_mode & FMODE_WRITE)) > > + return -EBADF; > > + > > + if (!f2fs_compressed_file(inode)) > > + return -EINVAL; > > Before compressubg/decompressing file, should we check whether current in= ode's > compress algorithm backend is available in f2fs module? > > > + > > + f2fs_balance_fs(F2FS_I_SB(inode), true); > > + > > + file_start_write(filp); > > + inode_lock(inode); > > + > > + if (f2fs_is_mmap_file(inode)) { > > + ret =3D -EBUSY; > > + goto out; > > + } > > + > > + ret =3D filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_M= AX); > > + if (ret) > > + goto out; > > + > > + if (!atomic_read(&fi->i_compr_blocks)) > > + goto out; > > + > > + last_idx =3D DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE); > > + > > + count =3D last_idx - page_idx; > > + while (count) { > > + int len =3D min(cluster_size, count); > > + > > + ret =3D redirty_blocks(inode, page_idx, len); > > + > > unneeded blank line.. > > > + if (ret < 0) > > + break; > > + > > + page_idx +=3D len; > > + count -=3D len; > > Considering there isn't so many memory in low-end device, how about calli= ng > filemap_fdatawrite() to writeback cluster after redirty several clusters > or xxMB? > > > + } > > + > > + if (!ret) > > + ret =3D filemap_write_and_wait_range(inode->i_mapping, 0, > > + LLONG_MAX); > > + > > + if (!ret) { > > + stat_sub_compr_blocks(inode, atomic_read(&fi->i_compr_blo= cks)); > > + atomic_set(&fi->i_compr_blocks, 0); > > + f2fs_mark_inode_dirty_sync(inode, true); > > A little bit wired, why not failing cluster_may_compress() for user mode,= and > let writepages write cluster as raw blocks, in-where we can update i_comp= r_blocks > and global compr block stats correctly. > > > + } else { > > + f2fs_warn(sbi, "%s: The file might be partially decompres= sed " > > + "(errno=3D%d). Please delete the file.\n"= , > > + __func__, ret); > > + } > > +out: > > + inode_unlock(inode); > > + file_end_write(filp); > > + > > + return ret; > > +} > > + > > +static int f2fs_ioc_compress_file(struct file *filp, unsigned long arg= ) > > +{ > > + struct inode *inode =3D file_inode(filp); > > + struct f2fs_sb_info *sbi =3D F2FS_I_SB(inode); > > + pgoff_t page_idx =3D 0, last_idx; > > + int cluster_size =3D F2FS_I(inode)->i_cluster_size; > > + int count, ret; > > + > > + if (!f2fs_sb_has_compression(sbi)) > > + return -EOPNOTSUPP; > > + > > + if (!(filp->f_mode & FMODE_WRITE)) > > + return -EBADF; > > + > > + if (!f2fs_compressed_file(inode)) > > + return -EINVAL; > > algorithm backend check? > > > + > > + f2fs_balance_fs(F2FS_I_SB(inode), true); > > + > > + file_start_write(filp); > > + inode_lock(inode); > > + > > + if (f2fs_is_mmap_file(inode)) { > > + ret =3D -EBUSY; > > + goto out; > > + } > > + > > + ret =3D filemap_write_and_wait_range(inode->i_mapping, 0, LLONG_M= AX); > > + if (ret) > > + goto out; > > + > > + set_inode_flag(inode, FI_ENABLE_COMPRESS); > > + > > + last_idx =3D DIV_ROUND_UP(i_size_read(inode), PAGE_SIZE); > > + > > + count =3D last_idx - page_idx; > > + while (count) { > > + int len =3D min(cluster_size, count); > > + > > + ret =3D redirty_blocks(inode, page_idx, len); > > + > > Ditto. > > Thanks, > > > + if (ret < 0) > > + break; > > + > > + page_idx +=3D len; > > + count -=3D len; > > + } > > + > > + if (!ret) > > + ret =3D filemap_write_and_wait_range(inode->i_mapping, 0, > > + LLONG_MAX); > > + > > + clear_inode_flag(inode, FI_ENABLE_COMPRESS); > > + > > + if (ret) > > + f2fs_warn(sbi, "%s: The file might be partially compresse= d " > > + "(errno=3D%d). Please delete the file.\n"= , > > + __func__, ret); > > +out: > > + inode_unlock(inode); > > + file_end_write(filp); > > + > > + return ret; > > +} > > + > > static long __f2fs_ioctl(struct file *filp, unsigned int cmd, unsigne= d long arg) > > { > > switch (cmd) { > > @@ -4113,6 +4287,10 @@ static long __f2fs_ioctl(struct file *filp, unsi= gned int cmd, unsigned long arg) > > return f2fs_ioc_get_compress_option(filp, arg); > > case F2FS_IOC_SET_COMPRESS_OPTION: > > return f2fs_ioc_set_compress_option(filp, arg); > > + case F2FS_IOC_DECOMPRESS_FILE: > > + return f2fs_ioc_decompress_file(filp, arg); > > + case F2FS_IOC_COMPRESS_FILE: > > + return f2fs_ioc_compress_file(filp, arg); > > default: > > return -ENOTTY; > > } > > @@ -4352,7 +4530,8 @@ long f2fs_compat_ioctl(struct file *file, unsigne= d int cmd, unsigned long arg) > > case F2FS_IOC_SEC_TRIM_FILE: > > case F2FS_IOC_GET_COMPRESS_OPTION: > > case F2FS_IOC_SET_COMPRESS_OPTION: > > - break; > > + case F2FS_IOC_DECOMPRESS_FILE: > > + case F2FS_IOC_COMPRESS_FILE: > > default: > > return -ENOIOCTLCMD; > > } > > diff --git a/include/uapi/linux/f2fs.h b/include/uapi/linux/f2fs.h > > index f00199a2e38b..352a822d4370 100644 > > --- a/include/uapi/linux/f2fs.h > > +++ b/include/uapi/linux/f2fs.h > > @@ -40,6 +40,8 @@ > > struct f2fs_comp_option) > > #define F2FS_IOC_SET_COMPRESS_OPTION _IOW(F2FS_IOCTL_MAGIC, 22= , \ > > struct f2fs_comp_option) > > +#define F2FS_IOC_DECOMPRESS_FILE _IO(F2FS_IOCTL_MAGIC, 23) > > +#define F2FS_IOC_COMPRESS_FILE _IO(F2FS_IOCTL_MAGIC, 24) > > > > /* > > * should be same as XFS_IOC_GOINGDOWN. > > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.5 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 42A5EC63777 for ; Thu, 26 Nov 2020 05:05:15 +0000 (UTC) Received: from lists.sourceforge.net (lists.sourceforge.net [216.105.38.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id AEC502173E; Thu, 26 Nov 2020 05:05:14 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=sourceforge.net header.i=@sourceforge.net header.b="fSwvEfiz"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=sf.net header.i=@sf.net header.b="jRCziC8f"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="h/62M8sU" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org AEC502173E Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=linux-f2fs-devel-bounces@lists.sourceforge.net Received: from [127.0.0.1] (helo=sfs-ml-2.v29.lw.sourceforge.com) by sfs-ml-2.v29.lw.sourceforge.com with esmtp (Exim 4.90_1) (envelope-from ) id 1ki9Sz-0000Ta-Cj; Thu, 26 Nov 2020 05:05:13 +0000 Received: from [172.30.20.202] (helo=mx.sourceforge.net) by sfs-ml-2.v29.lw.sourceforge.com with esmtps (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.90_1) (envelope-from ) id 1ki9Sx-0000TS-OZ for linux-f2fs-devel@lists.sourceforge.net; Thu, 26 Nov 2020 05:05:11 +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:Cc:To: Subject:Message-ID:Date:From:In-Reply-To:References:MIME-Version:Sender: Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender :Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=mr3M1d7Ya09mmBd3mIMV36AOJTbJZ2AUv7On7VuvZMU=; b=fSwvEfizweIbSmqIJbxRtfV9Ec LTvhxl4qkmiN+77REh3Qk/eIzSZsxy2xYOPdWojnGPNJoOG0f8RfMipPGwsVEdSqBa8bCP4m60Q6T mduODp+9S00LVySMW0Vw2o9LSrlsVPiUTKC2yHzbLqPE2kd7mB++31LR90eAo5qErjB4=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=Content-Transfer-Encoding:Content-Type:Cc:To:Subject:Message-ID:Date:From :In-Reply-To:References:MIME-Version:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=mr3M1d7Ya09mmBd3mIMV36AOJTbJZ2AUv7On7VuvZMU=; b=jRCziC8f5iSfCo+I9lW5RCGjBa 18nWcaLZPiYpkClM4JIR5Yqo/YGoKMctYTBatOu4iRh5UQRl2GJrR54mHWZ/cuLzFg0far7QeZR5A 8OA5drFGZPGnll73m7hM6XFfrJxilKuOIR92iETkgNk4AWl0Jj3nPjQlcDSObnxUvqu0=; Received: from mail-lj1-f193.google.com ([209.85.208.193]) by sfi-mx-1.v28.lw.sourceforge.com with esmtps (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.92.2) id 1ki9Ss-00Gf2X-Fm for linux-f2fs-devel@lists.sourceforge.net; Thu, 26 Nov 2020 05:05:11 +0000 Received: by mail-lj1-f193.google.com with SMTP id f18so884576ljg.9 for ; Wed, 25 Nov 2020 21:05:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=mr3M1d7Ya09mmBd3mIMV36AOJTbJZ2AUv7On7VuvZMU=; b=h/62M8sU3UOxjLgc+vBM2+wz/Q84zR3ff4HEJtjVR03ogQykCuuLy3p9pfkxPD+NoY CCPytUNGT8YfiemZw2uUaKx+ueYkQhSpfjQJa7g/b84AbtS4dQyt2f0TSRwn3whjvIh1 9RevpJAuQg6m3YseXJaSq2bRMTlNwJwlat7tZI9SN9Zheenlt+NBGx70CyxlQhKs21fB sOiyakUT75dDpMe3Zke0sli6rm7VH1dpL/ziH9CssuYvQz8eZ9D6xapfhDD+BClcW388 qmodGWlPR1SUwEn2GYPiURHIFayPGE33Xdj8WCjqbby9flQ0uywpTZmi1bTc99gc3x3e HQYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=mr3M1d7Ya09mmBd3mIMV36AOJTbJZ2AUv7On7VuvZMU=; b=jxL8aO7Iq8ZJXe1Di1Jv2Q+57IZItKRSDfa9rMZB5m532MI/pGv5qIup9MPOLbC+tD bCuJ8jwR8gvt3hm2iVZZ25unh7uRlIOEiuORYvUaxTXQRFQMV9/2YSunUZpCxi2TXSAd vmyoq29DYucVioJvga0PrtLv8ogKl4/GSU2++paQGjUUyKrrEcgH1gDUP5/GsA9okWP+ 5uKz/ycD3PuTKDAiwlapO3AcDJWRRzhQv6UfyzPDYk6aULG4wq2aKMK72NXM1duXrfy+ +/UPBfyYEtEpbvx2aKeW9V6tWSy2Xkbx0U3AxUtvGuIrfS7kasdcIUsYA8yJL5EEC9j3 zarQ== X-Gm-Message-State: AOAM532/N/VFO6Cr1UuY0d7qJ1FdB1/YX/TwNw6XgtkH5ns75PUboQm7 sjI8sk7kevLtjA7mYHekDe4/Miqzg6S8uowLVj8= X-Google-Smtp-Source: ABdhPJwjVuQc61XMORu7AUTTxJMiEc5ih+wtpxWk2GC1VJ+qApPujEh+mNysVmCrPMC4Rp5hsZK/8bxC6nag+l9vkkA= X-Received: by 2002:a2e:9707:: with SMTP id r7mr531976lji.265.1606367092479; Wed, 25 Nov 2020 21:04:52 -0800 (PST) MIME-Version: 1.0 References: <20201123031751.36811-1-daeho43@gmail.com> <20201123031751.36811-2-daeho43@gmail.com> <5b3cb83d-5d0f-c1ca-2cff-f28372dec48e@huawei.com> In-Reply-To: <5b3cb83d-5d0f-c1ca-2cff-f28372dec48e@huawei.com> From: Daeho Jeong Date: Thu, 26 Nov 2020 14:04:41 +0900 Message-ID: To: Chao Yu X-Headers-End: 1ki9Ss-00Gf2X-Fm Subject: Re: [f2fs-dev] [PATCH 2/2] f2fs: add F2FS_IOC_DECOMPRESS_FILE and F2FS_IOC_COMPRESS_FILE X-BeenThere: linux-f2fs-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , 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 Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net RXJpYywKCmRvX3BhZ2VfY2FjaGVfcmEoKSBpcyBkZWZpbmVkIGluIG1tL2ludGVybmFsLmggZm9y IGludGVybmFsIHVzZQpiZXR3ZWVuIGluIG1tLCBzbyB3ZSBjYW5ub3QgdXNlIHRoaXMgb25lIHJp Z2h0IG5vdy4KU28sIEkgdGhpbmsgd2UgY291bGQgdXNlIHBhZ2VfY2FjaGVfcmFfdW5ib3VuZGVk KCksIGJlY2F1c2Ugd2UgYWxyZWFkeQpjaGVjayBpX3NpemUgYm91bmRhcnkgb24gb3VyIG93bi4K V2hhdCBkbyB5b3UgdGhpbms/CgoyMDIw64WEIDEx7JuUIDI07J28ICjtmZQpIOyYpO2bhCAxMjow NSwgQ2hhbyBZdSA8eXVjaGFvMEBodWF3ZWkuY29tPuuLmOydtCDsnpHshLE6Cj4KPiBPbiAyMDIw LzExLzIzIDExOjE3LCBEYWVobyBKZW9uZyB3cm90ZToKPiA+IEZyb206IERhZWhvIEplb25nIDxk YWVob2plb25nQGdvb2dsZS5jb20+Cj4gPgo+ID4gQWRkZWQgdHdvIGlvY3RsIHRvIGRlY29tcHJl c3MvY29tcHJlc3MgZXhwbGljaXRseSB0aGUgY29tcHJlc3Npb24KPiA+IGVuYWJsZWQgZmlsZSBp biAiY29tcHJlc3NfbW9kZT11c2VyLWJhc2VkIiBtb3VudCBvcHRpb24uCj4gPgo+ID4gVXNpbmcg dGhlc2UgdHdvIGlvY3RscywgdGhlIHVzZXJzIGNhbiBtYWtlIGEgY29udHJvbCBvZiBjb21wcmVz c2lvbgo+ID4gYW5kIGRlY29tcHJlc3Npb24gb2YgdGhlaXIgZmlsZXMuCj4gPgo+ID4gU2lnbmVk LW9mZi1ieTogRGFlaG8gSmVvbmcgPGRhZWhvamVvbmdAZ29vZ2xlLmNvbT4KPiA+IC0tLQo+ID4g ICBmcy9mMmZzL2ZpbGUuYyAgICAgICAgICAgIHwgMTgxICsrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKystCj4gPiAgIGluY2x1ZGUvdWFwaS9saW51eC9mMmZzLmggfCAgIDIgKwo+ ID4gICAyIGZpbGVzIGNoYW5nZWQsIDE4MiBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pCj4g Pgo+ID4gZGlmZiAtLWdpdCBhL2ZzL2YyZnMvZmlsZS5jIGIvZnMvZjJmcy9maWxlLmMKPiA+IGlu ZGV4IGJlOGRiMDZhY2EyNy4uZThmMTQyNDcwZTg3IDEwMDY0NAo+ID4gLS0tIGEvZnMvZjJmcy9m aWxlLmMKPiA+ICsrKyBiL2ZzL2YyZnMvZmlsZS5jCj4gPiBAQCAtNDAyNiw2ICs0MDI2LDE4MCBA QCBzdGF0aWMgaW50IGYyZnNfaW9jX3NldF9jb21wcmVzc19vcHRpb24oc3RydWN0IGZpbGUgKmZp bHAsIHVuc2lnbmVkIGxvbmcgYXJnKQo+ID4gICAgICAgcmV0dXJuIHJldDsKPiA+ICAgfQo+ID4K PiA+ICtzdGF0aWMgaW50IHJlZGlydHlfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHBnb2Zm X3QgcGFnZV9pZHgsIGludCBsZW4pCj4gPiArewo+ID4gKyAgICAgREVGSU5FX1JFQURBSEVBRChy YWN0bCwgTlVMTCwgaW5vZGUtPmlfbWFwcGluZywgcGFnZV9pZHgpOwo+ID4gKyAgICAgc3RydWN0 IGYyZnNfc2JfaW5mbyAqc2JpID0gRjJGU19JX1NCKGlub2RlKTsKPiA+ICsgICAgIHN0cnVjdCBh ZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKPiA+ICsgICAgIHN0cnVj dCBwYWdlICpwYWdlOwo+ID4gKyAgICAgcGdvZmZfdCByZWRpcnR5X2lkeCA9IHBhZ2VfaWR4Owo+ ID4gKyAgICAgaW50IGksIHBhZ2VfbGVuID0gMCwgcmV0ID0gMDsKPiA+ICsKPiA+ICsgICAgIHBh Z2VfY2FjaGVfcmFfdW5ib3VuZGVkKCZyYWN0bCwgbGVuLCAwKTsKPiA+ICsKPiA+ICsgICAgIGZv ciAoaSA9IDA7IGkgPCBsZW47IGkrKywgcGFnZV9pZHgrKykgewo+ID4gKyAgICAgICAgICAgICBw YWdlID0gcmVhZF9jYWNoZV9wYWdlKG1hcHBpbmcsIHBhZ2VfaWR4LCBOVUxMLCBOVUxMKTsKPiA+ ICsgICAgICAgICAgICAgaWYgKElTX0VSUihwYWdlKSkgewo+ID4gKyAgICAgICAgICAgICAgICAg ICAgIHJldCA9IFBUUl9FUlIocGFnZSk7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgZjJmc193 YXJuKHNiaSwgIiVzOiBpbm9kZSAoJWx1KSA6IHBhZ2VfaW5kZXggKCVsdSkgIgo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgImNvdWxkbid0IGJlIHJlYWQgKGVycm5vOiVkKS5cbiIs Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgaW5vZGUtPmlfaW5v LCBwYWdlX2lkeCwgcmV0KTsKPgo+IFRoaXMgaXMgYSBjb21tb24gZXJyb3IgY2FzZSBkdXJpbmcg Y2FsbGluZyByZWFkX2NhY2hlX3BhZ2UoKSwgSU1PLCB0aGlzIGxvb2tzCj4gbW9yZSBsaWtlIGEg ZGVidWcgbG9nLCBzbyBJIHByZWZlciB0byBwcmludCBub3RoaW5nIGhlcmUsIG9yIGF0IGxlYXN0 IHVzaW5nCj4gZjJmc19kZWJ1ZygpIGluc3RlYWQuCj4KPiA+ICsgICAgICAgICAgICAgICAgICAg ICBicmVhazsKPiA+ICsgICAgICAgICAgICAgfQo+ID4gKyAgICAgICAgICAgICBwYWdlX2xlbisr Owo+ID4gKyAgICAgfQo+ID4gKwo+ID4gKyAgICAgZm9yIChpID0gMDsgaSA8IHBhZ2VfbGVuOyBp KyssIHJlZGlydHlfaWR4KyspIHsKPiA+ICsgICAgICAgICAgICAgcGFnZSA9IGZpbmRfbG9ja19w YWdlKG1hcHBpbmcsIHJlZGlydHlfaWR4KTsKPiA+ICsgICAgICAgICAgICAgaWYgKCFwYWdlKSB7 Cj4gPiArICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVOT0VOVDsKPiA+ICsgICAgICAgICAg ICAgICAgICAgICBmMmZzX3dhcm4oc2JpLCAiJXM6IGlub2RlICglbHUpIDogcGFnZV9pbmRleCAo JWx1KSAiCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY291bGRuJ3QgYmUgZm91 bmQgKGVycm5vOiVkKS5cbiIsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1 bmNfXywgaW5vZGUtPmlfaW5vLCByZWRpcnR5X2lkeCwgcmV0KTsKPgo+IERpdHRvLgo+Cj4gPiAr ICAgICAgICAgICAgIH0KPiA+ICsgICAgICAgICAgICAgc2V0X3BhZ2VfZGlydHkocGFnZSk7Cj4g PiArICAgICAgICAgICAgIGYyZnNfcHV0X3BhZ2UocGFnZSwgMSk7Cj4gPiArICAgICAgICAgICAg IGYyZnNfcHV0X3BhZ2UocGFnZSwgMCk7Cj4gPiArICAgICB9Cj4gPiArCj4gPiArICAgICByZXR1 cm4gcmV0Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IGYyZnNfaW9jX2RlY29tcHJlc3Nf ZmlsZShzdHJ1Y3QgZmlsZSAqZmlscCwgdW5zaWduZWQgbG9uZyBhcmcpCj4gPiArewo+ID4gKyAg ICAgc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZmlscCk7Cj4gPiArICAgICBzdHJ1 Y3QgZjJmc19zYl9pbmZvICpzYmkgPSBGMkZTX0lfU0IoaW5vZGUpOwo+ID4gKyAgICAgc3RydWN0 IGYyZnNfaW5vZGVfaW5mbyAqZmkgPSBGMkZTX0koaW5vZGUpOwo+ID4gKyAgICAgcGdvZmZfdCBw YWdlX2lkeCA9IDAsIGxhc3RfaWR4Owo+ID4gKyAgICAgaW50IGNsdXN0ZXJfc2l6ZSA9IEYyRlNf SShpbm9kZSktPmlfY2x1c3Rlcl9zaXplOwo+ID4gKyAgICAgaW50IGNvdW50LCByZXQ7Cj4gPiAr Cj4gPiArICAgICBpZiAoIWYyZnNfc2JfaGFzX2NvbXByZXNzaW9uKHNiaSkpCj4gPiArICAgICAg ICAgICAgIHJldHVybiAtRU9QTk9UU1VQUDsKPiA+ICsKPiA+ICsgICAgIGlmICghKGZpbHAtPmZf bW9kZSAmIEZNT0RFX1dSSVRFKSkKPiA+ICsgICAgICAgICAgICAgcmV0dXJuIC1FQkFERjsKPiA+ ICsKPiA+ICsgICAgIGlmICghZjJmc19jb21wcmVzc2VkX2ZpbGUoaW5vZGUpKQo+ID4gKyAgICAg ICAgICAgICByZXR1cm4gLUVJTlZBTDsKPgo+IEJlZm9yZSBjb21wcmVzc3ViZy9kZWNvbXByZXNz aW5nIGZpbGUsIHNob3VsZCB3ZSBjaGVjayB3aGV0aGVyIGN1cnJlbnQgaW5vZGUncwo+IGNvbXBy ZXNzIGFsZ29yaXRobSBiYWNrZW5kIGlzIGF2YWlsYWJsZSBpbiBmMmZzIG1vZHVsZT8KPgo+ID4g Kwo+ID4gKyAgICAgZjJmc19iYWxhbmNlX2ZzKEYyRlNfSV9TQihpbm9kZSksIHRydWUpOwo+ID4g Kwo+ID4gKyAgICAgZmlsZV9zdGFydF93cml0ZShmaWxwKTsKPiA+ICsgICAgIGlub2RlX2xvY2so aW5vZGUpOwo+ID4gKwo+ID4gKyAgICAgaWYgKGYyZnNfaXNfbW1hcF9maWxlKGlub2RlKSkgewo+ ID4gKyAgICAgICAgICAgICByZXQgPSAtRUJVU1k7Cj4gPiArICAgICAgICAgICAgIGdvdG8gb3V0 Owo+ID4gKyAgICAgfQo+ID4gKwo+ID4gKyAgICAgcmV0ID0gZmlsZW1hcF93cml0ZV9hbmRfd2Fp dF9yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCAwLCBMTE9OR19NQVgpOwo+ID4gKyAgICAgaWYgKHJl dCkKPiA+ICsgICAgICAgICAgICAgZ290byBvdXQ7Cj4gPiArCj4gPiArICAgICBpZiAoIWF0b21p Y19yZWFkKCZmaS0+aV9jb21wcl9ibG9ja3MpKQo+ID4gKyAgICAgICAgICAgICBnb3RvIG91dDsK PiA+ICsKPiA+ICsgICAgIGxhc3RfaWR4ID0gRElWX1JPVU5EX1VQKGlfc2l6ZV9yZWFkKGlub2Rl KSwgUEFHRV9TSVpFKTsKPiA+ICsKPiA+ICsgICAgIGNvdW50ID0gbGFzdF9pZHggLSBwYWdlX2lk eDsKPiA+ICsgICAgIHdoaWxlIChjb3VudCkgewo+ID4gKyAgICAgICAgICAgICBpbnQgbGVuID0g bWluKGNsdXN0ZXJfc2l6ZSwgY291bnQpOwo+ID4gKwo+ID4gKyAgICAgICAgICAgICByZXQgPSBy ZWRpcnR5X2Jsb2Nrcyhpbm9kZSwgcGFnZV9pZHgsIGxlbik7Cj4gPiArCj4KPiB1bm5lZWRlZCBi bGFuayBsaW5lLi4KPgo+ID4gKyAgICAgICAgICAgICBpZiAocmV0IDwgMCkKPiA+ICsgICAgICAg ICAgICAgICAgICAgICBicmVhazsKPiA+ICsKPiA+ICsgICAgICAgICAgICAgcGFnZV9pZHggKz0g bGVuOwo+ID4gKyAgICAgICAgICAgICBjb3VudCAtPSBsZW47Cj4KPiBDb25zaWRlcmluZyB0aGVy ZSBpc24ndCBzbyBtYW55IG1lbW9yeSBpbiBsb3ctZW5kIGRldmljZSwgaG93IGFib3V0IGNhbGxp bmcKPiBmaWxlbWFwX2ZkYXRhd3JpdGUoKSB0byB3cml0ZWJhY2sgY2x1c3RlciBhZnRlciByZWRp cnR5IHNldmVyYWwgY2x1c3RlcnMKPiBvciB4eE1CPwo+Cj4gPiArICAgICB9Cj4gPiArCj4gPiAr ICAgICBpZiAoIXJldCkKPiA+ICsgICAgICAgICAgICAgcmV0ID0gZmlsZW1hcF93cml0ZV9hbmRf d2FpdF9yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCAwLAo+ID4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExPTkdfTUFYKTsKPiA+ICsKPiA+ICsg ICAgIGlmICghcmV0KSB7Cj4gPiArICAgICAgICAgICAgIHN0YXRfc3ViX2NvbXByX2Jsb2Nrcyhp bm9kZSwgYXRvbWljX3JlYWQoJmZpLT5pX2NvbXByX2Jsb2NrcykpOwo+ID4gKyAgICAgICAgICAg ICBhdG9taWNfc2V0KCZmaS0+aV9jb21wcl9ibG9ja3MsIDApOwo+ID4gKyAgICAgICAgICAgICBm MmZzX21hcmtfaW5vZGVfZGlydHlfc3luYyhpbm9kZSwgdHJ1ZSk7Cj4KPiBBIGxpdHRsZSBiaXQg d2lyZWQsIHdoeSBub3QgZmFpbGluZyBjbHVzdGVyX21heV9jb21wcmVzcygpIGZvciB1c2VyIG1v ZGUsIGFuZAo+IGxldCB3cml0ZXBhZ2VzIHdyaXRlIGNsdXN0ZXIgYXMgcmF3IGJsb2NrcywgaW4t d2hlcmUgd2UgY2FuIHVwZGF0ZSBpX2NvbXByX2Jsb2Nrcwo+IGFuZCBnbG9iYWwgY29tcHIgYmxv Y2sgc3RhdHMgY29ycmVjdGx5Lgo+Cj4gPiArICAgICB9IGVsc2Ugewo+ID4gKyAgICAgICAgICAg ICBmMmZzX3dhcm4oc2JpLCAiJXM6IFRoZSBmaWxlIG1pZ2h0IGJlIHBhcnRpYWxseSBkZWNvbXBy ZXNzZWQgIgo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihlcnJubz0lZCkuIFBs ZWFzZSBkZWxldGUgdGhlIGZpbGUuXG4iLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgX19mdW5jX18sIHJldCk7Cj4gPiArICAgICB9Cj4gPiArb3V0Ogo+ID4gKyAgICAgaW5vZGVf dW5sb2NrKGlub2RlKTsKPiA+ICsgICAgIGZpbGVfZW5kX3dyaXRlKGZpbHApOwo+ID4gKwo+ID4g KyAgICAgcmV0dXJuIHJldDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBmMmZzX2lvY19j b21wcmVzc19maWxlKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBsb25nIGFyZykKPiA+ICt7 Cj4gPiArICAgICBzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxwKTsKPiA+ICsg ICAgIHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSA9IEYyRlNfSV9TQihpbm9kZSk7Cj4gPiArICAg ICBwZ29mZl90IHBhZ2VfaWR4ID0gMCwgbGFzdF9pZHg7Cj4gPiArICAgICBpbnQgY2x1c3Rlcl9z aXplID0gRjJGU19JKGlub2RlKS0+aV9jbHVzdGVyX3NpemU7Cj4gPiArICAgICBpbnQgY291bnQs IHJldDsKPiA+ICsKPiA+ICsgICAgIGlmICghZjJmc19zYl9oYXNfY29tcHJlc3Npb24oc2JpKSkK PiA+ICsgICAgICAgICAgICAgcmV0dXJuIC1FT1BOT1RTVVBQOwo+ID4gKwo+ID4gKyAgICAgaWYg KCEoZmlscC0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQo+ID4gKyAgICAgICAgICAgICByZXR1cm4g LUVCQURGOwo+ID4gKwo+ID4gKyAgICAgaWYgKCFmMmZzX2NvbXByZXNzZWRfZmlsZShpbm9kZSkp Cj4gPiArICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+Cj4gYWxnb3JpdGhtIGJhY2tlbmQg Y2hlY2s/Cj4KPiA+ICsKPiA+ICsgICAgIGYyZnNfYmFsYW5jZV9mcyhGMkZTX0lfU0IoaW5vZGUp LCB0cnVlKTsKPiA+ICsKPiA+ICsgICAgIGZpbGVfc3RhcnRfd3JpdGUoZmlscCk7Cj4gPiArICAg ICBpbm9kZV9sb2NrKGlub2RlKTsKPiA+ICsKPiA+ICsgICAgIGlmIChmMmZzX2lzX21tYXBfZmls ZShpbm9kZSkpIHsKPiA+ICsgICAgICAgICAgICAgcmV0ID0gLUVCVVNZOwo+ID4gKyAgICAgICAg ICAgICBnb3RvIG91dDsKPiA+ICsgICAgIH0KPiA+ICsKPiA+ICsgICAgIHJldCA9IGZpbGVtYXBf d3JpdGVfYW5kX3dhaXRfcmFuZ2UoaW5vZGUtPmlfbWFwcGluZywgMCwgTExPTkdfTUFYKTsKPiA+ ICsgICAgIGlmIChyZXQpCj4gPiArICAgICAgICAgICAgIGdvdG8gb3V0Owo+ID4gKwo+ID4gKyAg ICAgc2V0X2lub2RlX2ZsYWcoaW5vZGUsIEZJX0VOQUJMRV9DT01QUkVTUyk7Cj4gPiArCj4gPiAr ICAgICBsYXN0X2lkeCA9IERJVl9ST1VORF9VUChpX3NpemVfcmVhZChpbm9kZSksIFBBR0VfU0la RSk7Cj4gPiArCj4gPiArICAgICBjb3VudCA9IGxhc3RfaWR4IC0gcGFnZV9pZHg7Cj4gPiArICAg ICB3aGlsZSAoY291bnQpIHsKPiA+ICsgICAgICAgICAgICAgaW50IGxlbiA9IG1pbihjbHVzdGVy X3NpemUsIGNvdW50KTsKPiA+ICsKPiA+ICsgICAgICAgICAgICAgcmV0ID0gcmVkaXJ0eV9ibG9j a3MoaW5vZGUsIHBhZ2VfaWR4LCBsZW4pOwo+ID4gKwo+Cj4gRGl0dG8uCj4KPiBUaGFua3MsCj4K PiA+ICsgICAgICAgICAgICAgaWYgKHJldCA8IDApCj4gPiArICAgICAgICAgICAgICAgICAgICAg YnJlYWs7Cj4gPiArCj4gPiArICAgICAgICAgICAgIHBhZ2VfaWR4ICs9IGxlbjsKPiA+ICsgICAg ICAgICAgICAgY291bnQgLT0gbGVuOwo+ID4gKyAgICAgfQo+ID4gKwo+ID4gKyAgICAgaWYgKCFy ZXQpCj4gPiArICAgICAgICAgICAgIHJldCA9IGZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2Uo aW5vZGUtPmlfbWFwcGluZywgMCwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIExMT05HX01BWCk7Cj4gPiArCj4gPiArICAgICBjbGVhcl9p bm9kZV9mbGFnKGlub2RlLCBGSV9FTkFCTEVfQ09NUFJFU1MpOwo+ID4gKwo+ID4gKyAgICAgaWYg KHJldCkKPiA+ICsgICAgICAgICAgICAgZjJmc193YXJuKHNiaSwgIiVzOiBUaGUgZmlsZSBtaWdo dCBiZSBwYXJ0aWFsbHkgY29tcHJlc3NlZCAiCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAiKGVycm5vPSVkKS4gUGxlYXNlIGRlbGV0ZSB0aGUgZmlsZS5cbiIsCj4gPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcmV0KTsKPiA+ICtvdXQ6Cj4gPiArICAg ICBpbm9kZV91bmxvY2soaW5vZGUpOwo+ID4gKyAgICAgZmlsZV9lbmRfd3JpdGUoZmlscCk7Cj4g PiArCj4gPiArICAgICByZXR1cm4gcmV0Owo+ID4gK30KPiA+ICsKPiA+ICAgc3RhdGljIGxvbmcg X19mMmZzX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25l ZCBsb25nIGFyZykKPiA+ICAgewo+ID4gICAgICAgc3dpdGNoIChjbWQpIHsKPiA+IEBAIC00MTEz LDYgKzQyODcsMTAgQEAgc3RhdGljIGxvbmcgX19mMmZzX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxw LCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKPiA+ICAgICAgICAgICAgICAg cmV0dXJuIGYyZnNfaW9jX2dldF9jb21wcmVzc19vcHRpb24oZmlscCwgYXJnKTsKPiA+ICAgICAg IGNhc2UgRjJGU19JT0NfU0VUX0NPTVBSRVNTX09QVElPTjoKPiA+ICAgICAgICAgICAgICAgcmV0 dXJuIGYyZnNfaW9jX3NldF9jb21wcmVzc19vcHRpb24oZmlscCwgYXJnKTsKPiA+ICsgICAgIGNh c2UgRjJGU19JT0NfREVDT01QUkVTU19GSUxFOgo+ID4gKyAgICAgICAgICAgICByZXR1cm4gZjJm c19pb2NfZGVjb21wcmVzc19maWxlKGZpbHAsIGFyZyk7Cj4gPiArICAgICBjYXNlIEYyRlNfSU9D X0NPTVBSRVNTX0ZJTEU6Cj4gPiArICAgICAgICAgICAgIHJldHVybiBmMmZzX2lvY19jb21wcmVz c19maWxlKGZpbHAsIGFyZyk7Cj4gPiAgICAgICBkZWZhdWx0Ogo+ID4gICAgICAgICAgICAgICBy ZXR1cm4gLUVOT1RUWTsKPiA+ICAgICAgIH0KPiA+IEBAIC00MzUyLDcgKzQ1MzAsOCBAQCBsb25n IGYyZnNfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1 bnNpZ25lZCBsb25nIGFyZykKPiA+ICAgICAgIGNhc2UgRjJGU19JT0NfU0VDX1RSSU1fRklMRToK PiA+ICAgICAgIGNhc2UgRjJGU19JT0NfR0VUX0NPTVBSRVNTX09QVElPTjoKPiA+ICAgICAgIGNh c2UgRjJGU19JT0NfU0VUX0NPTVBSRVNTX09QVElPTjoKPiA+IC0gICAgICAgICAgICAgYnJlYWs7 Cj4gPiArICAgICBjYXNlIEYyRlNfSU9DX0RFQ09NUFJFU1NfRklMRToKPiA+ICsgICAgIGNhc2Ug RjJGU19JT0NfQ09NUFJFU1NfRklMRToKPiA+ICAgICAgIGRlZmF1bHQ6Cj4gPiAgICAgICAgICAg ICAgIHJldHVybiAtRU5PSU9DVExDTUQ7Cj4gPiAgICAgICB9Cj4gPiBkaWZmIC0tZ2l0IGEvaW5j bHVkZS91YXBpL2xpbnV4L2YyZnMuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9mMmZzLmgKPiA+IGlu ZGV4IGYwMDE5OWEyZTM4Yi4uMzUyYTgyMmQ0MzcwIDEwMDY0NAo+ID4gLS0tIGEvaW5jbHVkZS91 YXBpL2xpbnV4L2YyZnMuaAo+ID4gKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2YyZnMuaAo+ID4g QEAgLTQwLDYgKzQwLDggQEAKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBzdHJ1Y3QgZjJmc19jb21wX29wdGlvbikKPiA+ICAgI2RlZmluZSBGMkZTX0lP Q19TRVRfQ09NUFJFU1NfT1BUSU9OICAgICAgICBfSU9XKEYyRlNfSU9DVExfTUFHSUMsIDIyLCAg ICAgIFwKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz dHJ1Y3QgZjJmc19jb21wX29wdGlvbikKPiA+ICsjZGVmaW5lIEYyRlNfSU9DX0RFQ09NUFJFU1Nf RklMRSAgICAgX0lPKEYyRlNfSU9DVExfTUFHSUMsIDIzKQo+ID4gKyNkZWZpbmUgRjJGU19JT0Nf Q09NUFJFU1NfRklMRSAgICAgICAgICAgICAgIF9JTyhGMkZTX0lPQ1RMX01BR0lDLCAyNCkKPiA+ Cj4gPiAgIC8qCj4gPiAgICAqIHNob3VsZCBiZSBzYW1lIGFzIFhGU19JT0NfR09JTkdET1dOLgo+ ID4KCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpMaW51 eC1mMmZzLWRldmVsIG1haWxpbmcgbGlzdApMaW51eC1mMmZzLWRldmVsQGxpc3RzLnNvdXJjZWZv cmdlLm5ldApodHRwczovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9saW51 eC1mMmZzLWRldmVsCg==