PhotoRec: rewrote update_blocksize() function
This commit is contained in:
parent
aa3c316be2
commit
59b6e0cb97
1 changed files with 42 additions and 17 deletions
|
@ -513,29 +513,54 @@ unsigned int find_blocksize(alloc_data_t *list_search_space, const unsigned int
|
||||||
void update_blocksize(unsigned int blocksize, alloc_data_t *list_search_space, const uint64_t offset)
|
void update_blocksize(unsigned int blocksize, alloc_data_t *list_search_space, const uint64_t offset)
|
||||||
{
|
{
|
||||||
struct td_list_head *search_walker = NULL;
|
struct td_list_head *search_walker = NULL;
|
||||||
struct td_list_head *search_walker_next = NULL;
|
struct td_list_head *search_walker_prev = NULL;
|
||||||
td_list_for_each_safe(search_walker,search_walker_next,&list_search_space->list)
|
/* Align end of last range (round up) */
|
||||||
{
|
|
||||||
uint64_t old_start;
|
|
||||||
alloc_data_t *current_search_space;
|
|
||||||
current_search_space=td_list_entry(search_walker, alloc_data_t, list);
|
|
||||||
old_start=current_search_space->start;
|
|
||||||
current_search_space->start=(current_search_space->start-offset%blocksize+blocksize-1)/blocksize*blocksize+offset%blocksize;
|
|
||||||
if(current_search_space->start!=old_start)
|
|
||||||
current_search_space->file_stat=NULL;
|
|
||||||
if(current_search_space->start>=current_search_space->end)
|
|
||||||
{
|
|
||||||
td_list_del(search_walker);
|
|
||||||
free(current_search_space);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Align end of last range */
|
|
||||||
search_walker=list_search_space->list.prev;
|
search_walker=list_search_space->list.prev;
|
||||||
{
|
{
|
||||||
alloc_data_t *current_search_space;
|
alloc_data_t *current_search_space;
|
||||||
current_search_space=td_list_entry(search_walker, alloc_data_t, list);
|
current_search_space=td_list_entry(search_walker, alloc_data_t, list);
|
||||||
current_search_space->end=(current_search_space->end+1-offset%blocksize+blocksize-1)/blocksize*blocksize+offset%blocksize-1;
|
current_search_space->end=(current_search_space->end+1-offset%blocksize+blocksize-1)/blocksize*blocksize+offset%blocksize-1;
|
||||||
}
|
}
|
||||||
|
/* Align start of each range */
|
||||||
|
td_list_for_each_prev_safe(search_walker,search_walker_prev,&list_search_space->list)
|
||||||
|
{
|
||||||
|
alloc_data_t *current_search_space=td_list_entry(search_walker, alloc_data_t, list);
|
||||||
|
const uint64_t aligned_start=(current_search_space->start-offset%blocksize+blocksize-1)/blocksize*blocksize+offset%blocksize;
|
||||||
|
if(current_search_space->start!=aligned_start)
|
||||||
|
{
|
||||||
|
alloc_data_t *prev_search_space=td_list_entry(search_walker_prev, alloc_data_t, list);
|
||||||
|
if(prev_search_space->end + 1 == current_search_space->start)
|
||||||
|
{
|
||||||
|
/* merge with previous block */
|
||||||
|
prev_search_space->end = current_search_space->end;
|
||||||
|
td_list_del(search_walker);
|
||||||
|
free(current_search_space);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
current_search_space->start=aligned_start;
|
||||||
|
current_search_space->file_stat=NULL;
|
||||||
|
if(current_search_space->start>=current_search_space->end)
|
||||||
|
{
|
||||||
|
/* block too small - delete it */
|
||||||
|
td_list_del(search_walker);
|
||||||
|
free(current_search_space);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Align end of each range (truncate) */
|
||||||
|
td_list_for_each_prev_safe(search_walker, search_walker_prev, &list_search_space->list)
|
||||||
|
{
|
||||||
|
alloc_data_t *current_search_space=td_list_entry(search_walker, alloc_data_t, list);
|
||||||
|
current_search_space->end=(current_search_space->end+1-offset%blocksize)/blocksize*blocksize+offset%blocksize-1;
|
||||||
|
if(current_search_space->start>=current_search_space->end)
|
||||||
|
{
|
||||||
|
/* block too small - delete it */
|
||||||
|
td_list_del(search_walker);
|
||||||
|
free(current_search_space);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t free_list_allocation_end=0;
|
uint64_t free_list_allocation_end=0;
|
||||||
|
|
Loading…
Reference in a new issue