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