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