ext2fs.h revision 27a0e958e619c3ca105e575670416a964fa2678f
1/*
2 * ext2fs.h --- ext2fs
3 *
4 * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o.
5 *
6 * %Begin-Header%
7 * This file may be redistributed under the terms of the GNU Library
8 * General Public License, version 2.
9 * %End-Header%
10 */
11
12#ifndef _EXT2FS_EXT2FS_H
13#define _EXT2FS_EXT2FS_H
14
15#ifdef __GNUC__
16#define EXT2FS_ATTR(x) __attribute__(x)
17#else
18#define EXT2FS_ATTR(x)
19#endif
20
21#ifdef __cplusplus
22extern "C" {
23#endif
24
25/*
26 * Non-GNU C compilers won't necessarily understand inline
27 */
28#if (!defined(__GNUC__) && !defined(__WATCOMC__))
29#define NO_INLINE_FUNCS
30#endif
31
32/*
33 * Where the master copy of the superblock is located, and how big
34 * superblocks are supposed to be.  We define SUPERBLOCK_SIZE because
35 * the size of the superblock structure is not necessarily trustworthy
36 * (some versions have the padding set up so that the superblock is
37 * 1032 bytes long).
38 */
39#define SUPERBLOCK_OFFSET	1024
40#define SUPERBLOCK_SIZE 	1024
41
42/*
43 * The last ext2fs revision level that this version of the library is
44 * able to support.
45 */
46#define EXT2_LIB_CURRENT_REV	EXT2_DYNAMIC_REV
47
48#ifdef HAVE_SYS_TYPES_H
49#include <sys/types.h>
50#endif
51
52#include <stdio.h>
53#include <stdlib.h>
54#include <string.h>
55
56#if EXT2_FLAT_INCLUDES
57#include "e2_types.h"
58#include "ext2_fs.h"
59#include "ext3_extents.h"
60#else
61#include <ext2fs/ext2_types.h>
62#include <ext2fs/ext2_fs.h>
63#include <ext2fs/ext3_extents.h>
64#endif /* EXT2_FLAT_INCLUDES */
65
66typedef __u32		ext2_ino_t;
67typedef __u32		blk_t;
68typedef __u64		blk64_t;
69typedef __u32		dgrp_t;
70typedef __u32		ext2_off_t;
71typedef __u64		ext2_off64_t;
72typedef __s64		e2_blkcnt_t;
73typedef __u32		ext2_dirhash_t;
74
75#if EXT2_FLAT_INCLUDES
76#include "com_err.h"
77#include "ext2_io.h"
78#include "ext2_err.h"
79#include "ext2_ext_attr.h"
80#else
81#include <et/com_err.h>
82#include <ext2fs/ext2_io.h>
83#include <ext2fs/ext2_err.h>
84#include <ext2fs/ext2_ext_attr.h>
85#endif
86
87/*
88 * Portability help for Microsoft Visual C++
89 */
90#ifdef _MSC_VER
91#define EXT2_QSORT_TYPE int __cdecl
92#else
93#define EXT2_QSORT_TYPE int
94#endif
95
96typedef struct struct_ext2_filsys *ext2_filsys;
97
98#define EXT2FS_MARK_ERROR 	0
99#define EXT2FS_UNMARK_ERROR 	1
100#define EXT2FS_TEST_ERROR	2
101
102typedef struct ext2fs_struct_generic_bitmap *ext2fs_generic_bitmap;
103typedef struct ext2fs_struct_generic_bitmap *ext2fs_inode_bitmap;
104typedef struct ext2fs_struct_generic_bitmap *ext2fs_block_bitmap;
105
106#define EXT2_FIRST_INODE(s)	EXT2_FIRST_INO(s)
107
108
109/*
110 * Badblocks list definitions
111 */
112
113typedef struct ext2_struct_u32_list *ext2_badblocks_list;
114typedef struct ext2_struct_u32_iterate *ext2_badblocks_iterate;
115
116typedef struct ext2_struct_u32_list *ext2_u32_list;
117typedef struct ext2_struct_u32_iterate *ext2_u32_iterate;
118
119/* old */
120typedef struct ext2_struct_u32_list *badblocks_list;
121typedef struct ext2_struct_u32_iterate *badblocks_iterate;
122
123#define BADBLOCKS_FLAG_DIRTY	1
124
125/*
126 * ext2_dblist structure and abstractions (see dblist.c)
127 */
128struct ext2_db_entry2 {
129	ext2_ino_t	ino;
130	blk64_t	blk;
131	e2_blkcnt_t	blockcnt;
132};
133
134/* Ye Olde 32-bit version */
135struct ext2_db_entry {
136	ext2_ino_t	ino;
137	blk_t	blk;
138	int	blockcnt;
139};
140
141typedef struct ext2_struct_dblist *ext2_dblist;
142
143#define DBLIST_ABORT	1
144
145/*
146 * ext2_fileio definitions
147 */
148
149#define EXT2_FILE_WRITE		0x0001
150#define EXT2_FILE_CREATE	0x0002
151
152#define EXT2_FILE_MASK		0x00FF
153
154#define EXT2_FILE_BUF_DIRTY	0x4000
155#define EXT2_FILE_BUF_VALID	0x2000
156
157typedef struct ext2_file *ext2_file_t;
158
159#define EXT2_SEEK_SET	0
160#define EXT2_SEEK_CUR	1
161#define EXT2_SEEK_END	2
162
163/*
164 * Flags for the ext2_filsys structure and for ext2fs_open()
165 */
166#define EXT2_FLAG_RW			0x01
167#define EXT2_FLAG_CHANGED		0x02
168#define EXT2_FLAG_DIRTY			0x04
169#define EXT2_FLAG_VALID			0x08
170#define EXT2_FLAG_IB_DIRTY		0x10
171#define EXT2_FLAG_BB_DIRTY		0x20
172#define EXT2_FLAG_SWAP_BYTES		0x40
173#define EXT2_FLAG_SWAP_BYTES_READ	0x80
174#define EXT2_FLAG_SWAP_BYTES_WRITE	0x100
175#define EXT2_FLAG_MASTER_SB_ONLY	0x200
176#define EXT2_FLAG_FORCE			0x400
177#define EXT2_FLAG_SUPER_ONLY		0x800
178#define EXT2_FLAG_JOURNAL_DEV_OK	0x1000
179#define EXT2_FLAG_IMAGE_FILE		0x2000
180#define EXT2_FLAG_EXCLUSIVE		0x4000
181#define EXT2_FLAG_SOFTSUPP_FEATURES	0x8000
182#define EXT2_FLAG_NOFREE_ON_ERROR	0x10000
183#define EXT2_FLAG_64BITS		0x20000
184#define EXT2_FLAG_PRINT_PROGRESS	0x40000
185
186/*
187 * Special flag in the ext2 inode i_flag field that means that this is
188 * a new inode.  (So that ext2_write_inode() can clear extra fields.)
189 */
190#define EXT2_NEW_INODE_FL	0x80000000
191
192/*
193 * Flags for mkjournal
194 *
195 * EXT2_MKJOURNAL_V1_SUPER	Make a (deprecated) V1 journal superblock
196 */
197#define EXT2_MKJOURNAL_V1_SUPER	0x0000001
198
199struct opaque_ext2_group_desc;
200
201struct struct_ext2_filsys {
202	errcode_t			magic;
203	io_channel			io;
204	int				flags;
205	char *				device_name;
206	struct ext2_super_block	* 	super;
207	unsigned int			blocksize;
208	int				fragsize;
209	dgrp_t				group_desc_count;
210	unsigned long			desc_blocks;
211	struct opaque_ext2_group_desc *	group_desc;
212	int				inode_blocks_per_group;
213	ext2fs_inode_bitmap		inode_map;
214	ext2fs_block_bitmap		block_map;
215	/* XXX FIXME-64: not 64-bit safe, but not used? */
216	errcode_t (*get_blocks)(ext2_filsys fs, ext2_ino_t ino, blk_t *blocks);
217	errcode_t (*check_directory)(ext2_filsys fs, ext2_ino_t ino);
218	errcode_t (*write_bitmaps)(ext2_filsys fs);
219	errcode_t (*read_inode)(ext2_filsys fs, ext2_ino_t ino,
220				struct ext2_inode *inode);
221	errcode_t (*write_inode)(ext2_filsys fs, ext2_ino_t ino,
222				struct ext2_inode *inode);
223	ext2_badblocks_list		badblocks;
224	ext2_dblist			dblist;
225	__u32				stride;	/* for mke2fs */
226	struct ext2_super_block *	orig_super;
227	struct ext2_image_hdr *		image_header;
228	__u32				umask;
229	time_t				now;
230	/*
231	 * Reserved for future expansion
232	 */
233	__u32				reserved[7];
234
235	/*
236	 * Reserved for the use of the calling application.
237	 */
238	void *				priv_data;
239
240	/*
241	 * Inode cache
242	 */
243	struct ext2_inode_cache		*icache;
244	io_channel			image_io;
245
246	/*
247	 * More callback functions
248	 */
249	errcode_t (*get_alloc_block)(ext2_filsys fs, blk64_t goal,
250				     blk64_t *ret);
251	void (*block_alloc_stats)(ext2_filsys fs, blk64_t blk, int inuse);
252};
253
254#if EXT2_FLAT_INCLUDES
255#include "e2_bitops.h"
256#else
257#include <ext2fs/bitops.h>
258#endif
259
260/*
261 * Return flags for the block iterator functions
262 */
263#define BLOCK_CHANGED	1
264#define BLOCK_ABORT	2
265#define BLOCK_ERROR	4
266
267/*
268 * Block interate flags
269 *
270 * BLOCK_FLAG_APPEND, or BLOCK_FLAG_HOLE, indicates that the interator
271 * function should be called on blocks where the block number is zero.
272 * This is used by ext2fs_expand_dir() to be able to add a new block
273 * to an inode.  It can also be used for programs that want to be able
274 * to deal with files that contain "holes".
275 *
276 * BLOCK_FLAG_DEPTH_TRAVERSE indicates that the iterator function for
277 * the indirect, doubly indirect, etc. blocks should be called after
278 * all of the blocks containined in the indirect blocks are processed.
279 * This is useful if you are going to be deallocating blocks from an
280 * inode.
281 *
282 * BLOCK_FLAG_DATA_ONLY indicates that the iterator function should be
283 * called for data blocks only.
284 *
285 * BLOCK_FLAG_READ_ONLY is a promise by the caller that it will not
286 * modify returned block number.
287 *
288 * BLOCK_FLAG_NO_LARGE is for internal use only.  It informs
289 * ext2fs_block_iterate2 that large files won't be accepted.
290 */
291#define BLOCK_FLAG_APPEND	1
292#define BLOCK_FLAG_HOLE		1
293#define BLOCK_FLAG_DEPTH_TRAVERSE	2
294#define BLOCK_FLAG_DATA_ONLY	4
295#define BLOCK_FLAG_READ_ONLY	8
296
297#define BLOCK_FLAG_NO_LARGE	0x1000
298
299/*
300 * Magic "block count" return values for the block iterator function.
301 */
302#define BLOCK_COUNT_IND		(-1)
303#define BLOCK_COUNT_DIND	(-2)
304#define BLOCK_COUNT_TIND	(-3)
305#define BLOCK_COUNT_TRANSLATOR	(-4)
306
307#if 0
308/*
309 * Flags for ext2fs_move_blocks
310 */
311#define EXT2_BMOVE_GET_DBLIST	0x0001
312#define EXT2_BMOVE_DEBUG	0x0002
313#endif
314
315/*
316 * Generic (non-filesystem layout specific) extents structure
317 */
318
319#define EXT2_EXTENT_FLAGS_LEAF		0x0001
320#define EXT2_EXTENT_FLAGS_UNINIT	0x0002
321#define EXT2_EXTENT_FLAGS_SECOND_VISIT	0x0004
322
323struct ext2fs_extent {
324	blk64_t	e_pblk;		/* first physical block */
325	blk64_t	e_lblk;		/* first logical block extent covers */
326	__u32	e_len;		/* number of blocks covered by extent */
327	__u32	e_flags;	/* extent flags */
328};
329
330typedef struct ext2_extent_handle *ext2_extent_handle_t;
331typedef struct ext2_extent_path *ext2_extent_path_t;
332
333/*
334 * Flags used by ext2fs_extent_get()
335 */
336#define EXT2_EXTENT_CURRENT	0x0000
337#define EXT2_EXTENT_MOVE_MASK	0x000F
338#define EXT2_EXTENT_ROOT	0x0001
339#define EXT2_EXTENT_LAST_LEAF	0x0002
340#define EXT2_EXTENT_FIRST_SIB	0x0003
341#define EXT2_EXTENT_LAST_SIB	0x0004
342#define EXT2_EXTENT_NEXT_SIB	0x0005
343#define EXT2_EXTENT_PREV_SIB	0x0006
344#define EXT2_EXTENT_NEXT_LEAF	0x0007
345#define EXT2_EXTENT_PREV_LEAF	0x0008
346#define EXT2_EXTENT_NEXT	0x0009
347#define EXT2_EXTENT_PREV	0x000A
348#define EXT2_EXTENT_UP		0x000B
349#define EXT2_EXTENT_DOWN	0x000C
350#define EXT2_EXTENT_DOWN_AND_LAST 0x000D
351
352/*
353 * Flags used by ext2fs_extent_insert()
354 */
355#define EXT2_EXTENT_INSERT_AFTER	0x0001 /* insert after handle loc'n */
356#define EXT2_EXTENT_INSERT_NOSPLIT	0x0002 /* insert may not cause split */
357
358/*
359 * Flags used by ext2fs_extent_delete()
360 */
361#define EXT2_EXTENT_DELETE_KEEP_EMPTY	0x001 /* keep node if last extnt gone */
362
363/*
364 * Flags used by ext2fs_extent_set_bmap()
365 */
366#define EXT2_EXTENT_SET_BMAP_UNINIT	0x0001
367
368/*
369 * Data structure returned by ext2fs_extent_get_info()
370 */
371struct ext2_extent_info {
372	int		curr_entry;
373	int		curr_level;
374	int		num_entries;
375	int		max_entries;
376	int		max_depth;
377	int		bytes_avail;
378	blk64_t		max_lblk;
379	blk64_t		max_pblk;
380	__u32		max_len;
381	__u32		max_uninit_len;
382};
383
384/*
385 * Flags for directory block reading and writing functions
386 */
387#define EXT2_DIRBLOCK_V2_STRUCT	0x0001
388
389/*
390 * Return flags for the directory iterator functions
391 */
392#define DIRENT_CHANGED	1
393#define DIRENT_ABORT	2
394#define DIRENT_ERROR	3
395
396/*
397 * Directory iterator flags
398 */
399
400#define DIRENT_FLAG_INCLUDE_EMPTY	1
401#define DIRENT_FLAG_INCLUDE_REMOVED	2
402
403#define DIRENT_DOT_FILE		1
404#define DIRENT_DOT_DOT_FILE	2
405#define DIRENT_OTHER_FILE	3
406#define DIRENT_DELETED_FILE	4
407
408/*
409 * Inode scan definitions
410 */
411typedef struct ext2_struct_inode_scan *ext2_inode_scan;
412
413/*
414 * ext2fs_scan flags
415 */
416#define EXT2_SF_CHK_BADBLOCKS	0x0001
417#define EXT2_SF_BAD_INODE_BLK	0x0002
418#define EXT2_SF_BAD_EXTRA_BYTES	0x0004
419#define EXT2_SF_SKIP_MISSING_ITABLE	0x0008
420#define EXT2_SF_DO_LAZY		0x0010
421
422/*
423 * ext2fs_check_if_mounted flags
424 */
425#define EXT2_MF_MOUNTED		1
426#define EXT2_MF_ISROOT		2
427#define EXT2_MF_READONLY	4
428#define EXT2_MF_SWAP		8
429#define EXT2_MF_BUSY		16
430
431/*
432 * Ext2/linux mode flags.  We define them here so that we don't need
433 * to depend on the OS's sys/stat.h, since we may be compiling on a
434 * non-Linux system.
435 */
436#define LINUX_S_IFMT  00170000
437#define LINUX_S_IFSOCK 0140000
438#define LINUX_S_IFLNK	 0120000
439#define LINUX_S_IFREG  0100000
440#define LINUX_S_IFBLK  0060000
441#define LINUX_S_IFDIR  0040000
442#define LINUX_S_IFCHR  0020000
443#define LINUX_S_IFIFO  0010000
444#define LINUX_S_ISUID  0004000
445#define LINUX_S_ISGID  0002000
446#define LINUX_S_ISVTX  0001000
447
448#define LINUX_S_IRWXU 00700
449#define LINUX_S_IRUSR 00400
450#define LINUX_S_IWUSR 00200
451#define LINUX_S_IXUSR 00100
452
453#define LINUX_S_IRWXG 00070
454#define LINUX_S_IRGRP 00040
455#define LINUX_S_IWGRP 00020
456#define LINUX_S_IXGRP 00010
457
458#define LINUX_S_IRWXO 00007
459#define LINUX_S_IROTH 00004
460#define LINUX_S_IWOTH 00002
461#define LINUX_S_IXOTH 00001
462
463#define LINUX_S_ISLNK(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFLNK)
464#define LINUX_S_ISREG(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFREG)
465#define LINUX_S_ISDIR(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFDIR)
466#define LINUX_S_ISCHR(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFCHR)
467#define LINUX_S_ISBLK(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFBLK)
468#define LINUX_S_ISFIFO(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFIFO)
469#define LINUX_S_ISSOCK(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFSOCK)
470
471/*
472 * ext2 size of an inode
473 */
474#define EXT2_I_SIZE(i)	((i)->i_size | ((__u64) (i)->i_size_high << 32))
475
476/*
477 * ext2_icount_t abstraction
478 */
479#define EXT2_ICOUNT_OPT_INCREMENT	0x01
480
481typedef struct ext2_icount *ext2_icount_t;
482
483/*
484 * Flags for ext2fs_bmap
485 */
486#define BMAP_ALLOC	0x0001
487#define BMAP_SET	0x0002
488
489/*
490 * Returned flags from ext2fs_bmap
491 */
492#define BMAP_RET_UNINIT	0x0001
493
494/*
495 * Flags for imager.c functions
496 */
497#define IMAGER_FLAG_INODEMAP	1
498#define IMAGER_FLAG_SPARSEWRITE	2
499
500/*
501 * For checking structure magic numbers...
502 */
503
504#define EXT2_CHECK_MAGIC(struct, code) \
505	  if ((struct)->magic != (code)) return (code)
506
507
508/*
509 * For ext2 compression support
510 */
511#define EXT2FS_COMPRESSED_BLKADDR ((blk_t) -1)
512#define HOLE_BLKADDR(_b) ((_b) == 0 || (_b) == EXT2FS_COMPRESSED_BLKADDR)
513
514/*
515 * Features supported by this version of the library
516 */
517#define EXT2_LIB_FEATURE_COMPAT_SUPP	(EXT2_FEATURE_COMPAT_DIR_PREALLOC|\
518					 EXT2_FEATURE_COMPAT_IMAGIC_INODES|\
519					 EXT3_FEATURE_COMPAT_HAS_JOURNAL|\
520					 EXT2_FEATURE_COMPAT_RESIZE_INODE|\
521					 EXT2_FEATURE_COMPAT_DIR_INDEX|\
522					 EXT2_FEATURE_COMPAT_EXT_ATTR)
523
524/* This #ifdef is temporary until compression is fully supported */
525#ifdef ENABLE_COMPRESSION
526#ifndef I_KNOW_THAT_COMPRESSION_IS_EXPERIMENTAL
527/* If the below warning bugs you, then have
528   `CPPFLAGS=-DI_KNOW_THAT_COMPRESSION_IS_EXPERIMENTAL' in your
529   environment at configure time. */
530 #warning "Compression support is experimental"
531#endif
532#define EXT2_LIB_FEATURE_INCOMPAT_SUPP	(EXT2_FEATURE_INCOMPAT_FILETYPE|\
533					 EXT2_FEATURE_INCOMPAT_COMPRESSION|\
534					 EXT3_FEATURE_INCOMPAT_JOURNAL_DEV|\
535					 EXT2_FEATURE_INCOMPAT_META_BG|\
536					 EXT3_FEATURE_INCOMPAT_RECOVER|\
537					 EXT3_FEATURE_INCOMPAT_EXTENTS|\
538					 EXT4_FEATURE_INCOMPAT_FLEX_BG|\
539					 EXT4_FEATURE_INCOMPAT_64BIT)
540#else
541#define EXT2_LIB_FEATURE_INCOMPAT_SUPP	(EXT2_FEATURE_INCOMPAT_FILETYPE|\
542					 EXT3_FEATURE_INCOMPAT_JOURNAL_DEV|\
543					 EXT2_FEATURE_INCOMPAT_META_BG|\
544					 EXT3_FEATURE_INCOMPAT_RECOVER|\
545					 EXT3_FEATURE_INCOMPAT_EXTENTS|\
546					 EXT4_FEATURE_INCOMPAT_FLEX_BG|\
547					 EXT4_FEATURE_INCOMPAT_64BIT)
548#endif
549#define EXT2_LIB_FEATURE_RO_COMPAT_SUPP	(EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER|\
550					 EXT4_FEATURE_RO_COMPAT_HUGE_FILE|\
551					 EXT2_FEATURE_RO_COMPAT_LARGE_FILE|\
552					 EXT4_FEATURE_RO_COMPAT_DIR_NLINK|\
553					 EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE|\
554					 EXT4_FEATURE_RO_COMPAT_GDT_CSUM)
555
556/*
557 * These features are only allowed if EXT2_FLAG_SOFTSUPP_FEATURES is passed
558 * to ext2fs_openfs()
559 */
560#define EXT2_LIB_SOFTSUPP_INCOMPAT	(0)
561#define EXT2_LIB_SOFTSUPP_RO_COMPAT	(0)
562
563/*
564 * function prototypes
565 */
566
567/* alloc.c */
568extern errcode_t ext2fs_new_inode(ext2_filsys fs, ext2_ino_t dir, int mode,
569				  ext2fs_inode_bitmap map, ext2_ino_t *ret);
570extern errcode_t ext2fs_new_block(ext2_filsys fs, blk_t goal,
571				  ext2fs_block_bitmap map, blk_t *ret);
572extern errcode_t ext2fs_new_block2(ext2_filsys fs, blk64_t goal,
573				   ext2fs_block_bitmap map, blk64_t *ret);
574extern errcode_t ext2fs_get_free_blocks(ext2_filsys fs, blk_t start,
575					blk_t finish, int num,
576					ext2fs_block_bitmap map,
577					blk_t *ret);
578extern errcode_t ext2fs_get_free_blocks2(ext2_filsys fs, blk64_t start,
579					 blk64_t finish, int num,
580					 ext2fs_block_bitmap map,
581					 blk64_t *ret);
582extern errcode_t ext2fs_alloc_block(ext2_filsys fs, blk_t goal,
583				    char *block_buf, blk_t *ret);
584extern errcode_t ext2fs_alloc_block2(ext2_filsys fs, blk64_t goal,
585				     char *block_buf, blk64_t *ret);
586extern void ext2fs_set_alloc_block_callback(ext2_filsys fs,
587					    errcode_t (*func)(ext2_filsys fs,
588							      blk64_t goal,
589							      blk64_t *ret),
590					    errcode_t (**old)(ext2_filsys fs,
591							      blk64_t goal,
592							      blk64_t *ret));
593
594/* alloc_sb.c */
595extern int ext2fs_reserve_super_and_bgd(ext2_filsys fs,
596					dgrp_t group,
597					ext2fs_block_bitmap bmap);
598extern void ext2fs_set_block_alloc_stats_callback(ext2_filsys fs,
599						  void (*func)(ext2_filsys fs,
600							       blk64_t blk,
601							       int inuse),
602						  void (**old)(ext2_filsys fs,
603							       blk64_t blk,
604							       int inuse));
605
606/* alloc_stats.c */
607void ext2fs_inode_alloc_stats(ext2_filsys fs, ext2_ino_t ino, int inuse);
608void ext2fs_inode_alloc_stats2(ext2_filsys fs, ext2_ino_t ino,
609			       int inuse, int isdir);
610void ext2fs_block_alloc_stats(ext2_filsys fs, blk_t blk, int inuse);
611void ext2fs_block_alloc_stats2(ext2_filsys fs, blk64_t blk, int inuse);
612
613/* alloc_tables.c */
614extern errcode_t ext2fs_allocate_tables(ext2_filsys fs);
615extern errcode_t ext2fs_allocate_group_table(ext2_filsys fs, dgrp_t group,
616					     ext2fs_block_bitmap bmap);
617
618/* badblocks.c */
619extern errcode_t ext2fs_u32_list_create(ext2_u32_list *ret, int size);
620extern errcode_t ext2fs_u32_list_add(ext2_u32_list bb, __u32 blk);
621extern int ext2fs_u32_list_find(ext2_u32_list bb, __u32 blk);
622extern int ext2fs_u32_list_test(ext2_u32_list bb, blk_t blk);
623extern errcode_t ext2fs_u32_list_iterate_begin(ext2_u32_list bb,
624					       ext2_u32_iterate *ret);
625extern int ext2fs_u32_list_iterate(ext2_u32_iterate iter, blk_t *blk);
626extern void ext2fs_u32_list_iterate_end(ext2_u32_iterate iter);
627extern errcode_t ext2fs_u32_copy(ext2_u32_list src, ext2_u32_list *dest);
628extern int ext2fs_u32_list_equal(ext2_u32_list bb1, ext2_u32_list bb2);
629
630extern errcode_t ext2fs_badblocks_list_create(ext2_badblocks_list *ret,
631					    int size);
632extern errcode_t ext2fs_badblocks_list_add(ext2_badblocks_list bb,
633					   blk_t blk);
634extern int ext2fs_badblocks_list_test(ext2_badblocks_list bb,
635				    blk_t blk);
636extern int ext2fs_u32_list_del(ext2_u32_list bb, __u32 blk);
637extern void ext2fs_badblocks_list_del(ext2_u32_list bb, __u32 blk);
638extern errcode_t
639	ext2fs_badblocks_list_iterate_begin(ext2_badblocks_list bb,
640					    ext2_badblocks_iterate *ret);
641extern int ext2fs_badblocks_list_iterate(ext2_badblocks_iterate iter,
642					 blk_t *blk);
643extern void ext2fs_badblocks_list_iterate_end(ext2_badblocks_iterate iter);
644extern errcode_t ext2fs_badblocks_copy(ext2_badblocks_list src,
645				       ext2_badblocks_list *dest);
646extern int ext2fs_badblocks_equal(ext2_badblocks_list bb1,
647				  ext2_badblocks_list bb2);
648extern int ext2fs_u32_list_count(ext2_u32_list bb);
649
650/* bb_compat */
651extern errcode_t badblocks_list_create(badblocks_list *ret, int size);
652extern errcode_t badblocks_list_add(badblocks_list bb, blk_t blk);
653extern int badblocks_list_test(badblocks_list bb, blk_t blk);
654extern errcode_t badblocks_list_iterate_begin(badblocks_list bb,
655					      badblocks_iterate *ret);
656extern int badblocks_list_iterate(badblocks_iterate iter, blk_t *blk);
657extern void badblocks_list_iterate_end(badblocks_iterate iter);
658extern void badblocks_list_free(badblocks_list bb);
659
660/* bb_inode.c */
661extern errcode_t ext2fs_update_bb_inode(ext2_filsys fs,
662					ext2_badblocks_list bb_list);
663
664/* bitmaps.c */
665extern void ext2fs_free_block_bitmap(ext2fs_block_bitmap bitmap);
666extern void ext2fs_free_inode_bitmap(ext2fs_inode_bitmap bitmap);
667extern errcode_t ext2fs_copy_bitmap(ext2fs_generic_bitmap src,
668				    ext2fs_generic_bitmap *dest);
669extern errcode_t ext2fs_write_inode_bitmap(ext2_filsys fs);
670extern errcode_t ext2fs_write_block_bitmap (ext2_filsys fs);
671extern errcode_t ext2fs_read_inode_bitmap (ext2_filsys fs);
672extern errcode_t ext2fs_read_block_bitmap(ext2_filsys fs);
673extern errcode_t ext2fs_allocate_block_bitmap(ext2_filsys fs,
674					      const char *descr,
675					      ext2fs_block_bitmap *ret);
676extern errcode_t ext2fs_allocate_inode_bitmap(ext2_filsys fs,
677					      const char *descr,
678					      ext2fs_inode_bitmap *ret);
679extern errcode_t ext2fs_fudge_inode_bitmap_end(ext2fs_inode_bitmap bitmap,
680					       ext2_ino_t end, ext2_ino_t *oend);
681extern errcode_t ext2fs_fudge_block_bitmap_end(ext2fs_block_bitmap bitmap,
682					       blk_t end, blk_t *oend);
683extern errcode_t ext2fs_fudge_block_bitmap_end2(ext2fs_block_bitmap bitmap,
684					 blk64_t end, blk64_t *oend);
685extern void ext2fs_clear_inode_bitmap(ext2fs_inode_bitmap bitmap);
686extern void ext2fs_clear_block_bitmap(ext2fs_block_bitmap bitmap);
687extern errcode_t ext2fs_read_bitmaps(ext2_filsys fs);
688extern errcode_t ext2fs_write_bitmaps(ext2_filsys fs);
689extern errcode_t ext2fs_resize_inode_bitmap(__u32 new_end, __u32 new_real_end,
690					    ext2fs_inode_bitmap bmap);
691extern errcode_t ext2fs_resize_inode_bitmap2(__u64 new_end,
692					     __u64 new_real_end,
693					     ext2fs_inode_bitmap bmap);
694extern errcode_t ext2fs_resize_block_bitmap(__u32 new_end, __u32 new_real_end,
695					    ext2fs_block_bitmap bmap);
696extern errcode_t ext2fs_resize_block_bitmap2(__u64 new_end,
697					     __u64 new_real_end,
698					     ext2fs_block_bitmap bmap);
699extern errcode_t ext2fs_compare_block_bitmap(ext2fs_block_bitmap bm1,
700					     ext2fs_block_bitmap bm2);
701extern errcode_t ext2fs_compare_inode_bitmap(ext2fs_inode_bitmap bm1,
702					     ext2fs_inode_bitmap bm2);
703extern errcode_t ext2fs_set_inode_bitmap_range(ext2fs_inode_bitmap bmap,
704					ext2_ino_t start, unsigned int num,
705					void *in);
706extern errcode_t ext2fs_set_inode_bitmap_range2(ext2fs_inode_bitmap bmap,
707					 __u64 start, size_t num,
708					 void *in);
709extern errcode_t ext2fs_get_inode_bitmap_range(ext2fs_inode_bitmap bmap,
710					ext2_ino_t start, unsigned int num,
711					void *out);
712extern errcode_t ext2fs_get_inode_bitmap_range2(ext2fs_inode_bitmap bmap,
713					 __u64 start, size_t num,
714					 void *out);
715extern errcode_t ext2fs_set_block_bitmap_range(ext2fs_block_bitmap bmap,
716					blk_t start, unsigned int num,
717					void *in);
718extern errcode_t ext2fs_set_block_bitmap_range2(ext2fs_block_bitmap bmap,
719					 blk64_t start, size_t num,
720					 void *in);
721extern errcode_t ext2fs_get_block_bitmap_range(ext2fs_block_bitmap bmap,
722					blk_t start, unsigned int num,
723					void *out);
724extern errcode_t ext2fs_get_block_bitmap_range2(ext2fs_block_bitmap bmap,
725					 blk64_t start, size_t num,
726					 void *out);
727
728/* blknum.c */
729extern dgrp_t ext2fs_group_of_blk2(ext2_filsys fs, blk64_t);
730extern blk64_t ext2fs_group_first_block2(ext2_filsys fs, dgrp_t group);
731extern blk64_t ext2fs_group_last_block2(ext2_filsys fs, dgrp_t group);
732extern blk64_t ext2fs_inode_data_blocks2(ext2_filsys fs,
733					 struct ext2_inode *inode);
734extern blk64_t ext2fs_inode_i_blocks(ext2_filsys fs,
735					 struct ext2_inode *inode);
736extern blk64_t ext2fs_blocks_count(struct ext2_super_block *super);
737extern void ext2fs_blocks_count_set(struct ext2_super_block *super,
738				    blk64_t blk);
739extern void ext2fs_blocks_count_add(struct ext2_super_block *super,
740				    blk64_t blk);
741extern blk64_t ext2fs_r_blocks_count(struct ext2_super_block *super);
742extern void ext2fs_r_blocks_count_set(struct ext2_super_block *super,
743				      blk64_t blk);
744extern void ext2fs_r_blocks_count_add(struct ext2_super_block *super,
745				      blk64_t blk);
746extern blk64_t ext2fs_free_blocks_count(struct ext2_super_block *super);
747extern void ext2fs_free_blocks_count_set(struct ext2_super_block *super,
748					 blk64_t blk);
749extern void ext2fs_free_blocks_count_add(struct ext2_super_block *super,
750					 blk64_t blk);
751/* Block group descriptor accessor functions */
752extern struct ext2_group_desc *ext2fs_group_desc(ext2_filsys fs,
753					  struct opaque_ext2_group_desc *gdp,
754					  dgrp_t group);
755extern blk64_t ext2fs_block_bitmap_loc(ext2_filsys fs, dgrp_t group);
756extern void ext2fs_block_bitmap_loc_set(ext2_filsys fs, dgrp_t group,
757					blk64_t blk);
758extern blk64_t ext2fs_inode_bitmap_loc(ext2_filsys fs, dgrp_t group);
759extern void ext2fs_inode_bitmap_loc_set(ext2_filsys fs, dgrp_t group,
760					blk64_t blk);
761extern blk64_t ext2fs_inode_table_loc(ext2_filsys fs, dgrp_t group);
762extern void ext2fs_inode_table_loc_set(ext2_filsys fs, dgrp_t group,
763				       blk64_t blk);
764extern __u32 ext2fs_bg_free_blocks_count(ext2_filsys fs, dgrp_t group);
765extern void ext2fs_bg_free_blocks_count_set(ext2_filsys fs, dgrp_t group,
766					 __u32 n);
767extern __u32 ext2fs_bg_free_inodes_count(ext2_filsys fs, dgrp_t group);
768extern void ext2fs_bg_free_inodes_count_set(ext2_filsys fs, dgrp_t group,
769					 __u32 n);
770extern __u32 ext2fs_bg_used_dirs_count(ext2_filsys fs, dgrp_t group);
771extern void ext2fs_bg_used_dirs_count_set(ext2_filsys fs, dgrp_t group,
772				       __u32 n);
773extern __u32 ext2fs_bg_itable_unused(ext2_filsys fs, dgrp_t group);
774extern void ext2fs_bg_itable_unused_set(ext2_filsys fs, dgrp_t group,
775				     __u32 n);
776extern __u16 ext2fs_bg_flags(ext2_filsys fs, dgrp_t group);
777extern void ext2fs_bg_flags_zap(ext2_filsys fs, dgrp_t group);
778extern int ext2fs_bg_flags_test(ext2_filsys fs, dgrp_t group, __u16 bg_flag);
779extern void ext2fs_bg_flags_set(ext2_filsys fs, dgrp_t group, __u16 bg_flags);
780extern void ext2fs_bg_flags_clear(ext2_filsys fs, dgrp_t group, __u16 bg_flags);
781extern __u16 ext2fs_bg_checksum(ext2_filsys fs, dgrp_t group);
782extern void ext2fs_bg_checksum_set(ext2_filsys fs, dgrp_t group, __u16 checksum);
783extern blk64_t ext2fs_file_acl_block(const struct ext2_inode *inode);
784extern void ext2fs_file_acl_block_set(struct ext2_inode *inode, blk64_t blk);
785
786/* block.c */
787extern errcode_t ext2fs_block_iterate(ext2_filsys fs,
788				      ext2_ino_t	ino,
789				      int	flags,
790				      char *block_buf,
791				      int (*func)(ext2_filsys fs,
792						  blk_t	*blocknr,
793						  int	blockcnt,
794						  void	*priv_data),
795				      void *priv_data);
796errcode_t ext2fs_block_iterate2(ext2_filsys fs,
797				ext2_ino_t	ino,
798				int	flags,
799				char *block_buf,
800				int (*func)(ext2_filsys fs,
801					    blk_t	*blocknr,
802					    e2_blkcnt_t	blockcnt,
803					    blk_t	ref_blk,
804					    int		ref_offset,
805					    void	*priv_data),
806				void *priv_data);
807errcode_t ext2fs_block_iterate3(ext2_filsys fs,
808				ext2_ino_t ino,
809				int	flags,
810				char *block_buf,
811				int (*func)(ext2_filsys fs,
812					    blk64_t	*blocknr,
813					    e2_blkcnt_t	blockcnt,
814					    blk64_t	ref_blk,
815					    int		ref_offset,
816					    void	*priv_data),
817				void *priv_data);
818
819/* bmap.c */
820extern errcode_t ext2fs_bmap(ext2_filsys fs, ext2_ino_t ino,
821			     struct ext2_inode *inode,
822			     char *block_buf, int bmap_flags,
823			     blk_t block, blk_t *phys_blk);
824extern errcode_t ext2fs_bmap2(ext2_filsys fs, ext2_ino_t ino,
825			      struct ext2_inode *inode,
826			      char *block_buf, int bmap_flags, blk64_t block,
827			      int *ret_flags, blk64_t *phys_blk);
828
829#if 0
830/* bmove.c */
831extern errcode_t ext2fs_move_blocks(ext2_filsys fs,
832				    ext2fs_block_bitmap reserve,
833				    ext2fs_block_bitmap alloc_map,
834				    int flags);
835#endif
836
837/* check_desc.c */
838extern errcode_t ext2fs_check_desc(ext2_filsys fs);
839
840/* closefs.c */
841extern errcode_t ext2fs_close(ext2_filsys fs);
842extern errcode_t ext2fs_flush(ext2_filsys fs);
843extern int ext2fs_bg_has_super(ext2_filsys fs, int group_block);
844extern errcode_t ext2fs_super_and_bgd_loc2(ext2_filsys fs,
845				    dgrp_t group,
846				    blk64_t *ret_super_blk,
847				    blk64_t *ret_old_desc_blk,
848				    blk64_t *ret_new_desc_blk,
849				    blk_t *ret_used_blks);
850extern int ext2fs_super_and_bgd_loc(ext2_filsys fs,
851				    dgrp_t group,
852				    blk_t *ret_super_blk,
853				    blk_t *ret_old_desc_blk,
854				    blk_t *ret_new_desc_blk,
855				    int *ret_meta_bg);
856extern void ext2fs_update_dynamic_rev(ext2_filsys fs);
857
858/* csum.c */
859extern void ext2fs_group_desc_csum_set(ext2_filsys fs, dgrp_t group);
860extern int ext2fs_group_desc_csum_verify(ext2_filsys fs, dgrp_t group);
861extern errcode_t ext2fs_set_gdt_csum(ext2_filsys fs);
862
863/* dblist.c */
864
865extern errcode_t ext2fs_get_num_dirs(ext2_filsys fs, ext2_ino_t *ret_num_dirs);
866extern errcode_t ext2fs_init_dblist(ext2_filsys fs, ext2_dblist *ret_dblist);
867extern errcode_t ext2fs_add_dir_block(ext2_dblist dblist, ext2_ino_t ino,
868				      blk_t blk, int blockcnt);
869extern errcode_t ext2fs_add_dir_block2(ext2_dblist dblist, ext2_ino_t ino,
870				       blk64_t blk, e2_blkcnt_t blockcnt);
871extern void ext2fs_dblist_sort(ext2_dblist dblist,
872			       EXT2_QSORT_TYPE (*sortfunc)(const void *,
873							   const void *));
874extern void ext2fs_dblist_sort2(ext2_dblist dblist,
875				EXT2_QSORT_TYPE (*sortfunc)(const void *,
876							    const void *));
877extern errcode_t ext2fs_dblist_iterate(ext2_dblist dblist,
878	int (*func)(ext2_filsys fs, struct ext2_db_entry *db_info,
879		    void	*priv_data),
880       void *priv_data);
881extern errcode_t ext2fs_dblist_iterate2(ext2_dblist dblist,
882	int (*func)(ext2_filsys fs, struct ext2_db_entry2 *db_info,
883		    void	*priv_data),
884       void *priv_data);
885extern errcode_t ext2fs_set_dir_block(ext2_dblist dblist, ext2_ino_t ino,
886				      blk_t blk, int blockcnt);
887extern errcode_t ext2fs_set_dir_block2(ext2_dblist dblist, ext2_ino_t ino,
888				       blk64_t blk, e2_blkcnt_t blockcnt);
889extern errcode_t ext2fs_copy_dblist(ext2_dblist src,
890				    ext2_dblist *dest);
891extern int ext2fs_dblist_count(ext2_dblist dblist);
892extern blk64_t ext2fs_dblist_count2(ext2_dblist dblist);
893extern errcode_t ext2fs_dblist_get_last(ext2_dblist dblist,
894					struct ext2_db_entry **entry);
895extern errcode_t ext2fs_dblist_get_last2(ext2_dblist dblist,
896					struct ext2_db_entry2 **entry);
897extern errcode_t ext2fs_dblist_drop_last(ext2_dblist dblist);
898
899/* dblist_dir.c */
900extern errcode_t
901	ext2fs_dblist_dir_iterate(ext2_dblist dblist,
902				  int	flags,
903				  char	*block_buf,
904				  int (*func)(ext2_ino_t	dir,
905					      int		entry,
906					      struct ext2_dir_entry *dirent,
907					      int	offset,
908					      int	blocksize,
909					      char	*buf,
910					      void	*priv_data),
911				  void *priv_data);
912
913/* dirblock.c */
914extern errcode_t ext2fs_read_dir_block(ext2_filsys fs, blk_t block,
915				       void *buf);
916extern errcode_t ext2fs_read_dir_block2(ext2_filsys fs, blk_t block,
917					void *buf, int flags);
918extern errcode_t ext2fs_read_dir_block3(ext2_filsys fs, blk64_t block,
919					void *buf, int flags);
920extern errcode_t ext2fs_write_dir_block(ext2_filsys fs, blk_t block,
921					void *buf);
922extern errcode_t ext2fs_write_dir_block2(ext2_filsys fs, blk_t block,
923					 void *buf, int flags);
924extern errcode_t ext2fs_write_dir_block3(ext2_filsys fs, blk64_t block,
925					 void *buf, int flags);
926
927/* dirhash.c */
928extern errcode_t ext2fs_dirhash(int version, const char *name, int len,
929				const __u32 *seed,
930				ext2_dirhash_t *ret_hash,
931				ext2_dirhash_t *ret_minor_hash);
932
933
934/* dir_iterate.c */
935extern errcode_t ext2fs_get_rec_len(ext2_filsys fs,
936				    struct ext2_dir_entry *dirent,
937				    unsigned int *rec_len);
938extern errcode_t ext2fs_set_rec_len(ext2_filsys fs,
939				    unsigned int len,
940				    struct ext2_dir_entry *dirent);
941extern errcode_t ext2fs_dir_iterate(ext2_filsys fs,
942			      ext2_ino_t dir,
943			      int flags,
944			      char *block_buf,
945			      int (*func)(struct ext2_dir_entry *dirent,
946					  int	offset,
947					  int	blocksize,
948					  char	*buf,
949					  void	*priv_data),
950			      void *priv_data);
951extern errcode_t ext2fs_dir_iterate2(ext2_filsys fs,
952			      ext2_ino_t dir,
953			      int flags,
954			      char *block_buf,
955			      int (*func)(ext2_ino_t	dir,
956					  int	entry,
957					  struct ext2_dir_entry *dirent,
958					  int	offset,
959					  int	blocksize,
960					  char	*buf,
961					  void	*priv_data),
962			      void *priv_data);
963
964/* dupfs.c */
965extern errcode_t ext2fs_dup_handle(ext2_filsys src, ext2_filsys *dest);
966
967/* expanddir.c */
968extern errcode_t ext2fs_expand_dir(ext2_filsys fs, ext2_ino_t dir);
969
970/* ext_attr.c */
971extern __u32 ext2fs_ext_attr_hash_entry(struct ext2_ext_attr_entry *entry,
972					void *data);
973extern errcode_t ext2fs_read_ext_attr(ext2_filsys fs, blk_t block, void *buf);
974extern errcode_t ext2fs_read_ext_attr2(ext2_filsys fs, blk64_t block,
975				       void *buf);
976extern errcode_t ext2fs_write_ext_attr(ext2_filsys fs, blk_t block,
977				       void *buf);
978extern errcode_t ext2fs_write_ext_attr2(ext2_filsys fs, blk64_t block,
979				       void *buf);
980extern errcode_t ext2fs_adjust_ea_refcount(ext2_filsys fs, blk_t blk,
981					   char *block_buf,
982					   int adjust, __u32 *newcount);
983extern errcode_t ext2fs_adjust_ea_refcount2(ext2_filsys fs, blk64_t blk,
984					   char *block_buf,
985					   int adjust, __u32 *newcount);
986
987/* extent.c */
988extern errcode_t ext2fs_extent_header_verify(void *ptr, int size);
989extern errcode_t ext2fs_extent_open(ext2_filsys fs, ext2_ino_t ino,
990				    ext2_extent_handle_t *handle);
991extern errcode_t ext2fs_extent_open2(ext2_filsys fs, ext2_ino_t ino,
992					struct ext2_inode *inode,
993					ext2_extent_handle_t *ret_handle);
994extern void ext2fs_extent_free(ext2_extent_handle_t handle);
995extern errcode_t ext2fs_extent_get(ext2_extent_handle_t handle,
996				   int flags, struct ext2fs_extent *extent);
997extern errcode_t ext2fs_extent_replace(ext2_extent_handle_t handle, int flags,
998				       struct ext2fs_extent *extent);
999extern errcode_t ext2fs_extent_insert(ext2_extent_handle_t handle, int flags,
1000				      struct ext2fs_extent *extent);
1001extern errcode_t ext2fs_extent_set_bmap(ext2_extent_handle_t handle,
1002					blk64_t logical, blk64_t physical,
1003					int flags);
1004extern errcode_t ext2fs_extent_delete(ext2_extent_handle_t handle, int flags);
1005extern errcode_t ext2fs_extent_get_info(ext2_extent_handle_t handle,
1006					struct ext2_extent_info *info);
1007extern errcode_t ext2fs_extent_goto(ext2_extent_handle_t handle,
1008				    blk64_t blk);
1009
1010/* fileio.c */
1011extern errcode_t ext2fs_file_open2(ext2_filsys fs, ext2_ino_t ino,
1012				   struct ext2_inode *inode,
1013				   int flags, ext2_file_t *ret);
1014extern errcode_t ext2fs_file_open(ext2_filsys fs, ext2_ino_t ino,
1015				  int flags, ext2_file_t *ret);
1016extern ext2_filsys ext2fs_file_get_fs(ext2_file_t file);
1017struct ext2_inode *ext2fs_file_get_inode(ext2_file_t file);
1018extern errcode_t ext2fs_file_close(ext2_file_t file);
1019extern errcode_t ext2fs_file_flush(ext2_file_t file);
1020extern errcode_t ext2fs_file_read(ext2_file_t file, void *buf,
1021				  unsigned int wanted, unsigned int *got);
1022extern errcode_t ext2fs_file_write(ext2_file_t file, const void *buf,
1023				   unsigned int nbytes, unsigned int *written);
1024extern errcode_t ext2fs_file_llseek(ext2_file_t file, __u64 offset,
1025				   int whence, __u64 *ret_pos);
1026extern errcode_t ext2fs_file_lseek(ext2_file_t file, ext2_off_t offset,
1027				   int whence, ext2_off_t *ret_pos);
1028errcode_t ext2fs_file_get_lsize(ext2_file_t file, __u64 *ret_size);
1029extern ext2_off_t ext2fs_file_get_size(ext2_file_t file);
1030extern errcode_t ext2fs_file_set_size(ext2_file_t file, ext2_off_t size);
1031extern errcode_t ext2fs_file_set_size2(ext2_file_t file, ext2_off64_t size);
1032
1033/* finddev.c */
1034extern char *ext2fs_find_block_device(dev_t device);
1035
1036/* flushb.c */
1037extern errcode_t ext2fs_sync_device(int fd, int flushb);
1038
1039/* freefs.c */
1040extern void ext2fs_free(ext2_filsys fs);
1041extern void ext2fs_free_dblist(ext2_dblist dblist);
1042extern void ext2fs_badblocks_list_free(ext2_badblocks_list bb);
1043extern void ext2fs_u32_list_free(ext2_u32_list bb);
1044
1045/* gen_bitmap.c */
1046extern void ext2fs_free_generic_bitmap(ext2fs_inode_bitmap bitmap);
1047extern errcode_t ext2fs_make_generic_bitmap(errcode_t magic, ext2_filsys fs,
1048					    __u32 start, __u32 end,
1049					    __u32 real_end,
1050					    const char *descr, char *init_map,
1051					    ext2fs_generic_bitmap *ret);
1052extern errcode_t ext2fs_allocate_generic_bitmap(__u32 start,
1053						__u32 end,
1054						__u32 real_end,
1055						const char *descr,
1056						ext2fs_generic_bitmap *ret);
1057extern errcode_t ext2fs_copy_generic_bitmap(ext2fs_generic_bitmap src,
1058					    ext2fs_generic_bitmap *dest);
1059extern void ext2fs_clear_generic_bitmap(ext2fs_generic_bitmap bitmap);
1060extern errcode_t ext2fs_fudge_generic_bitmap_end(ext2fs_inode_bitmap bitmap,
1061						 errcode_t magic,
1062						 errcode_t neq,
1063						 ext2_ino_t end,
1064						 ext2_ino_t *oend);
1065extern void ext2fs_set_generic_bitmap_padding(ext2fs_generic_bitmap map);
1066extern errcode_t ext2fs_resize_generic_bitmap(errcode_t magic,
1067					      __u32 new_end,
1068					      __u32 new_real_end,
1069					      ext2fs_generic_bitmap bmap);
1070extern errcode_t ext2fs_compare_generic_bitmap(errcode_t magic, errcode_t neq,
1071					       ext2fs_generic_bitmap bm1,
1072					       ext2fs_generic_bitmap bm2);
1073extern errcode_t ext2fs_get_generic_bitmap_range(ext2fs_generic_bitmap bmap,
1074						 errcode_t magic,
1075						 __u32 start, __u32 num,
1076						 void *out);
1077extern errcode_t ext2fs_set_generic_bitmap_range(ext2fs_generic_bitmap bmap,
1078						 errcode_t magic,
1079						 __u32 start, __u32 num,
1080						 void *in);
1081
1082/* gen_bitmap64.c */
1083void ext2fs_free_generic_bmap(ext2fs_generic_bitmap bmap);
1084errcode_t ext2fs_alloc_generic_bmap(ext2_filsys fs, errcode_t magic,
1085				    int type, __u64 start, __u64 end,
1086				    __u64 real_end,
1087				    const char *descr,
1088				    ext2fs_generic_bitmap *ret);
1089errcode_t ext2fs_copy_generic_bmap(ext2fs_generic_bitmap src,
1090				   ext2fs_generic_bitmap *dest);
1091void ext2fs_clear_generic_bmap(ext2fs_generic_bitmap bitmap);
1092errcode_t ext2fs_fudge_generic_bmap_end(ext2fs_generic_bitmap bitmap,
1093					errcode_t neq,
1094					__u64 end, __u64 *oend);
1095void ext2fs_set_generic_bmap_padding(ext2fs_generic_bitmap bmap);
1096errcode_t ext2fs_resize_generic_bmap(ext2fs_generic_bitmap bmap,
1097				     __u64 new_end,
1098				     __u64 new_real_end);
1099errcode_t ext2fs_compare_generic_bmap(errcode_t neq,
1100				      ext2fs_generic_bitmap bm1,
1101				      ext2fs_generic_bitmap bm2);
1102errcode_t ext2fs_get_generic_bmap_range(ext2fs_generic_bitmap bmap,
1103					__u64 start, unsigned int num,
1104					void *out);
1105errcode_t ext2fs_set_generic_bmap_range(ext2fs_generic_bitmap bmap,
1106					__u64 start, unsigned int num,
1107					void *in);
1108
1109/* getsize.c */
1110extern errcode_t ext2fs_get_device_size(const char *file, int blocksize,
1111					blk_t *retblocks);
1112extern errcode_t ext2fs_get_device_size2(const char *file, int blocksize,
1113					blk64_t *retblocks);
1114
1115/* getsectsize.c */
1116errcode_t ext2fs_get_device_sectsize(const char *file, int *sectsize);
1117errcode_t ext2fs_get_device_phys_sectsize(const char *file, int *sectsize);
1118
1119/* i_block.c */
1120errcode_t ext2fs_iblk_add_blocks(ext2_filsys fs, struct ext2_inode *inode,
1121				 blk64_t num_blocks);
1122errcode_t ext2fs_iblk_sub_blocks(ext2_filsys fs, struct ext2_inode *inode,
1123				 blk64_t num_blocks);
1124errcode_t ext2fs_iblk_set(ext2_filsys fs, struct ext2_inode *inode, blk64_t b);
1125
1126/* imager.c */
1127extern errcode_t ext2fs_image_inode_write(ext2_filsys fs, int fd, int flags);
1128extern errcode_t ext2fs_image_inode_read(ext2_filsys fs, int fd, int flags);
1129extern errcode_t ext2fs_image_super_write(ext2_filsys fs, int fd, int flags);
1130extern errcode_t ext2fs_image_super_read(ext2_filsys fs, int fd, int flags);
1131extern errcode_t ext2fs_image_bitmap_write(ext2_filsys fs, int fd, int flags);
1132extern errcode_t ext2fs_image_bitmap_read(ext2_filsys fs, int fd, int flags);
1133
1134/* ind_block.c */
1135errcode_t ext2fs_read_ind_block(ext2_filsys fs, blk_t blk, void *buf);
1136errcode_t ext2fs_write_ind_block(ext2_filsys fs, blk_t blk, void *buf);
1137
1138/* initialize.c */
1139extern errcode_t ext2fs_initialize(const char *name, int flags,
1140				   struct ext2_super_block *param,
1141				   io_manager manager, ext2_filsys *ret_fs);
1142
1143/* icount.c */
1144extern void ext2fs_free_icount(ext2_icount_t icount);
1145extern errcode_t ext2fs_create_icount_tdb(ext2_filsys fs, char *tdb_dir,
1146					  int flags, ext2_icount_t *ret);
1147extern errcode_t ext2fs_create_icount2(ext2_filsys fs, int flags,
1148				       unsigned int size,
1149				       ext2_icount_t hint, ext2_icount_t *ret);
1150extern errcode_t ext2fs_create_icount(ext2_filsys fs, int flags,
1151				      unsigned int size,
1152				      ext2_icount_t *ret);
1153extern errcode_t ext2fs_icount_fetch(ext2_icount_t icount, ext2_ino_t ino,
1154				     __u16 *ret);
1155extern errcode_t ext2fs_icount_increment(ext2_icount_t icount, ext2_ino_t ino,
1156					 __u16 *ret);
1157extern errcode_t ext2fs_icount_decrement(ext2_icount_t icount, ext2_ino_t ino,
1158					 __u16 *ret);
1159extern errcode_t ext2fs_icount_store(ext2_icount_t icount, ext2_ino_t ino,
1160				     __u16 count);
1161extern ext2_ino_t ext2fs_get_icount_size(ext2_icount_t icount);
1162errcode_t ext2fs_icount_validate(ext2_icount_t icount, FILE *);
1163
1164/* inode.c */
1165extern errcode_t ext2fs_flush_icache(ext2_filsys fs);
1166extern errcode_t ext2fs_get_next_inode_full(ext2_inode_scan scan,
1167					    ext2_ino_t *ino,
1168					    struct ext2_inode *inode,
1169					    int bufsize);
1170extern errcode_t ext2fs_open_inode_scan(ext2_filsys fs, int buffer_blocks,
1171				  ext2_inode_scan *ret_scan);
1172extern void ext2fs_close_inode_scan(ext2_inode_scan scan);
1173extern errcode_t ext2fs_get_next_inode(ext2_inode_scan scan, ext2_ino_t *ino,
1174			       struct ext2_inode *inode);
1175extern errcode_t ext2fs_inode_scan_goto_blockgroup(ext2_inode_scan scan,
1176						   int	group);
1177extern void ext2fs_set_inode_callback
1178	(ext2_inode_scan scan,
1179	 errcode_t (*done_group)(ext2_filsys fs,
1180				 ext2_inode_scan scan,
1181				 dgrp_t group,
1182				 void * priv_data),
1183	 void *done_group_data);
1184extern int ext2fs_inode_scan_flags(ext2_inode_scan scan, int set_flags,
1185				   int clear_flags);
1186extern errcode_t ext2fs_read_inode_full(ext2_filsys fs, ext2_ino_t ino,
1187					struct ext2_inode * inode,
1188					int bufsize);
1189extern errcode_t ext2fs_read_inode (ext2_filsys fs, ext2_ino_t ino,
1190			    struct ext2_inode * inode);
1191extern errcode_t ext2fs_write_inode_full(ext2_filsys fs, ext2_ino_t ino,
1192					 struct ext2_inode * inode,
1193					 int bufsize);
1194extern errcode_t ext2fs_write_inode(ext2_filsys fs, ext2_ino_t ino,
1195			    struct ext2_inode * inode);
1196extern errcode_t ext2fs_write_new_inode(ext2_filsys fs, ext2_ino_t ino,
1197			    struct ext2_inode * inode);
1198extern errcode_t ext2fs_get_blocks(ext2_filsys fs, ext2_ino_t ino, blk_t *blocks);
1199extern errcode_t ext2fs_check_directory(ext2_filsys fs, ext2_ino_t ino);
1200
1201/* inode_io.c */
1202extern io_manager inode_io_manager;
1203extern errcode_t ext2fs_inode_io_intern(ext2_filsys fs, ext2_ino_t ino,
1204					char **name);
1205extern errcode_t ext2fs_inode_io_intern2(ext2_filsys fs, ext2_ino_t ino,
1206					 struct ext2_inode *inode,
1207					 char **name);
1208
1209/* ismounted.c */
1210extern errcode_t ext2fs_check_if_mounted(const char *file, int *mount_flags);
1211extern errcode_t ext2fs_check_mount_point(const char *device, int *mount_flags,
1212					  char *mtpt, int mtlen);
1213
1214/* punch.c */
1215extern errcode_t ext2fs_punch(ext2_filsys fs, ext2_ino_t ino,
1216			      struct ext2_inode *inode,
1217			      char *block_buf, blk64_t start,
1218			      blk64_t end);
1219
1220/* namei.c */
1221extern errcode_t ext2fs_lookup(ext2_filsys fs, ext2_ino_t dir, const char *name,
1222			 int namelen, char *buf, ext2_ino_t *inode);
1223extern errcode_t ext2fs_namei(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
1224			const char *name, ext2_ino_t *inode);
1225errcode_t ext2fs_namei_follow(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
1226			      const char *name, ext2_ino_t *inode);
1227extern errcode_t ext2fs_follow_link(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
1228			ext2_ino_t inode, ext2_ino_t *res_inode);
1229
1230/* native.c */
1231int ext2fs_native_flag(void);
1232
1233/* newdir.c */
1234extern errcode_t ext2fs_new_dir_block(ext2_filsys fs, ext2_ino_t dir_ino,
1235				ext2_ino_t parent_ino, char **block);
1236
1237/* mkdir.c */
1238extern errcode_t ext2fs_mkdir(ext2_filsys fs, ext2_ino_t parent, ext2_ino_t inum,
1239			      const char *name);
1240
1241/* mkjournal.c */
1242extern errcode_t ext2fs_zero_blocks(ext2_filsys fs, blk_t blk, int num,
1243				    blk_t *ret_blk, int *ret_count);
1244extern errcode_t ext2fs_zero_blocks2(ext2_filsys fs, blk64_t blk, int num,
1245				     blk64_t *ret_blk, int *ret_count);
1246extern errcode_t ext2fs_create_journal_superblock(ext2_filsys fs,
1247						  __u32 size, int flags,
1248						  char  **ret_jsb);
1249extern errcode_t ext2fs_add_journal_device(ext2_filsys fs,
1250					   ext2_filsys journal_dev);
1251extern errcode_t ext2fs_add_journal_inode(ext2_filsys fs, blk_t size,
1252					  int flags);
1253extern int ext2fs_default_journal_size(__u64 blocks);
1254
1255/* openfs.c */
1256extern errcode_t ext2fs_open(const char *name, int flags, int superblock,
1257			     unsigned int block_size, io_manager manager,
1258			     ext2_filsys *ret_fs);
1259extern errcode_t ext2fs_open2(const char *name, const char *io_options,
1260			      int flags, int superblock,
1261			      unsigned int block_size, io_manager manager,
1262			      ext2_filsys *ret_fs);
1263extern blk64_t ext2fs_descriptor_block_loc2(ext2_filsys fs,
1264					blk64_t group_block, dgrp_t i);
1265extern blk_t ext2fs_descriptor_block_loc(ext2_filsys fs, blk_t group_block,
1266					 dgrp_t i);
1267errcode_t ext2fs_get_data_io(ext2_filsys fs, io_channel *old_io);
1268errcode_t ext2fs_set_data_io(ext2_filsys fs, io_channel new_io);
1269errcode_t ext2fs_rewrite_to_io(ext2_filsys fs, io_channel new_io);
1270
1271/* get_pathname.c */
1272extern errcode_t ext2fs_get_pathname(ext2_filsys fs, ext2_ino_t dir, ext2_ino_t ino,
1273			       char **name);
1274
1275/* link.c */
1276errcode_t ext2fs_link(ext2_filsys fs, ext2_ino_t dir, const char *name,
1277		      ext2_ino_t ino, int flags);
1278errcode_t ext2fs_unlink(ext2_filsys fs, ext2_ino_t dir, const char *name,
1279			ext2_ino_t ino, int flags);
1280
1281/* read_bb.c */
1282extern errcode_t ext2fs_read_bb_inode(ext2_filsys fs,
1283				      ext2_badblocks_list *bb_list);
1284
1285/* read_bb_file.c */
1286extern errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f,
1287				      ext2_badblocks_list *bb_list,
1288				      void *priv_data,
1289				      void (*invalid)(ext2_filsys fs,
1290						      blk_t blk,
1291						      char *badstr,
1292						      void *priv_data));
1293extern errcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f,
1294				     ext2_badblocks_list *bb_list,
1295				     void (*invalid)(ext2_filsys fs,
1296						     blk_t blk));
1297
1298/* res_gdt.c */
1299extern errcode_t ext2fs_create_resize_inode(ext2_filsys fs);
1300
1301/* swapfs.c */
1302extern void ext2fs_swap_ext_attr(char *to, char *from, int bufsize,
1303				 int has_header);
1304extern void ext2fs_swap_ext_attr_header(struct ext2_ext_attr_header *to_header,
1305					struct ext2_ext_attr_header *from_hdr);
1306extern void ext2fs_swap_ext_attr_entry(struct ext2_ext_attr_entry *to_entry,
1307				       struct ext2_ext_attr_entry *from_entry);
1308extern void ext2fs_swap_super(struct ext2_super_block * super);
1309extern void ext2fs_swap_group_desc(struct ext2_group_desc *gdp);
1310extern void ext2fs_swap_group_desc2(ext2_filsys, struct ext2_group_desc *gdp);
1311extern void ext2fs_swap_inode_full(ext2_filsys fs, struct ext2_inode_large *t,
1312				   struct ext2_inode_large *f, int hostorder,
1313				   int bufsize);
1314extern void ext2fs_swap_inode(ext2_filsys fs,struct ext2_inode *t,
1315			      struct ext2_inode *f, int hostorder);
1316
1317/* valid_blk.c */
1318extern int ext2fs_inode_has_valid_blocks(struct ext2_inode *inode);
1319
1320/* version.c */
1321extern int ext2fs_parse_version_string(const char *ver_string);
1322extern int ext2fs_get_library_version(const char **ver_string,
1323				      const char **date_string);
1324
1325/* write_bb_file.c */
1326extern errcode_t ext2fs_write_bb_FILE(ext2_badblocks_list bb_list,
1327				      unsigned int flags,
1328				      FILE *f);
1329
1330
1331/* inline functions */
1332extern errcode_t ext2fs_get_mem(unsigned long size, void *ptr);
1333extern errcode_t ext2fs_get_array(unsigned long count, unsigned long size, void *ptr);
1334extern errcode_t ext2fs_free_mem(void *ptr);
1335extern errcode_t ext2fs_resize_mem(unsigned long old_size,
1336				   unsigned long size, void *ptr);
1337extern void ext2fs_mark_super_dirty(ext2_filsys fs);
1338extern void ext2fs_mark_changed(ext2_filsys fs);
1339extern int ext2fs_test_changed(ext2_filsys fs);
1340extern void ext2fs_mark_valid(ext2_filsys fs);
1341extern void ext2fs_unmark_valid(ext2_filsys fs);
1342extern int ext2fs_test_valid(ext2_filsys fs);
1343extern void ext2fs_mark_ib_dirty(ext2_filsys fs);
1344extern void ext2fs_mark_bb_dirty(ext2_filsys fs);
1345extern int ext2fs_test_ib_dirty(ext2_filsys fs);
1346extern int ext2fs_test_bb_dirty(ext2_filsys fs);
1347extern int ext2fs_group_of_blk(ext2_filsys fs, blk_t blk);
1348extern int ext2fs_group_of_ino(ext2_filsys fs, ext2_ino_t ino);
1349extern blk_t ext2fs_group_first_block(ext2_filsys fs, dgrp_t group);
1350extern blk_t ext2fs_group_last_block(ext2_filsys fs, dgrp_t group);
1351extern blk_t ext2fs_inode_data_blocks(ext2_filsys fs,
1352				      struct ext2_inode *inode);
1353extern unsigned int ext2fs_div_ceil(unsigned int a, unsigned int b);
1354extern __u64 ext2fs_div64_ceil(__u64 a, __u64 b);
1355
1356/*
1357 * The actual inlined functions definitions themselves...
1358 *
1359 * If NO_INLINE_FUNCS is defined, then we won't try to do inline
1360 * functions at all!
1361 */
1362#if (defined(INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS))
1363#ifdef INCLUDE_INLINE_FUNCS
1364#define _INLINE_ extern
1365#else
1366#ifdef __GNUC__
1367#define _INLINE_ extern __inline__
1368#else				/* For Watcom C */
1369#define _INLINE_ extern inline
1370#endif
1371#endif
1372
1373#ifndef EXT2_CUSTOM_MEMORY_ROUTINES
1374#include <string.h>
1375/*
1376 *  Allocate memory
1377 */
1378_INLINE_ errcode_t ext2fs_get_mem(unsigned long size, void *ptr)
1379{
1380	void *pp;
1381
1382	pp = malloc(size);
1383	if (!pp)
1384		return EXT2_ET_NO_MEMORY;
1385	memcpy(ptr, &pp, sizeof (pp));
1386	return 0;
1387}
1388
1389_INLINE_ errcode_t ext2fs_get_array(unsigned long count, unsigned long size, void *ptr)
1390{
1391	if (count && (-1UL)/count<size)
1392		return EXT2_ET_NO_MEMORY; //maybe define EXT2_ET_OVERFLOW ?
1393	return ext2fs_get_mem(count*size, ptr);
1394}
1395
1396/*
1397 * Free memory
1398 */
1399_INLINE_ errcode_t ext2fs_free_mem(void *ptr)
1400{
1401	void *p;
1402
1403	memcpy(&p, ptr, sizeof(p));
1404	free(p);
1405	p = 0;
1406	memcpy(ptr, &p, sizeof(p));
1407	return 0;
1408}
1409
1410/*
1411 *  Resize memory
1412 */
1413_INLINE_ errcode_t ext2fs_resize_mem(unsigned long EXT2FS_ATTR((unused)) old_size,
1414				     unsigned long size, void *ptr)
1415{
1416	void *p;
1417
1418	/* Use "memcpy" for pointer assignments here to avoid problems
1419	 * with C99 strict type aliasing rules. */
1420	memcpy(&p, ptr, sizeof(p));
1421	p = realloc(p, size);
1422	if (!p)
1423		return EXT2_ET_NO_MEMORY;
1424	memcpy(ptr, &p, sizeof(p));
1425	return 0;
1426}
1427#endif	/* Custom memory routines */
1428
1429/*
1430 * Mark a filesystem superblock as dirty
1431 */
1432_INLINE_ void ext2fs_mark_super_dirty(ext2_filsys fs)
1433{
1434	fs->flags |= EXT2_FLAG_DIRTY | EXT2_FLAG_CHANGED;
1435}
1436
1437/*
1438 * Mark a filesystem as changed
1439 */
1440_INLINE_ void ext2fs_mark_changed(ext2_filsys fs)
1441{
1442	fs->flags |= EXT2_FLAG_CHANGED;
1443}
1444
1445/*
1446 * Check to see if a filesystem has changed
1447 */
1448_INLINE_ int ext2fs_test_changed(ext2_filsys fs)
1449{
1450	return (fs->flags & EXT2_FLAG_CHANGED);
1451}
1452
1453/*
1454 * Mark a filesystem as valid
1455 */
1456_INLINE_ void ext2fs_mark_valid(ext2_filsys fs)
1457{
1458	fs->flags |= EXT2_FLAG_VALID;
1459}
1460
1461/*
1462 * Mark a filesystem as NOT valid
1463 */
1464_INLINE_ void ext2fs_unmark_valid(ext2_filsys fs)
1465{
1466	fs->flags &= ~EXT2_FLAG_VALID;
1467}
1468
1469/*
1470 * Check to see if a filesystem is valid
1471 */
1472_INLINE_ int ext2fs_test_valid(ext2_filsys fs)
1473{
1474	return (fs->flags & EXT2_FLAG_VALID);
1475}
1476
1477/*
1478 * Mark the inode bitmap as dirty
1479 */
1480_INLINE_ void ext2fs_mark_ib_dirty(ext2_filsys fs)
1481{
1482	fs->flags |= EXT2_FLAG_IB_DIRTY | EXT2_FLAG_CHANGED;
1483}
1484
1485/*
1486 * Mark the block bitmap as dirty
1487 */
1488_INLINE_ void ext2fs_mark_bb_dirty(ext2_filsys fs)
1489{
1490	fs->flags |= EXT2_FLAG_BB_DIRTY | EXT2_FLAG_CHANGED;
1491}
1492
1493/*
1494 * Check to see if a filesystem's inode bitmap is dirty
1495 */
1496_INLINE_ int ext2fs_test_ib_dirty(ext2_filsys fs)
1497{
1498	return (fs->flags & EXT2_FLAG_IB_DIRTY);
1499}
1500
1501/*
1502 * Check to see if a filesystem's block bitmap is dirty
1503 */
1504_INLINE_ int ext2fs_test_bb_dirty(ext2_filsys fs)
1505{
1506	return (fs->flags & EXT2_FLAG_BB_DIRTY);
1507}
1508
1509/*
1510 * Return the group # of a block
1511 */
1512_INLINE_ int ext2fs_group_of_blk(ext2_filsys fs, blk_t blk)
1513{
1514	return ext2fs_group_of_blk2(fs, blk);
1515}
1516/*
1517 * Return the group # of an inode number
1518 */
1519_INLINE_ int ext2fs_group_of_ino(ext2_filsys fs, ext2_ino_t ino)
1520{
1521	return (ino - 1) / fs->super->s_inodes_per_group;
1522}
1523
1524/*
1525 * Return the first block (inclusive) in a group
1526 */
1527_INLINE_ blk_t ext2fs_group_first_block(ext2_filsys fs, dgrp_t group)
1528{
1529	return ext2fs_group_first_block2(fs, group);
1530}
1531
1532/*
1533 * Return the last block (inclusive) in a group
1534 */
1535_INLINE_ blk_t ext2fs_group_last_block(ext2_filsys fs, dgrp_t group)
1536{
1537	return ext2fs_group_last_block2(fs, group);
1538}
1539
1540_INLINE_ blk_t ext2fs_inode_data_blocks(ext2_filsys fs,
1541					struct ext2_inode *inode)
1542{
1543	return ext2fs_inode_data_blocks2(fs, inode);
1544}
1545
1546/*
1547 * This is an efficient, overflow safe way of calculating ceil((1.0 * a) / b)
1548 */
1549_INLINE_ unsigned int ext2fs_div_ceil(unsigned int a, unsigned int b)
1550{
1551	if (!a)
1552		return 0;
1553	return ((a - 1) / b) + 1;
1554}
1555
1556_INLINE_ __u64 ext2fs_div64_ceil(__u64 a, __u64 b)
1557{
1558	if (!a)
1559		return 0;
1560	return ((a - 1) / b) + 1;
1561}
1562
1563#undef _INLINE_
1564#endif
1565
1566#ifdef __cplusplus
1567}
1568#endif
1569
1570#endif /* _EXT2FS_EXT2FS_H */
1571