From a994592d75e64b50201121f6357ea73a0b7d4e6e Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Thu, 11 Oct 2012 17:15:55 +1100 Subject: [PATCH] Fix open_container open_container should open a container which contains the device, but sometimes it would open another volume which contains the device. Be more careful in 'holder' selection. Signed-off-by: NeilBrown --- util.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/util.c b/util.c index 687a2ce2..4581fbd4 100644 --- a/util.c +++ b/util.c @@ -1352,6 +1352,20 @@ int open_container(int fd) continue; if (de->d_name[0] == '.') continue; + /* Need to make sure it is a container and not a volume */ + sprintf(e, "/%s/md/metadata_version", de->d_name); + dfd = open(path, O_RDONLY); + if (dfd < 0) + continue; + n = read(dfd, buf, sizeof(buf)); + close(dfd); + if (n <= 0 || (unsigned)n >= sizeof(buf)) + continue; + buf[n] = 0; + if (strncmp(buf, "external", 8) != 0 || + n < 10 || + buf[9] == '/') + continue; sprintf(e, "/%s/dev", de->d_name); dfd = open(path, O_RDONLY); if (dfd < 0) -- 2.39.2