int COPY_VALID_PAGES(int32_t old_pbn, int32_t new_pbn) { int i; int copy_page_nb = 0; unsigned int old_flash_nb = CALC_FLASH(old_pbn); unsigned int old_block_nb = CALC_BLOCK(old_pbn); unsigned int new_flash_nb = CALC_FLASH(new_pbn); unsigned int new_block_nb = CALC_BLOCK(new_pbn);; block_state_entry* old_b_s_entry = GET_BLOCK_STATE_ENTRY(old_pbn); char* valid_array = old_b_s_entry->valid_array; for(i=0;i<PAGE_NB;i++){ if(valid_array[i] == 'V'){ SSD_PAGE_READ(old_flash_nb, old_block_nb, i, -1, GC_READ, -1); SSD_PAGE_WRITE(new_flash_nb, new_block_nb, i, -1, GC_WRITE, -1); UPDATE_BLOCK_STATE_ENTRY(new_pbn, i, VALID); UPDATE_BLOCK_STATE_ENTRY(old_pbn, i, INVALID); copy_page_nb++; } } return copy_page_nb; }
int UPDATE_NEW_PAGE_MAPPING(int32_t lpn, int32_t ppn) { /* Update Page Mapping Table */ #ifdef FTL_MAP_CACHE CACHE_UPDATE_PPN(lpn, ppn); #else mapping_table[lpn] = ppn; #endif /* Update Inverse Page Mapping Table */ UPDATE_BLOCK_STATE_ENTRY(CALC_FLASH(ppn), CALC_BLOCK(ppn), CALC_PAGE(ppn), VALID); UPDATE_BLOCK_STATE(CALC_FLASH(ppn), CALC_BLOCK(ppn), DATA_BLOCK); UPDATE_INVERSE_MAPPING(ppn, lpn); return SUCCESS; }
int UPDATE_NEW_PAGE_MAPPING(IDEState *s, int32_t lpn, int32_t ppn) { SSDState *ssd = &(s->ssd); /* Update Page Mapping Table */ #ifdef FTL_MAP_CACHE CACHE_UPDATE_PPN(s, lpn, ppn); #else ssd->mapping_table[lpn] = ppn; #endif /* Update Inverse Page Mapping Table */ UPDATE_BLOCK_STATE_ENTRY(s, CALC_FLASH(s, ppn), CALC_BLOCK(s, ppn), CALC_PAGE(s, ppn), VALID); UPDATE_BLOCK_STATE(s, CALC_FLASH(s, ppn), CALC_BLOCK(s, ppn), DATA_BLOCK); UPDATE_INVERSE_MAPPING(s, ppn, lpn); return SUCCESS; }
int UPDATE_OLD_PAGE_MAPPING(int32_t lpn) { int32_t old_ppn; #ifdef FTL_MAP_CACHE old_ppn = CACHE_GET_PPN(lpn); #else old_ppn = GET_MAPPING_INFO(lpn); #endif if(old_ppn == -1){ #ifdef FTL_DEBUG printf("[%s] New page \n", __FUNCTION__); #endif return SUCCESS; } else{ UPDATE_BLOCK_STATE_ENTRY(CALC_FLASH(old_ppn), CALC_BLOCK(old_ppn), CALC_PAGE(old_ppn), INVALID); UPDATE_INVERSE_MAPPING(old_ppn, -1); } return SUCCESS; }