1*6a54128fSAndroid Build Coastguard Worker /*
2*6a54128fSAndroid Build Coastguard Worker * badblocks.c --- routines to manipulate the bad block structure
3*6a54128fSAndroid Build Coastguard Worker *
4*6a54128fSAndroid Build Coastguard Worker * Copyright (C) 1994, 1995, 1996 Theodore Ts'o.
5*6a54128fSAndroid Build Coastguard Worker *
6*6a54128fSAndroid Build Coastguard Worker * %Begin-Header%
7*6a54128fSAndroid Build Coastguard Worker * This file may be redistributed under the terms of the GNU Library
8*6a54128fSAndroid Build Coastguard Worker * General Public License, version 2.
9*6a54128fSAndroid Build Coastguard Worker * %End-Header%
10*6a54128fSAndroid Build Coastguard Worker */
11*6a54128fSAndroid Build Coastguard Worker
12*6a54128fSAndroid Build Coastguard Worker #include "config.h"
13*6a54128fSAndroid Build Coastguard Worker #include <stdio.h>
14*6a54128fSAndroid Build Coastguard Worker #include <string.h>
15*6a54128fSAndroid Build Coastguard Worker #if HAVE_UNISTD_H
16*6a54128fSAndroid Build Coastguard Worker #include <unistd.h>
17*6a54128fSAndroid Build Coastguard Worker #endif
18*6a54128fSAndroid Build Coastguard Worker #include <fcntl.h>
19*6a54128fSAndroid Build Coastguard Worker #include <time.h>
20*6a54128fSAndroid Build Coastguard Worker #if HAVE_SYS_STAT_H
21*6a54128fSAndroid Build Coastguard Worker #include <sys/stat.h>
22*6a54128fSAndroid Build Coastguard Worker #endif
23*6a54128fSAndroid Build Coastguard Worker #if HAVE_SYS_TYPES_H
24*6a54128fSAndroid Build Coastguard Worker #include <sys/types.h>
25*6a54128fSAndroid Build Coastguard Worker #endif
26*6a54128fSAndroid Build Coastguard Worker
27*6a54128fSAndroid Build Coastguard Worker #include "ext2_fs.h"
28*6a54128fSAndroid Build Coastguard Worker #include "ext2fsP.h"
29*6a54128fSAndroid Build Coastguard Worker
30*6a54128fSAndroid Build Coastguard Worker /*
31*6a54128fSAndroid Build Coastguard Worker * Helper function for making a badblocks list
32*6a54128fSAndroid Build Coastguard Worker */
make_u32_list(int size,int num,__u32 * list,ext2_u32_list * ret)33*6a54128fSAndroid Build Coastguard Worker static errcode_t make_u32_list(int size, int num, __u32 *list,
34*6a54128fSAndroid Build Coastguard Worker ext2_u32_list *ret)
35*6a54128fSAndroid Build Coastguard Worker {
36*6a54128fSAndroid Build Coastguard Worker ext2_u32_list bb;
37*6a54128fSAndroid Build Coastguard Worker errcode_t retval;
38*6a54128fSAndroid Build Coastguard Worker
39*6a54128fSAndroid Build Coastguard Worker retval = ext2fs_get_mem(sizeof(struct ext2_struct_u32_list), &bb);
40*6a54128fSAndroid Build Coastguard Worker if (retval)
41*6a54128fSAndroid Build Coastguard Worker return retval;
42*6a54128fSAndroid Build Coastguard Worker memset(bb, 0, sizeof(struct ext2_struct_u32_list));
43*6a54128fSAndroid Build Coastguard Worker bb->magic = EXT2_ET_MAGIC_BADBLOCKS_LIST;
44*6a54128fSAndroid Build Coastguard Worker bb->size = size ? size : 10;
45*6a54128fSAndroid Build Coastguard Worker bb->num = num;
46*6a54128fSAndroid Build Coastguard Worker retval = ext2fs_get_array(bb->size, sizeof(blk_t), &bb->list);
47*6a54128fSAndroid Build Coastguard Worker if (retval) {
48*6a54128fSAndroid Build Coastguard Worker ext2fs_free_mem(&bb);
49*6a54128fSAndroid Build Coastguard Worker return retval;
50*6a54128fSAndroid Build Coastguard Worker }
51*6a54128fSAndroid Build Coastguard Worker if (list)
52*6a54128fSAndroid Build Coastguard Worker memcpy(bb->list, list, bb->size * sizeof(blk_t));
53*6a54128fSAndroid Build Coastguard Worker else
54*6a54128fSAndroid Build Coastguard Worker memset(bb->list, 0, bb->size * sizeof(blk_t));
55*6a54128fSAndroid Build Coastguard Worker *ret = bb;
56*6a54128fSAndroid Build Coastguard Worker return 0;
57*6a54128fSAndroid Build Coastguard Worker }
58*6a54128fSAndroid Build Coastguard Worker
59*6a54128fSAndroid Build Coastguard Worker
60*6a54128fSAndroid Build Coastguard Worker /*
61*6a54128fSAndroid Build Coastguard Worker * This procedure creates an empty u32 list.
62*6a54128fSAndroid Build Coastguard Worker */
ext2fs_u32_list_create(ext2_u32_list * ret,int size)63*6a54128fSAndroid Build Coastguard Worker errcode_t ext2fs_u32_list_create(ext2_u32_list *ret, int size)
64*6a54128fSAndroid Build Coastguard Worker {
65*6a54128fSAndroid Build Coastguard Worker return make_u32_list(size, 0, 0, ret);
66*6a54128fSAndroid Build Coastguard Worker }
67*6a54128fSAndroid Build Coastguard Worker
68*6a54128fSAndroid Build Coastguard Worker /*
69*6a54128fSAndroid Build Coastguard Worker * This procedure creates an empty badblocks list.
70*6a54128fSAndroid Build Coastguard Worker */
ext2fs_badblocks_list_create(ext2_badblocks_list * ret,int size)71*6a54128fSAndroid Build Coastguard Worker errcode_t ext2fs_badblocks_list_create(ext2_badblocks_list *ret, int size)
72*6a54128fSAndroid Build Coastguard Worker {
73*6a54128fSAndroid Build Coastguard Worker return make_u32_list(size, 0, 0, (ext2_badblocks_list *) ret);
74*6a54128fSAndroid Build Coastguard Worker }
75*6a54128fSAndroid Build Coastguard Worker
76*6a54128fSAndroid Build Coastguard Worker
77*6a54128fSAndroid Build Coastguard Worker /*
78*6a54128fSAndroid Build Coastguard Worker * This procedure copies a badblocks list
79*6a54128fSAndroid Build Coastguard Worker */
ext2fs_u32_copy(ext2_u32_list src,ext2_u32_list * dest)80*6a54128fSAndroid Build Coastguard Worker errcode_t ext2fs_u32_copy(ext2_u32_list src, ext2_u32_list *dest)
81*6a54128fSAndroid Build Coastguard Worker {
82*6a54128fSAndroid Build Coastguard Worker errcode_t retval;
83*6a54128fSAndroid Build Coastguard Worker
84*6a54128fSAndroid Build Coastguard Worker retval = make_u32_list(src->size, src->num, src->list, dest);
85*6a54128fSAndroid Build Coastguard Worker if (retval)
86*6a54128fSAndroid Build Coastguard Worker return retval;
87*6a54128fSAndroid Build Coastguard Worker (*dest)->badblocks_flags = src->badblocks_flags;
88*6a54128fSAndroid Build Coastguard Worker return 0;
89*6a54128fSAndroid Build Coastguard Worker }
90*6a54128fSAndroid Build Coastguard Worker
ext2fs_badblocks_copy(ext2_badblocks_list src,ext2_badblocks_list * dest)91*6a54128fSAndroid Build Coastguard Worker errcode_t ext2fs_badblocks_copy(ext2_badblocks_list src,
92*6a54128fSAndroid Build Coastguard Worker ext2_badblocks_list *dest)
93*6a54128fSAndroid Build Coastguard Worker {
94*6a54128fSAndroid Build Coastguard Worker return ext2fs_u32_copy((ext2_u32_list) src,
95*6a54128fSAndroid Build Coastguard Worker (ext2_u32_list *) dest);
96*6a54128fSAndroid Build Coastguard Worker }
97*6a54128fSAndroid Build Coastguard Worker
98*6a54128fSAndroid Build Coastguard Worker /*
99*6a54128fSAndroid Build Coastguard Worker * This procedure frees a badblocks list.
100*6a54128fSAndroid Build Coastguard Worker *
101*6a54128fSAndroid Build Coastguard Worker * (note: moved to closefs.c)
102*6a54128fSAndroid Build Coastguard Worker */
103*6a54128fSAndroid Build Coastguard Worker
104*6a54128fSAndroid Build Coastguard Worker
105*6a54128fSAndroid Build Coastguard Worker /*
106*6a54128fSAndroid Build Coastguard Worker * This procedure adds a block to a badblocks list.
107*6a54128fSAndroid Build Coastguard Worker */
ext2fs_u32_list_add(ext2_u32_list bb,__u32 blk)108*6a54128fSAndroid Build Coastguard Worker errcode_t ext2fs_u32_list_add(ext2_u32_list bb, __u32 blk)
109*6a54128fSAndroid Build Coastguard Worker {
110*6a54128fSAndroid Build Coastguard Worker errcode_t retval;
111*6a54128fSAndroid Build Coastguard Worker int i, j;
112*6a54128fSAndroid Build Coastguard Worker unsigned long old_size;
113*6a54128fSAndroid Build Coastguard Worker
114*6a54128fSAndroid Build Coastguard Worker EXT2_CHECK_MAGIC(bb, EXT2_ET_MAGIC_BADBLOCKS_LIST);
115*6a54128fSAndroid Build Coastguard Worker
116*6a54128fSAndroid Build Coastguard Worker if (bb->num >= bb->size) {
117*6a54128fSAndroid Build Coastguard Worker old_size = bb->size * sizeof(__u32);
118*6a54128fSAndroid Build Coastguard Worker bb->size += 100;
119*6a54128fSAndroid Build Coastguard Worker retval = ext2fs_resize_mem(old_size, bb->size * sizeof(__u32),
120*6a54128fSAndroid Build Coastguard Worker &bb->list);
121*6a54128fSAndroid Build Coastguard Worker if (retval) {
122*6a54128fSAndroid Build Coastguard Worker bb->size -= 100;
123*6a54128fSAndroid Build Coastguard Worker return retval;
124*6a54128fSAndroid Build Coastguard Worker }
125*6a54128fSAndroid Build Coastguard Worker }
126*6a54128fSAndroid Build Coastguard Worker
127*6a54128fSAndroid Build Coastguard Worker /*
128*6a54128fSAndroid Build Coastguard Worker * Add special case code for appending to the end of the list
129*6a54128fSAndroid Build Coastguard Worker */
130*6a54128fSAndroid Build Coastguard Worker i = bb->num-1;
131*6a54128fSAndroid Build Coastguard Worker if ((bb->num != 0) && (bb->list[i] == blk))
132*6a54128fSAndroid Build Coastguard Worker return 0;
133*6a54128fSAndroid Build Coastguard Worker if ((bb->num == 0) || (bb->list[i] < blk)) {
134*6a54128fSAndroid Build Coastguard Worker bb->list[bb->num++] = blk;
135*6a54128fSAndroid Build Coastguard Worker return 0;
136*6a54128fSAndroid Build Coastguard Worker }
137*6a54128fSAndroid Build Coastguard Worker
138*6a54128fSAndroid Build Coastguard Worker j = bb->num;
139*6a54128fSAndroid Build Coastguard Worker for (i=0; i < bb->num; i++) {
140*6a54128fSAndroid Build Coastguard Worker if (bb->list[i] == blk)
141*6a54128fSAndroid Build Coastguard Worker return 0;
142*6a54128fSAndroid Build Coastguard Worker if (bb->list[i] > blk) {
143*6a54128fSAndroid Build Coastguard Worker j = i;
144*6a54128fSAndroid Build Coastguard Worker break;
145*6a54128fSAndroid Build Coastguard Worker }
146*6a54128fSAndroid Build Coastguard Worker }
147*6a54128fSAndroid Build Coastguard Worker for (i=bb->num; i > j; i--)
148*6a54128fSAndroid Build Coastguard Worker bb->list[i] = bb->list[i-1];
149*6a54128fSAndroid Build Coastguard Worker bb->list[j] = blk;
150*6a54128fSAndroid Build Coastguard Worker bb->num++;
151*6a54128fSAndroid Build Coastguard Worker return 0;
152*6a54128fSAndroid Build Coastguard Worker }
153*6a54128fSAndroid Build Coastguard Worker
ext2fs_badblocks_list_add(ext2_badblocks_list bb,blk_t blk)154*6a54128fSAndroid Build Coastguard Worker errcode_t ext2fs_badblocks_list_add(ext2_badblocks_list bb, blk_t blk)
155*6a54128fSAndroid Build Coastguard Worker {
156*6a54128fSAndroid Build Coastguard Worker return ext2fs_u32_list_add((ext2_u32_list) bb, (__u32) blk);
157*6a54128fSAndroid Build Coastguard Worker }
158*6a54128fSAndroid Build Coastguard Worker
159*6a54128fSAndroid Build Coastguard Worker /*
160*6a54128fSAndroid Build Coastguard Worker * This procedure finds a particular block is on a badblocks
161*6a54128fSAndroid Build Coastguard Worker * list.
162*6a54128fSAndroid Build Coastguard Worker */
ext2fs_u32_list_find(ext2_u32_list bb,__u32 blk)163*6a54128fSAndroid Build Coastguard Worker int ext2fs_u32_list_find(ext2_u32_list bb, __u32 blk)
164*6a54128fSAndroid Build Coastguard Worker {
165*6a54128fSAndroid Build Coastguard Worker int low, high, mid;
166*6a54128fSAndroid Build Coastguard Worker
167*6a54128fSAndroid Build Coastguard Worker if (bb->magic != EXT2_ET_MAGIC_BADBLOCKS_LIST)
168*6a54128fSAndroid Build Coastguard Worker return -1;
169*6a54128fSAndroid Build Coastguard Worker
170*6a54128fSAndroid Build Coastguard Worker if (bb->num == 0)
171*6a54128fSAndroid Build Coastguard Worker return -1;
172*6a54128fSAndroid Build Coastguard Worker
173*6a54128fSAndroid Build Coastguard Worker low = 0;
174*6a54128fSAndroid Build Coastguard Worker high = bb->num-1;
175*6a54128fSAndroid Build Coastguard Worker if (blk == bb->list[low])
176*6a54128fSAndroid Build Coastguard Worker return low;
177*6a54128fSAndroid Build Coastguard Worker if (blk == bb->list[high])
178*6a54128fSAndroid Build Coastguard Worker return high;
179*6a54128fSAndroid Build Coastguard Worker
180*6a54128fSAndroid Build Coastguard Worker while (low < high) {
181*6a54128fSAndroid Build Coastguard Worker mid = ((unsigned)low + (unsigned)high)/2;
182*6a54128fSAndroid Build Coastguard Worker if (mid == low || mid == high)
183*6a54128fSAndroid Build Coastguard Worker break;
184*6a54128fSAndroid Build Coastguard Worker if (blk == bb->list[mid])
185*6a54128fSAndroid Build Coastguard Worker return mid;
186*6a54128fSAndroid Build Coastguard Worker if (blk < bb->list[mid])
187*6a54128fSAndroid Build Coastguard Worker high = mid;
188*6a54128fSAndroid Build Coastguard Worker else
189*6a54128fSAndroid Build Coastguard Worker low = mid;
190*6a54128fSAndroid Build Coastguard Worker }
191*6a54128fSAndroid Build Coastguard Worker return -1;
192*6a54128fSAndroid Build Coastguard Worker }
193*6a54128fSAndroid Build Coastguard Worker
194*6a54128fSAndroid Build Coastguard Worker /*
195*6a54128fSAndroid Build Coastguard Worker * This procedure tests to see if a particular block is on a badblocks
196*6a54128fSAndroid Build Coastguard Worker * list.
197*6a54128fSAndroid Build Coastguard Worker */
ext2fs_u32_list_test(ext2_u32_list bb,__u32 blk)198*6a54128fSAndroid Build Coastguard Worker int ext2fs_u32_list_test(ext2_u32_list bb, __u32 blk)
199*6a54128fSAndroid Build Coastguard Worker {
200*6a54128fSAndroid Build Coastguard Worker if (ext2fs_u32_list_find(bb, blk) < 0)
201*6a54128fSAndroid Build Coastguard Worker return 0;
202*6a54128fSAndroid Build Coastguard Worker else
203*6a54128fSAndroid Build Coastguard Worker return 1;
204*6a54128fSAndroid Build Coastguard Worker }
205*6a54128fSAndroid Build Coastguard Worker
ext2fs_badblocks_list_test(ext2_badblocks_list bb,blk_t blk)206*6a54128fSAndroid Build Coastguard Worker int ext2fs_badblocks_list_test(ext2_badblocks_list bb, blk_t blk)
207*6a54128fSAndroid Build Coastguard Worker {
208*6a54128fSAndroid Build Coastguard Worker return ext2fs_u32_list_test((ext2_u32_list) bb, (__u32) blk);
209*6a54128fSAndroid Build Coastguard Worker }
210*6a54128fSAndroid Build Coastguard Worker
211*6a54128fSAndroid Build Coastguard Worker
212*6a54128fSAndroid Build Coastguard Worker /*
213*6a54128fSAndroid Build Coastguard Worker * Remove a block from the badblock list
214*6a54128fSAndroid Build Coastguard Worker */
ext2fs_u32_list_del(ext2_u32_list bb,__u32 blk)215*6a54128fSAndroid Build Coastguard Worker int ext2fs_u32_list_del(ext2_u32_list bb, __u32 blk)
216*6a54128fSAndroid Build Coastguard Worker {
217*6a54128fSAndroid Build Coastguard Worker int remloc, i;
218*6a54128fSAndroid Build Coastguard Worker
219*6a54128fSAndroid Build Coastguard Worker if (bb->num == 0)
220*6a54128fSAndroid Build Coastguard Worker return -1;
221*6a54128fSAndroid Build Coastguard Worker
222*6a54128fSAndroid Build Coastguard Worker remloc = ext2fs_u32_list_find(bb, blk);
223*6a54128fSAndroid Build Coastguard Worker if (remloc < 0)
224*6a54128fSAndroid Build Coastguard Worker return -1;
225*6a54128fSAndroid Build Coastguard Worker
226*6a54128fSAndroid Build Coastguard Worker for (i = remloc ; i < bb->num-1; i++)
227*6a54128fSAndroid Build Coastguard Worker bb->list[i] = bb->list[i+1];
228*6a54128fSAndroid Build Coastguard Worker bb->num--;
229*6a54128fSAndroid Build Coastguard Worker return 0;
230*6a54128fSAndroid Build Coastguard Worker }
231*6a54128fSAndroid Build Coastguard Worker
ext2fs_badblocks_list_del(ext2_u32_list bb,__u32 blk)232*6a54128fSAndroid Build Coastguard Worker void ext2fs_badblocks_list_del(ext2_u32_list bb, __u32 blk)
233*6a54128fSAndroid Build Coastguard Worker {
234*6a54128fSAndroid Build Coastguard Worker ext2fs_u32_list_del(bb, blk);
235*6a54128fSAndroid Build Coastguard Worker }
236*6a54128fSAndroid Build Coastguard Worker
ext2fs_u32_list_iterate_begin(ext2_u32_list bb,ext2_u32_iterate * ret)237*6a54128fSAndroid Build Coastguard Worker errcode_t ext2fs_u32_list_iterate_begin(ext2_u32_list bb,
238*6a54128fSAndroid Build Coastguard Worker ext2_u32_iterate *ret)
239*6a54128fSAndroid Build Coastguard Worker {
240*6a54128fSAndroid Build Coastguard Worker ext2_u32_iterate iter;
241*6a54128fSAndroid Build Coastguard Worker errcode_t retval;
242*6a54128fSAndroid Build Coastguard Worker
243*6a54128fSAndroid Build Coastguard Worker EXT2_CHECK_MAGIC(bb, EXT2_ET_MAGIC_BADBLOCKS_LIST);
244*6a54128fSAndroid Build Coastguard Worker
245*6a54128fSAndroid Build Coastguard Worker retval = ext2fs_get_mem(sizeof(struct ext2_struct_u32_iterate), &iter);
246*6a54128fSAndroid Build Coastguard Worker if (retval)
247*6a54128fSAndroid Build Coastguard Worker return retval;
248*6a54128fSAndroid Build Coastguard Worker
249*6a54128fSAndroid Build Coastguard Worker iter->magic = EXT2_ET_MAGIC_BADBLOCKS_ITERATE;
250*6a54128fSAndroid Build Coastguard Worker iter->bb = bb;
251*6a54128fSAndroid Build Coastguard Worker iter->ptr = 0;
252*6a54128fSAndroid Build Coastguard Worker *ret = iter;
253*6a54128fSAndroid Build Coastguard Worker return 0;
254*6a54128fSAndroid Build Coastguard Worker }
255*6a54128fSAndroid Build Coastguard Worker
ext2fs_badblocks_list_iterate_begin(ext2_badblocks_list bb,ext2_badblocks_iterate * ret)256*6a54128fSAndroid Build Coastguard Worker errcode_t ext2fs_badblocks_list_iterate_begin(ext2_badblocks_list bb,
257*6a54128fSAndroid Build Coastguard Worker ext2_badblocks_iterate *ret)
258*6a54128fSAndroid Build Coastguard Worker {
259*6a54128fSAndroid Build Coastguard Worker return ext2fs_u32_list_iterate_begin((ext2_u32_list) bb,
260*6a54128fSAndroid Build Coastguard Worker (ext2_u32_iterate *) ret);
261*6a54128fSAndroid Build Coastguard Worker }
262*6a54128fSAndroid Build Coastguard Worker
263*6a54128fSAndroid Build Coastguard Worker
ext2fs_u32_list_iterate(ext2_u32_iterate iter,__u32 * blk)264*6a54128fSAndroid Build Coastguard Worker int ext2fs_u32_list_iterate(ext2_u32_iterate iter, __u32 *blk)
265*6a54128fSAndroid Build Coastguard Worker {
266*6a54128fSAndroid Build Coastguard Worker ext2_u32_list bb;
267*6a54128fSAndroid Build Coastguard Worker
268*6a54128fSAndroid Build Coastguard Worker if (iter->magic != EXT2_ET_MAGIC_BADBLOCKS_ITERATE)
269*6a54128fSAndroid Build Coastguard Worker return 0;
270*6a54128fSAndroid Build Coastguard Worker
271*6a54128fSAndroid Build Coastguard Worker bb = iter->bb;
272*6a54128fSAndroid Build Coastguard Worker
273*6a54128fSAndroid Build Coastguard Worker if (bb->magic != EXT2_ET_MAGIC_BADBLOCKS_LIST)
274*6a54128fSAndroid Build Coastguard Worker return 0;
275*6a54128fSAndroid Build Coastguard Worker
276*6a54128fSAndroid Build Coastguard Worker if (iter->ptr < bb->num) {
277*6a54128fSAndroid Build Coastguard Worker *blk = bb->list[iter->ptr++];
278*6a54128fSAndroid Build Coastguard Worker return 1;
279*6a54128fSAndroid Build Coastguard Worker }
280*6a54128fSAndroid Build Coastguard Worker *blk = 0;
281*6a54128fSAndroid Build Coastguard Worker return 0;
282*6a54128fSAndroid Build Coastguard Worker }
283*6a54128fSAndroid Build Coastguard Worker
ext2fs_badblocks_list_iterate(ext2_badblocks_iterate iter,blk_t * blk)284*6a54128fSAndroid Build Coastguard Worker int ext2fs_badblocks_list_iterate(ext2_badblocks_iterate iter, blk_t *blk)
285*6a54128fSAndroid Build Coastguard Worker {
286*6a54128fSAndroid Build Coastguard Worker return ext2fs_u32_list_iterate((ext2_u32_iterate) iter,
287*6a54128fSAndroid Build Coastguard Worker (__u32 *) blk);
288*6a54128fSAndroid Build Coastguard Worker }
289*6a54128fSAndroid Build Coastguard Worker
290*6a54128fSAndroid Build Coastguard Worker
ext2fs_u32_list_iterate_end(ext2_u32_iterate iter)291*6a54128fSAndroid Build Coastguard Worker void ext2fs_u32_list_iterate_end(ext2_u32_iterate iter)
292*6a54128fSAndroid Build Coastguard Worker {
293*6a54128fSAndroid Build Coastguard Worker if (!iter || (iter->magic != EXT2_ET_MAGIC_BADBLOCKS_ITERATE))
294*6a54128fSAndroid Build Coastguard Worker return;
295*6a54128fSAndroid Build Coastguard Worker
296*6a54128fSAndroid Build Coastguard Worker iter->bb = 0;
297*6a54128fSAndroid Build Coastguard Worker ext2fs_free_mem(&iter);
298*6a54128fSAndroid Build Coastguard Worker }
299*6a54128fSAndroid Build Coastguard Worker
ext2fs_badblocks_list_iterate_end(ext2_badblocks_iterate iter)300*6a54128fSAndroid Build Coastguard Worker void ext2fs_badblocks_list_iterate_end(ext2_badblocks_iterate iter)
301*6a54128fSAndroid Build Coastguard Worker {
302*6a54128fSAndroid Build Coastguard Worker ext2fs_u32_list_iterate_end((ext2_u32_iterate) iter);
303*6a54128fSAndroid Build Coastguard Worker }
304*6a54128fSAndroid Build Coastguard Worker
305*6a54128fSAndroid Build Coastguard Worker
ext2fs_u32_list_equal(ext2_u32_list bb1,ext2_u32_list bb2)306*6a54128fSAndroid Build Coastguard Worker int ext2fs_u32_list_equal(ext2_u32_list bb1, ext2_u32_list bb2)
307*6a54128fSAndroid Build Coastguard Worker {
308*6a54128fSAndroid Build Coastguard Worker EXT2_CHECK_MAGIC(bb1, EXT2_ET_MAGIC_BADBLOCKS_LIST);
309*6a54128fSAndroid Build Coastguard Worker EXT2_CHECK_MAGIC(bb2, EXT2_ET_MAGIC_BADBLOCKS_LIST);
310*6a54128fSAndroid Build Coastguard Worker
311*6a54128fSAndroid Build Coastguard Worker if (bb1->num != bb2->num)
312*6a54128fSAndroid Build Coastguard Worker return 0;
313*6a54128fSAndroid Build Coastguard Worker
314*6a54128fSAndroid Build Coastguard Worker if (memcmp(bb1->list, bb2->list, bb1->num * sizeof(blk_t)) != 0)
315*6a54128fSAndroid Build Coastguard Worker return 0;
316*6a54128fSAndroid Build Coastguard Worker return 1;
317*6a54128fSAndroid Build Coastguard Worker }
318*6a54128fSAndroid Build Coastguard Worker
ext2fs_badblocks_equal(ext2_badblocks_list bb1,ext2_badblocks_list bb2)319*6a54128fSAndroid Build Coastguard Worker int ext2fs_badblocks_equal(ext2_badblocks_list bb1, ext2_badblocks_list bb2)
320*6a54128fSAndroid Build Coastguard Worker {
321*6a54128fSAndroid Build Coastguard Worker return ext2fs_u32_list_equal((ext2_u32_list) bb1,
322*6a54128fSAndroid Build Coastguard Worker (ext2_u32_list) bb2);
323*6a54128fSAndroid Build Coastguard Worker }
324*6a54128fSAndroid Build Coastguard Worker
ext2fs_u32_list_count(ext2_u32_list bb)325*6a54128fSAndroid Build Coastguard Worker int ext2fs_u32_list_count(ext2_u32_list bb)
326*6a54128fSAndroid Build Coastguard Worker {
327*6a54128fSAndroid Build Coastguard Worker return bb->num;
328*6a54128fSAndroid Build Coastguard Worker }
329