* [PATCH mdadm/master v2 0/4] remove bitmap file support and reserve major number for lockless bitmap
@ 2024-11-07 8:13 Yu Kuai
2024-11-07 8:13 ` [PATCH mdadm/master v2 1/4] tests/04update-uuid: remove bitmap file test Yu Kuai
` (4 more replies)
0 siblings, 5 replies; 8+ messages in thread
From: Yu Kuai @ 2024-11-07 8:13 UTC (permalink / raw)
To: mariusz.tkaczyk, linux-raid; +Cc: yukuai3, yangerkun
From: Yu Kuai <yukuai3@huawei.com>
Yu Kuai (4):
tests/04update-uuid: remove bitmap file test
tests/05r1-re-add-nosuper: remove bitmap file test
mdadm: remove bitmap file support
mdadm: add support for new lockless bitmap
Assemble.c | 33 +-------------
Build.c | 35 +--------------
Create.c | 40 ++++-------------
Grow.c | 95 +++++----------------------------------
Incremental.c | 37 +--------------
bitmap.c | 44 +++++++++---------
bitmap.h | 1 +
config.c | 17 ++++---
mdadm.c | 83 ++++++++++++++++------------------
mdadm.h | 19 +++++---
tests/04update-uuid | 34 --------------
tests/05r1-re-add-nosuper | 5 +--
12 files changed, 112 insertions(+), 331 deletions(-)
--
2.39.2
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH mdadm/master v2 1/4] tests/04update-uuid: remove bitmap file test
2024-11-07 8:13 [PATCH mdadm/master v2 0/4] remove bitmap file support and reserve major number for lockless bitmap Yu Kuai
@ 2024-11-07 8:13 ` Yu Kuai
2024-11-07 8:13 ` [PATCH mdadm/master v2 2/4] tests/05r1-re-add-nosuper: " Yu Kuai
` (3 subsequent siblings)
4 siblings, 0 replies; 8+ messages in thread
From: Yu Kuai @ 2024-11-07 8:13 UTC (permalink / raw)
To: mariusz.tkaczyk, linux-raid; +Cc: yukuai3, yangerkun
From: Yu Kuai <yukuai3@huawei.com>
Prepare to remove the bitmap file support.
Signed-off-by: Yu Kuai <yukuai3@huawei.com>
---
tests/04update-uuid | 34 ----------------------------------
1 file changed, 34 deletions(-)
diff --git a/tests/04update-uuid b/tests/04update-uuid
index 25314ab5..ce5a958c 100644
--- a/tests/04update-uuid
+++ b/tests/04update-uuid
@@ -22,40 +22,6 @@ mdadm -D /dev/md0 | grep -s > /dev/null 01234567:89abcdef:fedcba98:76543210 || {
}
mdadm -S /dev/md0
-
-# now if we have a bitmap, that needs updating too.
-rm -f $targetdir/bitmap
-yes | mdadm -CR --assume-clean -b $targetdir/bitmap $md0 -l5 -n3 $dev0 $dev1 $dev2
-mdadm -S /dev/md0
-mdadm -A /dev/md0 -b $targetdir/bitmap --update=uuid --uuid=0123456789abcdef:fedcba9876543210 $dev0 $dev1 $dev2
-no_errors
-mdadm -D /dev/md0 | grep -s > /dev/null 01234567:89abcdef:fedcba98:76543210 || {
- echo Wrong uuid; mdadm -D /dev/md0 ; exit 2;
-}
-if mdadm -X $targetdir/bitmap | grep -s > /dev/null 01234567:89abcdef:fedcba98:76543210 ||
- mdadm -X $targetdir/bitmap | grep -s > /dev/null 67452301:efcdab89:98badcfe:10325476
-then : ; else
- echo Wrong uuid; mdadm -X $targetdir/bitmap ; exit 2;
-fi
-mdadm -S /dev/md0
-
-# and bitmap for version1
-rm -f $targetdir/bitmap
-yes | mdadm -CR --assume-clean -e1.1 -b $targetdir/bitmap $md0 -l5 -n3 $dev0 $dev1 $dev2
-mdadm -S /dev/md0
-mdadm -A /dev/md0 -b $targetdir/bitmap --update=uuid --uuid=0123456789abcdef:fedcba9876543210 $dev0 $dev1 $dev2
-no_errors
-mdadm -D /dev/md0 | grep -s > /dev/null 01234567:89abcdef:fedcba98:76543210 || {
- echo Wrong uuid; mdadm -D /dev/md0 ; exit 2;
-}
-# -X cannot tell which byteorder to use for the UUID, so allow both.
-if mdadm -X $targetdir/bitmap | grep -s > /dev/null 01234567:89abcdef:fedcba98:76543210 ||
- mdadm -X $targetdir/bitmap | grep -s > /dev/null 67452301:efcdab89:98badcfe:10325476
-then : ; else
- echo Wrong uuid; mdadm -X $targetdir/bitmap ; exit 2;
-fi
-mdadm -S /dev/md0
-
# Internal bitmaps too.
mdadm -CR --assume-clean -b internal --bitmap-chunk 4 $md0 -l5 -n3 $dev0 $dev1 $dev2
mdadm -S /dev/md0
--
2.39.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH mdadm/master v2 2/4] tests/05r1-re-add-nosuper: remove bitmap file test
2024-11-07 8:13 [PATCH mdadm/master v2 0/4] remove bitmap file support and reserve major number for lockless bitmap Yu Kuai
2024-11-07 8:13 ` [PATCH mdadm/master v2 1/4] tests/04update-uuid: remove bitmap file test Yu Kuai
@ 2024-11-07 8:13 ` Yu Kuai
2024-11-07 8:13 ` [PATCH mdadm/master v2 3/4] mdadm: remove bitmap file support Yu Kuai
` (2 subsequent siblings)
4 siblings, 0 replies; 8+ messages in thread
From: Yu Kuai @ 2024-11-07 8:13 UTC (permalink / raw)
To: mariusz.tkaczyk, linux-raid; +Cc: yukuai3, yangerkun
From: Yu Kuai <yukuai3@huawei.com>
Prepare to remove bitmap file support.
Signed-off-by: Yu Kuai <yukuai3@huawei.com>
---
tests/05r1-re-add-nosuper | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/tests/05r1-re-add-nosuper b/tests/05r1-re-add-nosuper
index 7d41fd7b..a3fa9503 100644
--- a/tests/05r1-re-add-nosuper
+++ b/tests/05r1-re-add-nosuper
@@ -1,12 +1,9 @@
-
#
# create a raid1, remove a drive, and readd it.
# resync should be instant.
# Then do some IO first. Resync should still be very fast
#
-bmf=$targetdir/bitmap2
-rm -f $bmf
-yes | mdadm -B $md0 -l1 -n2 -b$bmf -d1 $dev1 $dev2
+mdadm -B $md0 -l1 -n2 -d1 $dev1 $dev2
check resync
check wait
testdev $md0 1 $size 1
--
2.39.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH mdadm/master v2 3/4] mdadm: remove bitmap file support
2024-11-07 8:13 [PATCH mdadm/master v2 0/4] remove bitmap file support and reserve major number for lockless bitmap Yu Kuai
2024-11-07 8:13 ` [PATCH mdadm/master v2 1/4] tests/04update-uuid: remove bitmap file test Yu Kuai
2024-11-07 8:13 ` [PATCH mdadm/master v2 2/4] tests/05r1-re-add-nosuper: " Yu Kuai
@ 2024-11-07 8:13 ` Yu Kuai
2024-11-07 8:13 ` [PATCH mdadm/master v2 4/4] mdadm: add support for new lockless bitmap Yu Kuai
2024-11-07 8:19 ` [PATCH mdadm/master v2 0/4] remove bitmap file support and reserve major number for " Yu Kuai
4 siblings, 0 replies; 8+ messages in thread
From: Yu Kuai @ 2024-11-07 8:13 UTC (permalink / raw)
To: mariusz.tkaczyk, linux-raid; +Cc: yukuai3, yangerkun
From: Yu Kuai <yukuai3@huawei.com>
Because it's marked deprecated for a long time now, and it's not worthy
to support it for new bitmap.
Now that we don't need to store filename for bitmap, also declare a new
enum type bitmap_type to simplify code.
Signed-off-by: Yu Kuai <yukuai3@huawei.com>
---
Assemble.c | 33 +-----------------
Build.c | 35 +------------------
Create.c | 37 +++-----------------
Grow.c | 94 ++++++---------------------------------------------
Incremental.c | 37 +-------------------
bitmap.c | 44 +++++++++++++-----------
config.c | 17 +++++++---
mdadm.c | 76 ++++++++++++++++++-----------------------
mdadm.h | 18 ++++++----
9 files changed, 98 insertions(+), 293 deletions(-)
diff --git a/Assemble.c b/Assemble.c
index 87d1ae04..37a530ee 100644
--- a/Assemble.c
+++ b/Assemble.c
@@ -633,7 +633,6 @@ static int load_devices(struct devs *devices, char *devmap,
struct mddev_dev *tmpdev;
int devcnt = 0;
int nextspare = 0;
- int bitmap_done = 0;
int most_recent = -1;
int bestcnt = 0;
int *best = *bestp;
@@ -661,7 +660,7 @@ static int load_devices(struct devs *devices, char *devmap,
if (c->update == UOPT_UUID && !ident->uuid_set)
random_uuid((__u8 *)ident->uuid);
- if (c->update == UOPT_PPL && ident->bitmap_fd >= 0) {
+ if (c->update == UOPT_PPL && ident->btype != BitmapNone) {
pr_err("PPL is not compatible with bitmap\n");
close(mdfd);
free(devices);
@@ -728,16 +727,6 @@ static int load_devices(struct devs *devices, char *devmap,
if (tst->ss->store_super(tst, dfd))
pr_err("Could not re-write superblock on %s.\n",
devname);
-
- if (c->update == UOPT_UUID &&
- ident->bitmap_fd >= 0 && !bitmap_done) {
- if (bitmap_update_uuid(ident->bitmap_fd,
- content->uuid,
- tst->ss->swapuuid) != 0)
- pr_err("Could not update uuid on external bitmap.\n");
- else
- bitmap_done = 1;
- }
} else {
dfd = dev_open(devname,
tmpdev->disposition == 'I'
@@ -1057,26 +1046,6 @@ static int start_array(int mdfd,
mddev, strerror(errno));
return 1;
}
- if (ident->bitmap_fd >= 0) {
- if (ioctl(mdfd, SET_BITMAP_FILE, ident->bitmap_fd) != 0) {
- pr_err("SET_BITMAP_FILE failed.\n");
- return 1;
- }
- } else if (ident->bitmap_file) {
- /* From config file */
- int bmfd = open(ident->bitmap_file, O_RDWR);
- if (bmfd < 0) {
- pr_err("Could not open bitmap file %s\n",
- ident->bitmap_file);
- return 1;
- }
- if (ioctl(mdfd, SET_BITMAP_FILE, bmfd) != 0) {
- pr_err("Failed to set bitmapfile for %s\n", mddev);
- close(bmfd);
- return 1;
- }
- close(bmfd);
- }
/* First, add the raid disks, but add the chosen one last */
for (i = 0; i <= bestcnt; i++) {
diff --git a/Build.c b/Build.c
index 6f63d3f3..70aab7a0 100644
--- a/Build.c
+++ b/Build.c
@@ -40,8 +40,6 @@ int Build(struct mddev_ident *ident, struct mddev_dev *devlist, struct shape *s,
dev_t rdev;
int subdevs = 0, missing_disks = 0;
struct mddev_dev *dv;
- int bitmap_fd;
- unsigned long long bitmapsize;
int mdfd;
char chosen_name[1024];
int uuid[4] = {0,0,0,0};
@@ -110,13 +108,6 @@ int Build(struct mddev_ident *ident, struct mddev_dev *devlist, struct shape *s,
goto abort;
}
- if (s->bitmap_file && str_is_none(s->bitmap_file) == true)
- s->bitmap_file = NULL;
- if (s->bitmap_file && s->level <= 0) {
- pr_err("bitmaps not meaningful with level %s\n",
- map_num(pers, s->level)?:"given");
- goto abort;
- }
/* now add the devices */
for ((i=0), (dv = devlist) ; dv ; i++, dv=dv->next) {
mdu_disk_info_t disk;
@@ -150,31 +141,7 @@ int Build(struct mddev_ident *ident, struct mddev_dev *devlist, struct shape *s,
goto abort;
}
}
- /* now to start it */
- if (s->bitmap_file) {
- bitmap_fd = open(s->bitmap_file, O_RDWR);
- if (bitmap_fd < 0) {
- int major = BITMAP_MAJOR_HI;
- bitmapsize = s->size >> 9; /* FIXME wrong for RAID10 */
- if (CreateBitmap(s->bitmap_file, 1, NULL,
- s->bitmap_chunk, c->delay,
- s->write_behind, bitmapsize, major)) {
- goto abort;
- }
- bitmap_fd = open(s->bitmap_file, O_RDWR);
- if (bitmap_fd < 0) {
- pr_err("%s cannot be opened.\n", s->bitmap_file);
- goto abort;
- }
- }
- if (ioctl(mdfd, SET_BITMAP_FILE, bitmap_fd) < 0) {
- pr_err("Cannot set bitmap file for %s: %s\n", chosen_name,
- strerror(errno));
- close(bitmap_fd);
- goto abort;
- }
- close(bitmap_fd);
- }
+
if (ioctl(mdfd, RUN_ARRAY, ¶m)) {
pr_err("RUN_ARRAY failed: %s\n", strerror(errno));
if (s->chunk & (s->chunk - 1)) {
diff --git a/Create.c b/Create.c
index 140a7098..29858483 100644
--- a/Create.c
+++ b/Create.c
@@ -521,7 +521,6 @@ int Create(struct supertype *st, struct mddev_ident *ident, int subdevs,
int insert_point = subdevs * 2; /* where to insert a missing drive */
int total_slots;
int rv;
- int bitmap_fd;
int have_container = 0;
int container_fd = -1;
int need_mdmon = 0;
@@ -536,7 +535,7 @@ int Create(struct supertype *st, struct mddev_ident *ident, int subdevs,
mdu_array_info_t inf;
int major_num = BITMAP_MAJOR_HI;
- if (s->bitmap_file && strcmp(s->bitmap_file, "clustered") == 0) {
+ if (s->btype == BitmapCluster) {
major_num = BITMAP_MAJOR_CLUSTERED;
if (c->nodes <= 1) {
pr_err("At least 2 nodes are needed for cluster-md\n");
@@ -618,7 +617,7 @@ int Create(struct supertype *st, struct mddev_ident *ident, int subdevs,
pr_err("You haven't given enough devices (real or missing) to create this array\n");
return 1;
}
- if (s->bitmap_file && s->level <= 0) {
+ if (s->btype != BitmapNone && s->level <= 0) {
pr_err("bitmaps not meaningful with level %s\n",
map_num(pers, s->level)?:"given");
return 1;
@@ -949,7 +948,7 @@ int Create(struct supertype *st, struct mddev_ident *ident, int subdevs,
}
}
- if (!s->bitmap_file &&
+ if (s->btype == BitmapNone &&
!st->ss->external &&
s->level >= 1 &&
st->ss->add_internal_bitmap &&
@@ -959,10 +958,8 @@ int Create(struct supertype *st, struct mddev_ident *ident, int subdevs,
(s->write_behind || s->size > 100*1024*1024ULL)) {
if (c->verbose > 0)
pr_err("automatically enabling write-intent bitmap on large array\n");
- s->bitmap_file = "internal";
+ s->btype = BitmapInternal;
}
- if (s->bitmap_file && str_is_none(s->bitmap_file) == true)
- s->bitmap_file = NULL;
if (s->consistency_policy == CONSISTENCY_POLICY_PPL &&
!st->ss->write_init_ppl) {
@@ -1198,8 +1195,7 @@ int Create(struct supertype *st, struct mddev_ident *ident, int subdevs,
* to stop another mdadm from finding and using those devices.
*/
- if (s->bitmap_file && (strcmp(s->bitmap_file, "internal") == 0 ||
- strcmp(s->bitmap_file, "clustered") == 0)) {
+ if (s->btype == BitmapInternal || s->btype == BitmapCluster) {
if (!st->ss->add_internal_bitmap) {
pr_err("internal bitmaps not supported with %s metadata\n",
st->ss->name);
@@ -1211,7 +1207,6 @@ int Create(struct supertype *st, struct mddev_ident *ident, int subdevs,
pr_err("Given bitmap chunk size not supported.\n");
goto abort_locked;
}
- s->bitmap_file = NULL;
}
if (sysfs_init(&info, mdfd, NULL)) {
@@ -1253,28 +1248,6 @@ int Create(struct supertype *st, struct mddev_ident *ident, int subdevs,
goto abort_locked;
}
- if (s->bitmap_file) {
- int uuid[4];
-
- st->ss->uuid_from_super(st, uuid);
- if (CreateBitmap(s->bitmap_file, c->force, (char*)uuid, s->bitmap_chunk,
- c->delay, s->write_behind,
- bitmapsize,
- major_num)) {
- goto abort_locked;
- }
- bitmap_fd = open(s->bitmap_file, O_RDWR);
- if (bitmap_fd < 0) {
- pr_err("weird: %s cannot be opened\n",
- s->bitmap_file);
- goto abort_locked;
- }
- if (ioctl(mdfd, SET_BITMAP_FILE, bitmap_fd) < 0) {
- pr_err("Cannot set bitmap file for %s: %s\n", chosen_name, strerror(errno));
- goto abort_locked;
- }
- }
-
if (add_disks(mdfd, &info, s, c, st, &map, devlist, total_slots,
have_container, insert_point, major_num, chosen_name))
goto abort_locked;
diff --git a/Grow.c b/Grow.c
index 31786941..fae5b8a7 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 == BitmapNone)
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;
diff --git a/Incremental.c b/Incremental.c
index 5e59b6d1..aa5db3bf 100644
--- a/Incremental.c
+++ b/Incremental.c
@@ -544,21 +544,7 @@ int Incremental(struct mddev_dev *devlist, struct context *c,
cont_err("by --incremental. Please use --assemble\n");
goto out;
}
- if (match && match->bitmap_file) {
- int bmfd = open(match->bitmap_file, O_RDWR);
- if (bmfd < 0) {
- pr_err("Could not open bitmap file %s.\n",
- match->bitmap_file);
- goto out;
- }
- if (ioctl(mdfd, SET_BITMAP_FILE, bmfd) != 0) {
- close(bmfd);
- pr_err("Failed to set bitmapfile for %s.\n",
- chosen_name);
- goto out;
- }
- close(bmfd);
- }
+
/* Need to remove from the array any devices which
* 'count_active' discerned were too old or inappropriate
*/
@@ -1400,28 +1386,7 @@ restart:
if (mddev->devname && me->path &&
devname_matches(mddev->devname, me->path))
break;
- if (mddev && mddev->bitmap_file) {
- /*
- * Note: early kernels will wrongly fail this, so it
- * is a hint only
- */
- int added = -1;
- int bmfd;
- bmfd = open(mddev->bitmap_file, O_RDWR);
- if (is_fd_valid(bmfd)) {
- added = ioctl(mdfd, SET_BITMAP_FILE, bmfd);
- close_fd(&bmfd);
- }
- if (c->verbose >= 0) {
- if (added == 0)
- pr_err("Added bitmap %s to %s\n",
- mddev->bitmap_file, me->path);
- else if (errno != EEXIST)
- pr_err("Failed to add bitmap to %s: %s\n",
- me->path, strerror(errno));
- }
- }
/* FIXME check for reshape_active and consider not
* starting array.
*/
diff --git a/bitmap.c b/bitmap.c
index 5110ae2f..c62d18d4 100644
--- a/bitmap.c
+++ b/bitmap.c
@@ -200,28 +200,32 @@ bitmap_file_open(char *filename, struct supertype **stp, int node_num, int fd)
close(fd);
return -1;
}
- if ((stb.st_mode & S_IFMT) == S_IFBLK) {
- /* block device, so we are probably after an internal bitmap */
- if (!st)
- st = guess_super(fd);
- if (!st) {
- /* just look at device... */
- lseek(fd, 0, 0);
- } else if (!st->ss->locate_bitmap) {
- pr_err("No bitmap possible with %s metadata\n",
- st->ss->name);
- close(fd);
- return -1;
- } else {
- if (st->ss->locate_bitmap(st, fd, node_num)) {
- pr_err("%s doesn't have bitmap\n", filename);
- close(fd);
- fd = -1;
- }
- }
- *stp = st;
+
+ if ((stb.st_mode & S_IFMT) != S_IFBLK) {
+ pr_err("bitmap file is not supported %s\n", filename);
+ close(fd);
+ return -1;
+ }
+
+ if (!st)
+ st = guess_super(fd);
+
+ if (!st) {
+ /* just look at device... */
+ lseek(fd, 0, 0);
+ } else if (!st->ss->locate_bitmap) {
+ pr_err("No bitmap possible with %s metadata\n", st->ss->name);
+ close(fd);
+ return -1;
+ }
+
+ if (st->ss->locate_bitmap(st, fd, node_num)) {
+ pr_err("%s doesn't have bitmap\n", filename);
+ close(fd);
+ fd = -1;
}
+ *stp = st;
return fd;
}
diff --git a/config.c b/config.c
index 3359504d..8a8ae5e4 100644
--- a/config.c
+++ b/config.c
@@ -171,8 +171,7 @@ inline void ident_init(struct mddev_ident *ident)
assert(ident);
ident->assembled = false;
- ident->bitmap_fd = -1;
- ident->bitmap_file = NULL;
+ ident->btype = BitmapUnknown;
ident->container = NULL;
ident->devices = NULL;
ident->devname = NULL;
@@ -542,11 +541,19 @@ void arrayline(char *line)
/* Ignore name in confile */
continue;
} else if (strncasecmp(w, "bitmap=", 7) == 0) {
- if (mis.bitmap_file)
+ if (mis.btype != BitmapUnknown)
pr_err("only specify bitmap file once. %s ignored\n",
w);
- else
- mis.bitmap_file = xstrdup(w + 7);
+ else {
+ char *bname = xstrdup(w + 7);
+
+ if (strcmp(bname, STR_COMMON_NONE) == 0)
+ mis.btype = BitmapNone;
+ else if (strcmp(bname, "internal") == 0)
+ mis.btype = BitmapInternal;
+ else if (strcmp(bname, "clustered") == 0)
+ mis.btype = BitmapCluster;
+ }
} else if (strncasecmp(w, "devices=", 8 ) == 0) {
if (mis.devices)
diff --git a/mdadm.c b/mdadm.c
index 8cb4ba66..82a48722 100644
--- a/mdadm.c
+++ b/mdadm.c
@@ -41,18 +41,23 @@
*/
static mdadm_status_t set_bitmap_value(struct shape *s, struct context *c, char *val)
{
- if (s->bitmap_file) {
+ if (s->btype != BitmapUnknown) {
pr_err("--bitmap cannot be set twice. Second value: \"%s\".\n", val);
return MDADM_STATUS_ERROR;
}
- if (strcmp(val, "internal") == 0 || strcmp(optarg, STR_COMMON_NONE) == 0) {
- s->bitmap_file = val;
+ if (strcmp(optarg, STR_COMMON_NONE) == 0) {
+ s->btype = BitmapNone;
+ return MDADM_STATUS_SUCCESS;
+ }
+
+ if (strcmp(val, "internal") == 0) {
+ s->btype = BitmapInternal;
return MDADM_STATUS_SUCCESS;
}
if (strcmp(val, "clustered") == 0) {
- s->bitmap_file = val;
+ s->btype = BitmapCluster;
/* Set the default number of cluster nodes
* to 4 if not already set by user
*/
@@ -62,17 +67,12 @@ static mdadm_status_t set_bitmap_value(struct shape *s, struct context *c, char
}
if (strchr(val, '/')) {
- pr_info("Custom write-intent bitmap file option is deprecated.\n");
- if (ask("Do you want to continue? (y/n)")) {
- s->bitmap_file = val;
- return MDADM_STATUS_SUCCESS;
- }
-
+ pr_err("Custom write-intent bitmap file option is not supported.\n");
return MDADM_STATUS_ERROR;
}
- pr_err("--bitmap value must contain a '/' or be 'internal', 'clustered' or 'none'\n");
- pr_err("Current value is \"%s\"", val);
+ pr_err("--bitmap value must be 'internal', 'clustered' or 'none'\n");
+ pr_err("Current value is \"%s\"\n", val);
return MDADM_STATUS_ERROR;
}
@@ -99,7 +99,6 @@ int main(int argc, char *argv[])
struct mddev_ident ident;
char *configfile = NULL;
int devmode = 0;
- int bitmap_fd = -1;
struct mddev_dev *devlist = NULL;
struct mddev_dev **devlistend = & devlist;
struct mddev_dev *dv;
@@ -116,6 +115,7 @@ int main(int argc, char *argv[])
.bitmap_chunk = UnSet,
.consistency_policy = CONSISTENCY_POLICY_UNKNOWN,
.data_offset = INVALID_SECTORS,
+ .btype = BitmapUnknown,
};
char sys_hostname[256];
@@ -1089,24 +1089,15 @@ int main(int argc, char *argv[])
case O(ASSEMBLE,'b'): /* here we simply set the bitmap file */
case O(ASSEMBLE,Bitmap):
- if (!optarg) {
- pr_err("bitmap file needed with -b in --assemble mode\n");
- exit(2);
- }
- if (strcmp(optarg, "internal") == 0 ||
- strcmp(optarg, "clustered") == 0) {
+ if (optarg && (strcmp(optarg, "internal") == 0 ||
+ strcmp(optarg, "clustered")) == 0) {
pr_err("no need to specify --bitmap when assembling"
" arrays with internal or clustered bitmap\n");
continue;
}
- bitmap_fd = open(optarg, O_RDWR);
- if (!*optarg || bitmap_fd < 0) {
- pr_err("cannot open bitmap file %s: %s\n", optarg, strerror(errno));
- exit(2);
- }
- ident.bitmap_fd = bitmap_fd; /* for Assemble */
- continue;
+ pr_err("bitmap file is not supported %s\n", optarg);
+ exit(2);
case O(ASSEMBLE, BackupFile):
case O(GROW, BackupFile):
/* Specify a file into which grow might place a backup,
@@ -1256,12 +1247,11 @@ int main(int argc, char *argv[])
pr_err("PPL consistency policy is only supported for RAID level 5.\n");
exit(2);
} else if (s.consistency_policy == CONSISTENCY_POLICY_BITMAP &&
- (!s.bitmap_file || str_is_none(s.bitmap_file) == true)) {
+ s.btype == BitmapNone) {
pr_err("--bitmap is required for consistency policy: %s\n",
map_num_s(consistency_policies, s.consistency_policy));
exit(2);
- } else if (s.bitmap_file &&
- str_is_none(s.bitmap_file) == false &&
+ } else if ((s.btype == BitmapInternal || s.btype == BitmapCluster) &&
s.consistency_policy != CONSISTENCY_POLICY_BITMAP &&
s.consistency_policy != CONSISTENCY_POLICY_JOURNAL) {
pr_err("--bitmap is not compatible with consistency policy: %s\n",
@@ -1394,7 +1384,7 @@ int main(int argc, char *argv[])
c.brief = 1;
if (mode == CREATE) {
- if (s.bitmap_file && strcmp(s.bitmap_file, "clustered") == 0) {
+ if (s.btype == BitmapCluster) {
locked = cluster_get_dlmlock();
if (locked != 1)
exit(1);
@@ -1479,7 +1469,14 @@ int main(int argc, char *argv[])
case BUILD:
if (c.delay == 0)
c.delay = DEFAULT_BITMAP_DELAY;
- if (s.write_behind && !s.bitmap_file) {
+
+ if (s.btype != BitmapNone) {
+ pr_err("--build argument only compatible with --bitmap=none\n");
+ rv |= 1;
+ break;
+ }
+
+ if (s.write_behind) {
pr_err("write-behind mode requires a bitmap.\n");
rv = 1;
break;
@@ -1490,14 +1487,6 @@ int main(int argc, char *argv[])
break;
}
- if (s.bitmap_file) {
- if (strcmp(s.bitmap_file, "internal") == 0 ||
- strcmp(s.bitmap_file, "clustered") == 0) {
- pr_err("'internal' and 'clustered' bitmaps not supported with --build\n");
- rv |= 1;
- break;
- }
- }
rv = Build(&ident, devlist->next, &s, &c);
break;
case CREATE:
@@ -1505,8 +1494,7 @@ int main(int argc, char *argv[])
c.delay = DEFAULT_BITMAP_DELAY;
if (c.nodes) {
- if (!s.bitmap_file ||
- strcmp(s.bitmap_file, "clustered") != 0) {
+ if (s.btype != BitmapCluster) {
pr_err("--nodes argument only compatible with --bitmap=clustered\n");
rv = 1;
break;
@@ -1524,7 +1512,7 @@ int main(int argc, char *argv[])
}
}
- if (s.write_behind && !s.bitmap_file) {
+ if (s.write_behind && s.btype == BitmapNone) {
pr_err("write-behind mode requires a bitmap.\n");
rv = 1;
break;
@@ -1626,7 +1614,7 @@ int main(int argc, char *argv[])
if (devs_found > 1 && s.raiddisks == 0 && s.level == UnSet) {
/* must be '-a'. */
if (s.size > 0 || s.chunk ||
- s.layout_str || s.bitmap_file) {
+ s.layout_str || s.btype != BitmapNone) {
pr_err("--add cannot be used with other geometry changes in --grow mode\n");
rv = 1;
break;
@@ -1636,7 +1624,7 @@ int main(int argc, char *argv[])
if (rv)
break;
}
- } else if (s.bitmap_file) {
+ } else if (s.btype != BitmapNone) {
if (s.size > 0 || s.raiddisks || s.chunk ||
s.layout_str || devs_found > 1) {
pr_err("--bitmap changes cannot be used with other geometry changes in --grow mode\n");
diff --git a/mdadm.h b/mdadm.h
index 5aa50854..af54a6ab 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -598,9 +598,16 @@ enum prefix_standard {
};
enum bitmap_update {
- NoUpdate,
- NameUpdate,
- NodeNumUpdate,
+ NoUpdate,
+ NameUpdate,
+ NodeNumUpdate,
+};
+
+enum bitmap_type {
+ BitmapNone,
+ BitmapInternal,
+ BitmapCluster,
+ BitmapUnknown,
};
enum flag_mode {
@@ -640,8 +647,7 @@ struct mddev_ident {
int spare_disks;
struct supertype *st;
char *spare_group;
- char *bitmap_file;
- int bitmap_fd;
+ enum bitmap_type btype;
char *container; /* /dev/whatever name of container, or
* uuid of container. You would expect
@@ -693,7 +699,7 @@ struct shape {
char *layout_str;
int chunk;
int bitmap_chunk;
- char *bitmap_file;
+ enum bitmap_type btype;
int assume_clean;
bool write_zeroes;
int write_behind;
--
2.39.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH mdadm/master v2 4/4] mdadm: add support for new lockless bitmap
2024-11-07 8:13 [PATCH mdadm/master v2 0/4] remove bitmap file support and reserve major number for lockless bitmap Yu Kuai
` (2 preceding siblings ...)
2024-11-07 8:13 ` [PATCH mdadm/master v2 3/4] mdadm: remove bitmap file support Yu Kuai
@ 2024-11-07 8:13 ` Yu Kuai
2024-11-07 9:02 ` Mariusz Tkaczyk
2024-11-07 8:19 ` [PATCH mdadm/master v2 0/4] remove bitmap file support and reserve major number for " Yu Kuai
4 siblings, 1 reply; 8+ messages in thread
From: Yu Kuai @ 2024-11-07 8:13 UTC (permalink / raw)
To: mariusz.tkaczyk, linux-raid; +Cc: yukuai3, yangerkun
From: Yu Kuai <yukuai3@huawei.com>
A new major number 6 is used for the new bitmap.
Noted that for the kernel that doesn't support lockless bitmap, create
such array will fail:
md0: invalid bitmap file superblock: unrecognized superblock version.
Signed-off-by: Yu Kuai <yukuai3@huawei.com>
---
Create.c | 5 ++++-
Grow.c | 3 ++-
bitmap.h | 1 +
mdadm.c | 9 ++++++++-
mdadm.h | 1 +
5 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/Create.c b/Create.c
index 29858483..3637af01 100644
--- a/Create.c
+++ b/Create.c
@@ -541,6 +541,8 @@ int Create(struct supertype *st, struct mddev_ident *ident, int subdevs,
pr_err("At least 2 nodes are needed for cluster-md\n");
return 1;
}
+ } else if (s->btype == BitmapLockless) {
+ major_num = BITMAP_MAJOR_LOCKLESS;
}
memset(&info, 0, sizeof(info));
@@ -1195,7 +1197,8 @@ int Create(struct supertype *st, struct mddev_ident *ident, int subdevs,
* to stop another mdadm from finding and using those devices.
*/
- if (s->btype == BitmapInternal || s->btype == BitmapCluster) {
+ if (s->btype == BitmapInternal || s->btype == BitmapCluster ||
+ s->btype == BitmapLockless) {
if (!st->ss->add_internal_bitmap) {
pr_err("internal bitmaps not supported with %s metadata\n",
st->ss->name);
diff --git a/Grow.c b/Grow.c
index fae5b8a7..95a8da5e 100644
--- a/Grow.c
+++ b/Grow.c
@@ -383,7 +383,8 @@ int Grow_addbitmap(char *devname, int fd, struct context *c, struct shape *s)
free(mdi);
}
- if (s->btype == BitmapInternal || s->btype == BitmapCluster) {
+ if (s->btype == BitmapInternal || s->btype == BitmapCluster ||
+ s->btype == BitmapLockless) {
int rv;
int d;
int offset_setable = 0;
diff --git a/bitmap.h b/bitmap.h
index 7b1f80f2..4b5d2d93 100644
--- a/bitmap.h
+++ b/bitmap.h
@@ -13,6 +13,7 @@
#define BITMAP_MAJOR_HI 4
#define BITMAP_MAJOR_HOSTENDIAN 3
#define BITMAP_MAJOR_CLUSTERED 5
+#define BITMAP_MAJOR_LOCKLESS 6
#define BITMAP_MINOR 39
diff --git a/mdadm.c b/mdadm.c
index 82a48722..314a5923 100644
--- a/mdadm.c
+++ b/mdadm.c
@@ -56,6 +56,12 @@ static mdadm_status_t set_bitmap_value(struct shape *s, struct context *c, char
return MDADM_STATUS_SUCCESS;
}
+ if (strcmp(val, "lockless") == 0) {
+ s->btype = BitmapLockless;
+ pr_info("Experimental lockless bitmap, use at your own disk!\n");
+ return MDADM_STATUS_SUCCESS;
+ }
+
if (strcmp(val, "clustered") == 0) {
s->btype = BitmapCluster;
/* Set the default number of cluster nodes
@@ -1251,7 +1257,8 @@ int main(int argc, char *argv[])
pr_err("--bitmap is required for consistency policy: %s\n",
map_num_s(consistency_policies, s.consistency_policy));
exit(2);
- } else if ((s.btype == BitmapInternal || s.btype == BitmapCluster) &&
+ } else if ((s.btype == BitmapInternal || s.btype == BitmapCluster ||
+ s.btype == BitmapLockless) &&
s.consistency_policy != CONSISTENCY_POLICY_BITMAP &&
s.consistency_policy != CONSISTENCY_POLICY_JOURNAL) {
pr_err("--bitmap is not compatible with consistency policy: %s\n",
diff --git a/mdadm.h b/mdadm.h
index af54a6ab..5e35d78c 100644
--- a/mdadm.h
+++ b/mdadm.h
@@ -607,6 +607,7 @@ enum bitmap_type {
BitmapNone,
BitmapInternal,
BitmapCluster,
+ BitmapLockless,
BitmapUnknown,
};
--
2.39.2
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH mdadm/master v2 0/4] remove bitmap file support and reserve major number for lockless bitmap
2024-11-07 8:13 [PATCH mdadm/master v2 0/4] remove bitmap file support and reserve major number for lockless bitmap Yu Kuai
` (3 preceding siblings ...)
2024-11-07 8:13 ` [PATCH mdadm/master v2 4/4] mdadm: add support for new lockless bitmap Yu Kuai
@ 2024-11-07 8:19 ` Yu Kuai
4 siblings, 0 replies; 8+ messages in thread
From: Yu Kuai @ 2024-11-07 8:19 UTC (permalink / raw)
To: Yu Kuai, mariusz.tkaczyk, linux-raid; +Cc: yangerkun, yukuai (C)
Hi, all!
the title "mdadm/master v2" is used in downstream, and I forgot to
remove it, please ignore it and this is the fist version of the set.
Thanks,
Kuai
在 2024/11/07 16:13, Yu Kuai 写道:
> From: Yu Kuai <yukuai3@huawei.com>
>
> Yu Kuai (4):
> tests/04update-uuid: remove bitmap file test
> tests/05r1-re-add-nosuper: remove bitmap file test
> mdadm: remove bitmap file support
> mdadm: add support for new lockless bitmap
>
> Assemble.c | 33 +-------------
> Build.c | 35 +--------------
> Create.c | 40 ++++-------------
> Grow.c | 95 +++++----------------------------------
> Incremental.c | 37 +--------------
> bitmap.c | 44 +++++++++---------
> bitmap.h | 1 +
> config.c | 17 ++++---
> mdadm.c | 83 ++++++++++++++++------------------
> mdadm.h | 19 +++++---
> tests/04update-uuid | 34 --------------
> tests/05r1-re-add-nosuper | 5 +--
> 12 files changed, 112 insertions(+), 331 deletions(-)
>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH mdadm/master v2 4/4] mdadm: add support for new lockless bitmap
2024-11-07 8:13 ` [PATCH mdadm/master v2 4/4] mdadm: add support for new lockless bitmap Yu Kuai
@ 2024-11-07 9:02 ` Mariusz Tkaczyk
2024-11-07 11:18 ` Yu Kuai
0 siblings, 1 reply; 8+ messages in thread
From: Mariusz Tkaczyk @ 2024-11-07 9:02 UTC (permalink / raw)
To: Yu Kuai; +Cc: linux-raid, yukuai3, yangerkun, Song Liu
On Thu, 7 Nov 2024 16:13:47 +0800
Yu Kuai <yukuai1@huaweicloud.com> wrote:
> + if (strcmp(val, "lockless") == 0) {
> + s->btype = BitmapLockless;
> + pr_info("Experimental lockless bitmap, use at your own
> disk!\n");
> + return MDADM_STATUS_SUCCESS;
> + }
> +
Hi Kuai,
I'm fine with previous patches. For this one, I'm not sure If I can take it yet.
The changes you added if for are not merged, therefore merging this looks bad
from process point of view (I'm merging feature that is not available in
kernel upstream). Am I missing something?
I would like to hear Song voice on that.
IMO, you should keep it as your own customization until development of new
bitmap is done but I understand that the topic is not simple and you might want
to people to test it so having mdadm build-in is an option.
If you really want this I would need a detailed process of "way to stable" in commit
message that I can always refer to. I'm challenging something like that first
time so I hope Song can add something.
Thanks,
Mariusz
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH mdadm/master v2 4/4] mdadm: add support for new lockless bitmap
2024-11-07 9:02 ` Mariusz Tkaczyk
@ 2024-11-07 11:18 ` Yu Kuai
0 siblings, 0 replies; 8+ messages in thread
From: Yu Kuai @ 2024-11-07 11:18 UTC (permalink / raw)
To: Mariusz Tkaczyk, Yu Kuai; +Cc: linux-raid, yangerkun, Song Liu, yukuai (C)
Hi,
在 2024/11/07 17:02, Mariusz Tkaczyk 写道:
> On Thu, 7 Nov 2024 16:13:47 +0800
> Yu Kuai <yukuai1@huaweicloud.com> wrote:
>
>> + if (strcmp(val, "lockless") == 0) {
>> + s->btype = BitmapLockless;
>> + pr_info("Experimental lockless bitmap, use at your own
>> disk!\n");
>> + return MDADM_STATUS_SUCCESS;
>> + }
>> +
>
> Hi Kuai,
> I'm fine with previous patches. For this one, I'm not sure If I can take it yet.
> The changes you added if for are not merged, therefore merging this looks bad
> from process point of view (I'm merging feature that is not available in
> kernel upstream). Am I missing something?
No, you're right that kernel changes are not ready yet. We just finish
testing the demo.
>
> I would like to hear Song voice on that.
>
> IMO, you should keep it as your own customization until development of new
> bitmap is done but I understand that the topic is not simple and you might want
> to people to test it so having mdadm build-in is an option.
Of course, I can remove this patch in the next version.
>
> If you really want this I would need a detailed process of "way to stable" in commit
> message that I can always refer to. I'm challenging something like that first
> time so I hope Song can add something.
Thanks,
Kuai
>
> Thanks,
> Mariusz
>
> .
>
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2024-11-07 11:18 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-11-07 8:13 [PATCH mdadm/master v2 0/4] remove bitmap file support and reserve major number for lockless bitmap Yu Kuai
2024-11-07 8:13 ` [PATCH mdadm/master v2 1/4] tests/04update-uuid: remove bitmap file test Yu Kuai
2024-11-07 8:13 ` [PATCH mdadm/master v2 2/4] tests/05r1-re-add-nosuper: " Yu Kuai
2024-11-07 8:13 ` [PATCH mdadm/master v2 3/4] mdadm: remove bitmap file support Yu Kuai
2024-11-07 8:13 ` [PATCH mdadm/master v2 4/4] mdadm: add support for new lockless bitmap Yu Kuai
2024-11-07 9:02 ` Mariusz Tkaczyk
2024-11-07 11:18 ` Yu Kuai
2024-11-07 8:19 ` [PATCH mdadm/master v2 0/4] remove bitmap file support and reserve major number for " Yu Kuai
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.