xref: /aosp_15_r20/external/e2fsprogs/lib/ext2fs/badblocks.c (revision 6a54128f25917bfc36a8a6e9d722c04a0b4641b6)
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