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:
NeilBrown 2010-12-16 12:10:01 +11:00
parent 78b10e663c
commit cb23f1f4c3
4 changed files with 12 additions and 0 deletions

View File

@ -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);

View File

@ -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;
};

View File

@ -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;

1
util.c
View File

@ -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;