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