119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * ea_refcount.c 33984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * 419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright (C) 2001 Theodore Ts'o. This file may be 519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * redistributed under the terms of the GNU Public License. 619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_UNISTD_H 919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <unistd.h> 1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <string.h> 1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdio.h> 1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 143984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#ifdef TEST_PROGRAM 153984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#undef ENABLE_NLS 163984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#endif 1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "e2fsck.h" 1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * The strategy we use for keeping track of EA refcounts is as 2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * follows. We keep a sorted array of first EA blocks and its 2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * reference counts. Once the refcount has dropped to zero, it is 2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * removed from the array to save memory space. Once the EA block is 243984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * checked, its bit is set in the block_ea_map bitmap. 2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstruct ea_refcount_el { 2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t ea_blk; 2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int ea_count; 2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}; 3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstruct ea_refcount { 3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t count; 3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t size; 3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t cursor; 3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ea_refcount_el *list; 3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}; 3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid ea_refcount_free(ext2_refcount_t refcount) 3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!refcount) 4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (refcount->list) 4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_free_mem(&refcount->list); 4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_free_mem(&refcount); 4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ea_refcount_create(int size, ext2_refcount_t *ret) 4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_refcount_t refcount; 5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project size_t bytes; 5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_get_mem(sizeof(struct ea_refcount), &refcount); 5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project memset(refcount, 0, sizeof(struct ea_refcount)); 5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!size) 6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project size = 500; 6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project refcount->size = size; 6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bytes = (size_t) (size * sizeof(struct ea_refcount_el)); 6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef DEBUG 6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Refcount allocated %d entries, %d bytes.\n", 6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project refcount->size, bytes); 6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_get_mem(bytes, &refcount->list); 6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto errout; 7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project memset(refcount->list, 0, bytes); 7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project refcount->count = 0; 7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project refcount->cursor = 0; 7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *ret = refcount; 7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrout: 7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ea_refcount_free(refcount); 8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return(retval); 8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * collapse_refcount() --- go through the refcount array, and get rid 8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * of any count == zero entries 8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void refcount_collapse(ext2_refcount_t refcount) 8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned int i, j; 9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ea_refcount_el *list; 9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project list = refcount->list; 9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (i = 0, j = 0; i < refcount->count; i++) { 9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (list[i].ea_count) { 9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (i != j) 9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project list[j] = list[i]; 9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project j++; 9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if defined(DEBUG) || defined(TEST_PROGRAM) 10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Refcount_collapse: size was %d, now %d\n", 10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project refcount->count, j); 10319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 10419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project refcount->count = j; 10519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 10619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 10819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * insert_refcount_el() --- Insert a new entry into the sorted list at a 11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * specified position. 11119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic struct ea_refcount_el *insert_refcount_el(ext2_refcount_t refcount, 11319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t blk, int pos) 11419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 11519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ea_refcount_el *el; 11619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 11719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t new_size = 0; 11819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int num; 11919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 12019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (refcount->count >= refcount->size) { 12119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project new_size = refcount->size + 100; 12219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef DEBUG 12319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Reallocating refcount %d entries...\n", new_size); 1243984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt#endif 12519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_resize_mem((size_t) refcount->size * 12619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project sizeof(struct ea_refcount_el), 12719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (size_t) new_size * 12819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project sizeof(struct ea_refcount_el), 12919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project &refcount->list); 13019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 13119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 13219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project refcount->size = new_size; 13319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 13419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project num = (int) refcount->count - pos; 13519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (num < 0) 13619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; /* should never happen */ 13719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (num) { 13819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project memmove(&refcount->list[pos+1], &refcount->list[pos], 13919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project sizeof(struct ea_refcount_el) * num); 14019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 14119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project refcount->count++; 14219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project el = &refcount->list[pos]; 14319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project el->ea_count = 0; 14419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project el->ea_blk = blk; 14519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return el; 14619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 14719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 14819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 14919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 15019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * get_refcount_el() --- given an block number, try to find refcount 15119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * information in the sorted list. If the create flag is set, 15219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * and we can't find an entry, create one in the sorted list. 15319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 15419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic struct ea_refcount_el *get_refcount_el(ext2_refcount_t refcount, 15519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t blk, int create) 15619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 15719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project float range; 15819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int low, high, mid; 15919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t lowval, highval; 16019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 16119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!refcount || !refcount->list) 16219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 16319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectretry: 16419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project low = 0; 16519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project high = (int) refcount->count-1; 16619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (create && ((refcount->count == 0) || 16719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (blk > refcount->list[high].ea_blk))) { 16819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (refcount->count >= refcount->size) 16919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project refcount_collapse(refcount); 17019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 17119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return insert_refcount_el(refcount, blk, 17219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (unsigned) refcount->count); 17319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 17419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (refcount->count == 0) 17519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 1763984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 17719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (refcount->cursor >= refcount->count) 17819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project refcount->cursor = 0; 17919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (blk == refcount->list[refcount->cursor].ea_blk) 18019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return &refcount->list[refcount->cursor++]; 18119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef DEBUG 18219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Non-cursor get_refcount_el: %u\n", blk); 18319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 18419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while (low <= high) { 18519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if 0 18619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mid = (low+high)/2; 18719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else 18819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (low == high) 18919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mid = low; 19019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else { 19119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* Interpolate for efficiency */ 19219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project lowval = refcount->list[low].ea_blk; 19319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project highval = refcount->list[high].ea_blk; 19419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 19519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (blk < lowval) 19619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project range = 0; 19719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else if (blk > highval) 19819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project range = 1; 1993984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt else 20019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project range = ((float) (blk - lowval)) / 20119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (highval - lowval); 20219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mid = low + ((int) (range * (high-low))); 20319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 20419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 20519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (blk == refcount->list[mid].ea_blk) { 20619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project refcount->cursor = mid+1; 20719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return &refcount->list[mid]; 20819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 20919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (blk < refcount->list[mid].ea_blk) 21019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project high = mid-1; 21119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 21219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project low = mid+1; 21319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 21419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* 21519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * If we need to create a new entry, it should be right at 21619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * low (where high will be left at low-1). 21719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 21819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (create) { 21919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (refcount->count >= refcount->size) { 22019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project refcount_collapse(refcount); 22119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (refcount->count < refcount->size) 22219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project goto retry; 22319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 22419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return insert_refcount_el(refcount, blk, low); 22519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 22619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 22719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 22819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 22919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ea_refcount_fetch(ext2_refcount_t refcount, blk_t blk, 23019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int *ret) 23119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 23219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ea_refcount_el *el; 2333984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 23419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project el = get_refcount_el(refcount, blk, 0); 23519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!el) { 23619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *ret = 0; 23719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 23819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 23919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *ret = el->ea_count; 24019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 24119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 24219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 24319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ea_refcount_increment(ext2_refcount_t refcount, blk_t blk, int *ret) 24419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 24519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ea_refcount_el *el; 24619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 24719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project el = get_refcount_el(refcount, blk, 1); 24819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!el) 24919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return EXT2_ET_NO_MEMORY; 25019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project el->ea_count++; 25119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 25219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ret) 25319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *ret = el->ea_count; 25419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 25519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 25619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 25719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ea_refcount_decrement(ext2_refcount_t refcount, blk_t blk, int *ret) 25819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 25919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ea_refcount_el *el; 26019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 26119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project el = get_refcount_el(refcount, blk, 0); 26219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!el || el->ea_count == 0) 26319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return EXT2_ET_INVALID_ARGUMENT; 26419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 26519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project el->ea_count--; 26619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 26719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ret) 26819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *ret = el->ea_count; 26919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 27019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 27119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 27219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ea_refcount_store(ext2_refcount_t refcount, blk_t blk, int count) 27319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 27419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ea_refcount_el *el; 27519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 27619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* 27719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Get the refcount element 27819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 27919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project el = get_refcount_el(refcount, blk, count ? 1 : 0); 28019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!el) 28119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return count ? EXT2_ET_NO_MEMORY : 0; 28219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project el->ea_count = count; 28319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 28419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 28519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 28619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectblk_t ext2fs_get_refcount_size(ext2_refcount_t refcount) 28719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 28819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!refcount) 28919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 29019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 29119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return refcount->size; 29219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 29319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 29419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid ea_refcount_intr_begin(ext2_refcount_t refcount) 29519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 29619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project refcount->cursor = 0; 29719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 29819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 29919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 30019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectblk_t ea_refcount_intr_next(ext2_refcount_t refcount, 30119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int *ret) 30219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 30319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project struct ea_refcount_el *list; 3043984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 30519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while (1) { 30619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (refcount->cursor >= refcount->count) 30719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 30819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project list = refcount->list; 30919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (list[refcount->cursor].ea_count) { 31019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ret) 31119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *ret = list[refcount->cursor].ea_count; 31219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return list[refcount->cursor++].ea_blk; 31319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 31419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project refcount->cursor++; 31519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 31619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 31719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 31819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 31919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef TEST_PROGRAM 32019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 32119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ea_refcount_validate(ext2_refcount_t refcount, FILE *out) 32219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 32319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t ret = 0; 32419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int i; 32519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project const char *bad = "bad refcount"; 3263984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 32719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (refcount->count > refcount->size) { 32819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(out, "%s: count > size\n", bad); 32919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return EXT2_ET_INVALID_ARGUMENT; 33019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 33119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (i=1; i < refcount->count; i++) { 33219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (refcount->list[i-1].ea_blk >= refcount->list[i].ea_blk) { 33319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fprintf(out, "%s: list[%d].blk=%u, list[%d].blk=%u\n", 33419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bad, i-1, refcount->list[i-1].ea_blk, 33519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project i, refcount->list[i].ea_blk); 33619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ret = EXT2_ET_INVALID_ARGUMENT; 33719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 33819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 33919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return ret; 34019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 34119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 34219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define BCODE_END 0 34319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define BCODE_CREATE 1 34419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define BCODE_FREE 2 34519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define BCODE_STORE 3 34619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define BCODE_INCR 4 34719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define BCODE_DECR 5 34819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define BCODE_FETCH 6 34919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define BCODE_VALIDATE 7 35019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define BCODE_LIST 8 35119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define BCODE_COLLAPSE 9 35219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 35319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint bcode_program[] = { 35419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_CREATE, 5, 35519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_STORE, 3, 3, 35619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_STORE, 4, 4, 35719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_STORE, 1, 1, 35819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_STORE, 8, 8, 35919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_STORE, 2, 2, 36019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_STORE, 4, 0, 36119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_STORE, 2, 0, 36219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_STORE, 6, 6, 36319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_VALIDATE, 36419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_STORE, 4, 4, 36519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_STORE, 2, 2, 36619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_FETCH, 1, 36719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_FETCH, 2, 36819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_INCR, 3, 36919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_INCR, 3, 37019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_DECR, 4, 37119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_STORE, 4, 4, 37219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_VALIDATE, 37319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_STORE, 20, 20, 37419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_STORE, 40, 40, 37519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_STORE, 30, 30, 37619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_STORE, 10, 10, 37719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_DECR, 30, 37819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_FETCH, 30, 37919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_DECR, 2, 38019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_DECR, 2, 38119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_COLLAPSE, 38219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_LIST, 38319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_VALIDATE, 38419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_FREE, 38519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project BCODE_END 38619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}; 38719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 38819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint main(int argc, char **argv) 38919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 39019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int i = 0; 39119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_refcount_t refcount; 39219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int size, arg; 39319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk_t blk; 39419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 39519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 39619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while (1) { 39719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project switch (bcode_program[i++]) { 39819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case BCODE_END: 39919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(0); 40019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case BCODE_CREATE: 40119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project size = bcode_program[i++]; 40219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ea_refcount_create(size, &refcount); 40319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 40419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("ea_refcount_create", 40519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval, ""); 40619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project exit(1); 40719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } else 40819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Creating refcount with size %d\n", 40919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project size); 41019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 41119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case BCODE_FREE: 41219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ea_refcount_free(refcount); 41319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project refcount = 0; 41419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Freeing refcount\n"); 41519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 41619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case BCODE_STORE: 41719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk = (blk_t) bcode_program[i++]; 41819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project arg = bcode_program[i++]; 41919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ea_refcount_store(refcount, blk, arg); 42019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Storing blk %u with value %d\n", blk, arg); 42119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 42219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("ea_refcount_store", retval, ""); 42319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 42419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case BCODE_FETCH: 42519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk = (blk_t) bcode_program[i++]; 42619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ea_refcount_fetch(refcount, blk, &arg); 42719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 42819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("ea_refcount_fetch", retval, ""); 42919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 43019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("bcode_fetch(%u) returns %d\n", 43119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk, arg); 43219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 43319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case BCODE_INCR: 43419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk = (blk_t) bcode_program[i++]; 43519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ea_refcount_increment(refcount, blk, 43619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project &arg); 43719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 43819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("ea_refcount_increment", retval, 43919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ""); 44019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 44119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("bcode_increment(%u) returns %d\n", 44219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk, arg); 44319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 44419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case BCODE_DECR: 44519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk = (blk_t) bcode_program[i++]; 44619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ea_refcount_decrement(refcount, blk, 44719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project &arg); 44819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 44919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("ea_refcount_decrement", retval, 45019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project "while decrementing blk %u", blk); 45119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 45219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("bcode_decrement(%u) returns %d\n", 45319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project blk, arg); 45419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 45519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case BCODE_VALIDATE: 45619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ea_refcount_validate(refcount, stderr); 45719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 45819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project com_err("ea_refcount_validate", 45919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval, ""); 46019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 46119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("Refcount validation OK.\n"); 46219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 46319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case BCODE_LIST: 46419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ea_refcount_intr_begin(refcount); 46519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while (1) { 4663984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt blk = ea_refcount_intr_next(refcount, 46719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project &arg); 46819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!blk) 46919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 47019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project printf("\tblk=%u, count=%d\n", blk, 47119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project arg); 47219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 47319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 47419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project case BCODE_COLLAPSE: 47519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project refcount_collapse(refcount); 47619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 47719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 4783984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 47919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 48019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 48119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 48219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 483