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) {
|
while (*update) {
|
||||||
struct metadata_update *this = *update;
|
struct metadata_update *this = *update;
|
||||||
|
void **space_list = this->space_list;
|
||||||
|
|
||||||
*update = this->next;
|
*update = this->next;
|
||||||
free(this->buf);
|
free(this->buf);
|
||||||
free(this->space);
|
free(this->space);
|
||||||
|
while (space_list) {
|
||||||
|
void *space = space_list;
|
||||||
|
space_list = *space_list;
|
||||||
|
free(space);
|
||||||
|
}
|
||||||
free(this);
|
free(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -710,6 +716,7 @@ static void handle_message(struct supertype *container, struct metadata_update *
|
||||||
mu->buf = msg->buf;
|
mu->buf = msg->buf;
|
||||||
msg->buf = NULL;
|
msg->buf = NULL;
|
||||||
mu->space = NULL;
|
mu->space = NULL;
|
||||||
|
mu->space_list = NULL;
|
||||||
mu->next = NULL;
|
mu->next = NULL;
|
||||||
if (container->ss->prepare_update)
|
if (container->ss->prepare_update)
|
||||||
container->ss->prepare_update(container, mu);
|
container->ss->prepare_update(container, mu);
|
||||||
|
|
3
mdadm.h
3
mdadm.h
|
@ -764,6 +764,9 @@ struct metadata_update {
|
||||||
int len;
|
int len;
|
||||||
char *buf;
|
char *buf;
|
||||||
void *space; /* allocated space that monitor will use */
|
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;
|
struct metadata_update *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -5357,6 +5357,7 @@ static struct mdinfo *imsm_activate_spare(struct active_array *a,
|
||||||
}
|
}
|
||||||
|
|
||||||
mu->space = NULL;
|
mu->space = NULL;
|
||||||
|
mu->space_list = NULL;
|
||||||
mu->len = sizeof(struct imsm_update_activate_spare) * num_spares;
|
mu->len = sizeof(struct imsm_update_activate_spare) * num_spares;
|
||||||
mu->next = *updates;
|
mu->next = *updates;
|
||||||
u = (struct imsm_update_activate_spare *) mu->buf;
|
u = (struct imsm_update_activate_spare *) mu->buf;
|
||||||
|
|
1
util.c
1
util.c
|
@ -1890,6 +1890,7 @@ void append_metadata_update(struct supertype *st, void *buf, int len)
|
||||||
mu->buf = buf;
|
mu->buf = buf;
|
||||||
mu->len = len;
|
mu->len = len;
|
||||||
mu->space = NULL;
|
mu->space = NULL;
|
||||||
|
mu->space_list = NULL;
|
||||||
mu->next = NULL;
|
mu->next = NULL;
|
||||||
*st->update_tail = mu;
|
*st->update_tail = mu;
|
||||||
st->update_tail = &mu->next;
|
st->update_tail = &mu->next;
|
||||||
|
|
Loading…
Reference in New Issue