[External] [PATCH] erofs: check the uniqueness of fsid in shared domain in advance
Hou Tao
houtao at huaweicloud.com
Fri Nov 25 19:39:47 AEDT 2022
Hi,
On 11/25/2022 4:25 PM, Jia Zhu wrote:
> Hi Tao,
> We've noticed this warning during development. It seems not a bug, so
> I ignored that.
> Many thanks for cacthing and clearing up the annoying warning.
Yes, it is not a bug. The duplicated mount will fail with -EEXIST even without
the patch. But it is a bit scary to see such warning in dmesg, so just fix it.
>
> 在 2022/11/25 15:40, Hou Tao 写道:
>> From: Hou Tao <houtao1 at huawei.com>
>>
>> When shared domain is enabled, doing mount twice with the same fsid and
>> domain_id will trigger sysfs warning as shown below:
>>
>> sysfs: cannot create duplicate filename '/fs/erofs/d0,meta.bin'
>> CPU: 15 PID: 1051 Comm: mount Not tainted 6.1.0-rc6+ #1
>> Hardware name: QEMU Standard PC (i440FX + PIIX, 1996)
>> Call Trace:
>> <TASK>
>> dump_stack_lvl+0x38/0x49
>> dump_stack+0x10/0x12
>> sysfs_warn_dup.cold+0x17/0x27
>> sysfs_create_dir_ns+0xb8/0xd0
>> kobject_add_internal+0xb1/0x240
>> kobject_init_and_add+0x71/0xa0
>> erofs_register_sysfs+0x89/0x110
>> erofs_fc_fill_super+0x98c/0xaf0
>> vfs_get_super+0x7d/0x100
>> get_tree_nodev+0x16/0x20
>> erofs_fc_get_tree+0x20/0x30
>> vfs_get_tree+0x24/0xb0
>> path_mount+0x2fa/0xa90
>> do_mount+0x7c/0xa0
>> __x64_sys_mount+0x8b/0xe0
>> do_syscall_64+0x30/0x60
>> entry_SYSCALL_64_after_hwframe+0x46/0xb0
>>
>> The reason is erofs_fscache_register_cookie() doesn't guarantee the primary
>> data blob (aka fsid) is unique in the shared domain and
>> erofs_register_sysfs() invoked by the second mount will fail due to the
>> duplicated fsid in the shared domain and report warning.
>>
>> It would be better to check the uniqueness of fsid before doing
>> erofs_register_sysfs(), so adding a new flags parameter for
>> erofs_fscache_register_cookie() and doing the uniqueness check if
>> EROFS_REG_COOKIE_NEED_NOEXIST is enabled.
>>
>> After the patch, the error in dmesg for the duplicated mount would be:
>>
>> erofs: ...: erofs_domain_register_cookie: XX already exists in domain YY
>>
>> Signed-off-by: Hou Tao <houtao1 at huawei.com>
SNIP
>> diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h
>> index 05dc68627722..a5f8c8fcdd17 100644
>> --- a/fs/erofs/internal.h
>> +++ b/fs/erofs/internal.h
>> @@ -604,13 +604,18 @@ static inline int z_erofs_load_lzma_config(struct
>> super_block *sb,
>> }
>> #endif /* !CONFIG_EROFS_FS_ZIP */
>> +/* flags for erofs_fscache_register_cookie() */
>> +#define EROFS_REG_COOKIE_NEED_INODE 1
>> +#define EROFS_REG_COOKIE_NEED_NOEXIST 2
> How about using TAB to align the columns?
> Apart from this, LGTM.
> Reviewed-by: Jia Zhu <zhujia.zj at bytedance.com>
> Thanks.
Thanks for the review. Will do the alignment in v2.
>> +
>> /* fscache.c */
>> #ifdef CONFIG_EROFS_FS_ONDEMAND
>> int erofs_fscache_register_fs(struct super_block *sb);
>> void erofs_fscache_unregister_fs(struct super_block *sb);
>> struct erofs_fscache *erofs_fscache_register_cookie(struct super_block *sb,
>> - char *name, bool need_inode);
>> + char *name,
>> + unsigned int flags);
>> void erofs_fscache_unregister_cookie(struct erofs_fscache *fscache);
>> extern const struct address_space_operations erofs_fscache_access_aops;
>> @@ -623,7 +628,8 @@ static inline void erofs_fscache_unregister_fs(struct
>> super_block *sb) {}
>> static inline
>> struct erofs_fscache *erofs_fscache_register_cookie(struct super_block *sb,
>> - char *name, bool need_inode)
>> + char *name,
>> + unsigned int flags)
>> {
>> return ERR_PTR(-EOPNOTSUPP);
>> }
>> diff --git a/fs/erofs/super.c b/fs/erofs/super.c
>> index 1c7dcca702b3..481788c24a68 100644
>> --- a/fs/erofs/super.c
>> +++ b/fs/erofs/super.c
>> @@ -245,7 +245,7 @@ static int erofs_init_device(struct erofs_buf *buf,
>> struct super_block *sb,
>> }
>> if (erofs_is_fscache_mode(sb)) {
>> - fscache = erofs_fscache_register_cookie(sb, dif->path, false);
>> + fscache = erofs_fscache_register_cookie(sb, dif->path, 0);
>> if (IS_ERR(fscache))
>> return PTR_ERR(fscache);
>> dif->fscache = fscache;
> .
More information about the Linux-erofs
mailing list