|
|
7140c6 |
From 1f5d54a06df01ca3032ca2d29159584cab7d7509 Mon Sep 17 00:00:00 2001
|
|
|
7140c6 |
From: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
|
|
7140c6 |
Date: Mon, 17 May 2021 16:39:03 +0200
|
|
|
7140c6 |
Subject: [PATCH 07/15] Manage: Call validate_geometry when adding drive to
|
|
|
7140c6 |
external container
|
|
|
7140c6 |
|
|
|
7140c6 |
When adding drive to container call validate_geometry to verify whether
|
|
|
7140c6 |
drive is supported and can be addded to container.
|
|
|
7140c6 |
|
|
|
7140c6 |
Remove unused parameters from validate_geometry_imsm_container().
|
|
|
7140c6 |
There is no need to pass them.
|
|
|
7140c6 |
Don't calculate freesize if it is not mandatory. Make it configurable.
|
|
|
7140c6 |
|
|
|
7140c6 |
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@linux.intel.com>
|
|
|
7140c6 |
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
|
|
|
7140c6 |
---
|
|
|
7140c6 |
Manage.c | 7 +++++++
|
|
|
7140c6 |
super-ddf.c | 9 +++++----
|
|
|
7140c6 |
super-intel.c | 19 +++++++------------
|
|
|
7140c6 |
3 files changed, 19 insertions(+), 16 deletions(-)
|
|
|
7140c6 |
|
|
|
7140c6 |
diff --git a/Manage.c b/Manage.c
|
|
|
7140c6 |
index 0a5f09b..f789e0c 100644
|
|
|
7140c6 |
--- a/Manage.c
|
|
|
7140c6 |
+++ b/Manage.c
|
|
|
7140c6 |
@@ -992,6 +992,13 @@ int Manage_add(int fd, int tfd, struct mddev_dev *dv,
|
|
|
7140c6 |
return -1;
|
|
|
7140c6 |
}
|
|
|
7140c6 |
|
|
|
7140c6 |
+ /* Check if metadata handler is able to accept the drive */
|
|
|
7140c6 |
+ if (!tst->ss->validate_geometry(tst, LEVEL_CONTAINER, 0, 1, NULL,
|
|
|
7140c6 |
+ 0, 0, dv->devname, NULL, 0, 1)) {
|
|
|
7140c6 |
+ close(container_fd);
|
|
|
7140c6 |
+ return -1;
|
|
|
7140c6 |
+ }
|
|
|
7140c6 |
+
|
|
|
7140c6 |
Kill(dv->devname, NULL, 0, -1, 0);
|
|
|
7140c6 |
dfd = dev_open(dv->devname, O_RDWR | O_EXCL|O_DIRECT);
|
|
|
7140c6 |
if (tst->ss->add_to_super(tst, &disc, dfd,
|
|
|
7140c6 |
diff --git a/super-ddf.c b/super-ddf.c
|
|
|
7140c6 |
index 2314762..80a40f8 100644
|
|
|
7140c6 |
--- a/super-ddf.c
|
|
|
7140c6 |
+++ b/super-ddf.c
|
|
|
7140c6 |
@@ -3475,10 +3475,11 @@ validate_geometry_ddf_container(struct supertype *st,
|
|
|
7140c6 |
return 0;
|
|
|
7140c6 |
}
|
|
|
7140c6 |
close(fd);
|
|
|
7140c6 |
-
|
|
|
7140c6 |
- *freesize = avail_size_ddf(st, ldsize >> 9, INVALID_SECTORS);
|
|
|
7140c6 |
- if (*freesize == 0)
|
|
|
7140c6 |
- return 0;
|
|
|
7140c6 |
+ if (freesize) {
|
|
|
7140c6 |
+ *freesize = avail_size_ddf(st, ldsize >> 9, INVALID_SECTORS);
|
|
|
7140c6 |
+ if (*freesize == 0)
|
|
|
7140c6 |
+ return 0;
|
|
|
7140c6 |
+ }
|
|
|
7140c6 |
|
|
|
7140c6 |
return 1;
|
|
|
7140c6 |
}
|
|
|
7140c6 |
diff --git a/super-intel.c b/super-intel.c
|
|
|
7140c6 |
index fdcefb6..fe45d93 100644
|
|
|
7140c6 |
--- a/super-intel.c
|
|
|
7140c6 |
+++ b/super-intel.c
|
|
|
7140c6 |
@@ -6652,8 +6652,7 @@ static int store_super_imsm(struct supertype *st, int fd)
|
|
|
7140c6 |
}
|
|
|
7140c6 |
|
|
|
7140c6 |
static int validate_geometry_imsm_container(struct supertype *st, int level,
|
|
|
7140c6 |
- int layout, int raiddisks, int chunk,
|
|
|
7140c6 |
- unsigned long long size,
|
|
|
7140c6 |
+ int raiddisks,
|
|
|
7140c6 |
unsigned long long data_offset,
|
|
|
7140c6 |
char *dev,
|
|
|
7140c6 |
unsigned long long *freesize,
|
|
|
7140c6 |
@@ -6725,8 +6724,8 @@ static int validate_geometry_imsm_container(struct supertype *st, int level,
|
|
|
7140c6 |
}
|
|
|
7140c6 |
}
|
|
|
7140c6 |
}
|
|
|
7140c6 |
-
|
|
|
7140c6 |
- *freesize = avail_size_imsm(st, ldsize >> 9, data_offset);
|
|
|
7140c6 |
+ if (freesize)
|
|
|
7140c6 |
+ *freesize = avail_size_imsm(st, ldsize >> 9, data_offset);
|
|
|
7140c6 |
rv = 1;
|
|
|
7140c6 |
exit:
|
|
|
7140c6 |
if (super)
|
|
|
7140c6 |
@@ -7586,15 +7585,11 @@ static int validate_geometry_imsm(struct supertype *st, int level, int layout,
|
|
|
7140c6 |
* if given unused devices create a container
|
|
|
7140c6 |
* if given given devices in a container create a member volume
|
|
|
7140c6 |
*/
|
|
|
7140c6 |
- if (level == LEVEL_CONTAINER) {
|
|
|
7140c6 |
+ if (level == LEVEL_CONTAINER)
|
|
|
7140c6 |
/* Must be a fresh device to add to a container */
|
|
|
7140c6 |
- return validate_geometry_imsm_container(st, level, layout,
|
|
|
7140c6 |
- raiddisks,
|
|
|
7140c6 |
- *chunk,
|
|
|
7140c6 |
- size, data_offset,
|
|
|
7140c6 |
- dev, freesize,
|
|
|
7140c6 |
- verbose);
|
|
|
7140c6 |
- }
|
|
|
7140c6 |
+ return validate_geometry_imsm_container(st, level, raiddisks,
|
|
|
7140c6 |
+ data_offset, dev,
|
|
|
7140c6 |
+ freesize, verbose);
|
|
|
7140c6 |
|
|
|
7140c6 |
/*
|
|
|
7140c6 |
* Size is given in sectors.
|
|
|
7140c6 |
--
|
|
|
7140c6 |
2.7.5
|
|
|
7140c6 |
|