summaryrefslogtreecommitdiff
path: root/Build.c
diff options
context:
space:
mode:
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;
}