• Home
  • Raw
  • Download

Lines Matching refs:icount

76 void ext2fs_free_icount(ext2_icount_t icount)  in ext2fs_free_icount()  argument
78 if (!icount) in ext2fs_free_icount()
81 icount->magic = 0; in ext2fs_free_icount()
82 if (icount->list) in ext2fs_free_icount()
83 ext2fs_free_mem(&icount->list); in ext2fs_free_icount()
84 if (icount->single) in ext2fs_free_icount()
85 ext2fs_free_inode_bitmap(icount->single); in ext2fs_free_icount()
86 if (icount->multiple) in ext2fs_free_icount()
87 ext2fs_free_inode_bitmap(icount->multiple); in ext2fs_free_icount()
89 if (icount->tdb) in ext2fs_free_icount()
90 tdb_close(icount->tdb); in ext2fs_free_icount()
91 if (icount->tdb_fn) { in ext2fs_free_icount()
92 (void) unlink(icount->tdb_fn); in ext2fs_free_icount()
93 free(icount->tdb_fn); in ext2fs_free_icount()
97 if (icount->fullmap) in ext2fs_free_icount()
98 ext2fs_free_mem(&icount->fullmap); in ext2fs_free_icount()
100 ext2fs_free_mem(&icount); in ext2fs_free_icount()
105 ext2_icount_t icount; in alloc_icount() local
110 retval = ext2fs_get_mem(sizeof(struct ext2_icount), &icount); in alloc_icount()
113 memset(icount, 0, sizeof(struct ext2_icount)); in alloc_icount()
114 icount->magic = EXT2_ET_MAGIC_ICOUNT; in alloc_icount()
115 icount->num_inodes = fs->super->s_inodes_count; in alloc_icount()
119 unsigned sz = sizeof(*icount->fullmap) * icount->num_inodes; in alloc_icount()
121 retval = ext2fs_get_mem(sz, &icount->fullmap); in alloc_icount()
124 memset(icount->fullmap, 0, sz); in alloc_icount()
125 *ret = icount; in alloc_icount()
130 retval = ext2fs_allocate_inode_bitmap(fs, "icount", &icount->single); in alloc_icount()
136 &icount->multiple); in alloc_icount()
140 icount->multiple = 0; in alloc_icount()
142 *ret = icount; in alloc_icount()
146 ext2fs_free_icount(icount); in alloc_icount()
205 ext2_icount_t icount; in ext2fs_create_icount_tdb() local
212 retval = alloc_icount(fs, flags, &icount); in ext2fs_create_icount_tdb()
228 icount->tdb_fn = fn; in ext2fs_create_icount_tdb()
240 icount->tdb = tdb_open(fn, num_inodes, TDB_NOLOCK | TDB_NOSYNC, in ext2fs_create_icount_tdb()
243 if (icount->tdb == NULL) { in ext2fs_create_icount_tdb()
247 *ret = icount; in ext2fs_create_icount_tdb()
250 ext2fs_free_icount(icount); in ext2fs_create_icount_tdb()
260 ext2_icount_t icount; in ext2fs_create_icount2() local
271 retval = alloc_icount(fs, flags, &icount); in ext2fs_create_icount2()
275 if (icount->fullmap) in ext2fs_create_icount2()
279 icount->size = size; in ext2fs_create_icount2()
286 retval = ext2fs_get_num_dirs(fs, &icount->size); in ext2fs_create_icount2()
289 icount->size += fs->super->s_inodes_count / 50; in ext2fs_create_icount2()
292 bytes = (size_t) (icount->size * sizeof(struct ext2_icount_el)); in ext2fs_create_icount2()
295 icount->size, bytes); in ext2fs_create_icount2()
297 retval = ext2fs_get_array(icount->size, sizeof(struct ext2_icount_el), in ext2fs_create_icount2()
298 &icount->list); in ext2fs_create_icount2()
301 memset(icount->list, 0, bytes); in ext2fs_create_icount2()
303 icount->count = 0; in ext2fs_create_icount2()
304 icount->cursor = 0; in ext2fs_create_icount2()
313 icount->list[i].ino = hint->list[i].ino; in ext2fs_create_icount2()
314 icount->count = hint->count; in ext2fs_create_icount2()
318 *ret = icount; in ext2fs_create_icount2()
322 ext2fs_free_icount(icount); in ext2fs_create_icount2()
337 static struct ext2_icount_el *insert_icount_el(ext2_icount_t icount, in insert_icount_el() argument
345 if (icount->last_lookup && icount->last_lookup->ino == ino) in insert_icount_el()
346 return icount->last_lookup; in insert_icount_el()
348 if (icount->count >= icount->size) { in insert_icount_el()
349 if (icount->count) { in insert_icount_el()
350 new_size = icount->list[(unsigned)icount->count-1].ino; in insert_icount_el()
351 new_size = (ext2_ino_t) (icount->count * in insert_icount_el()
352 ((float) icount->num_inodes / new_size)); in insert_icount_el()
354 if (new_size < (icount->size + 100)) in insert_icount_el()
355 new_size = icount->size + 100; in insert_icount_el()
359 retval = ext2fs_resize_mem((size_t) icount->size * in insert_icount_el()
363 &icount->list); in insert_icount_el()
366 icount->size = new_size; in insert_icount_el()
368 num = (int) icount->count - pos; in insert_icount_el()
372 memmove(&icount->list[pos+1], &icount->list[pos], in insert_icount_el()
375 icount->count++; in insert_icount_el()
376 el = &icount->list[pos]; in insert_icount_el()
379 icount->last_lookup = el; in insert_icount_el()
388 static struct ext2_icount_el *get_icount_el(ext2_icount_t icount, in get_icount_el() argument
393 if (!icount || !icount->list) in get_icount_el()
396 if (create && ((icount->count == 0) || in get_icount_el()
397 (ino > icount->list[(unsigned)icount->count-1].ino))) { in get_icount_el()
398 return insert_icount_el(icount, ino, (unsigned) icount->count); in get_icount_el()
400 if (icount->count == 0) in get_icount_el()
403 if (icount->cursor >= icount->count) in get_icount_el()
404 icount->cursor = 0; in get_icount_el()
405 if (ino == icount->list[icount->cursor].ino) in get_icount_el()
406 return &icount->list[icount->cursor++]; in get_icount_el()
411 high = (int) icount->count-1; in get_icount_el()
414 if (ino == icount->list[mid].ino) { in get_icount_el()
415 icount->cursor = mid+1; in get_icount_el()
416 return &icount->list[mid]; in get_icount_el()
418 if (ino < icount->list[mid].ino) in get_icount_el()
428 return insert_icount_el(icount, ino, low); in get_icount_el()
432 static errcode_t set_inode_count(ext2_icount_t icount, ext2_ino_t ino, in set_inode_count() argument
439 if (icount->tdb) { in set_inode_count()
445 if (tdb_store(icount->tdb, key, data, TDB_REPLACE)) in set_inode_count()
446 return tdb_error(icount->tdb) + in set_inode_count()
449 if (tdb_delete(icount->tdb, key)) in set_inode_count()
450 return tdb_error(icount->tdb) + in set_inode_count()
456 if (icount->fullmap) { in set_inode_count()
457 icount->fullmap[ino] = icount_16_xlate(count); in set_inode_count()
461 el = get_icount_el(icount, ino, 1); in set_inode_count()
469 static errcode_t get_inode_count(ext2_icount_t icount, ext2_ino_t ino, in get_inode_count() argument
476 if (icount->tdb) { in get_inode_count()
480 data = tdb_fetch(icount->tdb, key); in get_inode_count()
483 return tdb_error(icount->tdb) + EXT2_ET_TDB_SUCCESS; in get_inode_count()
491 if (icount->fullmap) { in get_inode_count()
492 *count = icount->fullmap[ino]; in get_inode_count()
496 el = get_icount_el(icount, ino, 0); in get_inode_count()
506 errcode_t ext2fs_icount_validate(ext2_icount_t icount, FILE *out) in ext2fs_icount_validate() argument
512 EXT2_CHECK_MAGIC(icount, EXT2_ET_MAGIC_ICOUNT); in ext2fs_icount_validate()
514 if (icount->count > icount->size) { in ext2fs_icount_validate()
518 for (i=1; i < icount->count; i++) { in ext2fs_icount_validate()
519 if (icount->list[i-1].ino >= icount->list[i].ino) { in ext2fs_icount_validate()
521 bad, i-1, icount->list[i-1].ino, in ext2fs_icount_validate()
522 i, icount->list[i].ino); in ext2fs_icount_validate()
529 errcode_t ext2fs_icount_fetch(ext2_icount_t icount, ext2_ino_t ino, __u16 *ret) in ext2fs_icount_fetch() argument
532 EXT2_CHECK_MAGIC(icount, EXT2_ET_MAGIC_ICOUNT); in ext2fs_icount_fetch()
534 if (!ino || (ino > icount->num_inodes)) in ext2fs_icount_fetch()
537 if (!icount->fullmap) { in ext2fs_icount_fetch()
538 if (ext2fs_test_inode_bitmap2(icount->single, ino)) { in ext2fs_icount_fetch()
542 if (icount->multiple && in ext2fs_icount_fetch()
543 !ext2fs_test_inode_bitmap2(icount->multiple, ino)) { in ext2fs_icount_fetch()
548 get_inode_count(icount, ino, &val); in ext2fs_icount_fetch()
553 errcode_t ext2fs_icount_increment(ext2_icount_t icount, ext2_ino_t ino, in ext2fs_icount_increment() argument
558 EXT2_CHECK_MAGIC(icount, EXT2_ET_MAGIC_ICOUNT); in ext2fs_icount_increment()
560 if (!ino || (ino > icount->num_inodes)) in ext2fs_icount_increment()
563 if (icount->fullmap) { in ext2fs_icount_increment()
564 curr_value = icount_16_xlate(icount->fullmap[ino] + 1); in ext2fs_icount_increment()
565 icount->fullmap[ino] = curr_value; in ext2fs_icount_increment()
566 } else if (ext2fs_test_inode_bitmap2(icount->single, ino)) { in ext2fs_icount_increment()
571 if (set_inode_count(icount, ino, 2)) in ext2fs_icount_increment()
574 ext2fs_unmark_inode_bitmap2(icount->single, ino); in ext2fs_icount_increment()
575 } else if (icount->multiple) { in ext2fs_icount_increment()
581 if (ext2fs_test_inode_bitmap2(icount->multiple, ino)) { in ext2fs_icount_increment()
582 get_inode_count(icount, ino, &curr_value); in ext2fs_icount_increment()
584 if (set_inode_count(icount, ino, curr_value)) in ext2fs_icount_increment()
591 ext2fs_mark_inode_bitmap2(icount->single, ino); in ext2fs_icount_increment()
601 get_inode_count(icount, ino, &curr_value); in ext2fs_icount_increment()
603 if (set_inode_count(icount, ino, curr_value)) in ext2fs_icount_increment()
606 if (icount->multiple) in ext2fs_icount_increment()
607 ext2fs_mark_inode_bitmap2(icount->multiple, ino); in ext2fs_icount_increment()
613 errcode_t ext2fs_icount_decrement(ext2_icount_t icount, ext2_ino_t ino, in ext2fs_icount_decrement() argument
618 if (!ino || (ino > icount->num_inodes)) in ext2fs_icount_decrement()
621 EXT2_CHECK_MAGIC(icount, EXT2_ET_MAGIC_ICOUNT); in ext2fs_icount_decrement()
623 if (icount->fullmap) { in ext2fs_icount_decrement()
624 if (!icount->fullmap[ino]) in ext2fs_icount_decrement()
627 curr_value = --icount->fullmap[ino]; in ext2fs_icount_decrement()
633 if (ext2fs_test_inode_bitmap2(icount->single, ino)) { in ext2fs_icount_decrement()
634 ext2fs_unmark_inode_bitmap2(icount->single, ino); in ext2fs_icount_decrement()
635 if (icount->multiple) in ext2fs_icount_decrement()
636 ext2fs_unmark_inode_bitmap2(icount->multiple, ino); in ext2fs_icount_decrement()
638 set_inode_count(icount, ino, 0); in ext2fs_icount_decrement()
645 if (icount->multiple && in ext2fs_icount_decrement()
646 !ext2fs_test_inode_bitmap2(icount->multiple, ino)) in ext2fs_icount_decrement()
649 get_inode_count(icount, ino, &curr_value); in ext2fs_icount_decrement()
653 if (set_inode_count(icount, ino, curr_value)) in ext2fs_icount_decrement()
657 ext2fs_mark_inode_bitmap2(icount->single, ino); in ext2fs_icount_decrement()
658 if ((curr_value == 0) && icount->multiple) in ext2fs_icount_decrement()
659 ext2fs_unmark_inode_bitmap2(icount->multiple, ino); in ext2fs_icount_decrement()
666 errcode_t ext2fs_icount_store(ext2_icount_t icount, ext2_ino_t ino, in ext2fs_icount_store() argument
669 if (!ino || (ino > icount->num_inodes)) in ext2fs_icount_store()
672 EXT2_CHECK_MAGIC(icount, EXT2_ET_MAGIC_ICOUNT); in ext2fs_icount_store()
674 if (icount->fullmap) in ext2fs_icount_store()
675 return set_inode_count(icount, ino, count); in ext2fs_icount_store()
678 ext2fs_mark_inode_bitmap2(icount->single, ino); in ext2fs_icount_store()
679 if (icount->multiple) in ext2fs_icount_store()
680 ext2fs_unmark_inode_bitmap2(icount->multiple, ino); in ext2fs_icount_store()
684 ext2fs_unmark_inode_bitmap2(icount->single, ino); in ext2fs_icount_store()
685 if (icount->multiple) { in ext2fs_icount_store()
690 ext2fs_unmark_inode_bitmap2(icount->multiple, ino); in ext2fs_icount_store()
692 set_inode_count(icount, ino, 0); in ext2fs_icount_store()
696 if (set_inode_count(icount, ino, count)) in ext2fs_icount_store()
698 ext2fs_unmark_inode_bitmap2(icount->single, ino); in ext2fs_icount_store()
699 if (icount->multiple) in ext2fs_icount_store()
700 ext2fs_mark_inode_bitmap2(icount->multiple, ino); in ext2fs_icount_store()
704 ext2_ino_t ext2fs_get_icount_size(ext2_icount_t icount) in ext2fs_get_icount_size() argument
706 if (!icount || icount->magic != EXT2_ET_MAGIC_ICOUNT) in ext2fs_get_icount_size()
709 return icount->size; in ext2fs_get_icount_size()
715 ext2_icount_t icount; variable
821 ext2_icount_t icount; in run_test() local
829 flags, &icount); in run_test()
841 &icount); in run_test()
853 retval = ext2fs_icount_store(icount, pc->ino, pc->arg); in run_test()
862 retval = ext2fs_icount_increment(icount, pc->ino, 0); in run_test()
871 retval = ext2fs_icount_decrement(icount, pc->ino, 0); in run_test()
880 retval = ext2fs_icount_fetch(icount, pc->ino, &result); in run_test()
891 printf("icount size is %u\n", ext2fs_get_icount_size(icount)); in run_test()
892 retval = ext2fs_icount_validate(icount, stdout); in run_test()
897 ext2fs_free_icount(icount); in run_test()