[PATCH v7] erofs-utils: mount: add OCI recovery support for NBD reattach

Gao Xiang hsiangkao at linux.alibaba.com
Wed Sep 10 17:10:52 AEST 2025



On 2025/9/10 14:13, ChengyuZhu6 wrote:
> From: Chengyu Zhu <hudsonzhu at tencent.com>
> 
> This commit implements recovery support for OCI-based NBD mounts,
> allowing the system to properly reattach NBD devices after
> NBD disconnection.
> 
> Signed-off-by: Chengyu Zhu <hudsonzhu at tencent.com>
> ---
>   lib/liberofs_oci.h |   3 +
>   lib/remotes/oci.c  |  71 ++++++++++++++++++++++
>   mount/main.c       | 143 ++++++++++++++++++++++++++++++++++++---------
>   3 files changed, 189 insertions(+), 28 deletions(-)
> 
> diff --git a/lib/liberofs_oci.h b/lib/liberofs_oci.h
> index 01a83aa..aa41141 100644
> --- a/lib/liberofs_oci.h
> +++ b/lib/liberofs_oci.h
> @@ -71,6 +71,9 @@ int ocierofs_build_trees(struct erofs_importer *importer,
>   			 const struct ocierofs_config *cfg);
>   int ocierofs_io_open(struct erofs_vfile *vf, const struct ocierofs_config *cfg);
>   
> +char *ocierofs_encode_userpass(const char *username, const char *password);
> +int ocierofs_decode_userpass(const char *b64, char **out_user, char **out_pass);
> +
>   #ifdef __cplusplus
>   }
>   #endif
> diff --git a/lib/remotes/oci.c b/lib/remotes/oci.c
> index de18daa..a00c04a 100644
> --- a/lib/remotes/oci.c
> +++ b/lib/remotes/oci.c
> @@ -24,6 +24,7 @@
>   #include "erofs/io.h"
>   #include "erofs/print.h"
>   #include "erofs/tar.h"
> +#include "liberofs_base64.h"
>   #include "liberofs_oci.h"
>   #include "liberofs_private.h"
>   
> @@ -1471,6 +1472,76 @@ int ocierofs_io_open(struct erofs_vfile *vfile, const struct ocierofs_config *cf
>   	*(struct ocierofs_iostream **)vfile->payload = oci_iostream;
>   	return 0;
>   }
> +
> +char *ocierofs_encode_userpass(const char *username, const char *password)
> +{
> +	char *buf;
> +	char *out;
> +	int ret;
> +	size_t outlen;
> +	size_t inlen;
> +
> +	if (asprintf(&buf, "%s:%s", username ?: "", password ?: "") == -1)
> +		return ERR_PTR(-ENOMEM);

inlen can be gotten from the return value of `asprintf`...

> +
> +	inlen = strlen(buf);
> +	outlen = 4 * DIV_ROUND_UP(inlen, 3);
> +	out = malloc(outlen + 1);
> +	if (!out) {
> +		free(buf);
> +		return ERR_PTR(-ENOMEM);
> +	}
> +	ret = erofs_base64_encode((unsigned char *)buf, inlen, out);
> +	if (ret < 0) {
> +		free(buf);
> +		free(out);
> +		return ERR_PTR(ret);
> +	}

	if (!out) {
		ret = -ENOMEM;
	} else {
		ret = erofs_base64_encode((unsigned char *)buf, inlen, out);
		if (ret < 0)
			free(out);
	}
	free(buf);
	return ret < 0 ? ERR_PTR(ret) : out;

Otherwise it looks good to me.

Thanks,
Gao Xiang


More information about the Linux-erofs mailing list