diff --git a/files-reg.c b/files-reg.c index 0ffce0e08..bb16e5f3c 100644 --- a/files-reg.c +++ b/files-reg.c @@ -131,7 +131,6 @@ static int open_remap_ghost(struct reg_file_info *rfi, int ifd; char *root; - rfe->remap_id &= ~REMAP_GHOST; list_for_each_entry(gf, &ghost_files, list) if (gf->id == rfe->remap_id) goto gf_found; @@ -246,10 +245,29 @@ static int collect_one_remap(void *obj, ProtobufCMessage *msg) rfi = container_of(fdesc, struct reg_file_info, d); pr_info("Configuring remap %#x -> %#x\n", rfi->rfe->id, rfe->remap_id); - if (rfe->remap_id & REMAP_GHOST) - ret = open_remap_ghost(rfi, rfe); - else + + if (!rfe->has_remap_type) { + rfe->has_remap_type = true; + /* backward compatibility with images */ + if (rfe->remap_id & REMAP_GHOST) { + rfe->remap_id &= ~REMAP_GHOST; + rfe->remap_type = REMAP_TYPE__GHOST; + } else + rfe->remap_type = REMAP_TYPE__LINKED; + } + + switch (rfe->remap_type) { + case REMAP_TYPE__LINKED: ret = open_remap_linked(rfi, rfe); + break; + case REMAP_TYPE__GHOST: + ret = open_remap_ghost(rfi, rfe); + break; + default: + pr_err("unknown remap type %u\n", rfe->remap_type); + goto out; + } + out: return ret; } @@ -375,10 +393,10 @@ static int dump_ghost_remap(char *path, const struct stat *st, return -1; dump_entry: - BUG_ON(gf->id & REMAP_GHOST); - rpe.orig_id = id; - rpe.remap_id = gf->id | REMAP_GHOST; + rpe.remap_id = gf->id; + rpe.has_remap_type = true; + rpe.remap_type = REMAP_TYPE__GHOST; return pb_write_one(fdset_fd(glob_fdset, CR_FD_REMAP_FPATH), &rpe, PB_REMAP_FPATH); diff --git a/protobuf/remap-file-path.proto b/protobuf/remap-file-path.proto index faeb745c5..37d50e54a 100644 --- a/protobuf/remap-file-path.proto +++ b/protobuf/remap-file-path.proto @@ -1,4 +1,10 @@ +enum remap_type { + LINKED = 0; + GHOST = 1; +}; + message remap_file_path_entry { required uint32 orig_id = 1; required uint32 remap_id = 2; + optional remap_type remap_type = 3; }