summaryrefslogtreecommitdiff
path: root/Build.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2008-11-04 10:35:37 +1100
committerNeilBrown <neilb@suse.de>2008-11-04 10:35:37 +1100
commit7f91af49ad09adc1b93346f7ad654e25534f35b7 (patch)
tree1b98d19f9382cf17ac7df5db4f07ea8ea48bda8a /Build.c
parentadf0493cba2355fc3714e6ab265f2b6b7de894d8 (diff)
Delay creation of array devices for assemble/build/create
We will shortly be feeding more information into the process of creating array devices, so delay the creation. Still open them early if the device already exists. This involves making sure the autof flag is in the right place so that it can be found at creation time. Also, Assemble, Build, and Create now always close 'mdfd'. Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'Build.c')
-rw-r--r--Build.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/Build.c b/Build.c
index 1e213ce4..1e751d13 100644
--- a/Build.c
+++ b/Build.c
@@ -33,10 +33,10 @@
#define START_MD _IO (MD_MAJOR, 2)
#define STOP_MD _IO (MD_MAJOR, 3)
-int Build(char *mddev, int mdfd, int chunk, int level, int layout,
- int raiddisks,
- mddev_dev_t devlist, int assume_clean,
- char *bitmap_file, int bitmap_chunk, int write_behind, int delay, int verbose)
+int Build(char *mddev, int chunk, int level, int layout,
+ int raiddisks, mddev_dev_t devlist, int assume_clean,
+ char *bitmap_file, int bitmap_chunk, int write_behind,
+ int delay, int verbose, int autof)
{
/* Build a linear or raid0 arrays without superblocks
* We cannot really do any checks, we just do it.
@@ -59,6 +59,7 @@ int Build(char *mddev, int mdfd, int chunk, int level, int layout,
int bitmap_fd;
unsigned long long size = ~0ULL;
unsigned long long bitmapsize;
+ int mdfd;
/* scan all devices, make sure they really are block devices */
for (dv = devlist; dv; dv=dv->next) {
@@ -112,6 +113,10 @@ int Build(char *mddev, int mdfd, int chunk, int level, int layout,
break;
}
+ /* We need to create the device */
+ mdfd = create_mddev(mddev, autof);
+ if (mdfd < 0)
+ return 1;
vers = md_get_version(mdfd);
@@ -140,17 +145,17 @@ int Build(char *mddev, int mdfd, int chunk, int level, int layout,
if (ioctl(mdfd, SET_ARRAY_INFO, &array)) {
fprintf(stderr, Name ": SET_ARRAY_INFO failed for %s: %s\n",
mddev, strerror(errno));
- return 1;
+ goto abort;
}
} else if (bitmap_file) {
fprintf(stderr, Name ": bitmaps not supported with this kernel\n");
- return 1;
+ goto abort;
}
if (bitmap_file && level <= 0) {
fprintf(stderr, Name ": bitmaps not meaningful with level %s\n",
map_num(pers, level)?:"given");
- return 1;
+ goto abort;
}
/* now add the devices */
for ((i=0), (dv = devlist) ; dv ; i++, dv=dv->next) {
@@ -211,7 +216,7 @@ int Build(char *mddev, int mdfd, int chunk, int level, int layout,
if (bitmap_chunk == UnSet) {
fprintf(stderr, Name ": %s cannot be openned.",
bitmap_file);
- return 1;
+ goto abort;
}
#endif
if (vers < 9003) {
@@ -224,20 +229,20 @@ int Build(char *mddev, int mdfd, int chunk, int level, int layout,
bitmapsize = size>>9; /* FIXME wrong for RAID10 */
if (CreateBitmap(bitmap_file, 1, NULL, bitmap_chunk,
delay, write_behind, bitmapsize, major)) {
- return 1;
+ goto abort;
}
bitmap_fd = open(bitmap_file, O_RDWR);
if (bitmap_fd < 0) {
fprintf(stderr, Name ": %s cannot be openned.",
bitmap_file);
- return 1;
+ goto abort;
}
}
if (bitmap_fd >= 0) {
if (ioctl(mdfd, SET_BITMAP_FILE, bitmap_fd) < 0) {
fprintf(stderr, Name ": Cannot set bitmap file for %s: %s\n",
mddev, strerror(errno));
- return 1;
+ goto abort;
}
}
}
@@ -265,6 +270,7 @@ int Build(char *mddev, int mdfd, int chunk, int level, int layout,
if (verbose >= 0)
fprintf(stderr, Name ": array %s built and started.\n",
mddev);
+ close(mdfd);
return 0;
abort:
@@ -272,5 +278,6 @@ int Build(char *mddev, int mdfd, int chunk, int level, int layout,
ioctl(mdfd, STOP_ARRAY, 0);
else
ioctl(mdfd, STOP_MD, 0);
+ close(mdfd);
return 1;
}