summaryrefslogtreecommitdiffstats
path: root/Grow.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-12-12 17:22:06 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-12-12 17:22:06 +0000
commit702eb8bf57b076e15e074f6a0c6fd04fb62546d9 (patch)
treee356c38fbe7b86af13593f321fa0da09a991e76f /Grow.c
parentAdding upstream version 4.3+20241108. (diff)
downloadmdadm-702eb8bf57b076e15e074f6a0c6fd04fb62546d9.tar.xz
mdadm-702eb8bf57b076e15e074f6a0c6fd04fb62546d9.zip
Adding upstream version 4.3+20241202.upstream/4.3+20241202upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'Grow.c')
-rw-r--r--Grow.c94
1 files changed, 10 insertions, 84 deletions
diff --git a/Grow.c b/Grow.c
index 3178694..cc1be6c 100644
--- a/Grow.c
+++ b/Grow.c
@@ -285,7 +285,6 @@ int Grow_addbitmap(char *devname, int fd, struct context *c, struct shape *s)
* find all the active devices, and write the bitmap block
* to all devices
*/
- mdu_bitmap_file_t bmf;
mdu_array_info_t array;
struct supertype *st;
char *subarray = NULL;
@@ -294,40 +293,21 @@ int Grow_addbitmap(char *devname, int fd, struct context *c, struct shape *s)
struct mdinfo *mdi;
/*
- * We only ever get called if s->bitmap_file is != NULL, so this check
+ * We only ever get called if bitmap is not none, so this check
* is just here to quiet down static code checkers.
*/
- if (!s->bitmap_file)
+ if (s->btype == BitmapUnknown)
return 1;
- if (strcmp(s->bitmap_file, "clustered") == 0)
+ if (s->btype == BitmapCluster)
major = BITMAP_MAJOR_CLUSTERED;
- if (ioctl(fd, GET_BITMAP_FILE, &bmf) != 0) {
- if (errno == ENOMEM)
- pr_err("Memory allocation failure.\n");
- else
- pr_err("bitmaps not supported by this kernel.\n");
- return 1;
- }
- if (bmf.pathname[0]) {
- if (str_is_none(s->bitmap_file) == true) {
- if (ioctl(fd, SET_BITMAP_FILE, -1) != 0) {
- pr_err("failed to remove bitmap %s\n",
- bmf.pathname);
- return 1;
- }
- return 0;
- }
- pr_err("%s already has a bitmap (%s)\n", devname, bmf.pathname);
- return 1;
- }
if (md_get_array_info(fd, &array) != 0) {
pr_err("cannot get array status for %s\n", devname);
return 1;
}
if (array.state & (1 << MD_SB_BITMAP_PRESENT)) {
- if (str_is_none(s->bitmap_file) == true) {
+ if (s->btype == BitmapNone) {
array.state &= ~(1 << MD_SB_BITMAP_PRESENT);
if (md_set_array_info(fd, &array) != 0) {
if (array.state & (1 << MD_SB_CLUSTERED))
@@ -342,10 +322,11 @@ int Grow_addbitmap(char *devname, int fd, struct context *c, struct shape *s)
return 1;
}
- if (str_is_none(s->bitmap_file) == true) {
+ if (s->btype == BitmapNone) {
pr_err("no bitmap found on %s\n", devname);
return 1;
}
+
if (array.level <= 0) {
pr_err("Bitmaps not meaningful with level %s\n",
map_num(pers, array.level)?:"of this array");
@@ -371,7 +352,7 @@ int Grow_addbitmap(char *devname, int fd, struct context *c, struct shape *s)
ncopies = (array.layout & 255) * ((array.layout >> 8) & 255);
bitmapsize = bitmapsize * array.raid_disks / ncopies;
- if (strcmp(s->bitmap_file, "clustered") == 0 &&
+ if (s->btype == BitmapCluster &&
!is_near_layout_10(array.layout)) {
pr_err("only near layout is supported with clustered raid10\n");
return 1;
@@ -402,8 +383,7 @@ int Grow_addbitmap(char *devname, int fd, struct context *c, struct shape *s)
free(mdi);
}
- if (strcmp(s->bitmap_file, "internal") == 0 ||
- strcmp(s->bitmap_file, "clustered") == 0) {
+ if (s->btype == BitmapInternal || s->btype == BitmapCluster) {
int rv;
int d;
int offset_setable = 0;
@@ -432,7 +412,7 @@ int Grow_addbitmap(char *devname, int fd, struct context *c, struct shape *s)
if (!dv)
continue;
if ((disk.state & (1 << MD_DISK_WRITEMOSTLY)) &&
- (strcmp(s->bitmap_file, "clustered") == 0)) {
+ s->btype == BitmapCluster) {
pr_err("%s disks marked write-mostly are not supported with clustered bitmap\n",devname);
free(mdi);
return 1;
@@ -471,7 +451,7 @@ int Grow_addbitmap(char *devname, int fd, struct context *c, struct shape *s)
mdi->bitmap_offset);
free(mdi);
} else {
- if (strcmp(s->bitmap_file, "clustered") == 0)
+ if (s->btype == BitmapCluster)
array.state |= (1 << MD_SB_CLUSTERED);
array.state |= (1 << MD_SB_BITMAP_PRESENT);
rv = md_set_array_info(fd, &array);
@@ -482,60 +462,6 @@ int Grow_addbitmap(char *devname, int fd, struct context *c, struct shape *s)
pr_err("failed to set internal bitmap.\n");
return 1;
}
- } else {
- int uuid[4];
- int bitmap_fd;
- int d;
- int max_devs = st->max_devs;
-
- /* try to load a superblock */
- for (d = 0; d < max_devs; d++) {
- mdu_disk_info_t disk;
- char *dv;
- int fd2;
- disk.number = d;
- if (md_get_disk_info(fd, &disk) < 0)
- continue;
- if ((disk.major==0 && disk.minor == 0) ||
- (disk.state & (1 << MD_DISK_REMOVED)))
- continue;
- dv = map_dev(disk.major, disk.minor, 1);
- if (!dv)
- continue;
- fd2 = dev_open(dv, O_RDONLY);
- if (fd2 >= 0) {
- if (st->ss->load_super(st, fd2, NULL) == 0) {
- close(fd2);
- st->ss->uuid_from_super(st, uuid);
- break;
- }
- close(fd2);
- }
- }
- if (d == max_devs) {
- pr_err("cannot find UUID for array!\n");
- return 1;
- }
- if (CreateBitmap(s->bitmap_file, c->force, (char*)uuid,
- s->bitmap_chunk, c->delay, s->write_behind,
- bitmapsize, major)) {
- return 1;
- }
- bitmap_fd = open(s->bitmap_file, O_RDWR);
- if (bitmap_fd < 0) {
- pr_err("weird: %s cannot be opened\n", s->bitmap_file);
- return 1;
- }
- if (ioctl(fd, SET_BITMAP_FILE, bitmap_fd) < 0) {
- int err = errno;
- if (errno == EBUSY)
- pr_err("Cannot add bitmap while array is resyncing or reshaping etc.\n");
- pr_err("Cannot set bitmap file for %s: %s\n",
- devname, strerror(err));
- close_fd(&bitmap_fd);
- return 1;
- }
- close_fd(&bitmap_fd);
}
return 0;