diff --git a/managemon.c b/managemon.c index 5cc50d8..860e578 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 2062825..36124de 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 6838251..43f75d9 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 f57cd9e..7544ce1 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;