From cb23f1f4c33d495c05a37ded7acecdeaebdabf14 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Thu, 16 Dec 2010 12:10:01 +1100 Subject: [PATCH] Allow a metadata update to have a linked list of allocated spaces. Sometimes one metadata update will require allocating several larger data structures. As 'monitor' cannot allocate, 'manager' must, so it must be able to attach a list of allocates to the update, and importantly it must be able to easily free them. So add a 'space_list' element to metadata updates where each element on the list starts with a pointer to the next. Signed-off-by: NeilBrown --- managemon.c | 7 +++++++ mdadm.h | 3 +++ super-intel.c | 1 + util.c | 1 + 4 files changed, 12 insertions(+) diff --git a/managemon.c b/managemon.c index 5cc50d8d..860e5785 100644 --- a/managemon.c +++ b/managemon.c @@ -217,10 +217,16 @@ static void free_updates(struct metadata_update **update) { while (*update) { struct metadata_update *this = *update; + void **space_list = this->space_list; *update = this->next; free(this->buf); free(this->space); + while (space_list) { + void *space = space_list; + space_list = *space_list; + free(space); + } free(this); } } @@ -710,6 +716,7 @@ static void handle_message(struct supertype *container, struct metadata_update * mu->buf = msg->buf; msg->buf = NULL; mu->space = NULL; + mu->space_list = NULL; mu->next = NULL; if (container->ss->prepare_update) container->ss->prepare_update(container, mu); diff --git a/mdadm.h b/mdadm.h index 20628254..36124dea 100644 --- a/mdadm.h +++ b/mdadm.h @@ -764,6 +764,9 @@ struct metadata_update { int len; char *buf; void *space; /* allocated space that monitor will use */ + void **space_list; /* list of allocated spaces that monitor can + * use or that it returned. + */ struct metadata_update *next; }; diff --git a/super-intel.c b/super-intel.c index 68382513..43f75d9e 100644 --- a/super-intel.c +++ b/super-intel.c @@ -5357,6 +5357,7 @@ static struct mdinfo *imsm_activate_spare(struct active_array *a, } mu->space = NULL; + mu->space_list = NULL; mu->len = sizeof(struct imsm_update_activate_spare) * num_spares; mu->next = *updates; u = (struct imsm_update_activate_spare *) mu->buf; diff --git a/util.c b/util.c index f57cd9ee..7544ce17 100644 --- a/util.c +++ b/util.c @@ -1890,6 +1890,7 @@ void append_metadata_update(struct supertype *st, void *buf, int len) mu->buf = buf; mu->len = len; mu->space = NULL; + mu->space_list = NULL; mu->next = NULL; *st->update_tail = mu; st->update_tail = &mu->next; -- 2.39.2