1*6a54128fSAndroid Build Coastguard Worker /*
2*6a54128fSAndroid Build Coastguard Worker * gen_bitmap.c --- Generic (32-bit) bitmap routines
3*6a54128fSAndroid Build Coastguard Worker *
4*6a54128fSAndroid Build Coastguard Worker * Copyright (C) 2001 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
13*6a54128fSAndroid Build Coastguard Worker #include "config.h"
14*6a54128fSAndroid Build Coastguard Worker #include <stdio.h>
15*6a54128fSAndroid Build Coastguard Worker #include <string.h>
16*6a54128fSAndroid Build Coastguard Worker #if HAVE_UNISTD_H
17*6a54128fSAndroid Build Coastguard Worker #include <unistd.h>
18*6a54128fSAndroid Build Coastguard Worker #endif
19*6a54128fSAndroid Build Coastguard Worker #include <fcntl.h>
20*6a54128fSAndroid Build Coastguard Worker #include <time.h>
21*6a54128fSAndroid Build Coastguard Worker #if HAVE_SYS_STAT_H
22*6a54128fSAndroid Build Coastguard Worker #include <sys/stat.h>
23*6a54128fSAndroid Build Coastguard Worker #endif
24*6a54128fSAndroid Build Coastguard Worker #if HAVE_SYS_TYPES_H
25*6a54128fSAndroid Build Coastguard Worker #include <sys/types.h>
26*6a54128fSAndroid Build Coastguard Worker #endif
27*6a54128fSAndroid Build Coastguard Worker
28*6a54128fSAndroid Build Coastguard Worker #include "ext2_fs.h"
29*6a54128fSAndroid Build Coastguard Worker #include "ext2fsP.h"
30*6a54128fSAndroid Build Coastguard Worker
31*6a54128fSAndroid Build Coastguard Worker struct ext2fs_struct_generic_bitmap_32 {
32*6a54128fSAndroid Build Coastguard Worker errcode_t magic;
33*6a54128fSAndroid Build Coastguard Worker ext2_filsys fs;
34*6a54128fSAndroid Build Coastguard Worker __u32 start, end;
35*6a54128fSAndroid Build Coastguard Worker __u32 real_end;
36*6a54128fSAndroid Build Coastguard Worker char * description;
37*6a54128fSAndroid Build Coastguard Worker char * bitmap;
38*6a54128fSAndroid Build Coastguard Worker errcode_t base_error_code;
39*6a54128fSAndroid Build Coastguard Worker __u32 reserved[7];
40*6a54128fSAndroid Build Coastguard Worker };
41*6a54128fSAndroid Build Coastguard Worker
42*6a54128fSAndroid Build Coastguard Worker typedef struct ext2fs_struct_generic_bitmap_32 *ext2fs_generic_bitmap_32;
43*6a54128fSAndroid Build Coastguard Worker
44*6a54128fSAndroid Build Coastguard Worker #define EXT2FS_IS_32_BITMAP(bmap) \
45*6a54128fSAndroid Build Coastguard Worker (((bmap)->magic == EXT2_ET_MAGIC_GENERIC_BITMAP) || \
46*6a54128fSAndroid Build Coastguard Worker ((bmap)->magic == EXT2_ET_MAGIC_BLOCK_BITMAP) || \
47*6a54128fSAndroid Build Coastguard Worker ((bmap)->magic == EXT2_ET_MAGIC_INODE_BITMAP))
48*6a54128fSAndroid Build Coastguard Worker
49*6a54128fSAndroid Build Coastguard Worker #define EXT2FS_IS_64_BITMAP(bmap) \
50*6a54128fSAndroid Build Coastguard Worker (((bmap)->magic == EXT2_ET_MAGIC_GENERIC_BITMAP64) || \
51*6a54128fSAndroid Build Coastguard Worker ((bmap)->magic == EXT2_ET_MAGIC_BLOCK_BITMAP64) || \
52*6a54128fSAndroid Build Coastguard Worker ((bmap)->magic == EXT2_ET_MAGIC_INODE_BITMAP64))
53*6a54128fSAndroid Build Coastguard Worker
54*6a54128fSAndroid Build Coastguard Worker /*
55*6a54128fSAndroid Build Coastguard Worker * Used by previously inlined function, so we have to export this and
56*6a54128fSAndroid Build Coastguard Worker * not change the function signature
57*6a54128fSAndroid Build Coastguard Worker */
ext2fs_warn_bitmap2(ext2fs_generic_bitmap gen_bitmap,int code,unsigned long arg)58*6a54128fSAndroid Build Coastguard Worker void ext2fs_warn_bitmap2(ext2fs_generic_bitmap gen_bitmap,
59*6a54128fSAndroid Build Coastguard Worker int code, unsigned long arg)
60*6a54128fSAndroid Build Coastguard Worker {
61*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap_32 bitmap = (ext2fs_generic_bitmap_32) gen_bitmap;
62*6a54128fSAndroid Build Coastguard Worker
63*6a54128fSAndroid Build Coastguard Worker #ifndef OMIT_COM_ERR
64*6a54128fSAndroid Build Coastguard Worker if (bitmap->description)
65*6a54128fSAndroid Build Coastguard Worker com_err(0, bitmap->base_error_code+code,
66*6a54128fSAndroid Build Coastguard Worker "#%lu for %s", arg, bitmap->description);
67*6a54128fSAndroid Build Coastguard Worker else
68*6a54128fSAndroid Build Coastguard Worker com_err(0, bitmap->base_error_code + code, "#%lu", arg);
69*6a54128fSAndroid Build Coastguard Worker #endif
70*6a54128fSAndroid Build Coastguard Worker }
71*6a54128fSAndroid Build Coastguard Worker
check_magic(ext2fs_generic_bitmap bitmap)72*6a54128fSAndroid Build Coastguard Worker static errcode_t check_magic(ext2fs_generic_bitmap bitmap)
73*6a54128fSAndroid Build Coastguard Worker {
74*6a54128fSAndroid Build Coastguard Worker if (!bitmap || !((bitmap->magic == EXT2_ET_MAGIC_GENERIC_BITMAP) ||
75*6a54128fSAndroid Build Coastguard Worker (bitmap->magic == EXT2_ET_MAGIC_INODE_BITMAP) ||
76*6a54128fSAndroid Build Coastguard Worker (bitmap->magic == EXT2_ET_MAGIC_BLOCK_BITMAP)))
77*6a54128fSAndroid Build Coastguard Worker return EXT2_ET_MAGIC_GENERIC_BITMAP;
78*6a54128fSAndroid Build Coastguard Worker return 0;
79*6a54128fSAndroid Build Coastguard Worker }
80*6a54128fSAndroid Build Coastguard Worker
ext2fs_make_generic_bitmap(errcode_t magic,ext2_filsys fs,__u32 start,__u32 end,__u32 real_end,const char * descr,char * init_map,ext2fs_generic_bitmap * ret)81*6a54128fSAndroid Build Coastguard Worker errcode_t ext2fs_make_generic_bitmap(errcode_t magic, ext2_filsys fs,
82*6a54128fSAndroid Build Coastguard Worker __u32 start, __u32 end, __u32 real_end,
83*6a54128fSAndroid Build Coastguard Worker const char *descr, char *init_map,
84*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap *ret)
85*6a54128fSAndroid Build Coastguard Worker {
86*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap_32 bitmap;
87*6a54128fSAndroid Build Coastguard Worker errcode_t retval;
88*6a54128fSAndroid Build Coastguard Worker size_t size;
89*6a54128fSAndroid Build Coastguard Worker
90*6a54128fSAndroid Build Coastguard Worker retval = ext2fs_get_mem(sizeof(struct ext2fs_struct_generic_bitmap_32),
91*6a54128fSAndroid Build Coastguard Worker &bitmap);
92*6a54128fSAndroid Build Coastguard Worker if (retval)
93*6a54128fSAndroid Build Coastguard Worker return retval;
94*6a54128fSAndroid Build Coastguard Worker
95*6a54128fSAndroid Build Coastguard Worker bitmap->magic = magic;
96*6a54128fSAndroid Build Coastguard Worker bitmap->fs = fs;
97*6a54128fSAndroid Build Coastguard Worker bitmap->start = start;
98*6a54128fSAndroid Build Coastguard Worker bitmap->end = end;
99*6a54128fSAndroid Build Coastguard Worker bitmap->real_end = real_end;
100*6a54128fSAndroid Build Coastguard Worker switch (magic) {
101*6a54128fSAndroid Build Coastguard Worker case EXT2_ET_MAGIC_INODE_BITMAP:
102*6a54128fSAndroid Build Coastguard Worker bitmap->base_error_code = EXT2_ET_BAD_INODE_MARK;
103*6a54128fSAndroid Build Coastguard Worker break;
104*6a54128fSAndroid Build Coastguard Worker case EXT2_ET_MAGIC_BLOCK_BITMAP:
105*6a54128fSAndroid Build Coastguard Worker bitmap->base_error_code = EXT2_ET_BAD_BLOCK_MARK;
106*6a54128fSAndroid Build Coastguard Worker break;
107*6a54128fSAndroid Build Coastguard Worker default:
108*6a54128fSAndroid Build Coastguard Worker bitmap->base_error_code = EXT2_ET_BAD_GENERIC_MARK;
109*6a54128fSAndroid Build Coastguard Worker }
110*6a54128fSAndroid Build Coastguard Worker if (descr) {
111*6a54128fSAndroid Build Coastguard Worker retval = ext2fs_get_mem(strlen(descr)+1, &bitmap->description);
112*6a54128fSAndroid Build Coastguard Worker if (retval) {
113*6a54128fSAndroid Build Coastguard Worker ext2fs_free_mem(&bitmap);
114*6a54128fSAndroid Build Coastguard Worker return retval;
115*6a54128fSAndroid Build Coastguard Worker }
116*6a54128fSAndroid Build Coastguard Worker strcpy(bitmap->description, descr);
117*6a54128fSAndroid Build Coastguard Worker } else
118*6a54128fSAndroid Build Coastguard Worker bitmap->description = 0;
119*6a54128fSAndroid Build Coastguard Worker
120*6a54128fSAndroid Build Coastguard Worker size = (size_t) (((bitmap->real_end - bitmap->start) / 8) + 1);
121*6a54128fSAndroid Build Coastguard Worker /* Round up to allow for the BT x86 instruction */
122*6a54128fSAndroid Build Coastguard Worker size = (size + 7) & ~3;
123*6a54128fSAndroid Build Coastguard Worker retval = ext2fs_get_mem(size, &bitmap->bitmap);
124*6a54128fSAndroid Build Coastguard Worker if (retval) {
125*6a54128fSAndroid Build Coastguard Worker ext2fs_free_mem(&bitmap->description);
126*6a54128fSAndroid Build Coastguard Worker ext2fs_free_mem(&bitmap);
127*6a54128fSAndroid Build Coastguard Worker return retval;
128*6a54128fSAndroid Build Coastguard Worker }
129*6a54128fSAndroid Build Coastguard Worker
130*6a54128fSAndroid Build Coastguard Worker if (init_map)
131*6a54128fSAndroid Build Coastguard Worker memcpy(bitmap->bitmap, init_map, size);
132*6a54128fSAndroid Build Coastguard Worker else
133*6a54128fSAndroid Build Coastguard Worker memset(bitmap->bitmap, 0, size);
134*6a54128fSAndroid Build Coastguard Worker *ret = (ext2fs_generic_bitmap) bitmap;
135*6a54128fSAndroid Build Coastguard Worker return 0;
136*6a54128fSAndroid Build Coastguard Worker }
137*6a54128fSAndroid Build Coastguard Worker
ext2fs_allocate_generic_bitmap(__u32 start,__u32 end,__u32 real_end,const char * descr,ext2fs_generic_bitmap * ret)138*6a54128fSAndroid Build Coastguard Worker errcode_t ext2fs_allocate_generic_bitmap(__u32 start,
139*6a54128fSAndroid Build Coastguard Worker __u32 end,
140*6a54128fSAndroid Build Coastguard Worker __u32 real_end,
141*6a54128fSAndroid Build Coastguard Worker const char *descr,
142*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap *ret)
143*6a54128fSAndroid Build Coastguard Worker {
144*6a54128fSAndroid Build Coastguard Worker return ext2fs_make_generic_bitmap(EXT2_ET_MAGIC_GENERIC_BITMAP, 0,
145*6a54128fSAndroid Build Coastguard Worker start, end, real_end, descr, 0, ret);
146*6a54128fSAndroid Build Coastguard Worker }
147*6a54128fSAndroid Build Coastguard Worker
ext2fs_copy_generic_bitmap(ext2fs_generic_bitmap gen_src,ext2fs_generic_bitmap * dest)148*6a54128fSAndroid Build Coastguard Worker errcode_t ext2fs_copy_generic_bitmap(ext2fs_generic_bitmap gen_src,
149*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap *dest)
150*6a54128fSAndroid Build Coastguard Worker {
151*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap_32 src = (ext2fs_generic_bitmap_32) gen_src;
152*6a54128fSAndroid Build Coastguard Worker
153*6a54128fSAndroid Build Coastguard Worker return (ext2fs_make_generic_bitmap(src->magic, src->fs,
154*6a54128fSAndroid Build Coastguard Worker src->start, src->end,
155*6a54128fSAndroid Build Coastguard Worker src->real_end,
156*6a54128fSAndroid Build Coastguard Worker src->description, src->bitmap,
157*6a54128fSAndroid Build Coastguard Worker dest));
158*6a54128fSAndroid Build Coastguard Worker }
159*6a54128fSAndroid Build Coastguard Worker
ext2fs_free_generic_bitmap(ext2fs_inode_bitmap gen_bitmap)160*6a54128fSAndroid Build Coastguard Worker void ext2fs_free_generic_bitmap(ext2fs_inode_bitmap gen_bitmap)
161*6a54128fSAndroid Build Coastguard Worker {
162*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap_32 bitmap = (ext2fs_generic_bitmap_32) gen_bitmap;
163*6a54128fSAndroid Build Coastguard Worker
164*6a54128fSAndroid Build Coastguard Worker if (check_magic(gen_bitmap))
165*6a54128fSAndroid Build Coastguard Worker return;
166*6a54128fSAndroid Build Coastguard Worker
167*6a54128fSAndroid Build Coastguard Worker bitmap->magic = 0;
168*6a54128fSAndroid Build Coastguard Worker if (bitmap->description) {
169*6a54128fSAndroid Build Coastguard Worker ext2fs_free_mem(&bitmap->description);
170*6a54128fSAndroid Build Coastguard Worker bitmap->description = 0;
171*6a54128fSAndroid Build Coastguard Worker }
172*6a54128fSAndroid Build Coastguard Worker if (bitmap->bitmap) {
173*6a54128fSAndroid Build Coastguard Worker ext2fs_free_mem(&bitmap->bitmap);
174*6a54128fSAndroid Build Coastguard Worker bitmap->bitmap = 0;
175*6a54128fSAndroid Build Coastguard Worker }
176*6a54128fSAndroid Build Coastguard Worker ext2fs_free_mem(&bitmap);
177*6a54128fSAndroid Build Coastguard Worker }
178*6a54128fSAndroid Build Coastguard Worker
ext2fs_test_generic_bitmap(ext2fs_generic_bitmap bitmap,blk_t bitno)179*6a54128fSAndroid Build Coastguard Worker int ext2fs_test_generic_bitmap(ext2fs_generic_bitmap bitmap,
180*6a54128fSAndroid Build Coastguard Worker blk_t bitno)
181*6a54128fSAndroid Build Coastguard Worker {
182*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap_32 bitmap32 = (ext2fs_generic_bitmap_32) bitmap;
183*6a54128fSAndroid Build Coastguard Worker
184*6a54128fSAndroid Build Coastguard Worker if (!EXT2FS_IS_32_BITMAP(bitmap)) {
185*6a54128fSAndroid Build Coastguard Worker if (EXT2FS_IS_64_BITMAP(bitmap)) {
186*6a54128fSAndroid Build Coastguard Worker ext2fs_warn_bitmap32(bitmap, __func__);
187*6a54128fSAndroid Build Coastguard Worker return ext2fs_test_generic_bmap(bitmap, bitno);
188*6a54128fSAndroid Build Coastguard Worker }
189*6a54128fSAndroid Build Coastguard Worker #ifndef OMIT_COM_ERR
190*6a54128fSAndroid Build Coastguard Worker com_err(0, EXT2_ET_MAGIC_GENERIC_BITMAP,
191*6a54128fSAndroid Build Coastguard Worker "test_bitmap(%lu)", (unsigned long) bitno);
192*6a54128fSAndroid Build Coastguard Worker #endif
193*6a54128fSAndroid Build Coastguard Worker return 0;
194*6a54128fSAndroid Build Coastguard Worker }
195*6a54128fSAndroid Build Coastguard Worker
196*6a54128fSAndroid Build Coastguard Worker if ((bitno < bitmap32->start) || (bitno > bitmap32->end)) {
197*6a54128fSAndroid Build Coastguard Worker ext2fs_warn_bitmap2(bitmap, EXT2FS_TEST_ERROR, bitno);
198*6a54128fSAndroid Build Coastguard Worker return 0;
199*6a54128fSAndroid Build Coastguard Worker }
200*6a54128fSAndroid Build Coastguard Worker return ext2fs_test_bit(bitno - bitmap32->start, bitmap32->bitmap);
201*6a54128fSAndroid Build Coastguard Worker }
202*6a54128fSAndroid Build Coastguard Worker
ext2fs_mark_generic_bitmap(ext2fs_generic_bitmap bitmap,__u32 bitno)203*6a54128fSAndroid Build Coastguard Worker int ext2fs_mark_generic_bitmap(ext2fs_generic_bitmap bitmap,
204*6a54128fSAndroid Build Coastguard Worker __u32 bitno)
205*6a54128fSAndroid Build Coastguard Worker {
206*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap_32 bitmap32 = (ext2fs_generic_bitmap_32) bitmap;
207*6a54128fSAndroid Build Coastguard Worker
208*6a54128fSAndroid Build Coastguard Worker if (!EXT2FS_IS_32_BITMAP(bitmap)) {
209*6a54128fSAndroid Build Coastguard Worker if (EXT2FS_IS_64_BITMAP(bitmap)) {
210*6a54128fSAndroid Build Coastguard Worker ext2fs_warn_bitmap32(bitmap, __func__);
211*6a54128fSAndroid Build Coastguard Worker return ext2fs_mark_generic_bmap(bitmap, bitno);
212*6a54128fSAndroid Build Coastguard Worker }
213*6a54128fSAndroid Build Coastguard Worker #ifndef OMIT_COM_ERR
214*6a54128fSAndroid Build Coastguard Worker com_err(0, EXT2_ET_MAGIC_GENERIC_BITMAP,
215*6a54128fSAndroid Build Coastguard Worker "mark_bitmap(%lu)", (unsigned long) bitno);
216*6a54128fSAndroid Build Coastguard Worker #endif
217*6a54128fSAndroid Build Coastguard Worker return 0;
218*6a54128fSAndroid Build Coastguard Worker }
219*6a54128fSAndroid Build Coastguard Worker
220*6a54128fSAndroid Build Coastguard Worker if ((bitno < bitmap32->start) || (bitno > bitmap32->end)) {
221*6a54128fSAndroid Build Coastguard Worker ext2fs_warn_bitmap2(bitmap, EXT2FS_MARK_ERROR, bitno);
222*6a54128fSAndroid Build Coastguard Worker return 0;
223*6a54128fSAndroid Build Coastguard Worker }
224*6a54128fSAndroid Build Coastguard Worker return ext2fs_set_bit(bitno - bitmap32->start, bitmap32->bitmap);
225*6a54128fSAndroid Build Coastguard Worker }
226*6a54128fSAndroid Build Coastguard Worker
ext2fs_unmark_generic_bitmap(ext2fs_generic_bitmap bitmap,blk_t bitno)227*6a54128fSAndroid Build Coastguard Worker int ext2fs_unmark_generic_bitmap(ext2fs_generic_bitmap bitmap,
228*6a54128fSAndroid Build Coastguard Worker blk_t bitno)
229*6a54128fSAndroid Build Coastguard Worker {
230*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap_32 bitmap32 = (ext2fs_generic_bitmap_32) bitmap;
231*6a54128fSAndroid Build Coastguard Worker
232*6a54128fSAndroid Build Coastguard Worker if (!EXT2FS_IS_32_BITMAP(bitmap)) {
233*6a54128fSAndroid Build Coastguard Worker if (EXT2FS_IS_64_BITMAP(bitmap)) {
234*6a54128fSAndroid Build Coastguard Worker ext2fs_warn_bitmap32(bitmap, __func__);
235*6a54128fSAndroid Build Coastguard Worker return ext2fs_unmark_generic_bmap(bitmap, bitno);
236*6a54128fSAndroid Build Coastguard Worker }
237*6a54128fSAndroid Build Coastguard Worker #ifndef OMIT_COM_ERR
238*6a54128fSAndroid Build Coastguard Worker com_err(0, EXT2_ET_MAGIC_GENERIC_BITMAP,
239*6a54128fSAndroid Build Coastguard Worker "mark_bitmap(%lu)", (unsigned long) bitno);
240*6a54128fSAndroid Build Coastguard Worker #endif
241*6a54128fSAndroid Build Coastguard Worker return 0;
242*6a54128fSAndroid Build Coastguard Worker }
243*6a54128fSAndroid Build Coastguard Worker
244*6a54128fSAndroid Build Coastguard Worker if ((bitno < bitmap32->start) || (bitno > bitmap32->end)) {
245*6a54128fSAndroid Build Coastguard Worker ext2fs_warn_bitmap2(bitmap, EXT2FS_UNMARK_ERROR, bitno);
246*6a54128fSAndroid Build Coastguard Worker return 0;
247*6a54128fSAndroid Build Coastguard Worker }
248*6a54128fSAndroid Build Coastguard Worker return ext2fs_clear_bit(bitno - bitmap32->start, bitmap32->bitmap);
249*6a54128fSAndroid Build Coastguard Worker }
250*6a54128fSAndroid Build Coastguard Worker
ext2fs_get_generic_bitmap_start(ext2fs_generic_bitmap bitmap)251*6a54128fSAndroid Build Coastguard Worker __u32 ext2fs_get_generic_bitmap_start(ext2fs_generic_bitmap bitmap)
252*6a54128fSAndroid Build Coastguard Worker {
253*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap_32 bitmap32 = (ext2fs_generic_bitmap_32) bitmap;
254*6a54128fSAndroid Build Coastguard Worker
255*6a54128fSAndroid Build Coastguard Worker if (!EXT2FS_IS_32_BITMAP(bitmap)) {
256*6a54128fSAndroid Build Coastguard Worker if (EXT2FS_IS_64_BITMAP(bitmap)) {
257*6a54128fSAndroid Build Coastguard Worker ext2fs_warn_bitmap32(bitmap, __func__);
258*6a54128fSAndroid Build Coastguard Worker return ext2fs_get_generic_bmap_start(bitmap);
259*6a54128fSAndroid Build Coastguard Worker }
260*6a54128fSAndroid Build Coastguard Worker #ifndef OMIT_COM_ERR
261*6a54128fSAndroid Build Coastguard Worker com_err(0, EXT2_ET_MAGIC_GENERIC_BITMAP,
262*6a54128fSAndroid Build Coastguard Worker "get_bitmap_start");
263*6a54128fSAndroid Build Coastguard Worker #endif
264*6a54128fSAndroid Build Coastguard Worker return 0;
265*6a54128fSAndroid Build Coastguard Worker }
266*6a54128fSAndroid Build Coastguard Worker
267*6a54128fSAndroid Build Coastguard Worker return bitmap32->start;
268*6a54128fSAndroid Build Coastguard Worker }
269*6a54128fSAndroid Build Coastguard Worker
ext2fs_get_generic_bitmap_end(ext2fs_generic_bitmap bitmap)270*6a54128fSAndroid Build Coastguard Worker __u32 ext2fs_get_generic_bitmap_end(ext2fs_generic_bitmap bitmap)
271*6a54128fSAndroid Build Coastguard Worker {
272*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap_32 bitmap32 = (ext2fs_generic_bitmap_32) bitmap;
273*6a54128fSAndroid Build Coastguard Worker
274*6a54128fSAndroid Build Coastguard Worker if (!EXT2FS_IS_32_BITMAP(bitmap)) {
275*6a54128fSAndroid Build Coastguard Worker if (EXT2FS_IS_64_BITMAP(bitmap)) {
276*6a54128fSAndroid Build Coastguard Worker ext2fs_warn_bitmap32(bitmap, __func__);
277*6a54128fSAndroid Build Coastguard Worker return ext2fs_get_generic_bmap_end(bitmap);
278*6a54128fSAndroid Build Coastguard Worker }
279*6a54128fSAndroid Build Coastguard Worker #ifndef OMIT_COM_ERR
280*6a54128fSAndroid Build Coastguard Worker com_err(0, EXT2_ET_MAGIC_GENERIC_BITMAP,
281*6a54128fSAndroid Build Coastguard Worker "get_bitmap_end");
282*6a54128fSAndroid Build Coastguard Worker #endif
283*6a54128fSAndroid Build Coastguard Worker return 0;
284*6a54128fSAndroid Build Coastguard Worker }
285*6a54128fSAndroid Build Coastguard Worker return bitmap32->end;
286*6a54128fSAndroid Build Coastguard Worker }
287*6a54128fSAndroid Build Coastguard Worker
ext2fs_clear_generic_bitmap(ext2fs_generic_bitmap bitmap)288*6a54128fSAndroid Build Coastguard Worker void ext2fs_clear_generic_bitmap(ext2fs_generic_bitmap bitmap)
289*6a54128fSAndroid Build Coastguard Worker {
290*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap_32 bitmap32 = (ext2fs_generic_bitmap_32) bitmap;
291*6a54128fSAndroid Build Coastguard Worker
292*6a54128fSAndroid Build Coastguard Worker if (!EXT2FS_IS_32_BITMAP(bitmap)) {
293*6a54128fSAndroid Build Coastguard Worker if (EXT2FS_IS_64_BITMAP(bitmap)) {
294*6a54128fSAndroid Build Coastguard Worker ext2fs_warn_bitmap32(bitmap, __func__);
295*6a54128fSAndroid Build Coastguard Worker ext2fs_clear_generic_bmap(bitmap);
296*6a54128fSAndroid Build Coastguard Worker return;
297*6a54128fSAndroid Build Coastguard Worker }
298*6a54128fSAndroid Build Coastguard Worker #ifndef OMIT_COM_ERR
299*6a54128fSAndroid Build Coastguard Worker com_err(0, EXT2_ET_MAGIC_GENERIC_BITMAP,
300*6a54128fSAndroid Build Coastguard Worker "clear_generic_bitmap");
301*6a54128fSAndroid Build Coastguard Worker #endif
302*6a54128fSAndroid Build Coastguard Worker return;
303*6a54128fSAndroid Build Coastguard Worker }
304*6a54128fSAndroid Build Coastguard Worker
305*6a54128fSAndroid Build Coastguard Worker memset(bitmap32->bitmap, 0,
306*6a54128fSAndroid Build Coastguard Worker (size_t) (((bitmap32->real_end - bitmap32->start) / 8) + 1));
307*6a54128fSAndroid Build Coastguard Worker }
308*6a54128fSAndroid Build Coastguard Worker
ext2fs_fudge_generic_bitmap_end(ext2fs_inode_bitmap gen_bitmap,errcode_t magic,errcode_t neq,ext2_ino_t end,ext2_ino_t * oend)309*6a54128fSAndroid Build Coastguard Worker errcode_t ext2fs_fudge_generic_bitmap_end(ext2fs_inode_bitmap gen_bitmap,
310*6a54128fSAndroid Build Coastguard Worker errcode_t magic, errcode_t neq,
311*6a54128fSAndroid Build Coastguard Worker ext2_ino_t end, ext2_ino_t *oend)
312*6a54128fSAndroid Build Coastguard Worker {
313*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap_32 bitmap = (ext2fs_generic_bitmap_32) gen_bitmap;
314*6a54128fSAndroid Build Coastguard Worker
315*6a54128fSAndroid Build Coastguard Worker EXT2_CHECK_MAGIC(bitmap, magic);
316*6a54128fSAndroid Build Coastguard Worker
317*6a54128fSAndroid Build Coastguard Worker if (end > bitmap->real_end)
318*6a54128fSAndroid Build Coastguard Worker return neq;
319*6a54128fSAndroid Build Coastguard Worker if (oend)
320*6a54128fSAndroid Build Coastguard Worker *oend = bitmap->end;
321*6a54128fSAndroid Build Coastguard Worker bitmap->end = end;
322*6a54128fSAndroid Build Coastguard Worker return 0;
323*6a54128fSAndroid Build Coastguard Worker }
324*6a54128fSAndroid Build Coastguard Worker
ext2fs_resize_generic_bitmap(errcode_t magic,__u32 new_end,__u32 new_real_end,ext2fs_generic_bitmap gen_bmap)325*6a54128fSAndroid Build Coastguard Worker errcode_t ext2fs_resize_generic_bitmap(errcode_t magic,
326*6a54128fSAndroid Build Coastguard Worker __u32 new_end, __u32 new_real_end,
327*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap gen_bmap)
328*6a54128fSAndroid Build Coastguard Worker {
329*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap_32 bmap = (ext2fs_generic_bitmap_32) gen_bmap;
330*6a54128fSAndroid Build Coastguard Worker errcode_t retval;
331*6a54128fSAndroid Build Coastguard Worker size_t size, new_size;
332*6a54128fSAndroid Build Coastguard Worker __u32 bitno;
333*6a54128fSAndroid Build Coastguard Worker
334*6a54128fSAndroid Build Coastguard Worker if (!bmap || (bmap->magic != magic))
335*6a54128fSAndroid Build Coastguard Worker return magic;
336*6a54128fSAndroid Build Coastguard Worker
337*6a54128fSAndroid Build Coastguard Worker /*
338*6a54128fSAndroid Build Coastguard Worker * If we're expanding the bitmap, make sure all of the new
339*6a54128fSAndroid Build Coastguard Worker * parts of the bitmap are zero.
340*6a54128fSAndroid Build Coastguard Worker */
341*6a54128fSAndroid Build Coastguard Worker if (new_end > bmap->end) {
342*6a54128fSAndroid Build Coastguard Worker bitno = bmap->real_end;
343*6a54128fSAndroid Build Coastguard Worker if (bitno > new_end)
344*6a54128fSAndroid Build Coastguard Worker bitno = new_end;
345*6a54128fSAndroid Build Coastguard Worker for (; bitno > bmap->end; bitno--)
346*6a54128fSAndroid Build Coastguard Worker ext2fs_clear_bit(bitno - bmap->start, bmap->bitmap);
347*6a54128fSAndroid Build Coastguard Worker }
348*6a54128fSAndroid Build Coastguard Worker if (new_real_end == bmap->real_end) {
349*6a54128fSAndroid Build Coastguard Worker bmap->end = new_end;
350*6a54128fSAndroid Build Coastguard Worker return 0;
351*6a54128fSAndroid Build Coastguard Worker }
352*6a54128fSAndroid Build Coastguard Worker
353*6a54128fSAndroid Build Coastguard Worker size = ((bmap->real_end - bmap->start) / 8) + 1;
354*6a54128fSAndroid Build Coastguard Worker new_size = ((new_real_end - bmap->start) / 8) + 1;
355*6a54128fSAndroid Build Coastguard Worker
356*6a54128fSAndroid Build Coastguard Worker if (size != new_size) {
357*6a54128fSAndroid Build Coastguard Worker retval = ext2fs_resize_mem(size, new_size, &bmap->bitmap);
358*6a54128fSAndroid Build Coastguard Worker if (retval)
359*6a54128fSAndroid Build Coastguard Worker return retval;
360*6a54128fSAndroid Build Coastguard Worker }
361*6a54128fSAndroid Build Coastguard Worker if (new_size > size)
362*6a54128fSAndroid Build Coastguard Worker memset(bmap->bitmap + size, 0, new_size - size);
363*6a54128fSAndroid Build Coastguard Worker
364*6a54128fSAndroid Build Coastguard Worker bmap->end = new_end;
365*6a54128fSAndroid Build Coastguard Worker bmap->real_end = new_real_end;
366*6a54128fSAndroid Build Coastguard Worker return 0;
367*6a54128fSAndroid Build Coastguard Worker }
368*6a54128fSAndroid Build Coastguard Worker
ext2fs_compare_generic_bitmap(errcode_t magic,errcode_t neq,ext2fs_generic_bitmap gen_bm1,ext2fs_generic_bitmap gen_bm2)369*6a54128fSAndroid Build Coastguard Worker errcode_t ext2fs_compare_generic_bitmap(errcode_t magic, errcode_t neq,
370*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap gen_bm1,
371*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap gen_bm2)
372*6a54128fSAndroid Build Coastguard Worker {
373*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap_32 bm1 = (ext2fs_generic_bitmap_32) gen_bm1;
374*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap_32 bm2 = (ext2fs_generic_bitmap_32) gen_bm2;
375*6a54128fSAndroid Build Coastguard Worker blk_t i;
376*6a54128fSAndroid Build Coastguard Worker
377*6a54128fSAndroid Build Coastguard Worker if (!bm1 || bm1->magic != magic)
378*6a54128fSAndroid Build Coastguard Worker return magic;
379*6a54128fSAndroid Build Coastguard Worker if (!bm2 || bm2->magic != magic)
380*6a54128fSAndroid Build Coastguard Worker return magic;
381*6a54128fSAndroid Build Coastguard Worker
382*6a54128fSAndroid Build Coastguard Worker if ((bm1->start != bm2->start) ||
383*6a54128fSAndroid Build Coastguard Worker (bm1->end != bm2->end) ||
384*6a54128fSAndroid Build Coastguard Worker (memcmp(bm1->bitmap, bm2->bitmap,
385*6a54128fSAndroid Build Coastguard Worker (size_t) (bm1->end - bm1->start)/8)))
386*6a54128fSAndroid Build Coastguard Worker return neq;
387*6a54128fSAndroid Build Coastguard Worker
388*6a54128fSAndroid Build Coastguard Worker for (i = bm1->end - ((bm1->end - bm1->start) % 8); i <= bm1->end; i++)
389*6a54128fSAndroid Build Coastguard Worker if (ext2fs_fast_test_block_bitmap(gen_bm1, i) !=
390*6a54128fSAndroid Build Coastguard Worker ext2fs_fast_test_block_bitmap(gen_bm2, i))
391*6a54128fSAndroid Build Coastguard Worker return neq;
392*6a54128fSAndroid Build Coastguard Worker
393*6a54128fSAndroid Build Coastguard Worker return 0;
394*6a54128fSAndroid Build Coastguard Worker }
395*6a54128fSAndroid Build Coastguard Worker
ext2fs_set_generic_bitmap_padding(ext2fs_generic_bitmap gen_map)396*6a54128fSAndroid Build Coastguard Worker void ext2fs_set_generic_bitmap_padding(ext2fs_generic_bitmap gen_map)
397*6a54128fSAndroid Build Coastguard Worker {
398*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap_32 map = (ext2fs_generic_bitmap_32) gen_map;
399*6a54128fSAndroid Build Coastguard Worker __u32 i, j;
400*6a54128fSAndroid Build Coastguard Worker
401*6a54128fSAndroid Build Coastguard Worker /* Protect loop from wrap-around if map->real_end is maxed */
402*6a54128fSAndroid Build Coastguard Worker for (i=map->end+1, j = i - map->start;
403*6a54128fSAndroid Build Coastguard Worker i <= map->real_end && i > map->end;
404*6a54128fSAndroid Build Coastguard Worker i++, j++)
405*6a54128fSAndroid Build Coastguard Worker ext2fs_set_bit(j, map->bitmap);
406*6a54128fSAndroid Build Coastguard Worker }
407*6a54128fSAndroid Build Coastguard Worker
ext2fs_get_generic_bitmap_range(ext2fs_generic_bitmap gen_bmap,errcode_t magic,__u32 start,__u32 num,void * out)408*6a54128fSAndroid Build Coastguard Worker errcode_t ext2fs_get_generic_bitmap_range(ext2fs_generic_bitmap gen_bmap,
409*6a54128fSAndroid Build Coastguard Worker errcode_t magic,
410*6a54128fSAndroid Build Coastguard Worker __u32 start, __u32 num,
411*6a54128fSAndroid Build Coastguard Worker void *out)
412*6a54128fSAndroid Build Coastguard Worker {
413*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap_32 bmap = (ext2fs_generic_bitmap_32) gen_bmap;
414*6a54128fSAndroid Build Coastguard Worker
415*6a54128fSAndroid Build Coastguard Worker if (!bmap || (bmap->magic != magic))
416*6a54128fSAndroid Build Coastguard Worker return magic;
417*6a54128fSAndroid Build Coastguard Worker
418*6a54128fSAndroid Build Coastguard Worker if ((start < bmap->start) || (start+num-1 > bmap->real_end))
419*6a54128fSAndroid Build Coastguard Worker return EXT2_ET_INVALID_ARGUMENT;
420*6a54128fSAndroid Build Coastguard Worker
421*6a54128fSAndroid Build Coastguard Worker memcpy(out, bmap->bitmap + ((start - bmap->start) >> 3), (num+7) >> 3);
422*6a54128fSAndroid Build Coastguard Worker return 0;
423*6a54128fSAndroid Build Coastguard Worker }
424*6a54128fSAndroid Build Coastguard Worker
ext2fs_set_generic_bitmap_range(ext2fs_generic_bitmap gen_bmap,errcode_t magic,__u32 start,__u32 num,void * in)425*6a54128fSAndroid Build Coastguard Worker errcode_t ext2fs_set_generic_bitmap_range(ext2fs_generic_bitmap gen_bmap,
426*6a54128fSAndroid Build Coastguard Worker errcode_t magic,
427*6a54128fSAndroid Build Coastguard Worker __u32 start, __u32 num,
428*6a54128fSAndroid Build Coastguard Worker void *in)
429*6a54128fSAndroid Build Coastguard Worker {
430*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap_32 bmap = (ext2fs_generic_bitmap_32) gen_bmap;
431*6a54128fSAndroid Build Coastguard Worker
432*6a54128fSAndroid Build Coastguard Worker if (!bmap || (bmap->magic != magic))
433*6a54128fSAndroid Build Coastguard Worker return magic;
434*6a54128fSAndroid Build Coastguard Worker
435*6a54128fSAndroid Build Coastguard Worker if ((start < bmap->start) || (start+num-1 > bmap->real_end))
436*6a54128fSAndroid Build Coastguard Worker return EXT2_ET_INVALID_ARGUMENT;
437*6a54128fSAndroid Build Coastguard Worker
438*6a54128fSAndroid Build Coastguard Worker memcpy(bmap->bitmap + ((start - bmap->start) >> 3), in, (num+7) >> 3);
439*6a54128fSAndroid Build Coastguard Worker return 0;
440*6a54128fSAndroid Build Coastguard Worker }
441*6a54128fSAndroid Build Coastguard Worker
442*6a54128fSAndroid Build Coastguard Worker /*
443*6a54128fSAndroid Build Coastguard Worker * Compare @mem to zero buffer by 256 bytes.
444*6a54128fSAndroid Build Coastguard Worker * Return 1 if @mem is zeroed memory, otherwise return 0.
445*6a54128fSAndroid Build Coastguard Worker */
ext2fs_mem_is_zero(const char * mem,size_t len)446*6a54128fSAndroid Build Coastguard Worker int ext2fs_mem_is_zero(const char *mem, size_t len)
447*6a54128fSAndroid Build Coastguard Worker {
448*6a54128fSAndroid Build Coastguard Worker static const char zero_buf[256];
449*6a54128fSAndroid Build Coastguard Worker
450*6a54128fSAndroid Build Coastguard Worker while (len >= sizeof(zero_buf)) {
451*6a54128fSAndroid Build Coastguard Worker if (memcmp(mem, zero_buf, sizeof(zero_buf)))
452*6a54128fSAndroid Build Coastguard Worker return 0;
453*6a54128fSAndroid Build Coastguard Worker len -= sizeof(zero_buf);
454*6a54128fSAndroid Build Coastguard Worker mem += sizeof(zero_buf);
455*6a54128fSAndroid Build Coastguard Worker }
456*6a54128fSAndroid Build Coastguard Worker /* Deal with leftover bytes. */
457*6a54128fSAndroid Build Coastguard Worker if (len)
458*6a54128fSAndroid Build Coastguard Worker return !memcmp(mem, zero_buf, len);
459*6a54128fSAndroid Build Coastguard Worker return 1;
460*6a54128fSAndroid Build Coastguard Worker }
461*6a54128fSAndroid Build Coastguard Worker
462*6a54128fSAndroid Build Coastguard Worker /*
463*6a54128fSAndroid Build Coastguard Worker * Return true if all of the bits in a specified range are clear
464*6a54128fSAndroid Build Coastguard Worker */
ext2fs_test_clear_generic_bitmap_range(ext2fs_generic_bitmap gen_bitmap,unsigned int start,unsigned int len)465*6a54128fSAndroid Build Coastguard Worker static int ext2fs_test_clear_generic_bitmap_range(ext2fs_generic_bitmap gen_bitmap,
466*6a54128fSAndroid Build Coastguard Worker unsigned int start,
467*6a54128fSAndroid Build Coastguard Worker unsigned int len)
468*6a54128fSAndroid Build Coastguard Worker {
469*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap_32 bitmap = (ext2fs_generic_bitmap_32) gen_bitmap;
470*6a54128fSAndroid Build Coastguard Worker size_t start_byte, len_byte = len >> 3;
471*6a54128fSAndroid Build Coastguard Worker unsigned int start_bit, len_bit = len % 8;
472*6a54128fSAndroid Build Coastguard Worker int first_bit = 0;
473*6a54128fSAndroid Build Coastguard Worker int last_bit = 0;
474*6a54128fSAndroid Build Coastguard Worker int mark_count = 0;
475*6a54128fSAndroid Build Coastguard Worker int mark_bit = 0;
476*6a54128fSAndroid Build Coastguard Worker int i;
477*6a54128fSAndroid Build Coastguard Worker const char *ADDR = bitmap->bitmap;
478*6a54128fSAndroid Build Coastguard Worker
479*6a54128fSAndroid Build Coastguard Worker start -= bitmap->start;
480*6a54128fSAndroid Build Coastguard Worker start_byte = start >> 3;
481*6a54128fSAndroid Build Coastguard Worker start_bit = start % 8;
482*6a54128fSAndroid Build Coastguard Worker
483*6a54128fSAndroid Build Coastguard Worker if (start_bit != 0) {
484*6a54128fSAndroid Build Coastguard Worker /*
485*6a54128fSAndroid Build Coastguard Worker * The compared start block number or start inode number
486*6a54128fSAndroid Build Coastguard Worker * is not the first bit in a byte.
487*6a54128fSAndroid Build Coastguard Worker */
488*6a54128fSAndroid Build Coastguard Worker mark_count = 8 - start_bit;
489*6a54128fSAndroid Build Coastguard Worker if (len < 8 - start_bit) {
490*6a54128fSAndroid Build Coastguard Worker mark_count = (int)len;
491*6a54128fSAndroid Build Coastguard Worker mark_bit = len + start_bit - 1;
492*6a54128fSAndroid Build Coastguard Worker } else
493*6a54128fSAndroid Build Coastguard Worker mark_bit = 7;
494*6a54128fSAndroid Build Coastguard Worker
495*6a54128fSAndroid Build Coastguard Worker for (i = mark_count; i > 0; i--, mark_bit--)
496*6a54128fSAndroid Build Coastguard Worker first_bit |= 1 << mark_bit;
497*6a54128fSAndroid Build Coastguard Worker
498*6a54128fSAndroid Build Coastguard Worker /*
499*6a54128fSAndroid Build Coastguard Worker * Compare blocks or inodes in the first byte.
500*6a54128fSAndroid Build Coastguard Worker * If there is any marked bit, this function returns 0.
501*6a54128fSAndroid Build Coastguard Worker */
502*6a54128fSAndroid Build Coastguard Worker if (first_bit & ADDR[start_byte])
503*6a54128fSAndroid Build Coastguard Worker return 0;
504*6a54128fSAndroid Build Coastguard Worker else if (len <= 8 - start_bit)
505*6a54128fSAndroid Build Coastguard Worker return 1;
506*6a54128fSAndroid Build Coastguard Worker
507*6a54128fSAndroid Build Coastguard Worker start_byte++;
508*6a54128fSAndroid Build Coastguard Worker len_bit = (len - mark_count) % 8;
509*6a54128fSAndroid Build Coastguard Worker len_byte = (len - mark_count) >> 3;
510*6a54128fSAndroid Build Coastguard Worker }
511*6a54128fSAndroid Build Coastguard Worker
512*6a54128fSAndroid Build Coastguard Worker /*
513*6a54128fSAndroid Build Coastguard Worker * The compared start block number or start inode number is
514*6a54128fSAndroid Build Coastguard Worker * the first bit in a byte.
515*6a54128fSAndroid Build Coastguard Worker */
516*6a54128fSAndroid Build Coastguard Worker if (len_bit != 0) {
517*6a54128fSAndroid Build Coastguard Worker /*
518*6a54128fSAndroid Build Coastguard Worker * The compared end block number or end inode number is
519*6a54128fSAndroid Build Coastguard Worker * not the last bit in a byte.
520*6a54128fSAndroid Build Coastguard Worker */
521*6a54128fSAndroid Build Coastguard Worker for (mark_bit = len_bit - 1; mark_bit >= 0; mark_bit--)
522*6a54128fSAndroid Build Coastguard Worker last_bit |= 1 << mark_bit;
523*6a54128fSAndroid Build Coastguard Worker
524*6a54128fSAndroid Build Coastguard Worker /*
525*6a54128fSAndroid Build Coastguard Worker * Compare blocks or inodes in the last byte.
526*6a54128fSAndroid Build Coastguard Worker * If there is any marked bit, this function returns 0.
527*6a54128fSAndroid Build Coastguard Worker */
528*6a54128fSAndroid Build Coastguard Worker if (last_bit & ADDR[start_byte + len_byte])
529*6a54128fSAndroid Build Coastguard Worker return 0;
530*6a54128fSAndroid Build Coastguard Worker else if (len_byte == 0)
531*6a54128fSAndroid Build Coastguard Worker return 1;
532*6a54128fSAndroid Build Coastguard Worker }
533*6a54128fSAndroid Build Coastguard Worker
534*6a54128fSAndroid Build Coastguard Worker /* Check whether all bytes are 0 */
535*6a54128fSAndroid Build Coastguard Worker return ext2fs_mem_is_zero(ADDR + start_byte, len_byte);
536*6a54128fSAndroid Build Coastguard Worker }
537*6a54128fSAndroid Build Coastguard Worker
ext2fs_find_first_zero_generic_bitmap(ext2fs_generic_bitmap gen_bitmap,__u32 start,__u32 end,__u32 * out)538*6a54128fSAndroid Build Coastguard Worker errcode_t ext2fs_find_first_zero_generic_bitmap(ext2fs_generic_bitmap gen_bitmap,
539*6a54128fSAndroid Build Coastguard Worker __u32 start, __u32 end,
540*6a54128fSAndroid Build Coastguard Worker __u32 *out)
541*6a54128fSAndroid Build Coastguard Worker {
542*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap_32 bitmap = (ext2fs_generic_bitmap_32) gen_bitmap;
543*6a54128fSAndroid Build Coastguard Worker blk_t b;
544*6a54128fSAndroid Build Coastguard Worker
545*6a54128fSAndroid Build Coastguard Worker if (start < bitmap->start || end > bitmap->end || start > end) {
546*6a54128fSAndroid Build Coastguard Worker ext2fs_warn_bitmap2(gen_bitmap, EXT2FS_TEST_ERROR, start);
547*6a54128fSAndroid Build Coastguard Worker return EINVAL;
548*6a54128fSAndroid Build Coastguard Worker }
549*6a54128fSAndroid Build Coastguard Worker
550*6a54128fSAndroid Build Coastguard Worker while (start <= end) {
551*6a54128fSAndroid Build Coastguard Worker b = ext2fs_test_bit(start - bitmap->start, bitmap->bitmap);
552*6a54128fSAndroid Build Coastguard Worker if (!b) {
553*6a54128fSAndroid Build Coastguard Worker *out = start;
554*6a54128fSAndroid Build Coastguard Worker return 0;
555*6a54128fSAndroid Build Coastguard Worker }
556*6a54128fSAndroid Build Coastguard Worker start++;
557*6a54128fSAndroid Build Coastguard Worker }
558*6a54128fSAndroid Build Coastguard Worker
559*6a54128fSAndroid Build Coastguard Worker return ENOENT;
560*6a54128fSAndroid Build Coastguard Worker }
561*6a54128fSAndroid Build Coastguard Worker
ext2fs_find_first_set_generic_bitmap(ext2fs_generic_bitmap gen_bitmap,__u32 start,__u32 end,__u32 * out)562*6a54128fSAndroid Build Coastguard Worker errcode_t ext2fs_find_first_set_generic_bitmap(ext2fs_generic_bitmap gen_bitmap,
563*6a54128fSAndroid Build Coastguard Worker __u32 start, __u32 end,
564*6a54128fSAndroid Build Coastguard Worker __u32 *out)
565*6a54128fSAndroid Build Coastguard Worker {
566*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap_32 bitmap = (ext2fs_generic_bitmap_32) gen_bitmap;
567*6a54128fSAndroid Build Coastguard Worker blk_t b;
568*6a54128fSAndroid Build Coastguard Worker
569*6a54128fSAndroid Build Coastguard Worker if (start < bitmap->start || end > bitmap->end || start > end) {
570*6a54128fSAndroid Build Coastguard Worker ext2fs_warn_bitmap2(gen_bitmap, EXT2FS_TEST_ERROR, start);
571*6a54128fSAndroid Build Coastguard Worker return EINVAL;
572*6a54128fSAndroid Build Coastguard Worker }
573*6a54128fSAndroid Build Coastguard Worker
574*6a54128fSAndroid Build Coastguard Worker while (start <= end) {
575*6a54128fSAndroid Build Coastguard Worker b = ext2fs_test_bit(start - bitmap->start, bitmap->bitmap);
576*6a54128fSAndroid Build Coastguard Worker if (b) {
577*6a54128fSAndroid Build Coastguard Worker *out = start;
578*6a54128fSAndroid Build Coastguard Worker return 0;
579*6a54128fSAndroid Build Coastguard Worker }
580*6a54128fSAndroid Build Coastguard Worker start++;
581*6a54128fSAndroid Build Coastguard Worker }
582*6a54128fSAndroid Build Coastguard Worker
583*6a54128fSAndroid Build Coastguard Worker return ENOENT;
584*6a54128fSAndroid Build Coastguard Worker }
585*6a54128fSAndroid Build Coastguard Worker
ext2fs_test_block_bitmap_range(ext2fs_block_bitmap gen_bitmap,blk_t block,int num)586*6a54128fSAndroid Build Coastguard Worker int ext2fs_test_block_bitmap_range(ext2fs_block_bitmap gen_bitmap,
587*6a54128fSAndroid Build Coastguard Worker blk_t block, int num)
588*6a54128fSAndroid Build Coastguard Worker {
589*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap_32 bitmap = (ext2fs_generic_bitmap_32) gen_bitmap;
590*6a54128fSAndroid Build Coastguard Worker
591*6a54128fSAndroid Build Coastguard Worker EXT2_CHECK_MAGIC(bitmap, EXT2_ET_MAGIC_BLOCK_BITMAP);
592*6a54128fSAndroid Build Coastguard Worker if ((block < bitmap->start) || (block > bitmap->real_end) ||
593*6a54128fSAndroid Build Coastguard Worker (block+num-1 > bitmap->real_end)) {
594*6a54128fSAndroid Build Coastguard Worker ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_TEST,
595*6a54128fSAndroid Build Coastguard Worker block, bitmap->description);
596*6a54128fSAndroid Build Coastguard Worker return 0;
597*6a54128fSAndroid Build Coastguard Worker }
598*6a54128fSAndroid Build Coastguard Worker return ext2fs_test_clear_generic_bitmap_range((ext2fs_generic_bitmap)
599*6a54128fSAndroid Build Coastguard Worker bitmap, block, num);
600*6a54128fSAndroid Build Coastguard Worker }
601*6a54128fSAndroid Build Coastguard Worker
ext2fs_test_inode_bitmap_range(ext2fs_inode_bitmap gen_bitmap,ext2_ino_t inode,int num)602*6a54128fSAndroid Build Coastguard Worker int ext2fs_test_inode_bitmap_range(ext2fs_inode_bitmap gen_bitmap,
603*6a54128fSAndroid Build Coastguard Worker ext2_ino_t inode, int num)
604*6a54128fSAndroid Build Coastguard Worker {
605*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap_32 bitmap = (ext2fs_generic_bitmap_32) gen_bitmap;
606*6a54128fSAndroid Build Coastguard Worker
607*6a54128fSAndroid Build Coastguard Worker EXT2_CHECK_MAGIC(bitmap, EXT2_ET_MAGIC_INODE_BITMAP);
608*6a54128fSAndroid Build Coastguard Worker if ((inode < bitmap->start) || (inode > bitmap->real_end) ||
609*6a54128fSAndroid Build Coastguard Worker (inode+num-1 > bitmap->real_end)) {
610*6a54128fSAndroid Build Coastguard Worker ext2fs_warn_bitmap(EXT2_ET_BAD_INODE_TEST,
611*6a54128fSAndroid Build Coastguard Worker inode, bitmap->description);
612*6a54128fSAndroid Build Coastguard Worker return 0;
613*6a54128fSAndroid Build Coastguard Worker }
614*6a54128fSAndroid Build Coastguard Worker return ext2fs_test_clear_generic_bitmap_range((ext2fs_generic_bitmap)
615*6a54128fSAndroid Build Coastguard Worker bitmap, inode, num);
616*6a54128fSAndroid Build Coastguard Worker }
617*6a54128fSAndroid Build Coastguard Worker
ext2fs_mark_block_bitmap_range(ext2fs_block_bitmap gen_bitmap,blk_t block,int num)618*6a54128fSAndroid Build Coastguard Worker void ext2fs_mark_block_bitmap_range(ext2fs_block_bitmap gen_bitmap,
619*6a54128fSAndroid Build Coastguard Worker blk_t block, int num)
620*6a54128fSAndroid Build Coastguard Worker {
621*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap_32 bitmap = (ext2fs_generic_bitmap_32) gen_bitmap;
622*6a54128fSAndroid Build Coastguard Worker int i;
623*6a54128fSAndroid Build Coastguard Worker
624*6a54128fSAndroid Build Coastguard Worker if ((block < bitmap->start) || (block > bitmap->end) ||
625*6a54128fSAndroid Build Coastguard Worker (block+num-1 > bitmap->end)) {
626*6a54128fSAndroid Build Coastguard Worker ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_MARK, block,
627*6a54128fSAndroid Build Coastguard Worker bitmap->description);
628*6a54128fSAndroid Build Coastguard Worker return;
629*6a54128fSAndroid Build Coastguard Worker }
630*6a54128fSAndroid Build Coastguard Worker for (i=0; i < num; i++)
631*6a54128fSAndroid Build Coastguard Worker ext2fs_fast_set_bit(block + i - bitmap->start, bitmap->bitmap);
632*6a54128fSAndroid Build Coastguard Worker }
633*6a54128fSAndroid Build Coastguard Worker
ext2fs_unmark_block_bitmap_range(ext2fs_block_bitmap gen_bitmap,blk_t block,int num)634*6a54128fSAndroid Build Coastguard Worker void ext2fs_unmark_block_bitmap_range(ext2fs_block_bitmap gen_bitmap,
635*6a54128fSAndroid Build Coastguard Worker blk_t block, int num)
636*6a54128fSAndroid Build Coastguard Worker {
637*6a54128fSAndroid Build Coastguard Worker ext2fs_generic_bitmap_32 bitmap = (ext2fs_generic_bitmap_32) gen_bitmap;
638*6a54128fSAndroid Build Coastguard Worker int i;
639*6a54128fSAndroid Build Coastguard Worker
640*6a54128fSAndroid Build Coastguard Worker if ((block < bitmap->start) || (block > bitmap->end) ||
641*6a54128fSAndroid Build Coastguard Worker (block+num-1 > bitmap->end)) {
642*6a54128fSAndroid Build Coastguard Worker ext2fs_warn_bitmap(EXT2_ET_BAD_BLOCK_UNMARK, block,
643*6a54128fSAndroid Build Coastguard Worker bitmap->description);
644*6a54128fSAndroid Build Coastguard Worker return;
645*6a54128fSAndroid Build Coastguard Worker }
646*6a54128fSAndroid Build Coastguard Worker for (i=0; i < num; i++)
647*6a54128fSAndroid Build Coastguard Worker ext2fs_fast_clear_bit(block + i - bitmap->start,
648*6a54128fSAndroid Build Coastguard Worker bitmap->bitmap);
649*6a54128fSAndroid Build Coastguard Worker }
650*6a54128fSAndroid Build Coastguard Worker
651