Browse Source

ext4_dir_idx: make qsort as a default dir idx sort algorithm

pull/28/head
gkostka 8 years ago
parent
commit
dee6a10ab3
  1. 5
      include/ext4_config.h
  2. 43
      src/ext4_dir_idx.c

5
include/ext4_config.h

@ -88,11 +88,6 @@ extern "C" {
#define CONFIG_JOURNALING_ENABLE 1 #define CONFIG_JOURNALING_ENABLE 1
#endif #endif
/**@brief Enable directory indexing comb sort*/
#ifndef CONFIG_DIR_INDEX_COMB_SORT
#define CONFIG_DIR_INDEX_COMB_SORT 1
#endif
/**@brief Include error codes from ext4_errno or standard library.*/ /**@brief Include error codes from ext4_errno or standard library.*/
#ifndef CONFIG_HAVE_OWN_ERRNO #ifndef CONFIG_HAVE_OWN_ERRNO
#define CONFIG_HAVE_OWN_ERRNO 0 #define CONFIG_HAVE_OWN_ERRNO 0

43
src/ext4_dir_idx.c

@ -830,42 +830,6 @@ cleanup:
return rc; 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. /**@brief Compare function used to pass in quicksort implementation.
* It can compare two entries by hash value. * It can compare two entries by hash value.
* @param arg1 First entry * @param arg1 First entry
@ -888,7 +852,6 @@ static int ext4_dir_dx_entry_comparator(const void *arg1, const void *arg2)
else else
return 1; return 1;
} }
#endif
/**@brief Insert new index entry to block. /**@brief Insert new index entry to block.
* Note that space for new entry must be checked by caller. * 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); 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), qsort(sort, idx, sizeof(struct ext4_dx_sort_entry),
ext4_dir_dx_entry_comparator); ext4_dir_dx_entry_comparator);
#endif
/* Allocate new block for store the second part of entries */ /* Allocate new block for store the second part of entries */
ext4_fsblk_t new_fblock; ext4_fsblk_t new_fblock;
uint32_t new_iblock; uint32_t new_iblock;

Loading…
Cancel
Save