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%
78558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall * This file may be redistributed under the terms of the GNU Library
88558eab78390d1924cd6b255686ceef133f294d5Ken Sumrall * General Public License, version 2.
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