summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2008-11-04 20:50:38 +1100
committerNeilBrown <neilb@suse.de>2008-11-04 20:50:38 +1100
commita04d576343fcdc3da6dee3a198a4534daddbe96e (patch)
tree83f4a5e0b9b7ccd7df8d91647da4f943e0417899
parent9180c81bd7f4f3dd2fb9f2835894d8c0e9488dbd (diff)
downloadmdadm-a04d576343fcdc3da6dee3a198a4534daddbe96e.tar.gz
mdadm-a04d576343fcdc3da6dee3a198a4534daddbe96e.tar.xz
mdadm-a04d576343fcdc3da6dee3a198a4534daddbe96e.zip
Always update mdadm/map when starting an array.
We previously only updated /var/run/mdadm/map when starting an array with --incremental. However we now make more use of that file (to pass the dev name to udev) so always update it. Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--Assemble.c11
-rw-r--r--Build.c7
-rw-r--r--Create.c7
-rw-r--r--mapfile.c3
-rw-r--r--mdassemble.c5
5 files changed, 29 insertions, 4 deletions
diff --git a/Assemble.c b/Assemble.c
index 5179df9..5c5a13e 100644
--- a/Assemble.c
+++ b/Assemble.c
@@ -144,6 +144,7 @@ int Assemble(struct supertype *st, char *mddev,
int nextspare = 0;
char *name;
int trustworthy;
+ char chosen_name[1024];
memset(&info, 0, sizeof(info));
@@ -429,7 +430,8 @@ int Assemble(struct supertype *st, char *mddev,
trustworthy = FOREIGN;
break;
}
- mdfd = create_mddev(mddev, name, ident->autof, trustworthy, NULL);
+ mdfd = create_mddev(mddev, name, ident->autof, trustworthy,
+ chosen_name);
if (mdfd < 0) {
st->ss->free_super(st);
free(devices);
@@ -437,6 +439,7 @@ int Assemble(struct supertype *st, char *mddev,
goto try_again;
return 1;
}
+ mddev = chosen_name;
vers = md_get_version(mdfd);
if (vers < 9000) {
fprintf(stderr, Name ": Assemble requires driver version 0.90.0 or later.\n"
@@ -899,6 +902,12 @@ int Assemble(struct supertype *st, char *mddev,
if (!old_linux) {
int rv;
+ /* First, fill in the map, so that udev can find our name
+ * as soon as we become active.
+ */
+ map_update(NULL, fd2devnum(mdfd), info.text_version,
+ info.uuid, chosen_name);
+
rv = set_array_info(mdfd, st, &info);
if (rv) {
fprintf(stderr, Name ": failed to set array info for %s: %s\n",
diff --git a/Build.c b/Build.c
index 789aca4..d831e55 100644
--- a/Build.c
+++ b/Build.c
@@ -60,6 +60,8 @@ int Build(char *mddev, int chunk, int level, int layout,
unsigned long long size = ~0ULL;
unsigned long long bitmapsize;
int mdfd;
+ char chosen_name[1024];
+ int uuid[4] = {0,0,0,0};
/* scan all devices, make sure they really are block devices */
for (dv = devlist; dv; dv=dv->next) {
@@ -114,10 +116,13 @@ int Build(char *mddev, int chunk, int level, int layout,
}
/* We need to create the device. It can have no name. */
- mdfd = create_mddev(mddev, NULL, autof, LOCAL, NULL);
+ mdfd = create_mddev(mddev, NULL, autof, LOCAL,
+ chosen_name);
if (mdfd < 0)
return 1;
+ map_update(NULL, fd2devnum(mdfd), "none", uuid, chosen_name);
+
vers = md_get_version(mdfd);
/* looks Ok, go for it */
diff --git a/Create.c b/Create.c
index ab4406e..23047c9 100644
--- a/Create.c
+++ b/Create.c
@@ -79,6 +79,7 @@ int Create(struct supertype *st, char *mddev,
struct mdinfo info, *infos;
int did_default = 0;
unsigned long safe_mode_delay = 0;
+ char chosen_name[1024];
int major_num = BITMAP_MAJOR_HI;
@@ -421,7 +422,7 @@ int Create(struct supertype *st, char *mddev,
}
/* We need to create the device */
- mdfd = create_mddev(mddev, name, autof, LOCAL, NULL);
+ mdfd = create_mddev(mddev, name, autof, LOCAL, chosen_name);
if (mdfd < 0)
return 1;
@@ -439,6 +440,7 @@ int Create(struct supertype *st, char *mddev,
goto abort;
}
}
+
/* Ok, lets try some ioctls */
info.array.level = level;
@@ -559,6 +561,9 @@ int Create(struct supertype *st, char *mddev,
" %s metadata\n", info.text_version);
}
+ map_update(NULL, fd2devnum(mdfd), info.text_version,
+ info.uuid, chosen_name);
+
if (bitmap_file && vers < 9003) {
major_num = BITMAP_MAJOR_HOSTENDIAN;
#ifdef __BIG_ENDIAN
diff --git a/mapfile.c b/mapfile.c
index 14b6df4..53d9aea 100644
--- a/mapfile.c
+++ b/mapfile.c
@@ -161,7 +161,8 @@ int map_update(struct map_ent **mpp, int devnum, char *metadata,
}
if (!mp)
map_add(&map, devnum, metadata, uuid, path);
- *mpp = NULL;
+ if (mpp)
+ *mpp = NULL;
rv = map_write(map);
map_free(map);
return rv;
diff --git a/mdassemble.c b/mdassemble.c
index 270ced2..ef5639a 100644
--- a/mdassemble.c
+++ b/mdassemble.c
@@ -75,6 +75,11 @@ int create_mddev(char *dev, char *name, int autof/*unused*/, int trustworthy,
return open_mddev(dev, 0);
}
#endif
+int map_update(struct map_ent **mpp, int devnum, char *metadata,
+ int *uuid, char *path)
+{
+ return 0;
+}
int rv;
int mdfd = -1;