@ -416,26 +416,26 @@ static int
_restart ( dm_reset_reason reason )
_restart ( dm_reset_reason reason )
{
{
unsigned char buffer [ 2 ] ;
unsigned char buffer [ 2 ] ;
int offset , result = 0 ;
int offset = 0 , result = 0 ;
/* We need to scan the entire file and invalidate and data that should not persist after the last reset */
/* We need to scan the entire file and invalidate and data that should not persist after the last reset */
/* Loop through all of the data segments and delete those that are not persistent */
/* Loop through all of the data segments and delete those that are not persistent */
offset = 0 ;
while ( 1 ) {
while ( 1 ) {
size_t len ;
size_t len ;
/* Get data segment at current offset */
/* Get data segment at current offset */
if ( lseek ( g_task_fd , offset , SEEK_SET ) ! = offset ) {
if ( lseek ( g_task_fd , offset , SEEK_SET ) ! = offset ) {
result = - 1 ;
/* must be at eof */
break ;
break ;
}
}
len = read ( g_task_fd , buffer , sizeof ( buffer ) ) ;
len = read ( g_task_fd , buffer , sizeof ( buffer ) ) ;
if ( len = = 0 )
if ( len ! = sizeof ( buffer ) ) {
/* must be at eof */
break ;
break ;
}
/* check if segment contains data */
/* check if segment contains data */
if ( buffer [ 0 ] ) {
if ( buffer [ 0 ] ) {
@ -443,12 +443,12 @@ _restart(dm_reset_reason reason)
/* Whether data gets deleted depends on reset type and data segment's persistence setting */
/* Whether data gets deleted depends on reset type and data segment's persistence setting */
if ( reason = = DM_INIT_REASON_POWER_ON ) {
if ( reason = = DM_INIT_REASON_POWER_ON ) {
if ( buffer [ 1 ] ! = DM_PERSIST_POWER_ON_RESET ) {
if ( buffer [ 1 ] > DM_PERSIST_POWER_ON_RESET ) {
clear_entry = 1 ;
clear_entry = 1 ;
}
}
} else {
} else {
if ( ( buffer [ 1 ] ! = DM_PERSIST_POWER_ON_RESET ) & & ( buffer [ 1 ] ! = DM_PERSIST_IN_FLIGHT_RESET ) ) {
if ( buffer [ 1 ] > DM_PERSIST_IN_FLIGHT_RESET ) {
clear_entry = 1 ;
clear_entry = 1 ;
}
}
}
}
@ -628,6 +628,23 @@ task_main(int argc, char *argv[])
fsync ( g_task_fd ) ;
fsync ( g_task_fd ) ;
/* see if we need to erase any items based on restart type */
int sys_restart_val ;
if ( param_get ( param_find ( " SYS_RESTART_TYPE " ) , & sys_restart_val ) = = OK ) {
if ( sys_restart_val = = DM_INIT_REASON_POWER_ON ) {
warnx ( " Power on restart " ) ;
_restart ( DM_INIT_REASON_POWER_ON ) ;
}
else if ( sys_restart_val = = DM_INIT_REASON_IN_FLIGHT ) {
warnx ( " In flight restart " ) ;
_restart ( DM_INIT_REASON_IN_FLIGHT ) ;
}
else
warnx ( " Unknown restart " ) ;
}
else
warnx ( " Unknown restart " ) ;
/* We use two file descriptors, one for the caller context and one for the worker thread */
/* We use two file descriptors, one for the caller context and one for the worker thread */
/* They are actually the same but we need to some way to reject caller request while the */
/* They are actually the same but we need to some way to reject caller request while the */
/* worker thread is shutting down but still processing requests */
/* worker thread is shutting down but still processing requests */
@ -724,7 +741,7 @@ start(void)
return - 1 ;
return - 1 ;
}
}
/* wait for the thread to actuall initialize */
/* wait for the thread to actually initialize */
sem_wait ( & g_init_sema ) ;
sem_wait ( & g_init_sema ) ;
sem_destroy ( & g_init_sema ) ;
sem_destroy ( & g_init_sema ) ;