[PATCH] erofs-utils: lib: avoid trailing '\n' in erofs_nbd_get_identifier()
hudsonZhu
hudson at cyzhu.com
Fri Sep 5 16:12:12 AEST 2025
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 <hsiangkao at 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 <hudson at cyzhu.com>
> Signed-off-by: Gao Xiang <hsiangkao at 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
More information about the Linux-erofs
mailing list