On 2025/9/9 15:09, ChengyuZhu6 wrote:
From: Chengyu Zhu <hudson...@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 <hudson...@tencent.com>
---
mount/main.c | 100 ++++++++++++++++++++++++++++++++++++++-------------
1 file changed, 75 insertions(+), 25 deletions(-)
diff --git a/mount/main.c b/mount/main.c
index c52ac3b..37e9f6d 100644
--- a/mount/main.c
+++ b/mount/main.c
@@ -401,12 +401,14 @@ out_closefd:
return err;
}
-static char *erofsmount_write_recovery_info(const char *source)
+static char *erofsmount_write_recovery_info(struct erofs_nbd_source *source)
{
char recp[] = "/var/run/erofs/mountnbd_XXXXXX";
char *realp;
int fd, err;
FILE *f;
+ char *content = NULL;
+ int ret;
fd = mkstemp(recp);
if (fd < 0 && errno == ENOENT) {
@@ -424,15 +426,32 @@ static char *erofsmount_write_recovery_info(const char
*source)
return ERR_PTR(-errno);
}
- realp = realpath(source, NULL);
- if (!realp) {
- fclose(f);
- return ERR_PTR(-errno);
+ if (source->type == EROFSNBD_SOURCE_OCI) {
Could we just split this block into:
erofsmount_write_recovery_oci(f, source);
+ ret = asprintf(&content, "%s %s %s %s %d",
+ source->ocicfg.image_ref ?: "",
+ source->ocicfg.platform ?: "",
+ source->ocicfg.username ?: "",
+ source->ocicfg.password ?: "",
Could we just encode username:password into base64?
+ source->ocicfg.layer_index);
+ if (ret < 0) {
+ fclose(f);
+ return ERR_PTR(-ENOMEM);
+ }
+ err = fprintf(f, "OCI_LAYER %s\n", content) < 0;
+ free(content);
+ } else {
and this into:
erofsmount_write_recovery_local(f, source);
+ realp = realpath(source->device_path, NULL);
+ if (!realp) {
+ fclose(f);
+ return ERR_PTR(-errno);
+ }
+
+ /* TYPE<LOCAL> <SOURCE PATH>\n(more..) */
+ err = fprintf(f, "LOCAL %s\n", realp) < 0;
+ free(realp);
}
- /* TYPE<LOCAL> <SOURCE PATH>\n(more..) */
- err = fprintf(f, "LOCAL %s\n", realp) < 0;
+
fclose(f);
- free(realp);
if (err)
return ERR_PTR(-ENOMEM);
return strdup(recp) ?: ERR_PTR(-ENOMEM);
@@ -491,15 +510,10 @@ static int erofsmount_startnbd_nl(pid_t *pid, struct
erofs_nbd_source *source)
exit(EXIT_FAILURE);
ctx.vd.fd = err;
}
-
- if (source->type == EROFSNBD_SOURCE_LOCAL) {
- recp =
erofsmount_write_recovery_info(source->device_path);
- if (IS_ERR(recp)) {
- erofs_io_close(&ctx.vd);
- exit(EXIT_FAILURE);
- }
- } else {
- recp = NULL;
+ recp = erofsmount_write_recovery_info(source);
+ if (IS_ERR(recp)) {
+ erofs_io_close(&ctx.vd);
+ exit(EXIT_FAILURE);
}
num = -1;
@@ -595,19 +609,55 @@ static int erofsmount_reattach(const char *target)
*(source++) = '\0';
}
- if (strcmp(line, "LOCAL")) {
+ if (!strcmp(line, "LOCAL")) {
+ err = open(source, O_RDONLY);
+ if (err < 0) {
+ err = -errno;
+ goto err_line;
+ }
+ ctx.vd.fd = err;
+ } else if (!strcmp(line, "OCI_LAYER")) {
+ struct ocierofs_config oci_cfg = {};
+ char *platform, *username, *password, *layer_str;
+ int layer_index;
+
+ platform = strchr(source, ' ');
+ if (platform) {
+ *platform++ = '\0';
+ oci_cfg.image_ref = source;
+ oci_cfg.platform = platform;
+ } else {
+ oci_cfg.image_ref = source;
+ }
+
+ username = strchr(platform ?: source, ' ');
+ if (username) {
+ *username++ = '\0';
+ oci_cfg.username = username;
+ }
+
+ password = strchr(username ?: (platform ?: source), ' ');
+ if (password) {
+ *password++ = '\0';
+ oci_cfg.password = password;
+ }
+
+ layer_str = strchr(password ?: (username ?: (platform ?:
source)), ' ');
+ if (layer_str) {
+ *layer_str++ = '\0';
+ layer_index = atoi(layer_str);
+ oci_cfg.layer_index = layer_index;
+ }
Move those into erofsmount_parse_recovery_ocilayer(&oci_cfg, source)?
Thanks,
Gao Xiang