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 <neilb@suse.de>
This commit is contained in:
parent
78b10e663c
commit
cb23f1f4c3
|
@ -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);
|
||||
|
|
3
mdadm.h
3
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;
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue