imsm: Prepare checkpoint update for general migration

mdadm has to prepare checkpoint information update and send it to mdmon.

Signed-off-by: Adam Kwolek <adam.kwolek@intel.com>
Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
Adam Kwolek 2011-06-08 17:12:48 +10:00 committed by NeilBrown
parent 2d40f3a132
commit c17608eac3
1 changed files with 67 additions and 0 deletions

View File

@ -1944,6 +1944,51 @@ out:
return retval;
}
/*******************************************************************************
* function: imsm_create_metadata_checkpoint_update
* Description: It creates update for checkpoint change.
* Parameters:
* super : imsm internal array info
* u : pointer to prepared update
* Returns:
* Uptate length.
* If length is equal to 0, input pointer u contains no update
******************************************************************************/
static int imsm_create_metadata_checkpoint_update(
struct intel_super *super,
struct imsm_update_general_migration_checkpoint **u)
{
int update_memory_size = 0;
dprintf("imsm_create_metadata_checkpoint_update(enter)\n");
if (u == NULL)
return 0;
*u = NULL;
/* size of all update data without anchor */
update_memory_size =
sizeof(struct imsm_update_general_migration_checkpoint);
*u = calloc(1, update_memory_size);
if (*u == NULL) {
dprintf("error: cannot get memory for "
"imsm_create_metadata_checkpoint_update update\n");
return 0;
}
(*u)->type = update_general_migration_checkpoint;
(*u)->curr_migr_unit = __le32_to_cpu(super->migr_rec->curr_migr_unit);
dprintf("imsm_create_metadata_checkpoint_update: prepared for %u\n",
(*u)->curr_migr_unit);
return update_memory_size;
}
static void imsm_update_metadata_locally(struct supertype *st,
void *buf, int len);
/*******************************************************************************
* Function: write_imsm_migr_rec
* Description: Function writes imsm migration record
@ -1962,6 +2007,8 @@ static int write_imsm_migr_rec(struct supertype *st)
int fd = -1;
int retval = -1;
struct dl *sd;
int len;
struct imsm_update_general_migration_checkpoint *u;
for (sd = super->disks ; sd ; sd = sd->next) {
/* write to 2 first slots only */
@ -1987,6 +2034,26 @@ static int write_imsm_migr_rec(struct supertype *st)
close(fd);
fd = -1;
}
/* update checkpoint information in metadata */
len = imsm_create_metadata_checkpoint_update(super, &u);
if (len <= 0) {
dprintf("imsm: Cannot prepare update\n");
goto out;
}
/* update metadata locally */
imsm_update_metadata_locally(st, u, len);
/* and possibly remotely */
if (st->update_tail) {
append_metadata_update(st, u, len);
/* during reshape we do all work inside metadata handler
* manage_reshape(), so metadata update has to be triggered
* insida it
*/
flush_metadata_updates(st);
st->update_tail = &st->updates;
} else
free(u);
retval = 0;
out: