|
|
@ -830,42 +830,6 @@ cleanup: |
|
|
|
return rc; |
|
|
|
} |
|
|
|
|
|
|
|
#if CONFIG_DIR_INDEX_COMB_SORT |
|
|
|
#define SWAP_ENTRY(se1, se2) \ |
|
|
|
do { \ |
|
|
|
struct ext4_dx_sort_entry tmp = se1; \ |
|
|
|
se1 = se2; \ |
|
|
|
se2 = tmp; \ |
|
|
|
\ |
|
|
|
} while (0) |
|
|
|
|
|
|
|
static void comb_sort(struct ext4_dx_sort_entry *se, uint32_t count) |
|
|
|
{ |
|
|
|
struct ext4_dx_sort_entry *p, *q, *top = se + count - 1; |
|
|
|
bool more; |
|
|
|
/* Combsort */ |
|
|
|
while (count > 2) { |
|
|
|
count = (count * 10) / 13; |
|
|
|
if (count - 9 < 2) |
|
|
|
count = 11; |
|
|
|
for (p = top, q = p - count; q >= se; p--, q--) |
|
|
|
if (p->hash < q->hash) |
|
|
|
SWAP_ENTRY(*p, *q); |
|
|
|
} |
|
|
|
/* Bubblesort */ |
|
|
|
do { |
|
|
|
more = 0; |
|
|
|
q = top; |
|
|
|
while (q-- > se) { |
|
|
|
if (q[1].hash >= q[0].hash) |
|
|
|
continue; |
|
|
|
SWAP_ENTRY(*(q + 1), *q); |
|
|
|
more = 1; |
|
|
|
} |
|
|
|
} while (more); |
|
|
|
} |
|
|
|
#else |
|
|
|
|
|
|
|
/**@brief Compare function used to pass in quicksort implementation.
|
|
|
|
* It can compare two entries by hash value. |
|
|
|
* @param arg1 First entry |
|
|
@ -888,7 +852,6 @@ static int ext4_dir_dx_entry_comparator(const void *arg1, const void *arg2) |
|
|
|
else |
|
|
|
return 1; |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
/**@brief Insert new index entry to block.
|
|
|
|
* Note that space for new entry must be checked by caller. |
|
|
@ -996,13 +959,9 @@ static int ext4_dir_dx_split_data(struct ext4_inode_ref *inode_ref, |
|
|
|
de = (void *)((uint8_t *)de + elen); |
|
|
|
} |
|
|
|
|
|
|
|
/* Sort all entries */ |
|
|
|
#if CONFIG_DIR_INDEX_COMB_SORT |
|
|
|
comb_sort(sort, idx); |
|
|
|
#else |
|
|
|
qsort(sort, idx, sizeof(struct ext4_dx_sort_entry), |
|
|
|
ext4_dir_dx_entry_comparator); |
|
|
|
#endif |
|
|
|
|
|
|
|
/* Allocate new block for store the second part of entries */ |
|
|
|
ext4_fsblk_t new_fblock; |
|
|
|
uint32_t new_iblock; |
|
|
|