Re: [PATCH] hfsplus: preserve FinderInfo when listing extended attributes

From: Viacheslav Dubeyko

Date: Wed Oct 21 2026 - 17:05:53 EST


On Wed, 2026-10-21 at 13:45 -0400, Hengyu Liang wrote:
> Commit aef507847129 ("hfsplus: fix generic/062 xfstests failure")
> made
> hfsplus_listxattr() return zero when the inode has no records in the
> attributes B-tree.
>
> However, osx.com.apple.FinderInfo is stored in the catalog record,
> and
> hfsplus_listxattr() has already added it to the result at that point.
> Setting the result to zero drops it. As of now, a file whose only
> extended attribute is FinderInfo gets an empty list on a volume with
> an attributes B-tree, which mkfs.hfsplus creates by default.
> getxattr()
> still returns the value.
>
> The issue can be reproduced with:
>
>     truncate -s 64M hfs.img
>     mkfs.hfsplus hfs.img
>     mount -o loop hfs.img /mnt
>     touch /mnt/file
>     v=0x54455854$(printf %056d 0)
>     setfattr -n osx.com.apple.FinderInfo -v $v /mnt/file
>     getfattr -m - /mnt/file
>
> Without this patch, getfattr prints nothing. With this patch, it
> lists
> the FinderInfo entry.
>
> This patch keeps the result of hfsplus_listxattr_finder_info() when
> no
> attributes B-tree records are found, as is already done when the
> volume has no attributes B-tree. A file without extended attributes
> still gets an empty list.
>
> Fixes: aef507847129 ("hfsplus: fix generic/062 xfstests failure")
> Cc: stable@xxxxxxxxxxxxxxx
> Signed-off-by: Hengyu Liang <hengyul@xxxxxxxxxx>
> ---
> Tested in KVM with KASAN on a804c5742bff, without and with this
> patch:
> - The commands above, and a C test of listxattr() sizes and buffer
>   lengths: a file with only FinderInfo gives 0 without the patch and
>   25 with it; a file without extended attributes gives 0 on both.
> - generic/062: 10/10 passed on both kernels.
> - Full fstests (805 generic tests): 186 passed, 11 failed and 608 not
>   run on both kernels, with the same failing tests. fsck.hfsplus -fn
>   reported no new errors.
>
> With this patch, getfattr above prints "osx.com.apple.FinderInf". The
> last character is lost by a separate bug in copy_name(), which
> Maurycy
> Pawlowski-Wieronski's patch fixes:
> https://lore.kernel.org/all/20260828-hfsplus-copy_name-fix-v1-1-75ed9f0f378c@xxxxxxxxxxx/

Somehow, discussion went nowhere. I am still waiting answers on my
questions. It will be great if you could revive the discussion or to
resend the patch addressing my comments.

>
>  fs/hfsplus/xattr.c | 1 -
>  1 file changed, 1 deletion(-)
>
> diff --git a/fs/hfsplus/xattr.c b/fs/hfsplus/xattr.c
> index 71364e093fa7..c74c81966f12 100644
> --- a/fs/hfsplus/xattr.c
> +++ b/fs/hfsplus/xattr.c
> @@ -838,7 +838,6 @@ ssize_t hfsplus_listxattr(struct dentry *dentry,
> char *buffer, size_t size)
>   err = hfsplus_find_attr(inode->i_sb, inode->i_ino, NULL,
> &fd);
>   if (err) {
>   if (err == -ENOENT || err == -ENODATA) {
> - res = 0;
>   goto end_listxattr;
>   } else {
>   res = err;

I think the fix makes sense. Maybe, we need to slightly rework the code
here:

err = hfsplus_find_attr(inode->i_sb, inode->i_ino, NULL, &fd);
if (err) {
if (err != -ENOENT && err != -ENODATA)
res = err;
goto end_listxattr;
}

What do you think?

Thanks,
Slava.

>
> base-commit: a804c5742bff224d4cb4d25dd383554d598be32b