[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