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