ext2fs.h revision 98f4547198b369bef7e41eb7ce4a16855726c393
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#define EXT2_MKJOURNAL_V1_SUPER	0x0000001 /* create V1 superblock (deprecated) */
209#define EXT2_MKJOURNAL_LAZYINIT	0x0000002 /* don't zero journal inode before use*/
210
211struct opaque_ext2_group_desc;
212
213struct struct_ext2_filsys {
214	errcode_t			magic;
215	io_channel			io;
216	int				flags;
217	char *				device_name;
218	struct ext2_super_block	* 	super;
219	unsigned int			blocksize;
220	int				fragsize;
221	dgrp_t				group_desc_count;
222	unsigned long			desc_blocks;
223	struct opaque_ext2_group_desc *	group_desc;
224	unsigned int			inode_blocks_per_group;
225	ext2fs_inode_bitmap		inode_map;
226	ext2fs_block_bitmap		block_map;
227	/* XXX FIXME-64: not 64-bit safe, but not used? */
228	errcode_t (*get_blocks)(ext2_filsys fs, ext2_ino_t ino, blk_t *blocks);
229	errcode_t (*check_directory)(ext2_filsys fs, ext2_ino_t ino);
230	errcode_t (*write_bitmaps)(ext2_filsys fs);
231	errcode_t (*read_inode)(ext2_filsys fs, ext2_ino_t ino,
232				struct ext2_inode *inode);
233	errcode_t (*write_inode)(ext2_filsys fs, ext2_ino_t ino,
234				struct ext2_inode *inode);
235	ext2_badblocks_list		badblocks;
236	ext2_dblist			dblist;
237	__u32				stride;	/* for mke2fs */
238	struct ext2_super_block *	orig_super;
239	struct ext2_image_hdr *		image_header;
240	__u32				umask;
241	time_t				now;
242	int				cluster_ratio_bits;
243	/*
244	 * Reserved for future expansion
245	 */
246	__u32				reserved[6];
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					 EXT4_FEATURE_RO_COMPAT_QUOTA)
570
571/*
572 * These features are only allowed if EXT2_FLAG_SOFTSUPP_FEATURES is passed
573 * to ext2fs_openfs()
574 */
575#define EXT2_LIB_SOFTSUPP_INCOMPAT	(0)
576#define EXT2_LIB_SOFTSUPP_RO_COMPAT	(EXT4_FEATURE_RO_COMPAT_BIGALLOC)
577
578
579/* Translate a block number to a cluster number */
580#define EXT2FS_CLUSTER_RATIO(fs)	(1 << (fs)->cluster_ratio_bits)
581#define EXT2FS_CLUSTER_MASK(fs)		(EXT2FS_CLUSTER_RATIO(fs) - 1)
582#define EXT2FS_B2C(fs, blk)		((blk) >> (fs)->cluster_ratio_bits)
583/* Translate a cluster number to a block number */
584#define EXT2FS_C2B(fs, cluster)		((cluster) << (fs)->cluster_ratio_bits)
585/* Translate # of blks to # of clusters */
586#define EXT2FS_NUM_B2C(fs, blks)	(((blks) + EXT2FS_CLUSTER_MASK(fs)) >> \
587					 (fs)->cluster_ratio_bits)
588
589#ifdef HAVE_OPEN64
590typedef struct stat64 ext2fs_struct_stat;
591#else
592typedef struct stat ext2fs_struct_stat;
593#endif
594
595/*
596 * function prototypes
597 */
598
599/* alloc.c */
600extern errcode_t ext2fs_new_inode(ext2_filsys fs, ext2_ino_t dir, int mode,
601				  ext2fs_inode_bitmap map, ext2_ino_t *ret);
602extern errcode_t ext2fs_new_block(ext2_filsys fs, blk_t goal,
603				  ext2fs_block_bitmap map, blk_t *ret);
604extern errcode_t ext2fs_new_block2(ext2_filsys fs, blk64_t goal,
605				   ext2fs_block_bitmap map, blk64_t *ret);
606extern errcode_t ext2fs_get_free_blocks(ext2_filsys fs, blk_t start,
607					blk_t finish, int num,
608					ext2fs_block_bitmap map,
609					blk_t *ret);
610extern errcode_t ext2fs_get_free_blocks2(ext2_filsys fs, blk64_t start,
611					 blk64_t finish, int num,
612					 ext2fs_block_bitmap map,
613					 blk64_t *ret);
614extern errcode_t ext2fs_alloc_block(ext2_filsys fs, blk_t goal,
615				    char *block_buf, blk_t *ret);
616extern errcode_t ext2fs_alloc_block2(ext2_filsys fs, blk64_t goal,
617				     char *block_buf, blk64_t *ret);
618extern void ext2fs_set_alloc_block_callback(ext2_filsys fs,
619					    errcode_t (*func)(ext2_filsys fs,
620							      blk64_t goal,
621							      blk64_t *ret),
622					    errcode_t (**old)(ext2_filsys fs,
623							      blk64_t goal,
624							      blk64_t *ret));
625
626/* alloc_sb.c */
627extern int ext2fs_reserve_super_and_bgd(ext2_filsys fs,
628					dgrp_t group,
629					ext2fs_block_bitmap bmap);
630extern void ext2fs_set_block_alloc_stats_callback(ext2_filsys fs,
631						  void (*func)(ext2_filsys fs,
632							       blk64_t blk,
633							       int inuse),
634						  void (**old)(ext2_filsys fs,
635							       blk64_t blk,
636							       int inuse));
637
638/* alloc_stats.c */
639void ext2fs_inode_alloc_stats(ext2_filsys fs, ext2_ino_t ino, int inuse);
640void ext2fs_inode_alloc_stats2(ext2_filsys fs, ext2_ino_t ino,
641			       int inuse, int isdir);
642void ext2fs_block_alloc_stats(ext2_filsys fs, blk_t blk, int inuse);
643void ext2fs_block_alloc_stats2(ext2_filsys fs, blk64_t blk, int inuse);
644
645/* alloc_tables.c */
646extern errcode_t ext2fs_allocate_tables(ext2_filsys fs);
647extern errcode_t ext2fs_allocate_group_table(ext2_filsys fs, dgrp_t group,
648					     ext2fs_block_bitmap bmap);
649
650/* badblocks.c */
651extern errcode_t ext2fs_u32_list_create(ext2_u32_list *ret, int size);
652extern errcode_t ext2fs_u32_list_add(ext2_u32_list bb, __u32 blk);
653extern int ext2fs_u32_list_find(ext2_u32_list bb, __u32 blk);
654extern int ext2fs_u32_list_test(ext2_u32_list bb, blk_t blk);
655extern errcode_t ext2fs_u32_list_iterate_begin(ext2_u32_list bb,
656					       ext2_u32_iterate *ret);
657extern int ext2fs_u32_list_iterate(ext2_u32_iterate iter, blk_t *blk);
658extern void ext2fs_u32_list_iterate_end(ext2_u32_iterate iter);
659extern errcode_t ext2fs_u32_copy(ext2_u32_list src, ext2_u32_list *dest);
660extern int ext2fs_u32_list_equal(ext2_u32_list bb1, ext2_u32_list bb2);
661
662extern errcode_t ext2fs_badblocks_list_create(ext2_badblocks_list *ret,
663					    int size);
664extern errcode_t ext2fs_badblocks_list_add(ext2_badblocks_list bb,
665					   blk_t blk);
666extern int ext2fs_badblocks_list_test(ext2_badblocks_list bb,
667				    blk_t blk);
668extern int ext2fs_u32_list_del(ext2_u32_list bb, __u32 blk);
669extern void ext2fs_badblocks_list_del(ext2_u32_list bb, __u32 blk);
670extern errcode_t
671	ext2fs_badblocks_list_iterate_begin(ext2_badblocks_list bb,
672					    ext2_badblocks_iterate *ret);
673extern int ext2fs_badblocks_list_iterate(ext2_badblocks_iterate iter,
674					 blk_t *blk);
675extern void ext2fs_badblocks_list_iterate_end(ext2_badblocks_iterate iter);
676extern errcode_t ext2fs_badblocks_copy(ext2_badblocks_list src,
677				       ext2_badblocks_list *dest);
678extern int ext2fs_badblocks_equal(ext2_badblocks_list bb1,
679				  ext2_badblocks_list bb2);
680extern int ext2fs_u32_list_count(ext2_u32_list bb);
681
682/* bb_compat */
683extern errcode_t badblocks_list_create(badblocks_list *ret, int size);
684extern errcode_t badblocks_list_add(badblocks_list bb, blk_t blk);
685extern int badblocks_list_test(badblocks_list bb, blk_t blk);
686extern errcode_t badblocks_list_iterate_begin(badblocks_list bb,
687					      badblocks_iterate *ret);
688extern int badblocks_list_iterate(badblocks_iterate iter, blk_t *blk);
689extern void badblocks_list_iterate_end(badblocks_iterate iter);
690extern void badblocks_list_free(badblocks_list bb);
691
692/* bb_inode.c */
693extern errcode_t ext2fs_update_bb_inode(ext2_filsys fs,
694					ext2_badblocks_list bb_list);
695
696/* bitmaps.c */
697extern void ext2fs_free_block_bitmap(ext2fs_block_bitmap bitmap);
698extern void ext2fs_free_inode_bitmap(ext2fs_inode_bitmap bitmap);
699extern errcode_t ext2fs_copy_bitmap(ext2fs_generic_bitmap src,
700				    ext2fs_generic_bitmap *dest);
701extern errcode_t ext2fs_write_inode_bitmap(ext2_filsys fs);
702extern errcode_t ext2fs_write_block_bitmap (ext2_filsys fs);
703extern errcode_t ext2fs_read_inode_bitmap (ext2_filsys fs);
704extern errcode_t ext2fs_read_block_bitmap(ext2_filsys fs);
705extern errcode_t ext2fs_allocate_block_bitmap(ext2_filsys fs,
706					      const char *descr,
707					      ext2fs_block_bitmap *ret);
708extern errcode_t ext2fs_allocate_subcluster_bitmap(ext2_filsys fs,
709						   const char *descr,
710						   ext2fs_block_bitmap *ret);
711extern int ext2fs_get_bitmap_granularity(ext2fs_block_bitmap bitmap);
712extern errcode_t ext2fs_allocate_inode_bitmap(ext2_filsys fs,
713					      const char *descr,
714					      ext2fs_inode_bitmap *ret);
715extern errcode_t ext2fs_fudge_inode_bitmap_end(ext2fs_inode_bitmap bitmap,
716					       ext2_ino_t end, ext2_ino_t *oend);
717extern errcode_t ext2fs_fudge_block_bitmap_end(ext2fs_block_bitmap bitmap,
718					       blk_t end, blk_t *oend);
719extern errcode_t ext2fs_fudge_block_bitmap_end2(ext2fs_block_bitmap bitmap,
720					 blk64_t end, blk64_t *oend);
721extern void ext2fs_clear_inode_bitmap(ext2fs_inode_bitmap bitmap);
722extern void ext2fs_clear_block_bitmap(ext2fs_block_bitmap bitmap);
723extern errcode_t ext2fs_read_bitmaps(ext2_filsys fs);
724extern errcode_t ext2fs_write_bitmaps(ext2_filsys fs);
725extern errcode_t ext2fs_resize_inode_bitmap(__u32 new_end, __u32 new_real_end,
726					    ext2fs_inode_bitmap bmap);
727extern errcode_t ext2fs_resize_inode_bitmap2(__u64 new_end,
728					     __u64 new_real_end,
729					     ext2fs_inode_bitmap bmap);
730extern errcode_t ext2fs_resize_block_bitmap(__u32 new_end, __u32 new_real_end,
731					    ext2fs_block_bitmap bmap);
732extern errcode_t ext2fs_resize_block_bitmap2(__u64 new_end,
733					     __u64 new_real_end,
734					     ext2fs_block_bitmap bmap);
735extern errcode_t ext2fs_compare_block_bitmap(ext2fs_block_bitmap bm1,
736					     ext2fs_block_bitmap bm2);
737extern errcode_t ext2fs_compare_inode_bitmap(ext2fs_inode_bitmap bm1,
738					     ext2fs_inode_bitmap bm2);
739extern errcode_t ext2fs_set_inode_bitmap_range(ext2fs_inode_bitmap bmap,
740					ext2_ino_t start, unsigned int num,
741					void *in);
742extern errcode_t ext2fs_set_inode_bitmap_range2(ext2fs_inode_bitmap bmap,
743					 __u64 start, size_t num,
744					 void *in);
745extern errcode_t ext2fs_get_inode_bitmap_range(ext2fs_inode_bitmap bmap,
746					ext2_ino_t start, unsigned int num,
747					void *out);
748extern errcode_t ext2fs_get_inode_bitmap_range2(ext2fs_inode_bitmap bmap,
749					 __u64 start, size_t num,
750					 void *out);
751extern errcode_t ext2fs_set_block_bitmap_range(ext2fs_block_bitmap bmap,
752					blk_t start, unsigned int num,
753					void *in);
754extern errcode_t ext2fs_set_block_bitmap_range2(ext2fs_block_bitmap bmap,
755					 blk64_t start, size_t num,
756					 void *in);
757extern errcode_t ext2fs_get_block_bitmap_range(ext2fs_block_bitmap bmap,
758					blk_t start, unsigned int num,
759					void *out);
760extern errcode_t ext2fs_get_block_bitmap_range2(ext2fs_block_bitmap bmap,
761					 blk64_t start, size_t num,
762					 void *out);
763
764/* blknum.c */
765extern dgrp_t ext2fs_group_of_blk2(ext2_filsys fs, blk64_t);
766extern blk64_t ext2fs_group_first_block2(ext2_filsys fs, dgrp_t group);
767extern blk64_t ext2fs_group_last_block2(ext2_filsys fs, dgrp_t group);
768extern int ext2fs_group_blocks_count(ext2_filsys fs, dgrp_t group);
769extern blk64_t ext2fs_inode_data_blocks2(ext2_filsys fs,
770					 struct ext2_inode *inode);
771extern blk64_t ext2fs_inode_i_blocks(ext2_filsys fs,
772					 struct ext2_inode *inode);
773extern blk64_t ext2fs_blocks_count(struct ext2_super_block *super);
774extern void ext2fs_blocks_count_set(struct ext2_super_block *super,
775				    blk64_t blk);
776extern void ext2fs_blocks_count_add(struct ext2_super_block *super,
777				    blk64_t blk);
778extern blk64_t ext2fs_r_blocks_count(struct ext2_super_block *super);
779extern void ext2fs_r_blocks_count_set(struct ext2_super_block *super,
780				      blk64_t blk);
781extern void ext2fs_r_blocks_count_add(struct ext2_super_block *super,
782				      blk64_t blk);
783extern blk64_t ext2fs_free_blocks_count(struct ext2_super_block *super);
784extern void ext2fs_free_blocks_count_set(struct ext2_super_block *super,
785					 blk64_t blk);
786extern void ext2fs_free_blocks_count_add(struct ext2_super_block *super,
787					 blk64_t blk);
788/* Block group descriptor accessor functions */
789extern struct ext2_group_desc *ext2fs_group_desc(ext2_filsys fs,
790					  struct opaque_ext2_group_desc *gdp,
791					  dgrp_t group);
792extern blk64_t ext2fs_block_bitmap_loc(ext2_filsys fs, dgrp_t group);
793extern void ext2fs_block_bitmap_loc_set(ext2_filsys fs, dgrp_t group,
794					blk64_t blk);
795extern blk64_t ext2fs_inode_bitmap_loc(ext2_filsys fs, dgrp_t group);
796extern void ext2fs_inode_bitmap_loc_set(ext2_filsys fs, dgrp_t group,
797					blk64_t blk);
798extern blk64_t ext2fs_inode_table_loc(ext2_filsys fs, dgrp_t group);
799extern void ext2fs_inode_table_loc_set(ext2_filsys fs, dgrp_t group,
800				       blk64_t blk);
801extern __u32 ext2fs_bg_free_blocks_count(ext2_filsys fs, dgrp_t group);
802extern void ext2fs_bg_free_blocks_count_set(ext2_filsys fs, dgrp_t group,
803					 __u32 n);
804extern __u32 ext2fs_bg_free_inodes_count(ext2_filsys fs, dgrp_t group);
805extern void ext2fs_bg_free_inodes_count_set(ext2_filsys fs, dgrp_t group,
806					 __u32 n);
807extern __u32 ext2fs_bg_used_dirs_count(ext2_filsys fs, dgrp_t group);
808extern void ext2fs_bg_used_dirs_count_set(ext2_filsys fs, dgrp_t group,
809				       __u32 n);
810extern __u32 ext2fs_bg_itable_unused(ext2_filsys fs, dgrp_t group);
811extern void ext2fs_bg_itable_unused_set(ext2_filsys fs, dgrp_t group,
812				     __u32 n);
813extern __u16 ext2fs_bg_flags(ext2_filsys fs, dgrp_t group);
814extern void ext2fs_bg_flags_zap(ext2_filsys fs, dgrp_t group);
815extern int ext2fs_bg_flags_test(ext2_filsys fs, dgrp_t group, __u16 bg_flag);
816extern void ext2fs_bg_flags_set(ext2_filsys fs, dgrp_t group, __u16 bg_flags);
817extern void ext2fs_bg_flags_clear(ext2_filsys fs, dgrp_t group, __u16 bg_flags);
818extern __u16 ext2fs_bg_checksum(ext2_filsys fs, dgrp_t group);
819extern void ext2fs_bg_checksum_set(ext2_filsys fs, dgrp_t group, __u16 checksum);
820extern blk64_t ext2fs_file_acl_block(const struct ext2_inode *inode);
821extern void ext2fs_file_acl_block_set(struct ext2_inode *inode, blk64_t blk);
822
823/* block.c */
824extern errcode_t ext2fs_block_iterate(ext2_filsys fs,
825				      ext2_ino_t	ino,
826				      int	flags,
827				      char *block_buf,
828				      int (*func)(ext2_filsys fs,
829						  blk_t	*blocknr,
830						  int	blockcnt,
831						  void	*priv_data),
832				      void *priv_data);
833errcode_t ext2fs_block_iterate2(ext2_filsys fs,
834				ext2_ino_t	ino,
835				int	flags,
836				char *block_buf,
837				int (*func)(ext2_filsys fs,
838					    blk_t	*blocknr,
839					    e2_blkcnt_t	blockcnt,
840					    blk_t	ref_blk,
841					    int		ref_offset,
842					    void	*priv_data),
843				void *priv_data);
844errcode_t ext2fs_block_iterate3(ext2_filsys fs,
845				ext2_ino_t ino,
846				int	flags,
847				char *block_buf,
848				int (*func)(ext2_filsys fs,
849					    blk64_t	*blocknr,
850					    e2_blkcnt_t	blockcnt,
851					    blk64_t	ref_blk,
852					    int		ref_offset,
853					    void	*priv_data),
854				void *priv_data);
855
856/* bmap.c */
857extern errcode_t ext2fs_bmap(ext2_filsys fs, ext2_ino_t ino,
858			     struct ext2_inode *inode,
859			     char *block_buf, int bmap_flags,
860			     blk_t block, blk_t *phys_blk);
861extern errcode_t ext2fs_bmap2(ext2_filsys fs, ext2_ino_t ino,
862			      struct ext2_inode *inode,
863			      char *block_buf, int bmap_flags, blk64_t block,
864			      int *ret_flags, blk64_t *phys_blk);
865
866#if 0
867/* bmove.c */
868extern errcode_t ext2fs_move_blocks(ext2_filsys fs,
869				    ext2fs_block_bitmap reserve,
870				    ext2fs_block_bitmap alloc_map,
871				    int flags);
872#endif
873
874/* check_desc.c */
875extern errcode_t ext2fs_check_desc(ext2_filsys fs);
876
877/* closefs.c */
878extern errcode_t ext2fs_close(ext2_filsys fs);
879extern errcode_t ext2fs_flush(ext2_filsys fs);
880extern int ext2fs_bg_has_super(ext2_filsys fs, int group_block);
881extern errcode_t ext2fs_super_and_bgd_loc2(ext2_filsys fs,
882				    dgrp_t group,
883				    blk64_t *ret_super_blk,
884				    blk64_t *ret_old_desc_blk,
885				    blk64_t *ret_new_desc_blk,
886				    blk_t *ret_used_blks);
887extern int ext2fs_super_and_bgd_loc(ext2_filsys fs,
888				    dgrp_t group,
889				    blk_t *ret_super_blk,
890				    blk_t *ret_old_desc_blk,
891				    blk_t *ret_new_desc_blk,
892				    int *ret_meta_bg);
893extern void ext2fs_update_dynamic_rev(ext2_filsys fs);
894
895/* crc32c.c */
896extern __u32 crc32c_be(__u32 crc, unsigned char const *p, size_t len);
897extern __u32 crc32c_le(__u32 crc, unsigned char const *p, size_t len);
898
899/* csum.c */
900extern void ext2fs_group_desc_csum_set(ext2_filsys fs, dgrp_t group);
901extern int ext2fs_group_desc_csum_verify(ext2_filsys fs, dgrp_t group);
902extern errcode_t ext2fs_set_gdt_csum(ext2_filsys fs);
903
904/* dblist.c */
905
906extern errcode_t ext2fs_get_num_dirs(ext2_filsys fs, ext2_ino_t *ret_num_dirs);
907extern errcode_t ext2fs_init_dblist(ext2_filsys fs, ext2_dblist *ret_dblist);
908extern errcode_t ext2fs_add_dir_block(ext2_dblist dblist, ext2_ino_t ino,
909				      blk_t blk, int blockcnt);
910extern errcode_t ext2fs_add_dir_block2(ext2_dblist dblist, ext2_ino_t ino,
911				       blk64_t blk, e2_blkcnt_t blockcnt);
912extern void ext2fs_dblist_sort(ext2_dblist dblist,
913			       EXT2_QSORT_TYPE (*sortfunc)(const void *,
914							   const void *));
915extern void ext2fs_dblist_sort2(ext2_dblist dblist,
916				EXT2_QSORT_TYPE (*sortfunc)(const void *,
917							    const void *));
918extern errcode_t ext2fs_dblist_iterate(ext2_dblist dblist,
919	int (*func)(ext2_filsys fs, struct ext2_db_entry *db_info,
920		    void	*priv_data),
921       void *priv_data);
922extern errcode_t ext2fs_dblist_iterate2(ext2_dblist dblist,
923	int (*func)(ext2_filsys fs, struct ext2_db_entry2 *db_info,
924		    void	*priv_data),
925       void *priv_data);
926extern errcode_t ext2fs_set_dir_block(ext2_dblist dblist, ext2_ino_t ino,
927				      blk_t blk, int blockcnt);
928extern errcode_t ext2fs_set_dir_block2(ext2_dblist dblist, ext2_ino_t ino,
929				       blk64_t blk, e2_blkcnt_t blockcnt);
930extern errcode_t ext2fs_copy_dblist(ext2_dblist src,
931				    ext2_dblist *dest);
932extern int ext2fs_dblist_count(ext2_dblist dblist);
933extern blk64_t ext2fs_dblist_count2(ext2_dblist dblist);
934extern errcode_t ext2fs_dblist_get_last(ext2_dblist dblist,
935					struct ext2_db_entry **entry);
936extern errcode_t ext2fs_dblist_get_last2(ext2_dblist dblist,
937					struct ext2_db_entry2 **entry);
938extern errcode_t ext2fs_dblist_drop_last(ext2_dblist dblist);
939
940/* dblist_dir.c */
941extern errcode_t
942	ext2fs_dblist_dir_iterate(ext2_dblist dblist,
943				  int	flags,
944				  char	*block_buf,
945				  int (*func)(ext2_ino_t	dir,
946					      int		entry,
947					      struct ext2_dir_entry *dirent,
948					      int	offset,
949					      int	blocksize,
950					      char	*buf,
951					      void	*priv_data),
952				  void *priv_data);
953
954/* dirblock.c */
955extern errcode_t ext2fs_read_dir_block(ext2_filsys fs, blk_t block,
956				       void *buf);
957extern errcode_t ext2fs_read_dir_block2(ext2_filsys fs, blk_t block,
958					void *buf, int flags);
959extern errcode_t ext2fs_read_dir_block3(ext2_filsys fs, blk64_t block,
960					void *buf, int flags);
961extern errcode_t ext2fs_write_dir_block(ext2_filsys fs, blk_t block,
962					void *buf);
963extern errcode_t ext2fs_write_dir_block2(ext2_filsys fs, blk_t block,
964					 void *buf, int flags);
965extern errcode_t ext2fs_write_dir_block3(ext2_filsys fs, blk64_t block,
966					 void *buf, int flags);
967
968/* dirhash.c */
969extern errcode_t ext2fs_dirhash(int version, const char *name, int len,
970				const __u32 *seed,
971				ext2_dirhash_t *ret_hash,
972				ext2_dirhash_t *ret_minor_hash);
973
974
975/* dir_iterate.c */
976extern errcode_t ext2fs_get_rec_len(ext2_filsys fs,
977				    struct ext2_dir_entry *dirent,
978				    unsigned int *rec_len);
979extern errcode_t ext2fs_set_rec_len(ext2_filsys fs,
980				    unsigned int len,
981				    struct ext2_dir_entry *dirent);
982extern errcode_t ext2fs_dir_iterate(ext2_filsys fs,
983			      ext2_ino_t dir,
984			      int flags,
985			      char *block_buf,
986			      int (*func)(struct ext2_dir_entry *dirent,
987					  int	offset,
988					  int	blocksize,
989					  char	*buf,
990					  void	*priv_data),
991			      void *priv_data);
992extern errcode_t ext2fs_dir_iterate2(ext2_filsys fs,
993			      ext2_ino_t dir,
994			      int flags,
995			      char *block_buf,
996			      int (*func)(ext2_ino_t	dir,
997					  int	entry,
998					  struct ext2_dir_entry *dirent,
999					  int	offset,
1000					  int	blocksize,
1001					  char	*buf,
1002					  void	*priv_data),
1003			      void *priv_data);
1004
1005/* dupfs.c */
1006extern errcode_t ext2fs_dup_handle(ext2_filsys src, ext2_filsys *dest);
1007
1008/* expanddir.c */
1009extern errcode_t ext2fs_expand_dir(ext2_filsys fs, ext2_ino_t dir);
1010
1011/* ext_attr.c */
1012extern __u32 ext2fs_ext_attr_hash_entry(struct ext2_ext_attr_entry *entry,
1013					void *data);
1014extern errcode_t ext2fs_read_ext_attr(ext2_filsys fs, blk_t block, void *buf);
1015extern errcode_t ext2fs_read_ext_attr2(ext2_filsys fs, blk64_t block,
1016				       void *buf);
1017extern errcode_t ext2fs_write_ext_attr(ext2_filsys fs, blk_t block,
1018				       void *buf);
1019extern errcode_t ext2fs_write_ext_attr2(ext2_filsys fs, blk64_t block,
1020				       void *buf);
1021extern errcode_t ext2fs_adjust_ea_refcount(ext2_filsys fs, blk_t blk,
1022					   char *block_buf,
1023					   int adjust, __u32 *newcount);
1024extern errcode_t ext2fs_adjust_ea_refcount2(ext2_filsys fs, blk64_t blk,
1025					   char *block_buf,
1026					   int adjust, __u32 *newcount);
1027
1028/* extent.c */
1029extern errcode_t ext2fs_extent_header_verify(void *ptr, int size);
1030extern errcode_t ext2fs_extent_open(ext2_filsys fs, ext2_ino_t ino,
1031				    ext2_extent_handle_t *handle);
1032extern errcode_t ext2fs_extent_open2(ext2_filsys fs, ext2_ino_t ino,
1033					struct ext2_inode *inode,
1034					ext2_extent_handle_t *ret_handle);
1035extern void ext2fs_extent_free(ext2_extent_handle_t handle);
1036extern errcode_t ext2fs_extent_get(ext2_extent_handle_t handle,
1037				   int flags, struct ext2fs_extent *extent);
1038extern errcode_t ext2fs_extent_replace(ext2_extent_handle_t handle, int flags,
1039				       struct ext2fs_extent *extent);
1040extern errcode_t ext2fs_extent_insert(ext2_extent_handle_t handle, int flags,
1041				      struct ext2fs_extent *extent);
1042extern errcode_t ext2fs_extent_set_bmap(ext2_extent_handle_t handle,
1043					blk64_t logical, blk64_t physical,
1044					int flags);
1045extern errcode_t ext2fs_extent_delete(ext2_extent_handle_t handle, int flags);
1046extern errcode_t ext2fs_extent_get_info(ext2_extent_handle_t handle,
1047					struct ext2_extent_info *info);
1048extern errcode_t ext2fs_extent_goto(ext2_extent_handle_t handle,
1049				    blk64_t blk);
1050
1051/* fileio.c */
1052extern errcode_t ext2fs_file_open2(ext2_filsys fs, ext2_ino_t ino,
1053				   struct ext2_inode *inode,
1054				   int flags, ext2_file_t *ret);
1055extern errcode_t ext2fs_file_open(ext2_filsys fs, ext2_ino_t ino,
1056				  int flags, ext2_file_t *ret);
1057extern ext2_filsys ext2fs_file_get_fs(ext2_file_t file);
1058struct ext2_inode *ext2fs_file_get_inode(ext2_file_t file);
1059extern errcode_t ext2fs_file_close(ext2_file_t file);
1060extern errcode_t ext2fs_file_flush(ext2_file_t file);
1061extern errcode_t ext2fs_file_read(ext2_file_t file, void *buf,
1062				  unsigned int wanted, unsigned int *got);
1063extern errcode_t ext2fs_file_write(ext2_file_t file, const void *buf,
1064				   unsigned int nbytes, unsigned int *written);
1065extern errcode_t ext2fs_file_llseek(ext2_file_t file, __u64 offset,
1066				   int whence, __u64 *ret_pos);
1067extern errcode_t ext2fs_file_lseek(ext2_file_t file, ext2_off_t offset,
1068				   int whence, ext2_off_t *ret_pos);
1069errcode_t ext2fs_file_get_lsize(ext2_file_t file, __u64 *ret_size);
1070extern ext2_off_t ext2fs_file_get_size(ext2_file_t file);
1071extern errcode_t ext2fs_file_set_size(ext2_file_t file, ext2_off_t size);
1072extern errcode_t ext2fs_file_set_size2(ext2_file_t file, ext2_off64_t size);
1073
1074/* finddev.c */
1075extern char *ext2fs_find_block_device(dev_t device);
1076
1077/* flushb.c */
1078extern errcode_t ext2fs_sync_device(int fd, int flushb);
1079
1080/* freefs.c */
1081extern void ext2fs_free(ext2_filsys fs);
1082extern void ext2fs_free_dblist(ext2_dblist dblist);
1083extern void ext2fs_badblocks_list_free(ext2_badblocks_list bb);
1084extern void ext2fs_u32_list_free(ext2_u32_list bb);
1085
1086/* gen_bitmap.c */
1087extern void ext2fs_free_generic_bitmap(ext2fs_inode_bitmap bitmap);
1088extern errcode_t ext2fs_make_generic_bitmap(errcode_t magic, ext2_filsys fs,
1089					    __u32 start, __u32 end,
1090					    __u32 real_end,
1091					    const char *descr, char *init_map,
1092					    ext2fs_generic_bitmap *ret);
1093extern errcode_t ext2fs_allocate_generic_bitmap(__u32 start,
1094						__u32 end,
1095						__u32 real_end,
1096						const char *descr,
1097						ext2fs_generic_bitmap *ret);
1098extern errcode_t ext2fs_copy_generic_bitmap(ext2fs_generic_bitmap src,
1099					    ext2fs_generic_bitmap *dest);
1100extern void ext2fs_clear_generic_bitmap(ext2fs_generic_bitmap bitmap);
1101extern errcode_t ext2fs_fudge_generic_bitmap_end(ext2fs_inode_bitmap bitmap,
1102						 errcode_t magic,
1103						 errcode_t neq,
1104						 ext2_ino_t end,
1105						 ext2_ino_t *oend);
1106extern void ext2fs_set_generic_bitmap_padding(ext2fs_generic_bitmap map);
1107extern errcode_t ext2fs_resize_generic_bitmap(errcode_t magic,
1108					      __u32 new_end,
1109					      __u32 new_real_end,
1110					      ext2fs_generic_bitmap bmap);
1111extern errcode_t ext2fs_compare_generic_bitmap(errcode_t magic, errcode_t neq,
1112					       ext2fs_generic_bitmap bm1,
1113					       ext2fs_generic_bitmap bm2);
1114extern errcode_t ext2fs_get_generic_bitmap_range(ext2fs_generic_bitmap bmap,
1115						 errcode_t magic,
1116						 __u32 start, __u32 num,
1117						 void *out);
1118extern errcode_t ext2fs_set_generic_bitmap_range(ext2fs_generic_bitmap bmap,
1119						 errcode_t magic,
1120						 __u32 start, __u32 num,
1121						 void *in);
1122
1123/* gen_bitmap64.c */
1124void ext2fs_free_generic_bmap(ext2fs_generic_bitmap bmap);
1125errcode_t ext2fs_alloc_generic_bmap(ext2_filsys fs, errcode_t magic,
1126				    int type, __u64 start, __u64 end,
1127				    __u64 real_end,
1128				    const char *descr,
1129				    ext2fs_generic_bitmap *ret);
1130errcode_t ext2fs_copy_generic_bmap(ext2fs_generic_bitmap src,
1131				   ext2fs_generic_bitmap *dest);
1132void ext2fs_clear_generic_bmap(ext2fs_generic_bitmap bitmap);
1133errcode_t ext2fs_fudge_generic_bmap_end(ext2fs_generic_bitmap bitmap,
1134					errcode_t neq,
1135					__u64 end, __u64 *oend);
1136void ext2fs_set_generic_bmap_padding(ext2fs_generic_bitmap bmap);
1137errcode_t ext2fs_resize_generic_bmap(ext2fs_generic_bitmap bmap,
1138				     __u64 new_end,
1139				     __u64 new_real_end);
1140errcode_t ext2fs_compare_generic_bmap(errcode_t neq,
1141				      ext2fs_generic_bitmap bm1,
1142				      ext2fs_generic_bitmap bm2);
1143errcode_t ext2fs_get_generic_bmap_range(ext2fs_generic_bitmap bmap,
1144					__u64 start, unsigned int num,
1145					void *out);
1146errcode_t ext2fs_set_generic_bmap_range(ext2fs_generic_bitmap bmap,
1147					__u64 start, unsigned int num,
1148					void *in);
1149errcode_t ext2fs_convert_subcluster_bitmap(ext2_filsys fs,
1150					   ext2fs_block_bitmap *bitmap);
1151
1152/* getsize.c */
1153extern errcode_t ext2fs_get_device_size(const char *file, int blocksize,
1154					blk_t *retblocks);
1155extern errcode_t ext2fs_get_device_size2(const char *file, int blocksize,
1156					blk64_t *retblocks);
1157
1158/* getsectsize.c */
1159errcode_t ext2fs_get_device_sectsize(const char *file, int *sectsize);
1160errcode_t ext2fs_get_device_phys_sectsize(const char *file, int *sectsize);
1161
1162/* i_block.c */
1163errcode_t ext2fs_iblk_add_blocks(ext2_filsys fs, struct ext2_inode *inode,
1164				 blk64_t num_blocks);
1165errcode_t ext2fs_iblk_sub_blocks(ext2_filsys fs, struct ext2_inode *inode,
1166				 blk64_t num_blocks);
1167errcode_t ext2fs_iblk_set(ext2_filsys fs, struct ext2_inode *inode, blk64_t b);
1168
1169/* imager.c */
1170extern errcode_t ext2fs_image_inode_write(ext2_filsys fs, int fd, int flags);
1171extern errcode_t ext2fs_image_inode_read(ext2_filsys fs, int fd, int flags);
1172extern errcode_t ext2fs_image_super_write(ext2_filsys fs, int fd, int flags);
1173extern errcode_t ext2fs_image_super_read(ext2_filsys fs, int fd, int flags);
1174extern errcode_t ext2fs_image_bitmap_write(ext2_filsys fs, int fd, int flags);
1175extern errcode_t ext2fs_image_bitmap_read(ext2_filsys fs, int fd, int flags);
1176
1177/* ind_block.c */
1178errcode_t ext2fs_read_ind_block(ext2_filsys fs, blk_t blk, void *buf);
1179errcode_t ext2fs_write_ind_block(ext2_filsys fs, blk_t blk, void *buf);
1180
1181/* initialize.c */
1182extern errcode_t ext2fs_initialize(const char *name, int flags,
1183				   struct ext2_super_block *param,
1184				   io_manager manager, ext2_filsys *ret_fs);
1185
1186/* icount.c */
1187extern void ext2fs_free_icount(ext2_icount_t icount);
1188extern errcode_t ext2fs_create_icount_tdb(ext2_filsys fs, char *tdb_dir,
1189					  int flags, ext2_icount_t *ret);
1190extern errcode_t ext2fs_create_icount2(ext2_filsys fs, int flags,
1191				       unsigned int size,
1192				       ext2_icount_t hint, ext2_icount_t *ret);
1193extern errcode_t ext2fs_create_icount(ext2_filsys fs, int flags,
1194				      unsigned int size,
1195				      ext2_icount_t *ret);
1196extern errcode_t ext2fs_icount_fetch(ext2_icount_t icount, ext2_ino_t ino,
1197				     __u16 *ret);
1198extern errcode_t ext2fs_icount_increment(ext2_icount_t icount, ext2_ino_t ino,
1199					 __u16 *ret);
1200extern errcode_t ext2fs_icount_decrement(ext2_icount_t icount, ext2_ino_t ino,
1201					 __u16 *ret);
1202extern errcode_t ext2fs_icount_store(ext2_icount_t icount, ext2_ino_t ino,
1203				     __u16 count);
1204extern ext2_ino_t ext2fs_get_icount_size(ext2_icount_t icount);
1205errcode_t ext2fs_icount_validate(ext2_icount_t icount, FILE *);
1206
1207/* inode.c */
1208extern errcode_t ext2fs_flush_icache(ext2_filsys fs);
1209extern errcode_t ext2fs_get_next_inode_full(ext2_inode_scan scan,
1210					    ext2_ino_t *ino,
1211					    struct ext2_inode *inode,
1212					    int bufsize);
1213extern errcode_t ext2fs_open_inode_scan(ext2_filsys fs, int buffer_blocks,
1214				  ext2_inode_scan *ret_scan);
1215extern void ext2fs_close_inode_scan(ext2_inode_scan scan);
1216extern errcode_t ext2fs_get_next_inode(ext2_inode_scan scan, ext2_ino_t *ino,
1217			       struct ext2_inode *inode);
1218extern errcode_t ext2fs_inode_scan_goto_blockgroup(ext2_inode_scan scan,
1219						   int	group);
1220extern void ext2fs_set_inode_callback
1221	(ext2_inode_scan scan,
1222	 errcode_t (*done_group)(ext2_filsys fs,
1223				 ext2_inode_scan scan,
1224				 dgrp_t group,
1225				 void * priv_data),
1226	 void *done_group_data);
1227extern int ext2fs_inode_scan_flags(ext2_inode_scan scan, int set_flags,
1228				   int clear_flags);
1229extern errcode_t ext2fs_read_inode_full(ext2_filsys fs, ext2_ino_t ino,
1230					struct ext2_inode * inode,
1231					int bufsize);
1232extern errcode_t ext2fs_read_inode (ext2_filsys fs, ext2_ino_t ino,
1233			    struct ext2_inode * inode);
1234extern errcode_t ext2fs_write_inode_full(ext2_filsys fs, ext2_ino_t ino,
1235					 struct ext2_inode * inode,
1236					 int bufsize);
1237extern errcode_t ext2fs_write_inode(ext2_filsys fs, ext2_ino_t ino,
1238			    struct ext2_inode * inode);
1239extern errcode_t ext2fs_write_new_inode(ext2_filsys fs, ext2_ino_t ino,
1240			    struct ext2_inode * inode);
1241extern errcode_t ext2fs_get_blocks(ext2_filsys fs, ext2_ino_t ino, blk_t *blocks);
1242extern errcode_t ext2fs_check_directory(ext2_filsys fs, ext2_ino_t ino);
1243
1244/* inode_io.c */
1245extern io_manager inode_io_manager;
1246extern errcode_t ext2fs_inode_io_intern(ext2_filsys fs, ext2_ino_t ino,
1247					char **name);
1248extern errcode_t ext2fs_inode_io_intern2(ext2_filsys fs, ext2_ino_t ino,
1249					 struct ext2_inode *inode,
1250					 char **name);
1251
1252/* ismounted.c */
1253extern errcode_t ext2fs_check_if_mounted(const char *file, int *mount_flags);
1254extern errcode_t ext2fs_check_mount_point(const char *device, int *mount_flags,
1255					  char *mtpt, int mtlen);
1256
1257/* punch.c */
1258extern errcode_t ext2fs_punch(ext2_filsys fs, ext2_ino_t ino,
1259			      struct ext2_inode *inode,
1260			      char *block_buf, blk64_t start,
1261			      blk64_t end);
1262
1263/* namei.c */
1264extern errcode_t ext2fs_lookup(ext2_filsys fs, ext2_ino_t dir, const char *name,
1265			 int namelen, char *buf, ext2_ino_t *inode);
1266extern errcode_t ext2fs_namei(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
1267			const char *name, ext2_ino_t *inode);
1268errcode_t ext2fs_namei_follow(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
1269			      const char *name, ext2_ino_t *inode);
1270extern errcode_t ext2fs_follow_link(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
1271			ext2_ino_t inode, ext2_ino_t *res_inode);
1272
1273/* native.c */
1274int ext2fs_native_flag(void);
1275
1276/* newdir.c */
1277extern errcode_t ext2fs_new_dir_block(ext2_filsys fs, ext2_ino_t dir_ino,
1278				ext2_ino_t parent_ino, char **block);
1279
1280/* mkdir.c */
1281extern errcode_t ext2fs_mkdir(ext2_filsys fs, ext2_ino_t parent, ext2_ino_t inum,
1282			      const char *name);
1283
1284/* mkjournal.c */
1285extern errcode_t ext2fs_zero_blocks(ext2_filsys fs, blk_t blk, int num,
1286				    blk_t *ret_blk, int *ret_count);
1287extern errcode_t ext2fs_zero_blocks2(ext2_filsys fs, blk64_t blk, int num,
1288				     blk64_t *ret_blk, int *ret_count);
1289extern errcode_t ext2fs_create_journal_superblock(ext2_filsys fs,
1290						  __u32 num_blocks, int flags,
1291						  char  **ret_jsb);
1292extern errcode_t ext2fs_add_journal_device(ext2_filsys fs,
1293					   ext2_filsys journal_dev);
1294extern errcode_t ext2fs_add_journal_inode(ext2_filsys fs, blk_t num_blocks,
1295					  int flags);
1296extern int ext2fs_default_journal_size(__u64 num_blocks);
1297
1298/* openfs.c */
1299extern errcode_t ext2fs_open(const char *name, int flags, int superblock,
1300			     unsigned int block_size, io_manager manager,
1301			     ext2_filsys *ret_fs);
1302extern errcode_t ext2fs_open2(const char *name, const char *io_options,
1303			      int flags, int superblock,
1304			      unsigned int block_size, io_manager manager,
1305			      ext2_filsys *ret_fs);
1306extern blk64_t ext2fs_descriptor_block_loc2(ext2_filsys fs,
1307					blk64_t group_block, dgrp_t i);
1308extern blk_t ext2fs_descriptor_block_loc(ext2_filsys fs, blk_t group_block,
1309					 dgrp_t i);
1310errcode_t ext2fs_get_data_io(ext2_filsys fs, io_channel *old_io);
1311errcode_t ext2fs_set_data_io(ext2_filsys fs, io_channel new_io);
1312errcode_t ext2fs_rewrite_to_io(ext2_filsys fs, io_channel new_io);
1313
1314/* get_pathname.c */
1315extern errcode_t ext2fs_get_pathname(ext2_filsys fs, ext2_ino_t dir, ext2_ino_t ino,
1316			       char **name);
1317
1318/* link.c */
1319errcode_t ext2fs_link(ext2_filsys fs, ext2_ino_t dir, const char *name,
1320		      ext2_ino_t ino, int flags);
1321errcode_t ext2fs_unlink(ext2_filsys fs, ext2_ino_t dir, const char *name,
1322			ext2_ino_t ino, int flags);
1323
1324/* read_bb.c */
1325extern errcode_t ext2fs_read_bb_inode(ext2_filsys fs,
1326				      ext2_badblocks_list *bb_list);
1327
1328/* read_bb_file.c */
1329extern errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f,
1330				      ext2_badblocks_list *bb_list,
1331				      void *priv_data,
1332				      void (*invalid)(ext2_filsys fs,
1333						      blk_t blk,
1334						      char *badstr,
1335						      void *priv_data));
1336extern errcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f,
1337				     ext2_badblocks_list *bb_list,
1338				     void (*invalid)(ext2_filsys fs,
1339						     blk_t blk));
1340
1341/* res_gdt.c */
1342extern errcode_t ext2fs_create_resize_inode(ext2_filsys fs);
1343
1344/* swapfs.c */
1345extern void ext2fs_swap_ext_attr(char *to, char *from, int bufsize,
1346				 int has_header);
1347extern void ext2fs_swap_ext_attr_header(struct ext2_ext_attr_header *to_header,
1348					struct ext2_ext_attr_header *from_hdr);
1349extern void ext2fs_swap_ext_attr_entry(struct ext2_ext_attr_entry *to_entry,
1350				       struct ext2_ext_attr_entry *from_entry);
1351extern void ext2fs_swap_super(struct ext2_super_block * super);
1352extern void ext2fs_swap_group_desc(struct ext2_group_desc *gdp);
1353extern void ext2fs_swap_group_desc2(ext2_filsys, struct ext2_group_desc *gdp);
1354extern void ext2fs_swap_inode_full(ext2_filsys fs, struct ext2_inode_large *t,
1355				   struct ext2_inode_large *f, int hostorder,
1356				   int bufsize);
1357extern void ext2fs_swap_inode(ext2_filsys fs,struct ext2_inode *t,
1358			      struct ext2_inode *f, int hostorder);
1359
1360/* valid_blk.c */
1361extern int ext2fs_inode_has_valid_blocks(struct ext2_inode *inode);
1362
1363/* version.c */
1364extern int ext2fs_parse_version_string(const char *ver_string);
1365extern int ext2fs_get_library_version(const char **ver_string,
1366				      const char **date_string);
1367
1368/* write_bb_file.c */
1369extern errcode_t ext2fs_write_bb_FILE(ext2_badblocks_list bb_list,
1370				      unsigned int flags,
1371				      FILE *f);
1372
1373
1374/* inline functions */
1375extern errcode_t ext2fs_get_mem(unsigned long size, void *ptr);
1376extern errcode_t ext2fs_get_memalign(unsigned long size,
1377				     unsigned long align, void *ptr);
1378extern errcode_t ext2fs_get_memzero(unsigned long size, void *ptr);
1379extern errcode_t ext2fs_get_array(unsigned long count,
1380				  unsigned long size, void *ptr);
1381extern errcode_t ext2fs_get_arrayzero(unsigned long count,
1382				      unsigned long size, void *ptr);
1383extern errcode_t ext2fs_free_mem(void *ptr);
1384extern errcode_t ext2fs_resize_mem(unsigned long old_size,
1385				   unsigned long size, void *ptr);
1386extern void ext2fs_mark_super_dirty(ext2_filsys fs);
1387extern void ext2fs_mark_changed(ext2_filsys fs);
1388extern int ext2fs_test_changed(ext2_filsys fs);
1389extern void ext2fs_mark_valid(ext2_filsys fs);
1390extern void ext2fs_unmark_valid(ext2_filsys fs);
1391extern int ext2fs_test_valid(ext2_filsys fs);
1392extern void ext2fs_mark_ib_dirty(ext2_filsys fs);
1393extern void ext2fs_mark_bb_dirty(ext2_filsys fs);
1394extern int ext2fs_test_ib_dirty(ext2_filsys fs);
1395extern int ext2fs_test_bb_dirty(ext2_filsys fs);
1396extern int ext2fs_group_of_blk(ext2_filsys fs, blk_t blk);
1397extern int ext2fs_group_of_ino(ext2_filsys fs, ext2_ino_t ino);
1398extern blk_t ext2fs_group_first_block(ext2_filsys fs, dgrp_t group);
1399extern blk_t ext2fs_group_last_block(ext2_filsys fs, dgrp_t group);
1400extern blk_t ext2fs_inode_data_blocks(ext2_filsys fs,
1401				      struct ext2_inode *inode);
1402extern unsigned int ext2fs_div_ceil(unsigned int a, unsigned int b);
1403extern __u64 ext2fs_div64_ceil(__u64 a, __u64 b);
1404extern int ext2fs_open_file(const char *pathname, int flags, ...);
1405extern int ext2fs_stat(const char *path, ext2fs_struct_stat *buf);
1406
1407/*
1408 * The actual inlined functions definitions themselves...
1409 *
1410 * If NO_INLINE_FUNCS is defined, then we won't try to do inline
1411 * functions at all!
1412 */
1413#if (defined(INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS))
1414#ifdef INCLUDE_INLINE_FUNCS
1415#define _INLINE_ extern
1416#else
1417#ifdef __GNUC__
1418#define _INLINE_ extern __inline__
1419#else				/* For Watcom C */
1420#define _INLINE_ extern inline
1421#endif
1422#endif
1423
1424#ifndef EXT2_CUSTOM_MEMORY_ROUTINES
1425#include <string.h>
1426/*
1427 *  Allocate memory
1428 */
1429_INLINE_ errcode_t ext2fs_get_mem(unsigned long size, void *ptr)
1430{
1431	void *pp;
1432
1433	pp = malloc(size);
1434	if (!pp)
1435		return EXT2_ET_NO_MEMORY;
1436	memcpy(ptr, &pp, sizeof (pp));
1437	return 0;
1438}
1439
1440_INLINE_ errcode_t ext2fs_get_memalign(unsigned long size,
1441				       unsigned long align, void *ptr)
1442{
1443	errcode_t retval;
1444
1445	if (align == 0)
1446		align = 8;
1447	retval = posix_memalign((void **) ptr, align, size);
1448	if (retval) {
1449		if (retval == ENOMEM)
1450			return EXT2_ET_NO_MEMORY;
1451		return retval;
1452	}
1453	return 0;
1454}
1455
1456_INLINE_ errcode_t ext2fs_get_memzero(unsigned long size, void *ptr)
1457{
1458	void *pp;
1459
1460	pp = malloc(size);
1461	if (!pp)
1462		return EXT2_ET_NO_MEMORY;
1463	memset(pp, 0, size);
1464	memcpy(ptr, &pp, sizeof(pp));
1465	return 0;
1466}
1467
1468_INLINE_ errcode_t ext2fs_get_array(unsigned long count, unsigned long size, void *ptr)
1469{
1470	if (count && (-1UL)/count<size)
1471		return EXT2_ET_NO_MEMORY;
1472	return ext2fs_get_mem(count*size, ptr);
1473}
1474
1475_INLINE_ errcode_t ext2fs_get_arrayzero(unsigned long count,
1476					unsigned long size, void *ptr)
1477{
1478	void *pp;
1479
1480	if (count && (-1UL)/count<size)
1481		return EXT2_ET_NO_MEMORY;
1482	pp = calloc(count, size);
1483	if (!pp)
1484		return EXT2_ET_NO_MEMORY;
1485	memcpy(ptr, &pp, sizeof(pp));
1486	return 0;
1487}
1488
1489/*
1490 * Free memory
1491 */
1492_INLINE_ errcode_t ext2fs_free_mem(void *ptr)
1493{
1494	void *p;
1495
1496	memcpy(&p, ptr, sizeof(p));
1497	free(p);
1498	p = 0;
1499	memcpy(ptr, &p, sizeof(p));
1500	return 0;
1501}
1502
1503/*
1504 *  Resize memory
1505 */
1506_INLINE_ errcode_t ext2fs_resize_mem(unsigned long EXT2FS_ATTR((unused)) old_size,
1507				     unsigned long size, void *ptr)
1508{
1509	void *p;
1510
1511	/* Use "memcpy" for pointer assignments here to avoid problems
1512	 * with C99 strict type aliasing rules. */
1513	memcpy(&p, ptr, sizeof(p));
1514	p = realloc(p, size);
1515	if (!p)
1516		return EXT2_ET_NO_MEMORY;
1517	memcpy(ptr, &p, sizeof(p));
1518	return 0;
1519}
1520#endif	/* Custom memory routines */
1521
1522/*
1523 * Mark a filesystem superblock as dirty
1524 */
1525_INLINE_ void ext2fs_mark_super_dirty(ext2_filsys fs)
1526{
1527	fs->flags |= EXT2_FLAG_DIRTY | EXT2_FLAG_CHANGED;
1528}
1529
1530/*
1531 * Mark a filesystem as changed
1532 */
1533_INLINE_ void ext2fs_mark_changed(ext2_filsys fs)
1534{
1535	fs->flags |= EXT2_FLAG_CHANGED;
1536}
1537
1538/*
1539 * Check to see if a filesystem has changed
1540 */
1541_INLINE_ int ext2fs_test_changed(ext2_filsys fs)
1542{
1543	return (fs->flags & EXT2_FLAG_CHANGED);
1544}
1545
1546/*
1547 * Mark a filesystem as valid
1548 */
1549_INLINE_ void ext2fs_mark_valid(ext2_filsys fs)
1550{
1551	fs->flags |= EXT2_FLAG_VALID;
1552}
1553
1554/*
1555 * Mark a filesystem as NOT valid
1556 */
1557_INLINE_ void ext2fs_unmark_valid(ext2_filsys fs)
1558{
1559	fs->flags &= ~EXT2_FLAG_VALID;
1560}
1561
1562/*
1563 * Check to see if a filesystem is valid
1564 */
1565_INLINE_ int ext2fs_test_valid(ext2_filsys fs)
1566{
1567	return (fs->flags & EXT2_FLAG_VALID);
1568}
1569
1570/*
1571 * Mark the inode bitmap as dirty
1572 */
1573_INLINE_ void ext2fs_mark_ib_dirty(ext2_filsys fs)
1574{
1575	fs->flags |= EXT2_FLAG_IB_DIRTY | EXT2_FLAG_CHANGED;
1576}
1577
1578/*
1579 * Mark the block bitmap as dirty
1580 */
1581_INLINE_ void ext2fs_mark_bb_dirty(ext2_filsys fs)
1582{
1583	fs->flags |= EXT2_FLAG_BB_DIRTY | EXT2_FLAG_CHANGED;
1584}
1585
1586/*
1587 * Check to see if a filesystem's inode bitmap is dirty
1588 */
1589_INLINE_ int ext2fs_test_ib_dirty(ext2_filsys fs)
1590{
1591	return (fs->flags & EXT2_FLAG_IB_DIRTY);
1592}
1593
1594/*
1595 * Check to see if a filesystem's block bitmap is dirty
1596 */
1597_INLINE_ int ext2fs_test_bb_dirty(ext2_filsys fs)
1598{
1599	return (fs->flags & EXT2_FLAG_BB_DIRTY);
1600}
1601
1602/*
1603 * Return the group # of a block
1604 */
1605_INLINE_ int ext2fs_group_of_blk(ext2_filsys fs, blk_t blk)
1606{
1607	return ext2fs_group_of_blk2(fs, blk);
1608}
1609/*
1610 * Return the group # of an inode number
1611 */
1612_INLINE_ int ext2fs_group_of_ino(ext2_filsys fs, ext2_ino_t ino)
1613{
1614	return (ino - 1) / fs->super->s_inodes_per_group;
1615}
1616
1617/*
1618 * Return the first block (inclusive) in a group
1619 */
1620_INLINE_ blk_t ext2fs_group_first_block(ext2_filsys fs, dgrp_t group)
1621{
1622	return ext2fs_group_first_block2(fs, group);
1623}
1624
1625/*
1626 * Return the last block (inclusive) in a group
1627 */
1628_INLINE_ blk_t ext2fs_group_last_block(ext2_filsys fs, dgrp_t group)
1629{
1630	return ext2fs_group_last_block2(fs, group);
1631}
1632
1633_INLINE_ blk_t ext2fs_inode_data_blocks(ext2_filsys fs,
1634					struct ext2_inode *inode)
1635{
1636	return ext2fs_inode_data_blocks2(fs, inode);
1637}
1638
1639/*
1640 * This is an efficient, overflow safe way of calculating ceil((1.0 * a) / b)
1641 */
1642_INLINE_ unsigned int ext2fs_div_ceil(unsigned int a, unsigned int b)
1643{
1644	if (!a)
1645		return 0;
1646	return ((a - 1) / b) + 1;
1647}
1648
1649_INLINE_ __u64 ext2fs_div64_ceil(__u64 a, __u64 b)
1650{
1651	if (!a)
1652		return 0;
1653	return ((a - 1) / b) + 1;
1654}
1655
1656_INLINE_ int ext2fs_open_file(const char *pathname, int flags, ...)
1657{
1658	va_list args;
1659	mode_t mode;
1660
1661	va_start(args, flags);
1662	mode = va_arg(args, mode_t);
1663	va_end(args);
1664
1665	if (mode)
1666#ifdef HAVE_OPEN64
1667		return open64(pathname, flags, mode);
1668	else
1669		return open64(pathname, flags);
1670#else
1671		return open(pathname, flags, mode);
1672	else
1673		return open(pathname, flags);
1674#endif
1675}
1676
1677_INLINE_ int ext2fs_stat(const char *path, ext2fs_struct_stat *buf)
1678{
1679#ifdef HAVE_OPEN64
1680	return stat64(path, buf);
1681#else
1682	return open(path, buf);
1683#endif
1684}
1685
1686#undef _INLINE_
1687#endif
1688
1689#ifdef __cplusplus
1690}
1691#endif
1692
1693#endif /* _EXT2FS_EXT2FS_H */
1694