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