From 6b70e4ad81f4af032eb72e0691dfe888122dfdb2 Mon Sep 17 00:00:00 2001 From: Tycho Andersen Date: Thu, 18 Sep 2014 00:32:00 +0400 Subject: [PATCH] remap: add remap_type field and use it Maintain backwards compatibility for old images, but don't set the REMAP_GHOST bit going forward, only use the remap_type field. v2: * preserve remap_id in GHOST_REMAP case * protobuf field is remap_type enum not u32 Signed-off-by: Tycho Andersen Signed-off-by: Pavel Emelyanov --- files-reg.c | 32 +++++++++++++++++++++++++------- protobuf/remap-file-path.proto | 6 ++++++ 2 files changed, 31 insertions(+), 7 deletions(-) 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; }