From: Sheng Yong <shengyong@oppo.com>
To: wangzijie <wangzijie1@honor.com>, jaegeuk@kernel.org, chao@kernel.org
Cc: linux-f2fs-devel@lists.sourceforge.net,
linux-kernel@vger.kernel.org, bintian.wang@honor.com
Subject: Re: [f2fs-dev] f2fs-tools: Check and fix inline xattr inplace
Date: Thu, 5 Dec 2024 10:02:18 +0800 [thread overview]
Message-ID: <502ae396-ae82-44d6-b08d-617e9e9c4092@oppo.com> (raw)
In-Reply-To: <20241204122317.3042137-1-wangzijie1@honor.com>
On 2024/12/4 20:23, wangzijie wrote:
> When we check inode which just has inline xattr data, we copy
> inline xattr data from inode, check it(maybe fix it) and copy
> it again to inode. We can check and fix xattr inplace for this
> kind of inode to reduce memcpy times.
>
> Signed-off-by: wangzijie <wangzijie1@honor.com>
> ---
> fsck/fsck.c | 18 ++++++++++++++----
> 1 file changed, 14 insertions(+), 4 deletions(-)
>
> diff --git a/fsck/fsck.c b/fsck/fsck.c
> index aa3fb97..fd8b082 100644
> --- a/fsck/fsck.c
> +++ b/fsck/fsck.c
> @@ -840,11 +840,18 @@ int chk_extended_attributes(struct f2fs_sb_info *sbi, u32 nid,
> struct f2fs_xattr_entry *ent;
> __u32 xattr_size = XATTR_SIZE(&inode->i);
> bool need_fix = false;
> + bool has_xattr_node = false;
> + nid_t xnid = le32_to_cpu(inode->i.i_xattr_nid);
>
> if (xattr_size == 0)
> return 0;
>
> - xattr = read_all_xattrs(sbi, inode, false);
> + if (xattr_size <= inline_xattr_size(&inode->i) && !xnid)
Hi, zijie,
I propose to change the behavors of read_all_xattrs and write_all_xattrs, and to add a
new free_xattrs.
* read_all_xattrs checks whether xnid exist. If it's not, return inline_xattr directly
without alloc and memcpy.
* write_all_xattrs checks whether inline_xattr and new txattr_addr have the same address
to avoid copying back.
* free_xattrs checks whether inline_xattr and new txattr_addr have the same address to
free xattr buffer properly.
In this way, all instances where {read|write}_all_xattrs are called can avoid unnecessary
memory alloc and copy. free_xattrs(xattrs) should be used instead of free(xattrs).
thanks,
shengyong
> + xattr = inline_xattr_addr(&inode->i);
> + else {
> + xattr = read_all_xattrs(sbi, inode, false);
> + has_xattr_node = true;
> + }
> ASSERT(xattr);
>
> last_base_addr = (void *)xattr + xattr_size;
> @@ -867,12 +874,15 @@ int chk_extended_attributes(struct f2fs_sb_info *sbi, u32 nid,
> }
> if (need_fix && c.fix_on) {
> memset(ent, 0, (u8 *)last_base_addr - (u8 *)ent);
> - write_all_xattrs(sbi, inode, xattr_size, xattr);
> + if (has_xattr_node) {
> + write_all_xattrs(sbi, inode, xattr_size, xattr);
> + free(xattr);
> + }
> FIX_MSG("[0x%x] nullify wrong xattr entries", nid);
> - free(xattr);
> return 1;
> }
> - free(xattr);
> + if (has_xattr_node)
> + free(xattr);
> return 0;
> }
>
next prev parent reply other threads:[~2024-12-05 2:02 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-12-04 12:23 wangzijie
2024-12-05 2:02 ` Sheng Yong [this message]
2024-12-05 3:40 ` wangzijie
2024-12-05 11:47 ` Sheng Yong
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=502ae396-ae82-44d6-b08d-617e9e9c4092@oppo.com \
--to=shengyong@oppo.com \
--cc=bintian.wang@honor.com \
--cc=chao@kernel.org \
--cc=jaegeuk@kernel.org \
--cc=linux-f2fs-devel@lists.sourceforge.net \
--cc=linux-kernel@vger.kernel.org \
--cc=wangzijie1@honor.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®