I have tested this patch and it can fix the autoclear issue when executing 
`mount.erofs -t erofs.nbd erofs.img /mnt`.

Nice patch, Xiang.

Thanks,
Chengyu Zhu

> 2025年9月5日 11:39,Gao Xiang <hsiang...@linux.alibaba.com> 写道:
> 
> The trailing '\n' shouldn't be part of backend.
> 
> Fixes: 5d3efc9babf3 ("erofs-utils: mount: enable autoclear for NBD devices")
> Cc: Chengyu Zhu <hud...@cyzhu.com>
> Signed-off-by: Gao Xiang <hsiang...@linux.alibaba.com>
> ---
> lib/backends/nbd.c | 21 +++++++++++++++------
> mount/main.c       | 20 +++++---------------
> 2 files changed, 20 insertions(+), 21 deletions(-)
> 
> diff --git a/lib/backends/nbd.c b/lib/backends/nbd.c
> index b9535dc..2e54814 100644
> --- a/lib/backends/nbd.c
> +++ b/lib/backends/nbd.c
> @@ -183,15 +183,24 @@ char *erofs_nbd_get_identifier(int nbdnum)
> 
>       (void)snprintf(s, sizeof(s), "/sys/block/nbd%d/backend", nbdnum);
>       f = fopen(s, "r");
> -     if (!f)
> +     if (!f) {
> +             if (errno == ENOENT)
> +                     return NULL;
>               return ERR_PTR(-errno);
> -
> -     if (getline(&line, &n, f) < 0)
> +     }
> +     err = getline(&line, &n, f);
> +     if (err < 0)
>               err = -errno;
> -     else
> -             err = 0;
>       fclose(f);
> -     return err ? ERR_PTR(err) : line;
> +     if (err < 0)
> +             return ERR_PTR(err);
> +     if (!err) {
> +             free(line);
> +             return NULL;
> +     }
> +     if (line[err - 1] == '\n')
> +             line[err - 1] = '\0';
> +     return line;
> }
> 
> int erofs_nbd_get_index_from_minor(int minor)
> diff --git a/mount/main.c b/mount/main.c
> index 149bb53..2826dac 100644
> --- a/mount/main.c
> +++ b/mount/main.c
> @@ -356,10 +356,7 @@ static int erofsmount_nbd_fix_backend_linkage(int num, 
> char **recp)
>       int err;
> 
>       newrecp = erofs_nbd_get_identifier(num);
> -     if (!IS_ERR(newrecp)) {
> -             err = strlen(newrecp);
> -             if (newrecp[err - 1] == '\n')
> -                     newrecp[err - 1] = '\0';
> +     if (!IS_ERR(newrecp) && newrecp) {
>               err = strcmp(newrecp, *recp) ? -EFAULT : 0;
>               free(newrecp);
>               return err;
> @@ -461,16 +458,11 @@ static int erofsmount_reattach(const char *target)
>       if (nbdnum < 0)
>               return nbdnum;
>       identifier = erofs_nbd_get_identifier(nbdnum);
> -     if (IS_ERR(identifier))
> +     if (IS_ERR(identifier)) {
> +             identifier = NULL;
> +     } else if (identifier && *identifier == '\0') {
> +             free(identifier);
>               identifier = NULL;
> -     else if (identifier) {
> -             n = strlen(identifier);
> -             if (__erofs_unlikely(!n)) {
> -                     free(identifier);
> -                     identifier = NULL;
> -             } else if (identifier[n - 1] == '\n') {
> -                     identifier[n - 1] = '\0';
> -             }
>       }
> 
>       if (!identifier &&
> @@ -596,8 +588,6 @@ static int erofsmount_nbd(const char *source, const char 
> *mountpoint,
> 
>               if (!err && is_netlink) {
>                       id = erofs_nbd_get_identifier(num);
> -                     if (id == ERR_PTR(-ENOENT))
> -                             id = NULL;
> 
>                       err = IS_ERR(id) ? PTR_ERR(id) :
>                               erofs_nbd_nl_reconfigure(num, id, true);
> -- 
> 2.43.5


Reply via email to