From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f175.google.com (mail-pl1-f175.google.com [209.85.214.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4565E373BE8 for ; Tue, 1 Sep 2026 01:10:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=209.85.214.175 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788225030; cv=pass; b=br+zsfpomE0LkfnT/VFwC5GspfIbESDGhjOk9BE2no3tNnvKRVg5IgaUM+TXMO5T5HV6iJ3dmeApPHlJfo0sUa9boDBfXYYXQv4vijZAi3F9WgMhUc5bmeIHEjwxvqlIiucVN7GnuKH7NeQf7GKGSrDYBYJSfAXytaAdtsjeBXI= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788225030; c=relaxed/simple; bh=MofrnayjfWvHsSm3I+SKfyzbVn91p5ywbndZJSUtIW4=; h=MIME-Version:References:In-Reply-To:From:Date:Message-ID:Subject: To:Cc:Content-Type; b=HNV+7AkMBizCB/CUE+3f0QhX90ibChAS2o3ZmUZwm0RvamAQSA5ssTNHFKDu79vFFkA/z0tD+LJBWUZ9/ZUJGqhleVk2MKogkuVyXlwtjFtSWllNAlXo/RyCKYsGKe6cBYki01sakNnh07m98NXGSU8GCHQEsa0r82TPPpNeNi4= ARC-Authentication-Results:i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=b19ePnJm; arc=pass smtp.client-ip=209.85.214.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="b19ePnJm" Received: by mail-pl1-f175.google.com with SMTP id d9443c01a7336-2cc891373e0so37588945ad.2 for ; Mon, 31 Aug 2026 18:10:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1788225027; cv=none; d=google.com; s=arc-20260327; b=mlJGYtLhIjzK3WiemyiqL4PnIRxFTLUjhrYH52nc7lum+nQD55v4x3gaS6/k4YNghZ g/vcYGXXHuJGajcUr4euMZT0MXennk1S573VIb3SstzArx/W1s3pvobwX7TpPVt3IB+y S+q6pmuG6R0APx5kw/Vbwzop2ZiDjKha3QLlLZpxTMd7W9WcAYL3hh9mIagg3oPtZQ7L vZroZiLvZxIa0aTx7qaHhYo+iV9QZobOZuJf9Ww6wHFMiTv9xN4W+XhBTQszWvE26JR9 sE15dL5r+pem+xNND8EukyoxQ52QkrLpOZU/ZeS6r2TgcFxJYLDxRTBQw60I17ZHrSzG ixqQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=X+pS56GJH4pWO/mcA3AvuINIy7nP1A7R6RjAquR381s=; fh=xGvp3CV5ywdAGvjewMo7dA2Ra/AxU2xqbu9AN9MyGXU=; b=DJ05oZyLstmYafVlH1HVbSCbgdPL8LUl1cultPWbianI29viXbXZHSAdS6SpXquri1 GIIo8s1YONEdBbtBiRNCKtprRrDr6oxDqDs3Bs4a4q6d3xMBo5SLAA7iyz1seAL412oH 1WQUHgKlJ06NCaRnj2kIIVTA3knullK9AktIc+pWETaXOy6t3sLls3HRWIXqPi5sxHdu r94XJcp1ExkdKtedKahQreluxJuFORzoEBRD/s4jBdVUBktOZ5SE2b4zsvlAsZZOCJ1L AawE4DKQCyBzbqTdLy0tIcIS3M9IwGNwljYBt6MDfJGqOvzrN46tjILr42vH0ufpocNQ x9jg==; darn=vger.kernel.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788225027; x=1788829827; darn=vger.kernel.org; h=content-transfer-encoding:content-type:cc:to:subject:message-id :date:from:in-reply-to:references:mime-version:from:to:cc:subject :date:message-id:reply-to:content-type; bh=X+pS56GJH4pWO/mcA3AvuINIy7nP1A7R6RjAquR381s=; b=b19ePnJm86XZDnwydAwIzcKUgSxfeXTNOfko3odV4KYPBpaHL7oZLftVzeES26C5dR i2eyVbWnhm/K+eOal8yKKOV2bpaSQoneobpe1q+SjKlIsgao1wuLSymlEIV0X694U3vj kkzSK96a/4vKvI6OGZnGNzDcRaId9bbHlmNX+sIqzDS0k9+uNoxEU574/MW7qh86NKTu WsFGQAJHoJkZaKgS7AKSneBJcBWTKgEtLgTb+JCl8TTxswUBcPwdt6ktqfSeTc9TR0fq 50ZBVzUfemJouAucLBZusFJSZ0UsPaS63JQwwyaMnbqpMbjADb+k+bLtnDhl31x1EtBo 8flw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788225027; x=1788829827; h=content-transfer-encoding:content-type:cc:to:subject:message-id :date:from:in-reply-to:references:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=X+pS56GJH4pWO/mcA3AvuINIy7nP1A7R6RjAquR381s=; b=DaUIPPs3UJq7PkqCgBQyBS36ww+OE1eDekJ+KdF78+UsmmppyJ0o+fjXVV1qOe5lMx IldNoyXCPP0x9ZJwabUz8bgi7EiOmIBwLThbRvJL30VJTMWILDNaO+I0yBirH+3hts52 n81ppdrq/zqaT5pV2z+PU0zM+f2mAzEQq5MH8Z2VEZmO1YI1XqAd5YQlRFHCRLsrjCNW pxuKXdX9uZ2uN2G8kHAyxeppfcsVv9/9Cuu/08ErK3ERA0FRColX+o2C0njNlgCIeoEW VGaL4VdOc7BOEajmkA4GJXOlI1lZi/ckTgBR9iqZwusezTt84NfR8JuhB4kAmxctfoMu BryQ== X-Forwarded-Encrypted: i=1; AKwUvBy3LGYcTAQZnevGDfC/XXywERkPTXU0nTvKhuw2k3HakFHooeQZlXhCj/JoZYbtVEBr5a+uCKIW4jqPeFw=@vger.kernel.org X-Gm-Message-State: AFuF++lyVBnEVzFfIYAsMDYhDGbweiRZf2DhL9FpDAKgj21HwA5J+A78 PYCaBYftNB8Ly39R6YAmNFhnj77qPTsidl+/Be3BOvkiWIe+ivLRnd2FCli0DwNUHp8C2fpP5my YnU/edpBaDgsAyX22Bz1OlQtaxqdiw/w= X-Gm-Gg: AYBFou3ZPAYFtLOwWfBjCppxHlNkRtbsnjZt06wE5tCmHeO3oNWlLheCZK07a0fMKgN 9SM0+SYAiGDiPi304dZEL8danpW47EO9gx2e4BwBaY2a4PS52zIP6ZP6YPOqN78hwPnIGDj1hfA 2kwo1gu78RdGfO6LS65GmKaATGXhyCBpyW4uXDFlDTVZ9goV1B+J7hVLpbKJ1m0SsHl1xx2gQr7 t2CruvRg2YH2SxXHI7LX9j7pCEweLgOI7MLBjBSpYB4srasA7eBZ9/5HYKUjfYx+UIrJ01LbiXt XZM0w15bo6XI2jvrRmJmc9ps51RQU6225GlrKOOmKtybAAJXSyxHonvNkQ1X8JKbl4zczY6iHn9 90t40BHp43vTV7tbHyerVB4Uo/nkQl7utvw== X-Received: by 2002:a17:903:19ce:b0:2d6:f6ba:263d with SMTP id d9443c01a7336-2d74dc7aca2mr329147915ad.7.1788225016330; Mon, 31 Aug 2026 18:10:16 -0700 (PDT) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 References: <65b4a84c4504019ea6b208f424917f9df4eed2dd.1788213716.git.zhangxp1998@gmail.com> In-Reply-To: <65b4a84c4504019ea6b208f424917f9df4eed2dd.1788213716.git.zhangxp1998@gmail.com> From: Daeho Jeong Date: Mon, 31 Aug 2026 18:10:01 -0700 X-Gm-Features: AcwNN1UYNxaOC49v5tjWEhw8sWOOEj4r1yzS0ybIKia-xeIkc_BQNaTGXcARCEA Message-ID: Subject: Re: [f2fs-dev] [PATCH v7 07/11] f2fs: describe xattr block layout dynamically To: Kelvin Zhang Cc: linux-f2fs-devel@lists.sourceforge.net, jaegeuk@kernel.org, linux-kernel@vger.kernel.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Mon, Aug 31, 2026 at 3:09=E2=80=AFPM Kelvin Zhang wrote: > > The usable capacity of dedicated on-disk extended attribute blocks and > inline xattr regions scales with the filesystem block size. > > Parameterize VALID_XATTR_BLOCK_SIZE and MAX_INLINE_XATTR_SIZE to > calculate usable xattr limits dynamically from sbi->blocksize rather than > hardcoding PAGE_SIZE or DEF_ADDRS_PER_INODE. > > Update mount option consistency validation for inline_xattr_size to > evaluate allowed boundaries dynamically against the runtime block size. > > Signed-off-by: Kelvin Zhang > --- > fs/f2fs/inode.c | 4 ++-- > fs/f2fs/node.c | 2 +- > fs/f2fs/super.c | 17 +++++++++++++++-- > fs/f2fs/xattr.c | 8 +++++--- > fs/f2fs/xattr.h | 15 ++++++++++----- > include/linux/f2fs_fs.h | 2 ++ > 6 files changed, 35 insertions(+), 13 deletions(-) > > diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c > index fda9ee3bfc61..20b0561fe35d 100644 > --- a/fs/f2fs/inode.c > +++ b/fs/f2fs/inode.c > @@ -337,12 +337,12 @@ static bool sanity_check_inode(struct inode *inode,= struct folio *node_folio) > } > > if (f2fs_sb_has_flexible_inline_xattr(sbi) && > - (fi->i_inline_xattr_size > MAX_INLINE_XATTR_SIZE || > + (fi->i_inline_xattr_size > MAX_INLINE_XATTR_SIZE(inode) |= | > (f2fs_has_inline_xattr(inode) && > fi->i_inline_xattr_size < MIN_INLINE_XATTR_SIZE))) { > f2fs_warn(sbi, "%s: inode (ino=3D%llx) has corrupted i_in= line_xattr_size: %d, min: %zu, max: %lu", > __func__, inode->i_ino, fi->i_inline_xattr_size= , > - MIN_INLINE_XATTR_SIZE, MAX_INLINE_XATTR_SIZE); > + MIN_INLINE_XATTR_SIZE, MAX_INLINE_XATTR_SIZE(in= ode)); > return false; > } > > diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c > index e3f594f7bcce..7dabfada1b54 100644 > --- a/fs/f2fs/node.c > +++ b/fs/f2fs/node.c > @@ -2919,7 +2919,7 @@ int f2fs_recover_xattr_data(struct inode *inode, st= ruct folio *folio) > /* 3: update and set xattr node page dirty */ > if (folio) { > memcpy(F2FS_NODE(xfolio), F2FS_NODE(folio), > - VALID_XATTR_BLOCK_SIZE); > + VALID_XATTR_BLOCK_SIZE(inode)); > folio_mark_dirty(xfolio); > } > f2fs_folio_put(xfolio, true); > diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c > index fcaeaacaab33..3ba4df757213 100644 > --- a/fs/f2fs/super.c > +++ b/fs/f2fs/super.c > @@ -855,9 +855,11 @@ static int f2fs_parse_param(struct fs_context *fc, s= truct fs_parameter *param) > break; > case Opt_inline_xattr_size: > if (result.int_32 < MIN_INLINE_XATTR_SIZE || > - result.int_32 > MAX_INLINE_XATTR_SIZE) { > + result.int_32 > > + MAX_INLINE_XATTR_SIZE_FOR_BLOCKSIZE(F2FS_MAX_BLKS= IZE)) { > f2fs_err(NULL, "inline xattr size is out of range= : %u ~ %u", > - (u32)MIN_INLINE_XATTR_SIZE, (u32)MAX_INL= INE_XATTR_SIZE); > + (u32)MIN_INLINE_XATTR_SIZE, > + (u32)MAX_INLINE_XATTR_SIZE_FOR_BLOCKSIZE= (F2FS_MAX_BLKSIZE)); > return -EINVAL; > } > ctx_set_opt(ctx, F2FS_MOUNT_INLINE_XATTR_SIZE); > @@ -1596,6 +1598,8 @@ static int f2fs_check_opt_consistency(struct fs_con= text *fc, > } > > if (ctx_test_opt(ctx, F2FS_MOUNT_INLINE_XATTR_SIZE)) { > + int min_size, max_size; > + > if (!f2fs_sb_has_extra_attr(sbi) || > !f2fs_sb_has_flexible_inline_xattr(sbi)) { > f2fs_err(sbi, "extra_attr or flexible_inline_xatt= r feature is off"); > @@ -1605,6 +1609,15 @@ static int f2fs_check_opt_consistency(struct fs_co= ntext *fc, > f2fs_err(sbi, "inline_xattr_size option should be= set with inline_xattr option"); > return -EINVAL; > } > + min_size =3D MIN_INLINE_XATTR_SIZE; > + max_size =3D MAX_INLINE_XATTR_SIZE_FOR_BLOCKSIZE(F2FS_BLK= SIZE); > + > + if (F2FS_OPTION(sbi).inline_xattr_size < min_size || > + F2FS_OPTION(sbi).inline_xattr_size > max_= size) { > + f2fs_err(sbi, "inline xattr size is out of range:= %d ~ %d", > + min_size, max_size); > + return -EINVAL; > + } > } > > if (ctx_test_opt(ctx, F2FS_MOUNT_ATGC) && > diff --git a/fs/f2fs/xattr.c b/fs/f2fs/xattr.c > index 6728d1488cad..99c863513725 100644 > --- a/fs/f2fs/xattr.c > +++ b/fs/f2fs/xattr.c > @@ -310,7 +310,8 @@ static int read_xattr_block(struct inode *inode, void= *txattr_addr) > return PTR_ERR(xfolio); > > xattr_addr =3D folio_address(xfolio); > - memcpy(txattr_addr + inline_size, xattr_addr, VALID_XATTR_BLOCK_S= IZE); > + memcpy(txattr_addr + inline_size, xattr_addr, > + VALID_XATTR_BLOCK_SIZE(inode)); > f2fs_folio_put(xfolio, true); > > return 0; > @@ -393,7 +394,7 @@ static int read_all_xattrs(struct inode *inode, struc= t folio *ifolio, > { > struct f2fs_xattr_header *header; > nid_t xnid =3D F2FS_I(inode)->i_xattr_nid; > - unsigned int size =3D VALID_XATTR_BLOCK_SIZE; > + unsigned int size =3D VALID_XATTR_BLOCK_SIZE(inode); > unsigned int inline_size =3D inline_xattr_size(inode); > void *txattr_addr; > int err; > @@ -502,7 +503,8 @@ static inline int write_all_xattrs(struct inode *inod= e, __u32 hsize, > > if (inline_size) > memcpy(inline_addr, txattr_addr, inline_size); > - memcpy(xattr_addr, txattr_addr + inline_size, VALID_XATTR_BLOCK_S= IZE); > + memcpy(xattr_addr, txattr_addr + inline_size, > + VALID_XATTR_BLOCK_SIZE(inode)); > > if (inline_size) > folio_mark_dirty(ifolio ? ifolio : in_folio); > diff --git a/fs/f2fs/xattr.h b/fs/f2fs/xattr.h > index bce3d93e4755..d9e2c65a1fc7 100644 > --- a/fs/f2fs/xattr.h > +++ b/fs/f2fs/xattr.h > @@ -71,24 +71,29 @@ struct f2fs_xattr_entry { > for (entry =3D XATTR_FIRST_ENTRY(addr);\ > !IS_XATTR_LAST_ENTRY(entry);\ > entry =3D XATTR_NEXT_ENTRY(entry)) > -#define VALID_XATTR_BLOCK_SIZE (PAGE_SIZE - sizeof(struct node_footer)) > +#define VALID_XATTR_BLOCK_SIZE(i) (i_blocksize(i) - \ > + sizeof(struct node_footer)) > #define XATTR_PADDING_SIZE (sizeof(__u32)) > #define XATTR_SIZE(i) ((F2FS_I(i)->i_xattr_nid ? \ > - VALID_XATTR_BLOCK_SIZE : 0) + \ > + VALID_XATTR_BLOCK_SIZE(i) : 0) + = \ > (inline_xattr_size(i))) > #define MIN_OFFSET(i) XATTR_ALIGN(inline_xattr_size(i) + \ > - VALID_XATTR_BLOCK_SIZE) > + VALID_XATTR_BLOCK_SIZE(i)= ) > > #define MAX_VALUE_LEN(i) (MIN_OFFSET(i) - \ > sizeof(struct f2fs_xattr_header) - \ > sizeof(struct f2fs_xattr_entry)) > > #define MIN_INLINE_XATTR_SIZE (sizeof(struct f2fs_xattr_header) / sizeof= (__le32)) > -#define MAX_INLINE_XATTR_SIZE \ > - (DEF_ADDRS_PER_INODE - \ > +#define MAX_INLINE_XATTR_SIZE_FOR_BLOCKSIZE(blocksize) \ > + (((blocksize) - OFFSET_OF_END_OF_I_EXT - \ > + SIZE_OF_I_NID - sizeof(struct node_footer)) / \ > + sizeof(__le32) - \ > F2FS_TOTAL_EXTRA_ATTR_SIZE / sizeof(__le32) - \ > DEF_INLINE_RESERVED_SIZE - \ > MIN_INLINE_DENTRY_SIZE / sizeof(__le32)) > +#define MAX_INLINE_XATTR_SIZE(inode) \ > + MAX_INLINE_XATTR_SIZE_FOR_BLOCKSIZE(i_blocksize(i= node)) Regarding MAX_INLINE_XATTR_SIZE and MAX_INLINE_XATTR_SIZE_FOR_BLOCKSIZE: Currently, two separate macros are defined in fs/f2fs/xattr.h: 1. MAX_INLINE_XATTR_SIZE_FOR_BLOCKSIZE(blocksize) - taking a blocksize valu= e 2. MAX_INLINE_XATTR_SIZE(inode) - a wrapper calling the above with i_blocksize(inode) This duplication was added because in super.c (during mount option parsing = in f2fs_parse_param), there is no struct inode instance yet, so F2FS_MIN_BLKSI= ZE had to be passed explicitly. Instead of maintaining the verbose `_FOR_BLOCKSIZE` duplicate macro, we can simply define a single unified macro that takes the blocksize: #define MAX_INLINE_XATTR_SIZE(bs) \ (F2FS_DEF_ADDRS_PER_INODE(bs) - \ F2FS_TOTAL_EXTRA_ATTR_SIZE / sizeof(__le32) - \ DEF_INLINE_RESERVED_SIZE - \ MIN_INLINE_DENTRY_SIZE / sizeof(__le32)) Call sites can then pass the blocksize directly: - In super.c: MAX_INLINE_XATTR_SIZE(F2FS_MIN_BLKSIZE) - In inode.c: MAX_INLINE_XATTR_SIZE(i_blocksize(inode)) (or MAX_INLINE_XATTR_SIZE(F2FS_I_SB(inode)->blocksize)) Thanks, > #define DEFAULT_XATTR_SLAB_SIZE (DEFAULT_INLINE_XATTR_ADDRS * = \ > sizeof(__le32) + XATTR_PADDING_SIZE) > > diff --git a/include/linux/f2fs_fs.h b/include/linux/f2fs_fs.h > index 3d0fe2c78e12..d4151970ae86 100644 > --- a/include/linux/f2fs_fs.h > +++ b/include/linux/f2fs_fs.h > @@ -15,6 +15,8 @@ > #define F2FS_MIN_LOG_SECTOR_SIZE 9 /* 9 bits for 512 bytes *= / > #define F2FS_MAX_LOG_SECTOR_SIZE PAGE_SHIFT /* Max is Block S= ize */ > #define F2FS_LOG_SECTORS_PER_BLOCK (PAGE_SHIFT - 9) /* log number fo= r sector/blk */ > +#define F2FS_MIN_LOG_BLOCKSIZE 12 > +#define F2FS_MIN_BLKSIZE 4096UL > #define F2FS_BLKSIZE PAGE_SIZE /* support only block = =3D=3D page */ > #define F2FS_MAX_BLKSIZE PAGE_SIZE > #define F2FS_BLKSIZE_BITS PAGE_SHIFT /* bits for F2FS_BLKSI= ZE */ > -- > 2.53.0 > > > > _______________________________________________ > Linux-f2fs-devel mailing list > Linux-f2fs-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel