ext2fs.h revision 3adb9374fb92736e393ad64f751073b19927ec0e
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);
1017extern errcode_t ext2fs_file_close(ext2_file_t file);
1018extern errcode_t ext2fs_file_flush(ext2_file_t file);
1019extern errcode_t ext2fs_file_read(ext2_file_t file, void *buf,
1020				  unsigned int wanted, unsigned int *got);
1021extern errcode_t ext2fs_file_write(ext2_file_t file, const void *buf,
1022				   unsigned int nbytes, unsigned int *written);
1023extern errcode_t ext2fs_file_llseek(ext2_file_t file, __u64 offset,
1024				   int whence, __u64 *ret_pos);
1025extern errcode_t ext2fs_file_lseek(ext2_file_t file, ext2_off_t offset,
1026				   int whence, ext2_off_t *ret_pos);
1027errcode_t ext2fs_file_get_lsize(ext2_file_t file, __u64 *ret_size);
1028extern ext2_off_t ext2fs_file_get_size(ext2_file_t file);
1029extern errcode_t ext2fs_file_set_size(ext2_file_t file, ext2_off_t size);
1030
1031/* finddev.c */
1032extern char *ext2fs_find_block_device(dev_t device);
1033
1034/* flushb.c */
1035extern errcode_t ext2fs_sync_device(int fd, int flushb);
1036
1037/* freefs.c */
1038extern void ext2fs_free(ext2_filsys fs);
1039extern void ext2fs_free_dblist(ext2_dblist dblist);
1040extern void ext2fs_badblocks_list_free(ext2_badblocks_list bb);
1041extern void ext2fs_u32_list_free(ext2_u32_list bb);
1042
1043/* gen_bitmap.c */
1044extern void ext2fs_free_generic_bitmap(ext2fs_inode_bitmap bitmap);
1045extern errcode_t ext2fs_make_generic_bitmap(errcode_t magic, ext2_filsys fs,
1046					    __u32 start, __u32 end,
1047					    __u32 real_end,
1048					    const char *descr, char *init_map,
1049					    ext2fs_generic_bitmap *ret);
1050extern errcode_t ext2fs_allocate_generic_bitmap(__u32 start,
1051						__u32 end,
1052						__u32 real_end,
1053						const char *descr,
1054						ext2fs_generic_bitmap *ret);
1055extern errcode_t ext2fs_copy_generic_bitmap(ext2fs_generic_bitmap src,
1056					    ext2fs_generic_bitmap *dest);
1057extern void ext2fs_clear_generic_bitmap(ext2fs_generic_bitmap bitmap);
1058extern errcode_t ext2fs_fudge_generic_bitmap_end(ext2fs_inode_bitmap bitmap,
1059						 errcode_t magic,
1060						 errcode_t neq,
1061						 ext2_ino_t end,
1062						 ext2_ino_t *oend);
1063extern void ext2fs_set_generic_bitmap_padding(ext2fs_generic_bitmap map);
1064extern errcode_t ext2fs_resize_generic_bitmap(errcode_t magic,
1065					      __u32 new_end,
1066					      __u32 new_real_end,
1067					      ext2fs_generic_bitmap bmap);
1068extern errcode_t ext2fs_compare_generic_bitmap(errcode_t magic, errcode_t neq,
1069					       ext2fs_generic_bitmap bm1,
1070					       ext2fs_generic_bitmap bm2);
1071extern errcode_t ext2fs_get_generic_bitmap_range(ext2fs_generic_bitmap bmap,
1072						 errcode_t magic,
1073						 __u32 start, __u32 num,
1074						 void *out);
1075extern errcode_t ext2fs_set_generic_bitmap_range(ext2fs_generic_bitmap bmap,
1076						 errcode_t magic,
1077						 __u32 start, __u32 num,
1078						 void *in);
1079
1080/* gen_bitmap64.c */
1081void ext2fs_free_generic_bmap(ext2fs_generic_bitmap bmap);
1082errcode_t ext2fs_alloc_generic_bmap(ext2_filsys fs, errcode_t magic,
1083				    int type, __u64 start, __u64 end,
1084				    __u64 real_end,
1085				    const char *descr,
1086				    ext2fs_generic_bitmap *ret);
1087errcode_t ext2fs_copy_generic_bmap(ext2fs_generic_bitmap src,
1088				   ext2fs_generic_bitmap *dest);
1089void ext2fs_clear_generic_bmap(ext2fs_generic_bitmap bitmap);
1090errcode_t ext2fs_fudge_generic_bmap_end(ext2fs_generic_bitmap bitmap,
1091					errcode_t neq,
1092					__u64 end, __u64 *oend);
1093void ext2fs_set_generic_bmap_padding(ext2fs_generic_bitmap bmap);
1094errcode_t ext2fs_resize_generic_bmap(ext2fs_generic_bitmap bmap,
1095				     __u64 new_end,
1096				     __u64 new_real_end);
1097errcode_t ext2fs_compare_generic_bmap(errcode_t neq,
1098				      ext2fs_generic_bitmap bm1,
1099				      ext2fs_generic_bitmap bm2);
1100errcode_t ext2fs_get_generic_bmap_range(ext2fs_generic_bitmap bmap,
1101					__u64 start, unsigned int num,
1102					void *out);
1103errcode_t ext2fs_set_generic_bmap_range(ext2fs_generic_bitmap bmap,
1104					__u64 start, unsigned int num,
1105					void *in);
1106
1107/* getsize.c */
1108extern errcode_t ext2fs_get_device_size(const char *file, int blocksize,
1109					blk_t *retblocks);
1110extern errcode_t ext2fs_get_device_size2(const char *file, int blocksize,
1111					blk64_t *retblocks);
1112
1113/* getsectsize.c */
1114errcode_t ext2fs_get_device_sectsize(const char *file, int *sectsize);
1115errcode_t ext2fs_get_device_phys_sectsize(const char *file, int *sectsize);
1116
1117/* i_block.c */
1118errcode_t ext2fs_iblk_add_blocks(ext2_filsys fs, struct ext2_inode *inode,
1119				 blk64_t num_blocks);
1120errcode_t ext2fs_iblk_sub_blocks(ext2_filsys fs, struct ext2_inode *inode,
1121				 blk64_t num_blocks);
1122errcode_t ext2fs_iblk_set(ext2_filsys fs, struct ext2_inode *inode, blk64_t b);
1123
1124/* imager.c */
1125extern errcode_t ext2fs_image_inode_write(ext2_filsys fs, int fd, int flags);
1126extern errcode_t ext2fs_image_inode_read(ext2_filsys fs, int fd, int flags);
1127extern errcode_t ext2fs_image_super_write(ext2_filsys fs, int fd, int flags);
1128extern errcode_t ext2fs_image_super_read(ext2_filsys fs, int fd, int flags);
1129extern errcode_t ext2fs_image_bitmap_write(ext2_filsys fs, int fd, int flags);
1130extern errcode_t ext2fs_image_bitmap_read(ext2_filsys fs, int fd, int flags);
1131
1132/* ind_block.c */
1133errcode_t ext2fs_read_ind_block(ext2_filsys fs, blk_t blk, void *buf);
1134errcode_t ext2fs_write_ind_block(ext2_filsys fs, blk_t blk, void *buf);
1135
1136/* initialize.c */
1137extern errcode_t ext2fs_initialize(const char *name, int flags,
1138				   struct ext2_super_block *param,
1139				   io_manager manager, ext2_filsys *ret_fs);
1140
1141/* icount.c */
1142extern void ext2fs_free_icount(ext2_icount_t icount);
1143extern errcode_t ext2fs_create_icount_tdb(ext2_filsys fs, char *tdb_dir,
1144					  int flags, ext2_icount_t *ret);
1145extern errcode_t ext2fs_create_icount2(ext2_filsys fs, int flags,
1146				       unsigned int size,
1147				       ext2_icount_t hint, ext2_icount_t *ret);
1148extern errcode_t ext2fs_create_icount(ext2_filsys fs, int flags,
1149				      unsigned int size,
1150				      ext2_icount_t *ret);
1151extern errcode_t ext2fs_icount_fetch(ext2_icount_t icount, ext2_ino_t ino,
1152				     __u16 *ret);
1153extern errcode_t ext2fs_icount_increment(ext2_icount_t icount, ext2_ino_t ino,
1154					 __u16 *ret);
1155extern errcode_t ext2fs_icount_decrement(ext2_icount_t icount, ext2_ino_t ino,
1156					 __u16 *ret);
1157extern errcode_t ext2fs_icount_store(ext2_icount_t icount, ext2_ino_t ino,
1158				     __u16 count);
1159extern ext2_ino_t ext2fs_get_icount_size(ext2_icount_t icount);
1160errcode_t ext2fs_icount_validate(ext2_icount_t icount, FILE *);
1161
1162/* inode.c */
1163extern errcode_t ext2fs_flush_icache(ext2_filsys fs);
1164extern errcode_t ext2fs_get_next_inode_full(ext2_inode_scan scan,
1165					    ext2_ino_t *ino,
1166					    struct ext2_inode *inode,
1167					    int bufsize);
1168extern errcode_t ext2fs_open_inode_scan(ext2_filsys fs, int buffer_blocks,
1169				  ext2_inode_scan *ret_scan);
1170extern void ext2fs_close_inode_scan(ext2_inode_scan scan);
1171extern errcode_t ext2fs_get_next_inode(ext2_inode_scan scan, ext2_ino_t *ino,
1172			       struct ext2_inode *inode);
1173extern errcode_t ext2fs_inode_scan_goto_blockgroup(ext2_inode_scan scan,
1174						   int	group);
1175extern void ext2fs_set_inode_callback
1176	(ext2_inode_scan scan,
1177	 errcode_t (*done_group)(ext2_filsys fs,
1178				 ext2_inode_scan scan,
1179				 dgrp_t group,
1180				 void * priv_data),
1181	 void *done_group_data);
1182extern int ext2fs_inode_scan_flags(ext2_inode_scan scan, int set_flags,
1183				   int clear_flags);
1184extern errcode_t ext2fs_read_inode_full(ext2_filsys fs, ext2_ino_t ino,
1185					struct ext2_inode * inode,
1186					int bufsize);
1187extern errcode_t ext2fs_read_inode (ext2_filsys fs, ext2_ino_t ino,
1188			    struct ext2_inode * inode);
1189extern errcode_t ext2fs_write_inode_full(ext2_filsys fs, ext2_ino_t ino,
1190					 struct ext2_inode * inode,
1191					 int bufsize);
1192extern errcode_t ext2fs_write_inode(ext2_filsys fs, ext2_ino_t ino,
1193			    struct ext2_inode * inode);
1194extern errcode_t ext2fs_write_new_inode(ext2_filsys fs, ext2_ino_t ino,
1195			    struct ext2_inode * inode);
1196extern errcode_t ext2fs_get_blocks(ext2_filsys fs, ext2_ino_t ino, blk_t *blocks);
1197extern errcode_t ext2fs_check_directory(ext2_filsys fs, ext2_ino_t ino);
1198
1199/* inode_io.c */
1200extern io_manager inode_io_manager;
1201extern errcode_t ext2fs_inode_io_intern(ext2_filsys fs, ext2_ino_t ino,
1202					char **name);
1203extern errcode_t ext2fs_inode_io_intern2(ext2_filsys fs, ext2_ino_t ino,
1204					 struct ext2_inode *inode,
1205					 char **name);
1206
1207/* ismounted.c */
1208extern errcode_t ext2fs_check_if_mounted(const char *file, int *mount_flags);
1209extern errcode_t ext2fs_check_mount_point(const char *device, int *mount_flags,
1210					  char *mtpt, int mtlen);
1211
1212/* punch.c */
1213extern errcode_t ext2fs_punch(ext2_filsys fs, ext2_ino_t ino,
1214			      struct ext2_inode *inode,
1215			      char *block_buf, blk64_t start,
1216			      blk64_t end);
1217
1218/* namei.c */
1219extern errcode_t ext2fs_lookup(ext2_filsys fs, ext2_ino_t dir, const char *name,
1220			 int namelen, char *buf, ext2_ino_t *inode);
1221extern errcode_t ext2fs_namei(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
1222			const char *name, ext2_ino_t *inode);
1223errcode_t ext2fs_namei_follow(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
1224			      const char *name, ext2_ino_t *inode);
1225extern errcode_t ext2fs_follow_link(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
1226			ext2_ino_t inode, ext2_ino_t *res_inode);
1227
1228/* native.c */
1229int ext2fs_native_flag(void);
1230
1231/* newdir.c */
1232extern errcode_t ext2fs_new_dir_block(ext2_filsys fs, ext2_ino_t dir_ino,
1233				ext2_ino_t parent_ino, char **block);
1234
1235/* mkdir.c */
1236extern errcode_t ext2fs_mkdir(ext2_filsys fs, ext2_ino_t parent, ext2_ino_t inum,
1237			      const char *name);
1238
1239/* mkjournal.c */
1240extern errcode_t ext2fs_zero_blocks(ext2_filsys fs, blk_t blk, int num,
1241				    blk_t *ret_blk, int *ret_count);
1242extern errcode_t ext2fs_zero_blocks2(ext2_filsys fs, blk64_t blk, int num,
1243				     blk64_t *ret_blk, int *ret_count);
1244extern errcode_t ext2fs_create_journal_superblock(ext2_filsys fs,
1245						  __u32 size, int flags,
1246						  char  **ret_jsb);
1247extern errcode_t ext2fs_add_journal_device(ext2_filsys fs,
1248					   ext2_filsys journal_dev);
1249extern errcode_t ext2fs_add_journal_inode(ext2_filsys fs, blk_t size,
1250					  int flags);
1251extern int ext2fs_default_journal_size(__u64 blocks);
1252
1253/* openfs.c */
1254extern errcode_t ext2fs_open(const char *name, int flags, int superblock,
1255			     unsigned int block_size, io_manager manager,
1256			     ext2_filsys *ret_fs);
1257extern errcode_t ext2fs_open2(const char *name, const char *io_options,
1258			      int flags, int superblock,
1259			      unsigned int block_size, io_manager manager,
1260			      ext2_filsys *ret_fs);
1261extern blk64_t ext2fs_descriptor_block_loc2(ext2_filsys fs,
1262					blk64_t group_block, dgrp_t i);
1263extern blk_t ext2fs_descriptor_block_loc(ext2_filsys fs, blk_t group_block,
1264					 dgrp_t i);
1265errcode_t ext2fs_get_data_io(ext2_filsys fs, io_channel *old_io);
1266errcode_t ext2fs_set_data_io(ext2_filsys fs, io_channel new_io);
1267errcode_t ext2fs_rewrite_to_io(ext2_filsys fs, io_channel new_io);
1268
1269/* get_pathname.c */
1270extern errcode_t ext2fs_get_pathname(ext2_filsys fs, ext2_ino_t dir, ext2_ino_t ino,
1271			       char **name);
1272
1273/* link.c */
1274errcode_t ext2fs_link(ext2_filsys fs, ext2_ino_t dir, const char *name,
1275		      ext2_ino_t ino, int flags);
1276errcode_t ext2fs_unlink(ext2_filsys fs, ext2_ino_t dir, const char *name,
1277			ext2_ino_t ino, int flags);
1278
1279/* read_bb.c */
1280extern errcode_t ext2fs_read_bb_inode(ext2_filsys fs,
1281				      ext2_badblocks_list *bb_list);
1282
1283/* read_bb_file.c */
1284extern errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f,
1285				      ext2_badblocks_list *bb_list,
1286				      void *priv_data,
1287				      void (*invalid)(ext2_filsys fs,
1288						      blk_t blk,
1289						      char *badstr,
1290						      void *priv_data));
1291extern errcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f,
1292				     ext2_badblocks_list *bb_list,
1293				     void (*invalid)(ext2_filsys fs,
1294						     blk_t blk));
1295
1296/* res_gdt.c */
1297extern errcode_t ext2fs_create_resize_inode(ext2_filsys fs);
1298
1299/* swapfs.c */
1300extern void ext2fs_swap_ext_attr(char *to, char *from, int bufsize,
1301				 int has_header);
1302extern void ext2fs_swap_ext_attr_header(struct ext2_ext_attr_header *to_header,
1303					struct ext2_ext_attr_header *from_hdr);
1304extern void ext2fs_swap_ext_attr_entry(struct ext2_ext_attr_entry *to_entry,
1305				       struct ext2_ext_attr_entry *from_entry);
1306extern void ext2fs_swap_super(struct ext2_super_block * super);
1307extern void ext2fs_swap_group_desc(struct ext2_group_desc *gdp);
1308extern void ext2fs_swap_group_desc2(ext2_filsys, struct ext2_group_desc *gdp);
1309extern void ext2fs_swap_inode_full(ext2_filsys fs, struct ext2_inode_large *t,
1310				   struct ext2_inode_large *f, int hostorder,
1311				   int bufsize);
1312extern void ext2fs_swap_inode(ext2_filsys fs,struct ext2_inode *t,
1313			      struct ext2_inode *f, int hostorder);
1314
1315/* valid_blk.c */
1316extern int ext2fs_inode_has_valid_blocks(struct ext2_inode *inode);
1317
1318/* version.c */
1319extern int ext2fs_parse_version_string(const char *ver_string);
1320extern int ext2fs_get_library_version(const char **ver_string,
1321				      const char **date_string);
1322
1323/* write_bb_file.c */
1324extern errcode_t ext2fs_write_bb_FILE(ext2_badblocks_list bb_list,
1325				      unsigned int flags,
1326				      FILE *f);
1327
1328
1329/* inline functions */
1330extern errcode_t ext2fs_get_mem(unsigned long size, void *ptr);
1331extern errcode_t ext2fs_get_array(unsigned long count, unsigned long size, void *ptr);
1332extern errcode_t ext2fs_free_mem(void *ptr);
1333extern errcode_t ext2fs_resize_mem(unsigned long old_size,
1334				   unsigned long size, void *ptr);
1335extern void ext2fs_mark_super_dirty(ext2_filsys fs);
1336extern void ext2fs_mark_changed(ext2_filsys fs);
1337extern int ext2fs_test_changed(ext2_filsys fs);
1338extern void ext2fs_mark_valid(ext2_filsys fs);
1339extern void ext2fs_unmark_valid(ext2_filsys fs);
1340extern int ext2fs_test_valid(ext2_filsys fs);
1341extern void ext2fs_mark_ib_dirty(ext2_filsys fs);
1342extern void ext2fs_mark_bb_dirty(ext2_filsys fs);
1343extern int ext2fs_test_ib_dirty(ext2_filsys fs);
1344extern int ext2fs_test_bb_dirty(ext2_filsys fs);
1345extern int ext2fs_group_of_blk(ext2_filsys fs, blk_t blk);
1346extern int ext2fs_group_of_ino(ext2_filsys fs, ext2_ino_t ino);
1347extern blk_t ext2fs_group_first_block(ext2_filsys fs, dgrp_t group);
1348extern blk_t ext2fs_group_last_block(ext2_filsys fs, dgrp_t group);
1349extern blk_t ext2fs_inode_data_blocks(ext2_filsys fs,
1350				      struct ext2_inode *inode);
1351extern unsigned int ext2fs_div_ceil(unsigned int a, unsigned int b);
1352extern __u64 ext2fs_div64_ceil(__u64 a, __u64 b);
1353
1354/*
1355 * The actual inlined functions definitions themselves...
1356 *
1357 * If NO_INLINE_FUNCS is defined, then we won't try to do inline
1358 * functions at all!
1359 */
1360#if (defined(INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS))
1361#ifdef INCLUDE_INLINE_FUNCS
1362#define _INLINE_ extern
1363#else
1364#ifdef __GNUC__
1365#define _INLINE_ extern __inline__
1366#else				/* For Watcom C */
1367#define _INLINE_ extern inline
1368#endif
1369#endif
1370
1371#ifndef EXT2_CUSTOM_MEMORY_ROUTINES
1372#include <string.h>
1373/*
1374 *  Allocate memory
1375 */
1376_INLINE_ errcode_t ext2fs_get_mem(unsigned long size, void *ptr)
1377{
1378	void *pp;
1379
1380	pp = malloc(size);
1381	if (!pp)
1382		return EXT2_ET_NO_MEMORY;
1383	memcpy(ptr, &pp, sizeof (pp));
1384	return 0;
1385}
1386
1387_INLINE_ errcode_t ext2fs_get_array(unsigned long count, unsigned long size, void *ptr)
1388{
1389	if (count && (-1UL)/count<size)
1390		return EXT2_ET_NO_MEMORY; //maybe define EXT2_ET_OVERFLOW ?
1391	return ext2fs_get_mem(count*size, ptr);
1392}
1393
1394/*
1395 * Free memory
1396 */
1397_INLINE_ errcode_t ext2fs_free_mem(void *ptr)
1398{
1399	void *p;
1400
1401	memcpy(&p, ptr, sizeof(p));
1402	free(p);
1403	p = 0;
1404	memcpy(ptr, &p, sizeof(p));
1405	return 0;
1406}
1407
1408/*
1409 *  Resize memory
1410 */
1411_INLINE_ errcode_t ext2fs_resize_mem(unsigned long EXT2FS_ATTR((unused)) old_size,
1412				     unsigned long size, void *ptr)
1413{
1414	void *p;
1415
1416	/* Use "memcpy" for pointer assignments here to avoid problems
1417	 * with C99 strict type aliasing rules. */
1418	memcpy(&p, ptr, sizeof(p));
1419	p = realloc(p, size);
1420	if (!p)
1421		return EXT2_ET_NO_MEMORY;
1422	memcpy(ptr, &p, sizeof(p));
1423	return 0;
1424}
1425#endif	/* Custom memory routines */
1426
1427/*
1428 * Mark a filesystem superblock as dirty
1429 */
1430_INLINE_ void ext2fs_mark_super_dirty(ext2_filsys fs)
1431{
1432	fs->flags |= EXT2_FLAG_DIRTY | EXT2_FLAG_CHANGED;
1433}
1434
1435/*
1436 * Mark a filesystem as changed
1437 */
1438_INLINE_ void ext2fs_mark_changed(ext2_filsys fs)
1439{
1440	fs->flags |= EXT2_FLAG_CHANGED;
1441}
1442
1443/*
1444 * Check to see if a filesystem has changed
1445 */
1446_INLINE_ int ext2fs_test_changed(ext2_filsys fs)
1447{
1448	return (fs->flags & EXT2_FLAG_CHANGED);
1449}
1450
1451/*
1452 * Mark a filesystem as valid
1453 */
1454_INLINE_ void ext2fs_mark_valid(ext2_filsys fs)
1455{
1456	fs->flags |= EXT2_FLAG_VALID;
1457}
1458
1459/*
1460 * Mark a filesystem as NOT valid
1461 */
1462_INLINE_ void ext2fs_unmark_valid(ext2_filsys fs)
1463{
1464	fs->flags &= ~EXT2_FLAG_VALID;
1465}
1466
1467/*
1468 * Check to see if a filesystem is valid
1469 */
1470_INLINE_ int ext2fs_test_valid(ext2_filsys fs)
1471{
1472	return (fs->flags & EXT2_FLAG_VALID);
1473}
1474
1475/*
1476 * Mark the inode bitmap as dirty
1477 */
1478_INLINE_ void ext2fs_mark_ib_dirty(ext2_filsys fs)
1479{
1480	fs->flags |= EXT2_FLAG_IB_DIRTY | EXT2_FLAG_CHANGED;
1481}
1482
1483/*
1484 * Mark the block bitmap as dirty
1485 */
1486_INLINE_ void ext2fs_mark_bb_dirty(ext2_filsys fs)
1487{
1488	fs->flags |= EXT2_FLAG_BB_DIRTY | EXT2_FLAG_CHANGED;
1489}
1490
1491/*
1492 * Check to see if a filesystem's inode bitmap is dirty
1493 */
1494_INLINE_ int ext2fs_test_ib_dirty(ext2_filsys fs)
1495{
1496	return (fs->flags & EXT2_FLAG_IB_DIRTY);
1497}
1498
1499/*
1500 * Check to see if a filesystem's block bitmap is dirty
1501 */
1502_INLINE_ int ext2fs_test_bb_dirty(ext2_filsys fs)
1503{
1504	return (fs->flags & EXT2_FLAG_BB_DIRTY);
1505}
1506
1507/*
1508 * Return the group # of a block
1509 */
1510_INLINE_ int ext2fs_group_of_blk(ext2_filsys fs, blk_t blk)
1511{
1512	return ext2fs_group_of_blk2(fs, blk);
1513}
1514/*
1515 * Return the group # of an inode number
1516 */
1517_INLINE_ int ext2fs_group_of_ino(ext2_filsys fs, ext2_ino_t ino)
1518{
1519	return (ino - 1) / fs->super->s_inodes_per_group;
1520}
1521
1522/*
1523 * Return the first block (inclusive) in a group
1524 */
1525_INLINE_ blk_t ext2fs_group_first_block(ext2_filsys fs, dgrp_t group)
1526{
1527	return ext2fs_group_first_block2(fs, group);
1528}
1529
1530/*
1531 * Return the last block (inclusive) in a group
1532 */
1533_INLINE_ blk_t ext2fs_group_last_block(ext2_filsys fs, dgrp_t group)
1534{
1535	return ext2fs_group_last_block2(fs, group);
1536}
1537
1538_INLINE_ blk_t ext2fs_inode_data_blocks(ext2_filsys fs,
1539					struct ext2_inode *inode)
1540{
1541	return ext2fs_inode_data_blocks2(fs, inode);
1542}
1543
1544/*
1545 * This is an efficient, overflow safe way of calculating ceil((1.0 * a) / b)
1546 */
1547_INLINE_ unsigned int ext2fs_div_ceil(unsigned int a, unsigned int b)
1548{
1549	if (!a)
1550		return 0;
1551	return ((a - 1) / b) + 1;
1552}
1553
1554_INLINE_ __u64 ext2fs_div64_ceil(__u64 a, __u64 b)
1555{
1556	if (!a)
1557		return 0;
1558	return ((a - 1) / b) + 1;
1559}
1560
1561#undef _INLINE_
1562#endif
1563
1564#ifdef __cplusplus
1565}
1566#endif
1567
1568#endif /* _EXT2FS_EXT2FS_H */
1569