int UPDATE_OLD_PAGE_MAPPING(int32_t lpn) { int32_t old_ppn; old_ppn = GET_MAPPING_INFO(lpn); if(old_ppn == -1){ #ifdef FTL_DEBUG //printf("[%s] New page \n",__FUNCTION__); #endif //LOG("Wrote new page for lpn %d (old_ppn %d)", lpn, old_ppn); return SUCCESS; } else{ LOG("Rewrote lpn %d (old_ppn %d)", lpn, old_ppn); UPDATE_INVERSE_BLOCK_VALIDITY(CALC_FLASH(old_ppn), CALC_BLOCK(old_ppn), CALC_PAGE(old_ppn), INVALID); //LOG("invalidated old_ppn=%d", old_ppn); UPDATE_INVERSE_PAGE_MAPPING(old_ppn, INVALIDATE, lpn); } return SUCCESS; }
int UPDATE_OLD_PAGE_MAPPING(int32_t lpn, int index) { int32_t *old_ppn; old_ppn = GET_MAPPING_INFO(lpn); if(old_ppn[index] == -1) { #ifdef FTL_DEBUG printf("[%s] New page \n",__FUNCTION__); #endif LOG("Wrote new page for lpn %d index %d (old_ppn %d)", lpn, index, old_ppn[index]); return SUCCESS; } else { LOG("Rewrote lpn %d index %d (old_ppn %d)", lpn, index, old_ppn[index]); UPDATE_INVERSE_BLOCK_VALIDITY(CALC_FLASH(old_ppn[index]), CALC_BLOCK(old_ppn[index]), CALC_PAGE(old_ppn[index]), INVALID, ratio_table[lpn][index]); UPDATE_INVERSE_PAGE_MAPPING(old_ppn[index], INVALIDATE, lpn, index); old_ppn[index] = -1; // this portion of the lpn is now empty } 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; }
int _FTL_READ(int32_t sector_nb, unsigned int length) { #ifdef FTL_DEBUG printf("[%s] Start: sector_nb %d length %u\n",__FUNCTION__, sector_nb, length); #endif if(sector_nb + length > SECTOR_NB){ printf("Error[FTL_READ] Exceed Sector number\n"); return FAIL; } int32_t lpn; int32_t *ppn; int32_t lba = sector_nb; unsigned int remain = length; unsigned int left_skip = sector_nb % SECTORS_PER_PAGE; unsigned int right_skip; unsigned int read_sects; unsigned int i, real_read_length = 0; unsigned int ret = FAIL; int read_page_nb = 0; int io_page_nb; while(remain > 0){ if(remain > SECTORS_PER_PAGE - left_skip){ right_skip = 0; } else{ right_skip = SECTORS_PER_PAGE - left_skip - remain; } read_sects = SECTORS_PER_PAGE - left_skip - right_skip; lpn = lba / (int32_t)SECTORS_PER_PAGE; ppn = GET_MAPPING_INFO(lpn); if(ppn[0] == -1){ return FAIL; } real_read_length += SECTORS_PER_PAGE; if(ppn[1] != -1){ real_read_length += SECTORS_PER_PAGE; } lba += read_sects; remain -= read_sects; left_skip = 0; } io_alloc_overhead = ALLOC_IO_REQUEST(sector_nb, real_read_length, READ, &io_page_nb); remain = length; lba = sector_nb; left_skip = sector_nb % SECTORS_PER_PAGE; while(remain > 0){ if(remain > SECTORS_PER_PAGE - left_skip){ right_skip = 0; } else{ right_skip = SECTORS_PER_PAGE - left_skip - remain; } read_sects = SECTORS_PER_PAGE - left_skip - right_skip; lpn = lba / (int32_t)SECTORS_PER_PAGE; ppn = GET_MAPPING_INFO(lpn); for(i=0; i<2; i++){ if(ppn[i] == -1){ #ifdef FTL_DEBUG printf("Error[%s] No Mapping info\n",__FUNCTION__); #endif /* its legal for 2nd index to be empty*/ if(i==1) break; } //LOG("lpn %d ppn %d", lpn, ppn); ret = SSD_PAGE_READ(CALC_FLASH(ppn[i]), CALC_BLOCK(ppn[i]), CALC_PAGE(ppn[i]), read_page_nb, READ, io_page_nb); if(ret == FAIL){ printf("Error[%s] %u page read fail \n", __FUNCTION__, ppn[i]); } read_page_nb++; } lba += read_sects; remain -= read_sects; left_skip = 0; } INCREASE_IO_REQUEST_SEQ_NB(); #ifdef MONITOR_ON char szTemp[1024]; sprintf(szTemp, "READ PAGE %d ", length); WRITE_LOG(szTemp); #endif #ifdef FTL_DEBUG printf("[%s] Complete\n",__FUNCTION__); #endif return ret; }