From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.ozlabs.org (lists.ozlabs.org [112.213.38.117]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 206E5C6FA8F for ; Tue, 29 Aug 2023 12:54:12 +0000 (UTC) Received: from boromir.ozlabs.org (localhost [IPv6:::1]) by lists.ozlabs.org (Postfix) with ESMTP id 4RZnS25vvlz3bhk for ; Tue, 29 Aug 2023 22:54:10 +1000 (AEST) Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=linux.alibaba.com (client-ip=115.124.30.110; helo=out30-110.freemail.mail.aliyun.com; envelope-from=hsiangkao@linux.alibaba.com; receiver=lists.ozlabs.org) Received: from out30-110.freemail.mail.aliyun.com (out30-110.freemail.mail.aliyun.com [115.124.30.110]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4RZnRs6JZbz2xdl for ; Tue, 29 Aug 2023 22:54:00 +1000 (AEST) X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R201e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=ay29a033018046050;MF=hsiangkao@linux.alibaba.com;NM=1;PH=DS;RN=2;SR=0;TI=SMTPD_---0VqrYSdZ_1693313633; Received: from 192.168.3.2(mailfrom:hsiangkao@linux.alibaba.com fp:SMTPD_---0VqrYSdZ_1693313633) by smtp.aliyun-inc.com; Tue, 29 Aug 2023 20:53:54 +0800 Message-ID: Date: Tue, 29 Aug 2023 20:53:53 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Thunderbird/102.13.0 Subject: Re: [PATCH v6 3/3] erofs-utils: mkfs: enable xattr name filter To: Jingbo Xu , linux-erofs@lists.ozlabs.org References: <20230829124127.36719-1-jefflexu@linux.alibaba.com> <20230829124127.36719-4-jefflexu@linux.alibaba.com> From: Gao Xiang In-Reply-To: <20230829124127.36719-4-jefflexu@linux.alibaba.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-BeenThere: linux-erofs@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Development of Linux EROFS file system List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linux-erofs-bounces+linux-erofs=archiver.kernel.org@lists.ozlabs.org Sender: "Linux-erofs" On 2023/8/29 20:41, Jingbo Xu wrote: > Introduce "-Exattr-name-filter" option to enable the xattr name bloom > filter feature. > > Signed-off-by: Jingbo Xu > --- > include/erofs/config.h | 1 + > include/erofs/internal.h | 1 + > lib/xattr.c | 63 ++++++++++++++++++++++++++++++++++++++++ > mkfs/main.c | 7 +++++ > 4 files changed, 72 insertions(+) > > diff --git a/include/erofs/config.h b/include/erofs/config.h > index 8f52d2c..c51f0cd 100644 > --- a/include/erofs/config.h > +++ b/include/erofs/config.h > @@ -53,6 +53,7 @@ struct erofs_configure { > bool c_ignore_mtime; > bool c_showprogress; > bool c_extra_ea_name_prefixes; > + bool c_xattr_name_filter; > > #ifdef HAVE_LIBSELINUX > struct selabel_handle *sehnd; > diff --git a/include/erofs/internal.h b/include/erofs/internal.h > index 3e73eef..382024a 100644 > --- a/include/erofs/internal.h > +++ b/include/erofs/internal.h > @@ -139,6 +139,7 @@ EROFS_FEATURE_FUNCS(fragments, incompat, INCOMPAT_FRAGMENTS) > EROFS_FEATURE_FUNCS(dedupe, incompat, INCOMPAT_DEDUPE) > EROFS_FEATURE_FUNCS(xattr_prefixes, incompat, INCOMPAT_XATTR_PREFIXES) > EROFS_FEATURE_FUNCS(sb_chksum, compat, COMPAT_SB_CHKSUM) > +EROFS_FEATURE_FUNCS(xattr_filter, compat, COMPAT_XATTR_FILTER) > > #define EROFS_I_EA_INITED (1 << 0) > #define EROFS_I_Z_INITED (1 << 1) > diff --git a/lib/xattr.c b/lib/xattr.c > index 46a301a..325241d 100644 > --- a/lib/xattr.c > +++ b/lib/xattr.c > @@ -18,6 +18,7 @@ > #include "erofs/cache.h" > #include "erofs/io.h" > #include "erofs/fragments.h" > +#include "erofs/xxhash.h" > #include "liberofs_private.h" > > #define EA_HASHTABLE_BITS 16 > @@ -783,6 +784,63 @@ out: > return ret; > } > > + > +static int erofs_xattr_filter_hashbit(struct xattr_item *item) > +{ > + u8 prefix = item->prefix; > + const char *key = item->kvbuf; > + unsigned int len = item->len[0]; > + char *name = NULL; > + uint32_t hashbit; > + > + if (prefix & EROFS_XATTR_LONG_PREFIX) { > + struct ea_type_node *tnode; > + u16 prefix_len; > + int ret; > + > + list_for_each_entry(tnode, &ea_name_prefixes, list) { > + if (tnode->index == item->prefix) { > + ret = asprintf(&name, "%s%.*s", > + tnode->type.prefix, len, key); > + if (ret < 0) > + return -ENOMEM; > + break; > + } > + } > + if (!name) > + return -ENOENT; > + > + if (!match_base_prefix(name, &prefix, &prefix_len)) { > + free(name); > + return -ENOENT; > + } > + key = name + prefix_len; > + len = strlen(key); > + } > + > + hashbit = xxh32(key, len, EROFS_XATTR_FILTER_SEED + prefix) & > + (EROFS_XATTR_FILTER_BITS - 1); > + if (name) > + free(name); > + return hashbit; > +} > + > +static u32 erofs_xattr_filter_map(struct list_head *ixattrs) > +{ > + struct inode_xattr_node *node, *n; > + u32 name_filter; > + int hashbit; > + > + name_filter = 0; > + list_for_each_entry_safe(node, n, ixattrs, list) { > + hashbit = erofs_xattr_filter_hashbit(node->item); > + if (hashbit < 0) I'd suggest to clear feature bit instead: erofs_sb_clear_xattr_filter(&sbi); > + return 0; > + name_filter |= (1UL << hashbit); > + } > + return EROFS_XATTR_FILTER_DEFAULT & ~name_filter; > +} > + > char *erofs_export_xattr_ibody(struct list_head *ixattrs, unsigned int size) > { > struct inode_xattr_node *node, *n; > @@ -797,6 +855,11 @@ char *erofs_export_xattr_ibody(struct list_head *ixattrs, unsigned int size) > header = (struct erofs_xattr_ibody_header *)buf; > header->h_shared_count = 0; > > + if (cfg.c_xattr_name_filter) { > + u32 name_filter = erofs_xattr_filter_map(ixattrs); Leave a blank line here. > + header->h_name_filter = cpu_to_le32(name_filter); Or header->h_name_filter = cpu_to_le32(erofs_xattr_filter_map(ixattrs)); Thanks, Gao Xiang