badblocks.c revision 3984b61df41c68966bdfbb2a5e5a45ef4b9a536c
119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * badblocks.c --- routines to manipulate the bad block structure 33984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt * 419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Copyright (C) 1994, 1995, 1996 Theodore Ts'o. 519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %Begin-Header% 719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This file may be redistributed under the terms of the GNU Public 819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * License. 919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * %End-Header% 1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdio.h> 1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <string.h> 1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_UNISTD_H 1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <unistd.h> 1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <fcntl.h> 1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <time.h> 1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_SYS_STAT_H 2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/stat.h> 2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if HAVE_SYS_TYPES_H 2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <sys/types.h> 2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif 2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "ext2_fs.h" 2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "ext2fsP.h" 2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Helper function for making a badblocks list 3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic errcode_t make_u32_list(int size, int num, __u32 *list, 3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_u32_list *ret) 3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_u32_list bb; 3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 373984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_get_mem(sizeof(struct ext2_struct_u32_list), &bb); 3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project memset(bb, 0, sizeof(struct ext2_struct_u32_list)); 4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bb->magic = EXT2_ET_MAGIC_BADBLOCKS_LIST; 4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bb->size = size ? size : 10; 4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bb->num = num; 4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_get_array(bb->size, sizeof(blk_t), &bb->list); 4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_free_mem(&bb); 4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (list) 5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project memcpy(bb->list, list, bb->size * sizeof(blk_t)); 5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project memset(bb->list, 0, bb->size * sizeof(blk_t)); 5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *ret = bb; 5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 573984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This procedure creates an empty u32 list. 6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ext2fs_u32_list_create(ext2_u32_list *ret, int size) 6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return make_u32_list(size, 0, 0, ret); 6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This procedure creates an empty badblocks list. 6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ext2fs_badblocks_list_create(ext2_badblocks_list *ret, int size) 7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return make_u32_list(size, 0, 0, (ext2_badblocks_list *) ret); 7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This procedure copies a badblocks list 7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ext2fs_u32_copy(ext2_u32_list src, ext2_u32_list *dest) 8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 823984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = make_u32_list(src->size, src->num, src->list, dest); 8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (*dest)->badblocks_flags = src->badblocks_flags; 8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ext2fs_badblocks_copy(ext2_badblocks_list src, 9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_badblocks_list *dest) 9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return ext2fs_u32_copy((ext2_u32_list) src, 9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (ext2_u32_list *) dest); 9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This procedure frees a badblocks list. 9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * 10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * (note: moved to closefs.c) 10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 10319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 10419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 10519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This procedure adds a block to a badblocks list. 10619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ext2fs_u32_list_add(ext2_u32_list bb, __u32 blk) 10819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int i, j; 11119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project unsigned long old_size; 11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 11319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project EXT2_CHECK_MAGIC(bb, EXT2_ET_MAGIC_BADBLOCKS_LIST); 11419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 11519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (bb->num >= bb->size) { 11619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project old_size = bb->size * sizeof(__u32); 11719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bb->size += 100; 11819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_resize_mem(old_size, bb->size * sizeof(__u32), 11919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project &bb->list); 12019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) { 12119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bb->size -= 100; 12219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 12319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 12419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 12519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 12619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project /* 12719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Add special case code for appending to the end of the list 12819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 12919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project i = bb->num-1; 13019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((bb->num != 0) && (bb->list[i] == blk)) 13119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 13219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if ((bb->num == 0) || (bb->list[i] < blk)) { 13319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bb->list[bb->num++] = blk; 13419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 13519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 13619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 13719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project j = bb->num; 13819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (i=0; i < bb->num; i++) { 13919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (bb->list[i] == blk) 14019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 14119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (bb->list[i] > blk) { 14219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project j = i; 14319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 14419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 14519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 14619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (i=bb->num; i > j; i--) 14719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bb->list[i] = bb->list[i-1]; 14819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bb->list[j] = blk; 14919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bb->num++; 15019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 15119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 15219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 15319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ext2fs_badblocks_list_add(ext2_badblocks_list bb, blk_t blk) 15419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 15519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return ext2fs_u32_list_add((ext2_u32_list) bb, (__u32) blk); 15619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 15719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 15819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 15919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This procedure finds a particular block is on a badblocks 16019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * list. 16119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 16219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint ext2fs_u32_list_find(ext2_u32_list bb, __u32 blk) 16319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 16419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int low, high, mid; 16519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 16619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (bb->magic != EXT2_ET_MAGIC_BADBLOCKS_LIST) 16719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return -1; 16819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 16919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (bb->num == 0) 17019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return -1; 17119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 17219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project low = 0; 17319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project high = bb->num-1; 17419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (blk == bb->list[low]) 17519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return low; 17619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (blk == bb->list[high]) 17719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return high; 17819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 17919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project while (low < high) { 18019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project mid = (low+high)/2; 18119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (mid == low || mid == high) 18219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project break; 18319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (blk == bb->list[mid]) 18419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return mid; 18519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (blk < bb->list[mid]) 18619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project high = mid; 18719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 18819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project low = mid; 18919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project } 19019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return -1; 19119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 19219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 19319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 19419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * This procedure tests to see if a particular block is on a badblocks 19519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * list. 19619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 19719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint ext2fs_u32_list_test(ext2_u32_list bb, __u32 blk) 19819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 19919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (ext2fs_u32_list_find(bb, blk) < 0) 20019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 20119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project else 20219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 1; 20319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 20419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 20519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint ext2fs_badblocks_list_test(ext2_badblocks_list bb, blk_t blk) 20619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 20719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return ext2fs_u32_list_test((ext2_u32_list) bb, (__u32) blk); 20819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 20919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 21019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 21119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* 21219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project * Remove a block from the badblock list 21319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project */ 21419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint ext2fs_u32_list_del(ext2_u32_list bb, __u32 blk) 21519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 21619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project int remloc, i; 21719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 21819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (bb->num == 0) 21919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return -1; 22019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 22119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project remloc = ext2fs_u32_list_find(bb, blk); 22219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (remloc < 0) 22319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return -1; 22419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 22519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project for (i = remloc ; i < bb->num-1; i++) 22619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bb->list[i] = bb->list[i+1]; 22719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bb->num--; 22819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 22919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 23019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 23119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid ext2fs_badblocks_list_del(ext2_u32_list bb, __u32 blk) 23219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 23319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_u32_list_del(bb, blk); 23419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 23519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 23619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ext2fs_u32_list_iterate_begin(ext2_u32_list bb, 23719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_u32_iterate *ret) 23819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 23919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_u32_iterate iter; 24019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project errcode_t retval; 24119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 24219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project EXT2_CHECK_MAGIC(bb, EXT2_ET_MAGIC_BADBLOCKS_LIST); 24319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 24419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project retval = ext2fs_get_mem(sizeof(struct ext2_struct_u32_iterate), &iter); 24519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (retval) 24619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return retval; 24719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 24819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project iter->magic = EXT2_ET_MAGIC_BADBLOCKS_ITERATE; 24919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project iter->bb = bb; 25019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project iter->ptr = 0; 25119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *ret = iter; 25219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 25319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 25419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 25519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projecterrcode_t ext2fs_badblocks_list_iterate_begin(ext2_badblocks_list bb, 25619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_badblocks_iterate *ret) 25719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 25819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return ext2fs_u32_list_iterate_begin((ext2_u32_list) bb, 25919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (ext2_u32_iterate *) ret); 26019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 26119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 26219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 26319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint ext2fs_u32_list_iterate(ext2_u32_iterate iter, __u32 *blk) 26419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 26519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2_u32_list bb; 26619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 26719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (iter->magic != EXT2_ET_MAGIC_BADBLOCKS_ITERATE) 26819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 26919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 27019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project bb = iter->bb; 27119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 27219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (bb->magic != EXT2_ET_MAGIC_BADBLOCKS_LIST) 27319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 2743984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt 27519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (iter->ptr < bb->num) { 27619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *blk = bb->list[iter->ptr++]; 27719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 1; 2783984b61df41c68966bdfbb2a5e5a45ef4b9a536cDmitry Shmidt } 27919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project *blk = 0; 28019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 28119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 28219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 28319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint ext2fs_badblocks_list_iterate(ext2_badblocks_iterate iter, blk_t *blk) 28419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 28519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return ext2fs_u32_list_iterate((ext2_u32_iterate) iter, 28619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (__u32 *) blk); 28719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 28819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 28919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 29019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid ext2fs_u32_list_iterate_end(ext2_u32_iterate iter) 29119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 29219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (!iter || (iter->magic != EXT2_ET_MAGIC_BADBLOCKS_ITERATE)) 29319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return; 29419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 29519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project iter->bb = 0; 29619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_free_mem(&iter); 29719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 29819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 29919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid ext2fs_badblocks_list_iterate_end(ext2_badblocks_iterate iter) 30019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 30119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project ext2fs_u32_list_iterate_end((ext2_u32_iterate) iter); 30219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 30319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 30419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 30519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint ext2fs_u32_list_equal(ext2_u32_list bb1, ext2_u32_list bb2) 30619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 30719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project EXT2_CHECK_MAGIC(bb1, EXT2_ET_MAGIC_BADBLOCKS_LIST); 30819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project EXT2_CHECK_MAGIC(bb2, EXT2_ET_MAGIC_BADBLOCKS_LIST); 30919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 31019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (bb1->num != bb2->num) 31119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 31219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 31319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project if (memcmp(bb1->list, bb2->list, bb1->num * sizeof(blk_t)) != 0) 31419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 0; 31519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return 1; 31619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 31719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 31819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint ext2fs_badblocks_equal(ext2_badblocks_list bb1, ext2_badblocks_list bb2) 31919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 32019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return ext2fs_u32_list_equal((ext2_u32_list) bb1, 32119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project (ext2_u32_list) bb2); 32219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 32319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project 32419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectint ext2fs_u32_list_count(ext2_u32_list bb) 32519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{ 32619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project return bb->num; 32719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project} 328