Whamcloud - gitweb
e2fsck: add support for expanding the inode size
[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 #ifndef __nonstring
22 #ifdef __has_attribute
23 #if __has_attribute(__nonstring__)
24 #define __nonstring                    __attribute__((__nonstring__))
25 #else
26 #define __nonstring
27 #endif /* __has_attribute(__nonstring__) */
28 #else
29 # define __nonstring
30 #endif /* __has_attribute */
31 #endif /* __nonstring */
32
33 #ifdef CONFIG_TDB
34 #define EXT2FS_NO_TDB_UNUSED
35 #else
36 #define EXT2FS_NO_TDB_UNUSED    EXT2FS_ATTR((unused))
37 #endif
38
39 #ifdef __cplusplus
40 extern "C" {
41 #endif
42
43 /*
44  * Non-GNU C compilers won't necessarily understand inline
45  */
46 #if (!defined(__GNUC__) && !defined(__WATCOMC__))
47 #define NO_INLINE_FUNCS
48 #endif
49
50 /*
51  * Where the master copy of the superblock is located, and how big
52  * superblocks are supposed to be.  We define SUPERBLOCK_SIZE because
53  * the size of the superblock structure is not necessarily trustworthy
54  * (some versions have the padding set up so that the superblock is
55  * 1032 bytes long).
56  */
57 #define SUPERBLOCK_OFFSET       1024
58 #define SUPERBLOCK_SIZE         1024
59
60 #define UUID_STR_SIZE 37
61
62 /*
63  * The last ext2fs revision level that this version of the library is
64  * able to support.
65  */
66 #define EXT2_LIB_CURRENT_REV    EXT2_DYNAMIC_REV
67
68 #ifdef HAVE_SYS_TYPES_H
69 #include <sys/types.h>
70 #endif
71
72 #include <stdio.h>
73 #include <stdlib.h>
74 #include <string.h>
75 #include <time.h>
76 #include <errno.h>
77
78 #if EXT2_FLAT_INCLUDES
79 #include "e2_types.h"
80 #include "ext2_fs.h"
81 #include "ext3_extents.h"
82 #else
83 #include <ext2fs/ext2_types.h>
84 #include <ext2fs/ext2_fs.h>
85 #include <ext2fs/ext3_extents.h>
86 #endif /* EXT2_FLAT_INCLUDES */
87
88 typedef __u32 __bitwise         ext2_ino_t;
89 typedef __u32 __bitwise         blk_t;
90 typedef __u64 __bitwise         blk64_t;
91 typedef __u32 __bitwise         dgrp_t;
92 typedef __s32 __bitwise         ext2_off_t;
93 typedef __s64 __bitwise         ext2_off64_t;
94 typedef __s64 __bitwise         e2_blkcnt_t;
95 typedef __u32 __bitwise         ext2_dirhash_t;
96
97 #if EXT2_FLAT_INCLUDES
98 #include "com_err.h"
99 #include "ext2_io.h"
100 #include "ext2_err.h"
101 #include "ext2_ext_attr.h"
102 #else
103 #include <et/com_err.h>
104 #include <ext2fs/ext2_io.h>
105 #include <ext2fs/ext2_err.h>
106 #include <ext2fs/ext2_ext_attr.h>
107 #endif
108
109 #include "hashmap.h"
110
111 /*
112  * Portability help for Microsoft Visual C++
113  */
114 #ifdef _MSC_VER
115 #define EXT2_QSORT_TYPE int __cdecl
116 #else
117 #define EXT2_QSORT_TYPE int
118 #endif
119
120 typedef struct struct_ext2_filsys *ext2_filsys;
121
122 #define EXT2FS_MARK_ERROR       0
123 #define EXT2FS_UNMARK_ERROR     1
124 #define EXT2FS_TEST_ERROR       2
125
126 struct ext2fs_struct_generic_bitmap_base {
127         errcode_t               magic;
128         ext2_filsys             fs;
129 };
130
131 typedef struct ext2fs_struct_generic_bitmap_base *ext2fs_generic_bitmap;
132 typedef struct ext2fs_struct_generic_bitmap_base *ext2fs_inode_bitmap;
133 typedef struct ext2fs_struct_generic_bitmap_base *ext2fs_block_bitmap;
134
135 #define EXT2_FIRST_INODE(s)     EXT2_FIRST_INO(s)
136
137
138 /*
139  * Badblocks list definitions
140  */
141
142 typedef struct ext2_struct_u32_list *ext2_badblocks_list;
143 typedef struct ext2_struct_u32_iterate *ext2_badblocks_iterate;
144
145 typedef struct ext2_struct_u32_list *ext2_u32_list;
146 typedef struct ext2_struct_u32_iterate *ext2_u32_iterate;
147
148 /* old */
149 typedef struct ext2_struct_u32_list *badblocks_list;
150 typedef struct ext2_struct_u32_iterate *badblocks_iterate;
151
152 #define BADBLOCKS_FLAG_DIRTY    1
153
154 /*
155  * ext2_dblist structure and abstractions (see dblist.c)
156  */
157 struct ext2_db_entry2 {
158         ext2_ino_t      ino;
159         blk64_t blk;
160         e2_blkcnt_t     blockcnt;
161 };
162
163 /* Ye Olde 32-bit version */
164 struct ext2_db_entry {
165         ext2_ino_t      ino;
166         blk_t   blk;
167         int     blockcnt;
168 };
169
170 typedef struct ext2_struct_dblist *ext2_dblist;
171
172 #define DBLIST_ABORT    1
173
174 /*
175  * ext2_fileio definitions
176  */
177
178 #define EXT2_FILE_WRITE         0x0001
179 #define EXT2_FILE_CREATE        0x0002
180
181 #define EXT2_FILE_MASK          0x00FF
182
183 #define EXT2_FILE_BUF_DIRTY     0x4000
184 #define EXT2_FILE_BUF_VALID     0x2000
185
186 typedef struct ext2_file *ext2_file_t;
187
188 #define EXT2_SEEK_SET   0
189 #define EXT2_SEEK_CUR   1
190 #define EXT2_SEEK_END   2
191
192 /*
193  * Flags for the ext2_filsys structure and for ext2fs_open()
194  */
195 #define EXT2_FLAG_RW                    0x01
196 #define EXT2_FLAG_CHANGED               0x02
197 #define EXT2_FLAG_DIRTY                 0x04
198 #define EXT2_FLAG_VALID                 0x08
199 #define EXT2_FLAG_IB_DIRTY              0x10
200 #define EXT2_FLAG_BB_DIRTY              0x20
201 #define EXT2_FLAG_SWAP_BYTES            0x40
202 #define EXT2_FLAG_SWAP_BYTES_READ       0x80
203 #define EXT2_FLAG_SWAP_BYTES_WRITE      0x100
204 #define EXT2_FLAG_MASTER_SB_ONLY        0x200
205 #define EXT2_FLAG_FORCE                 0x400
206 #define EXT2_FLAG_SUPER_ONLY            0x800
207 #define EXT2_FLAG_JOURNAL_DEV_OK        0x1000
208 #define EXT2_FLAG_IMAGE_FILE            0x2000
209 #define EXT2_FLAG_EXCLUSIVE             0x4000
210 #define EXT2_FLAG_SOFTSUPP_FEATURES     0x8000
211 #define EXT2_FLAG_NOFREE_ON_ERROR       0x10000
212 #define EXT2_FLAG_64BITS                0x20000
213 #define EXT2_FLAG_PRINT_PROGRESS        0x40000
214 #define EXT2_FLAG_DIRECT_IO             0x80000
215 #define EXT2_FLAG_SKIP_MMP              0x100000
216 #define EXT2_FLAG_IGNORE_CSUM_ERRORS    0x200000
217 #define EXT2_FLAG_SHARE_DUP             0x400000
218 #define EXT2_FLAG_IGNORE_SB_ERRORS      0x800000
219 #define EXT2_FLAG_BBITMAP_TAIL_PROBLEM  0x1000000
220 #define EXT2_FLAG_IBITMAP_TAIL_PROBLEM  0x2000000
221 #define EXT2_FLAG_THREADS               0x4000000
222 #define EXT2_FLAG_IGNORE_SWAP_DIRENT    0x8000000
223
224 /*
225  * Special flag in the ext2 inode i_flag field that means that this is
226  * a new inode.  (So that ext2_write_inode() can clear extra fields.)
227  */
228 #define EXT2_NEW_INODE_FL       0x80000000
229
230 /*
231  * Flags for mkjournal
232  */
233 #define EXT2_MKJOURNAL_V1_SUPER 0x0000001 /* create V1 superblock (deprecated) */
234 #define EXT2_MKJOURNAL_LAZYINIT 0x0000002 /* don't zero journal inode before use*/
235 #define EXT2_MKJOURNAL_NO_MNT_CHECK 0x0000004 /* don't check mount status */
236
237 /*
238  * Normal journal area size to fast commit area size ratio. This is used to
239  * set default size of fast commit area.
240  */
241 #define EXT2_JOURNAL_TO_FC_BLKS_RATIO           64
242
243 struct blk_alloc_ctx;
244 struct opaque_ext2_group_desc;
245
246 struct struct_ext2_filsys {
247         errcode_t                       magic;
248         io_channel                      io;
249         int                             flags;
250         char *                          device_name;
251         struct ext2_super_block *       super;
252         unsigned int                    blocksize;
253         int                             fragsize;
254         dgrp_t                          group_desc_count;
255         unsigned long                   desc_blocks;
256         struct opaque_ext2_group_desc * group_desc;
257         unsigned int                    inode_blocks_per_group;
258         ext2fs_inode_bitmap             inode_map;
259         ext2fs_block_bitmap             block_map;
260         /* XXX FIXME-64: not 64-bit safe, but not used? */
261         errcode_t (*get_blocks)(ext2_filsys fs, ext2_ino_t ino, blk_t *blocks);
262         errcode_t (*check_directory)(ext2_filsys fs, ext2_ino_t ino);
263         errcode_t (*write_bitmaps)(ext2_filsys fs);
264         errcode_t (*read_inode)(ext2_filsys fs, ext2_ino_t ino,
265                                 struct ext2_inode *inode);
266         errcode_t (*write_inode)(ext2_filsys fs, ext2_ino_t ino,
267                                 struct ext2_inode *inode);
268         ext2_badblocks_list             badblocks;
269         ext2_dblist                     dblist;
270         __u32                           stride; /* for mke2fs */
271         struct ext2_super_block *       orig_super;
272         struct ext2_image_hdr *         image_header;
273         __u32                           umask;
274         time_t                          now;
275         int                             cluster_ratio_bits;
276         __u16                           default_bitmap_type;
277         __u16                           fs_num_threads;
278         /*
279          * Reserved for future expansion
280          */
281         __u32                           reserved[5];
282
283         /*
284          * Reserved for the use of the calling application.
285          */
286         void *                          priv_data;
287
288         /*
289          * Inode cache
290          */
291         struct ext2_inode_cache         *icache;
292         io_channel                      image_io;
293
294         /*
295          * More callback functions
296          */
297         errcode_t (*get_alloc_block)(ext2_filsys fs, blk64_t goal,
298                                      blk64_t *ret);
299         errcode_t (*get_alloc_block2)(ext2_filsys fs, blk64_t goal,
300                                       blk64_t *ret, struct blk_alloc_ctx *ctx);
301         void (*block_alloc_stats)(ext2_filsys fs, blk64_t blk, int inuse);
302
303         /*
304          * Buffers for Multiple mount protection(MMP) block.
305          */
306         void *mmp_buf;
307         void *mmp_cmp;
308         int mmp_fd;
309
310         /*
311          * Time at which e2fsck last updated the MMP block.
312          */
313         long mmp_last_written;
314
315         /* progress operation functions */
316         struct ext2fs_progress_ops *progress_ops;
317
318         /* Precomputed FS UUID checksum for seeding other checksums */
319         __u32 csum_seed;
320
321         io_channel                      journal_io;
322         char                            *journal_name;
323
324         /* New block range allocation hooks */
325         errcode_t (*new_range)(ext2_filsys fs, int flags, blk64_t goal,
326                                blk64_t len, blk64_t *pblk, blk64_t *plen);
327         void (*block_alloc_stats_range)(ext2_filsys fs, blk64_t blk, blk_t num,
328                                         int inuse);
329
330         /* hashmap for SHA of data blocks */
331         struct ext2fs_hashmap* block_sha_map;
332
333         const struct ext2fs_nls_table *encoding;
334 };
335
336 #if EXT2_FLAT_INCLUDES
337 #include "e2_bitops.h"
338 #else
339 #include <ext2fs/bitops.h>
340 #endif
341
342 /*
343  * 64-bit bitmap backend types
344  */
345 #define EXT2FS_BMAP64_BITARRAY  1
346 #define EXT2FS_BMAP64_RBTREE    2
347 #define EXT2FS_BMAP64_AUTODIR   3
348
349 /*
350  * Return flags for the block iterator functions
351  */
352 #define BLOCK_CHANGED                   1
353 #define BLOCK_ABORT                     2
354 #define BLOCK_ERROR                     4
355 #define BLOCK_INLINE_DATA_CHANGED       8
356
357 /*
358  * Block interate flags
359  *
360  * BLOCK_FLAG_APPEND, or BLOCK_FLAG_HOLE, indicates that the interator
361  * function should be called on blocks where the block number is zero.
362  * This is used by ext2fs_expand_dir() to be able to add a new block
363  * to an inode.  It can also be used for programs that want to be able
364  * to deal with files that contain "holes".
365  *
366  * BLOCK_FLAG_DEPTH_TRAVERSE indicates that the iterator function for
367  * the indirect, doubly indirect, etc. blocks should be called after
368  * all of the blocks contained in the indirect blocks are processed.
369  * This is useful if you are going to be deallocating blocks from an
370  * inode.
371  *
372  * BLOCK_FLAG_DATA_ONLY indicates that the iterator function should be
373  * called for data blocks only.
374  *
375  * BLOCK_FLAG_READ_ONLY is a promise by the caller that it will not
376  * modify returned block number.
377  *
378  * BLOCK_FLAG_NO_LARGE is for internal use only.  It informs
379  * ext2fs_block_iterate2 that large files won't be accepted.
380  */
381 #define BLOCK_FLAG_APPEND       1
382 #define BLOCK_FLAG_HOLE         1
383 #define BLOCK_FLAG_DEPTH_TRAVERSE       2
384 #define BLOCK_FLAG_DATA_ONLY    4
385 #define BLOCK_FLAG_READ_ONLY    8
386
387 #define BLOCK_FLAG_NO_LARGE     0x1000
388
389 /*
390  * Magic "block count" return values for the block iterator function.
391  */
392 #define BLOCK_COUNT_IND         (-1)
393 #define BLOCK_COUNT_DIND        (-2)
394 #define BLOCK_COUNT_TIND        (-3)
395 #define BLOCK_COUNT_TRANSLATOR  (-4)
396
397 #define BLOCK_ALLOC_UNKNOWN     0
398 #define BLOCK_ALLOC_DATA        1
399 #define BLOCK_ALLOC_METADATA    2
400
401 struct blk_alloc_ctx {
402         ext2_ino_t              ino;
403         struct ext2_inode       *inode;
404         blk64_t                 lblk;
405         int                     flags;
406 };
407
408 #if 0
409 /*
410  * Flags for ext2fs_move_blocks
411  */
412 #define EXT2_BMOVE_GET_DBLIST   0x0001
413 #define EXT2_BMOVE_DEBUG        0x0002
414 #endif
415
416 /*
417  * Generic (non-filesystem layout specific) extents structure
418  */
419
420 #define EXT2_EXTENT_FLAGS_LEAF          0x0001
421 #define EXT2_EXTENT_FLAGS_UNINIT        0x0002
422 #define EXT2_EXTENT_FLAGS_SECOND_VISIT  0x0004
423
424 struct ext2fs_extent {
425         blk64_t e_pblk;         /* first physical block */
426         blk64_t e_lblk;         /* first logical block extent covers */
427         __u32   e_len;          /* number of blocks covered by extent */
428         __u32   e_flags;        /* extent flags */
429 };
430
431 typedef struct ext2_extent_handle *ext2_extent_handle_t;
432 typedef struct ext2_extent_path *ext2_extent_path_t;
433
434 /*
435  * Flags used by ext2fs_extent_get()
436  */
437 #define EXT2_EXTENT_CURRENT     0x0000
438 #define EXT2_EXTENT_MOVE_MASK   0x000F
439 #define EXT2_EXTENT_ROOT        0x0001
440 #define EXT2_EXTENT_LAST_LEAF   0x0002
441 #define EXT2_EXTENT_FIRST_SIB   0x0003
442 #define EXT2_EXTENT_LAST_SIB    0x0004
443 #define EXT2_EXTENT_NEXT_SIB    0x0005
444 #define EXT2_EXTENT_PREV_SIB    0x0006
445 #define EXT2_EXTENT_NEXT_LEAF   0x0007
446 #define EXT2_EXTENT_PREV_LEAF   0x0008
447 #define EXT2_EXTENT_NEXT        0x0009
448 #define EXT2_EXTENT_PREV        0x000A
449 #define EXT2_EXTENT_UP          0x000B
450 #define EXT2_EXTENT_DOWN        0x000C
451 #define EXT2_EXTENT_DOWN_AND_LAST 0x000D
452
453 /*
454  * Flags used by ext2fs_extent_insert()
455  */
456 #define EXT2_EXTENT_INSERT_AFTER        0x0001 /* insert after handle loc'n */
457 #define EXT2_EXTENT_INSERT_NOSPLIT      0x0002 /* insert may not cause split */
458
459 /*
460  * Flags used by ext2fs_extent_delete()
461  */
462 #define EXT2_EXTENT_DELETE_KEEP_EMPTY   0x001 /* keep node if last extent gone */
463
464 /*
465  * Flags used by ext2fs_extent_set_bmap()
466  */
467 #define EXT2_EXTENT_SET_BMAP_UNINIT     0x0001
468
469 /*
470  * Data structure returned by ext2fs_extent_get_info()
471  */
472 struct ext2_extent_info {
473         int             curr_entry;
474         int             curr_level;
475         int             num_entries;
476         int             max_entries;
477         int             max_depth;
478         int             bytes_avail;
479         blk64_t         max_lblk;
480         blk64_t         max_pblk;
481         __u32           max_len;
482         __u32           max_uninit_len;
483 };
484
485 /*
486  * Flags for directory block reading and writing functions
487  */
488 #define EXT2_DIRBLOCK_V2_STRUCT 0x0001
489
490 /*
491  * Return flags for the directory iterator functions
492  */
493 #define DIRENT_CHANGED  1
494 #define DIRENT_ABORT    2
495 #define DIRENT_ERROR    3
496
497 /*
498  * Directory iterator flags
499  */
500
501 #define DIRENT_FLAG_INCLUDE_EMPTY       1
502 #define DIRENT_FLAG_INCLUDE_REMOVED     2
503 #define DIRENT_FLAG_INCLUDE_CSUM        4
504 #define DIRENT_FLAG_INCLUDE_INLINE_DATA 8
505
506 #define DIRENT_DOT_FILE         1
507 #define DIRENT_DOT_DOT_FILE     2
508 #define DIRENT_OTHER_FILE       3
509 #define DIRENT_DELETED_FILE     4
510 #define DIRENT_CHECKSUM         5
511
512 /*
513  * Inode scan definitions
514  */
515 typedef struct ext2_struct_inode_scan *ext2_inode_scan;
516
517 /*
518  * ext2fs_scan flags
519  */
520 #define EXT2_SF_CHK_BADBLOCKS   0x0001
521 #define EXT2_SF_BAD_INODE_BLK   0x0002
522 #define EXT2_SF_BAD_EXTRA_BYTES 0x0004
523 #define EXT2_SF_SKIP_MISSING_ITABLE     0x0008
524 #define EXT2_SF_DO_LAZY         0x0010
525 #define EXT2_SF_WARN_GARBAGE_INODES     0x0020
526
527 /*
528  * ext2fs_check_if_mounted flags
529  */
530 #define EXT2_MF_MOUNTED         1
531 #define EXT2_MF_ISROOT          2
532 #define EXT2_MF_READONLY        4
533 #define EXT2_MF_SWAP            8
534 #define EXT2_MF_BUSY            16
535
536 /*
537  * Ext2/linux mode flags.  We define them here so that we don't need
538  * to depend on the OS's sys/stat.h, since we may be compiling on a
539  * non-Linux system.
540  */
541 #define LINUX_S_IFMT  00170000
542 #define LINUX_S_IFSOCK 0140000
543 #define LINUX_S_IFLNK    0120000
544 #define LINUX_S_IFREG  0100000
545 #define LINUX_S_IFBLK  0060000
546 #define LINUX_S_IFDIR  0040000
547 #define LINUX_S_IFCHR  0020000
548 #define LINUX_S_IFIFO  0010000
549 #define LINUX_S_ISUID  0004000
550 #define LINUX_S_ISGID  0002000
551 #define LINUX_S_ISVTX  0001000
552
553 #define LINUX_S_IRWXU 00700
554 #define LINUX_S_IRUSR 00400
555 #define LINUX_S_IWUSR 00200
556 #define LINUX_S_IXUSR 00100
557
558 #define LINUX_S_IRWXG 00070
559 #define LINUX_S_IRGRP 00040
560 #define LINUX_S_IWGRP 00020
561 #define LINUX_S_IXGRP 00010
562
563 #define LINUX_S_IRWXO 00007
564 #define LINUX_S_IROTH 00004
565 #define LINUX_S_IWOTH 00002
566 #define LINUX_S_IXOTH 00001
567
568 #define LINUX_S_ISLNK(m)        (((m) & LINUX_S_IFMT) == LINUX_S_IFLNK)
569 #define LINUX_S_ISREG(m)        (((m) & LINUX_S_IFMT) == LINUX_S_IFREG)
570 #define LINUX_S_ISDIR(m)        (((m) & LINUX_S_IFMT) == LINUX_S_IFDIR)
571 #define LINUX_S_ISCHR(m)        (((m) & LINUX_S_IFMT) == LINUX_S_IFCHR)
572 #define LINUX_S_ISBLK(m)        (((m) & LINUX_S_IFMT) == LINUX_S_IFBLK)
573 #define LINUX_S_ISFIFO(m)       (((m) & LINUX_S_IFMT) == LINUX_S_IFIFO)
574 #define LINUX_S_ISSOCK(m)       (((m) & LINUX_S_IFMT) == LINUX_S_IFSOCK)
575
576 /*
577  * ext2 size of an inode
578  */
579 #define EXT2_I_SIZE(i)  ((i)->i_size | ((__u64) (i)->i_size_high << 32))
580
581 /*
582  * ext2_icount_t abstraction
583  */
584 #define EXT2_ICOUNT_OPT_INCREMENT       0x01
585 #define EXT2_ICOUNT_OPT_FULLMAP         0x02
586
587 typedef struct ext2_icount *ext2_icount_t;
588
589 /*
590  * Flags for ext2fs_bmap
591  */
592 #define BMAP_ALLOC      0x0001
593 #define BMAP_SET        0x0002
594 #define BMAP_UNINIT     0x0004
595 #define BMAP_ZERO       0x0008
596
597 /*
598  * Returned flags from ext2fs_bmap
599  */
600 #define BMAP_RET_UNINIT 0x0001
601
602 /*
603  * Flags for ext2fs_read_inode2
604  */
605 #define READ_INODE_NOCSUM       0x0001
606
607 /*
608  * Flags for ext2fs_write_inode2
609  */
610 #define WRITE_INODE_NOCSUM      0x0001
611
612 /*
613  * Flags for imager.c functions
614  */
615 #define IMAGER_FLAG_INODEMAP    1
616 #define IMAGER_FLAG_SPARSEWRITE 2
617
618 /*
619  * For checking structure magic numbers...
620  */
621
622 #define EXT2_CHECK_MAGIC(struct, code) \
623           if ((struct)->magic != (code)) return (code)
624
625 /*
626  * Flags for returning status of ext2fs_expand_extra_isize()
627  */
628 #define EXT2_EXPAND_EISIZE_UNSAFE       0x0001
629 #define EXT2_EXPAND_EISIZE_NEW_BLOCK    0x0002
630 #define EXT2_EXPAND_EISIZE_NOSPC        0x0004
631
632 /*
633  * Features supported by this version of the library
634  */
635 #define EXT2_LIB_FEATURE_COMPAT_SUPP    (EXT2_FEATURE_COMPAT_DIR_PREALLOC|\
636                                          EXT2_FEATURE_COMPAT_IMAGIC_INODES|\
637                                          EXT3_FEATURE_COMPAT_HAS_JOURNAL|\
638                                          EXT2_FEATURE_COMPAT_RESIZE_INODE|\
639                                          EXT2_FEATURE_COMPAT_DIR_INDEX|\
640                                          EXT2_FEATURE_COMPAT_EXT_ATTR|\
641                                          EXT4_FEATURE_COMPAT_SPARSE_SUPER2|\
642                                          EXT4_FEATURE_COMPAT_FAST_COMMIT|\
643                                          EXT4_FEATURE_COMPAT_STABLE_INODES)
644
645 #ifdef CONFIG_MMP
646 #define EXT4_LIB_INCOMPAT_MMP           EXT4_FEATURE_INCOMPAT_MMP
647 #else
648 #define EXT4_LIB_INCOMPAT_MMP           (0)
649 #endif
650
651 #define EXT2_LIB_FEATURE_INCOMPAT_SUPP  (EXT2_FEATURE_INCOMPAT_FILETYPE|\
652                                          EXT3_FEATURE_INCOMPAT_JOURNAL_DEV|\
653                                          EXT2_FEATURE_INCOMPAT_META_BG|\
654                                          EXT3_FEATURE_INCOMPAT_RECOVER|\
655                                          EXT3_FEATURE_INCOMPAT_EXTENTS|\
656                                          EXT4_FEATURE_INCOMPAT_FLEX_BG|\
657                                          EXT4_FEATURE_INCOMPAT_EA_INODE|\
658                                          EXT4_LIB_INCOMPAT_MMP|\
659                                          EXT4_FEATURE_INCOMPAT_64BIT|\
660                                          EXT4_FEATURE_INCOMPAT_INLINE_DATA|\
661                                          EXT4_FEATURE_INCOMPAT_ENCRYPT|\
662                                          EXT4_FEATURE_INCOMPAT_CASEFOLD|\
663                                          EXT4_FEATURE_INCOMPAT_CSUM_SEED|\
664                                          EXT4_FEATURE_INCOMPAT_LARGEDIR)
665
666 #define EXT2_LIB_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER|\
667                                          EXT4_FEATURE_RO_COMPAT_HUGE_FILE|\
668                                          EXT2_FEATURE_RO_COMPAT_LARGE_FILE|\
669                                          EXT4_FEATURE_RO_COMPAT_DIR_NLINK|\
670                                          EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE|\
671                                          EXT4_FEATURE_RO_COMPAT_GDT_CSUM|\
672                                          EXT4_FEATURE_RO_COMPAT_BIGALLOC|\
673                                          EXT4_FEATURE_RO_COMPAT_QUOTA|\
674                                          EXT4_FEATURE_RO_COMPAT_METADATA_CSUM|\
675                                          EXT4_FEATURE_RO_COMPAT_READONLY |\
676                                          EXT4_FEATURE_RO_COMPAT_PROJECT |\
677                                          EXT4_FEATURE_RO_COMPAT_SHARED_BLOCKS |\
678                                          EXT4_FEATURE_RO_COMPAT_VERITY)
679
680 /*
681  * These features are only allowed if EXT2_FLAG_SOFTSUPP_FEATURES is passed
682  * to ext2fs_openfs()
683  */
684 #define EXT2_LIB_SOFTSUPP_INCOMPAT      (0)
685 #define EXT2_LIB_SOFTSUPP_RO_COMPAT     (EXT4_FEATURE_RO_COMPAT_REPLICA)
686
687
688 /* Translate a block number to a cluster number */
689 #define EXT2FS_CLUSTER_RATIO(fs)        (1 << (fs)->cluster_ratio_bits)
690 #define EXT2FS_CLUSTER_MASK(fs)         (EXT2FS_CLUSTER_RATIO(fs) - 1)
691 #define EXT2FS_B2C(fs, blk)             ((blk) >> (fs)->cluster_ratio_bits)
692 /* Translate a cluster number to a block number */
693 #define EXT2FS_C2B(fs, cluster)         ((cluster) << (fs)->cluster_ratio_bits)
694 /* Translate # of blks to # of clusters */
695 #define EXT2FS_NUM_B2C(fs, blks)        (((blks) + EXT2FS_CLUSTER_MASK(fs)) >> \
696                                          (fs)->cluster_ratio_bits)
697
698 #if defined(HAVE_FSTAT64) && !defined(__OSX_AVAILABLE_BUT_DEPRECATED)
699 typedef struct stat64 ext2fs_struct_stat;
700 #else
701 typedef struct stat ext2fs_struct_stat;
702 #endif
703
704 /*
705  * For ext2fs_close2() and ext2fs_flush2(), this flag allows you to
706  * avoid the fsync call.
707  */
708 #define EXT2_FLAG_FLUSH_NO_SYNC          1
709
710 /*
711  * Modify and iterate extended attributes
712  */
713 struct ext2_xattr_handle;
714 #define XATTR_ABORT     1
715 #define XATTR_CHANGED   2
716
717 /*
718  * flags for ext2fs_rw_bitmaps()
719  */
720 #define EXT2FS_BITMAPS_WRITE            0x0001
721 #define EXT2FS_BITMAPS_BLOCK            0x0002
722 #define EXT2FS_BITMAPS_INODE            0x0004
723 #define EXT2FS_BITMAPS_VALID_FLAGS      0x0007
724
725 /*
726  * function prototypes
727  */
728 static inline int ext2fs_has_group_desc_csum(ext2_filsys fs)
729 {
730         return ext2fs_has_feature_metadata_csum(fs->super) ||
731                ext2fs_has_feature_gdt_csum(fs->super);
732 }
733
734 /* The LARGE_FILE feature should be set if we have stored files 2GB+ in size */
735 static inline int ext2fs_needs_large_file_feature(unsigned long long file_size)
736 {
737         return file_size >= 0x80000000ULL;
738 }
739
740 /* alloc.c */
741 extern void ext2fs_clear_block_uninit(ext2_filsys fs, dgrp_t group);
742 extern errcode_t ext2fs_new_inode(ext2_filsys fs, ext2_ino_t dir, int mode,
743                                   ext2fs_inode_bitmap map, ext2_ino_t *ret);
744 extern errcode_t ext2fs_new_block(ext2_filsys fs, blk_t goal,
745                                   ext2fs_block_bitmap map, blk_t *ret);
746 extern errcode_t ext2fs_new_block2(ext2_filsys fs, blk64_t goal,
747                                    ext2fs_block_bitmap map, blk64_t *ret);
748 extern errcode_t ext2fs_new_block3(ext2_filsys fs, blk64_t goal,
749                                    ext2fs_block_bitmap map, blk64_t *ret,
750                                    struct blk_alloc_ctx *ctx);
751 extern errcode_t ext2fs_get_free_blocks(ext2_filsys fs, blk_t start,
752                                         blk_t finish, int num,
753                                         ext2fs_block_bitmap map,
754                                         blk_t *ret);
755 extern errcode_t ext2fs_get_free_blocks2(ext2_filsys fs, blk64_t start,
756                                          blk64_t finish, int num,
757                                          ext2fs_block_bitmap map,
758                                          blk64_t *ret);
759 extern errcode_t ext2fs_alloc_block(ext2_filsys fs, blk_t goal,
760                                     char *block_buf, blk_t *ret);
761 extern errcode_t ext2fs_alloc_block2(ext2_filsys fs, blk64_t goal,
762                                      char *block_buf, blk64_t *ret);
763 extern errcode_t ext2fs_alloc_block3(ext2_filsys fs, blk64_t goal,
764                                      char *block_buf, blk64_t *ret,
765                                      struct blk_alloc_ctx *ctx);
766
767 extern void ext2fs_set_alloc_block_callback(ext2_filsys fs,
768                                             errcode_t (*func)(ext2_filsys fs,
769                                                               blk64_t goal,
770                                                               blk64_t *ret),
771                                             errcode_t (**old)(ext2_filsys fs,
772                                                               blk64_t goal,
773                                                               blk64_t *ret));
774 blk64_t ext2fs_find_inode_goal(ext2_filsys fs, ext2_ino_t ino,
775                                struct ext2_inode *inode, blk64_t lblk);
776 extern void ext2fs_set_new_range_callback(ext2_filsys fs,
777         errcode_t (*func)(ext2_filsys fs, int flags, blk64_t goal,
778                                blk64_t len, blk64_t *pblk, blk64_t *plen),
779         errcode_t (**old)(ext2_filsys fs, int flags, blk64_t goal,
780                                blk64_t len, blk64_t *pblk, blk64_t *plen));
781 extern void ext2fs_set_block_alloc_stats_range_callback(ext2_filsys fs,
782         void (*func)(ext2_filsys fs, blk64_t blk,
783                                     blk_t num, int inuse),
784         void (**old)(ext2_filsys fs, blk64_t blk,
785                                     blk_t num, int inuse));
786 #define EXT2_NEWRANGE_FIXED_GOAL        (0x1)
787 #define EXT2_NEWRANGE_MIN_LENGTH        (0x2)
788 #define EXT2_NEWRANGE_ALL_FLAGS         (0x3)
789 errcode_t ext2fs_new_range(ext2_filsys fs, int flags, blk64_t goal,
790                            blk64_t len, ext2fs_block_bitmap map, blk64_t *pblk,
791                            blk64_t *plen);
792 #define EXT2_ALLOCRANGE_FIXED_GOAL      (0x1)
793 #define EXT2_ALLOCRANGE_ZERO_BLOCKS     (0x2)
794 #define EXT2_ALLOCRANGE_ALL_FLAGS       (0x3)
795 errcode_t ext2fs_alloc_range(ext2_filsys fs, int flags, blk64_t goal,
796                              blk_t len, blk64_t *ret);
797
798 /* alloc_sb.c */
799 extern int ext2fs_reserve_super_and_bgd(ext2_filsys fs,
800                                         dgrp_t group,
801                                         ext2fs_block_bitmap bmap);
802 extern void ext2fs_set_block_alloc_stats_callback(ext2_filsys fs,
803                                                   void (*func)(ext2_filsys fs,
804                                                                blk64_t blk,
805                                                                int inuse),
806                                                   void (**old)(ext2_filsys fs,
807                                                                blk64_t blk,
808                                                                int inuse));
809
810 /* alloc_stats.c */
811 void ext2fs_inode_alloc_stats(ext2_filsys fs, ext2_ino_t ino, int inuse);
812 void ext2fs_inode_alloc_stats2(ext2_filsys fs, ext2_ino_t ino,
813                                int inuse, int isdir);
814 void ext2fs_block_alloc_stats(ext2_filsys fs, blk_t blk, int inuse);
815 void ext2fs_block_alloc_stats2(ext2_filsys fs, blk64_t blk, int inuse);
816 void ext2fs_block_alloc_stats_range(ext2_filsys fs, blk64_t blk,
817                                     blk_t num, int inuse);
818
819 /* alloc_tables.c */
820 extern errcode_t ext2fs_allocate_tables(ext2_filsys fs);
821 extern errcode_t ext2fs_allocate_group_table(ext2_filsys fs, dgrp_t group,
822                                              ext2fs_block_bitmap bmap);
823
824 /* badblocks.c */
825 extern errcode_t ext2fs_u32_list_create(ext2_u32_list *ret, int size);
826 extern errcode_t ext2fs_u32_list_add(ext2_u32_list bb, __u32 blk);
827 extern int ext2fs_u32_list_find(ext2_u32_list bb, __u32 blk);
828 extern int ext2fs_u32_list_test(ext2_u32_list bb, blk_t blk);
829 extern errcode_t ext2fs_u32_list_iterate_begin(ext2_u32_list bb,
830                                                ext2_u32_iterate *ret);
831 extern int ext2fs_u32_list_iterate(ext2_u32_iterate iter, blk_t *blk);
832 extern void ext2fs_u32_list_iterate_end(ext2_u32_iterate iter);
833 extern errcode_t ext2fs_u32_copy(ext2_u32_list src, ext2_u32_list *dest);
834 extern int ext2fs_u32_list_equal(ext2_u32_list bb1, ext2_u32_list bb2);
835
836 extern errcode_t ext2fs_badblocks_list_create(ext2_badblocks_list *ret,
837                                             int size);
838 extern errcode_t ext2fs_badblocks_list_add(ext2_badblocks_list bb,
839                                            blk_t blk);
840 extern int ext2fs_badblocks_list_test(ext2_badblocks_list bb,
841                                     blk_t blk);
842 extern int ext2fs_u32_list_del(ext2_u32_list bb, __u32 blk);
843 extern void ext2fs_badblocks_list_del(ext2_u32_list bb, __u32 blk);
844 extern errcode_t
845         ext2fs_badblocks_list_iterate_begin(ext2_badblocks_list bb,
846                                             ext2_badblocks_iterate *ret);
847 extern int ext2fs_badblocks_list_iterate(ext2_badblocks_iterate iter,
848                                          blk_t *blk);
849 extern void ext2fs_badblocks_list_iterate_end(ext2_badblocks_iterate iter);
850 extern errcode_t ext2fs_badblocks_copy(ext2_badblocks_list src,
851                                        ext2_badblocks_list *dest);
852 extern errcode_t ext2fs_badblocks_merge(ext2_badblocks_list src,
853                                         ext2_badblocks_list dest);
854 extern int ext2fs_badblocks_equal(ext2_badblocks_list bb1,
855                                   ext2_badblocks_list bb2);
856 extern int ext2fs_u32_list_count(ext2_u32_list bb);
857
858 /* bb_compat */
859 extern errcode_t badblocks_list_create(badblocks_list *ret, int size);
860 extern errcode_t badblocks_list_add(badblocks_list bb, blk_t blk);
861 extern int badblocks_list_test(badblocks_list bb, blk_t blk);
862 extern errcode_t badblocks_list_iterate_begin(badblocks_list bb,
863                                               badblocks_iterate *ret);
864 extern int badblocks_list_iterate(badblocks_iterate iter, blk_t *blk);
865 extern void badblocks_list_iterate_end(badblocks_iterate iter);
866 extern void badblocks_list_free(badblocks_list bb);
867
868 /* bb_inode.c */
869 extern errcode_t ext2fs_update_bb_inode(ext2_filsys fs,
870                                         ext2_badblocks_list bb_list);
871
872 /* bitmaps.c */
873 extern void ext2fs_free_block_bitmap(ext2fs_block_bitmap bitmap);
874 extern void ext2fs_free_inode_bitmap(ext2fs_inode_bitmap bitmap);
875 extern errcode_t ext2fs_copy_bitmap(ext2fs_generic_bitmap src,
876                                     ext2fs_generic_bitmap *dest);
877 errcode_t ext2fs_merge_bitmap(ext2fs_generic_bitmap src,
878                               ext2fs_generic_bitmap dest,
879                               ext2fs_generic_bitmap dup,
880                               ext2fs_generic_bitmap dup_allowed);
881 extern errcode_t ext2fs_allocate_block_bitmap(ext2_filsys fs,
882                                               const char *descr,
883                                               ext2fs_block_bitmap *ret);
884 extern errcode_t ext2fs_allocate_subcluster_bitmap(ext2_filsys fs,
885                                                    const char *descr,
886                                                    ext2fs_block_bitmap *ret);
887 extern int ext2fs_get_bitmap_granularity(ext2fs_block_bitmap bitmap);
888 extern errcode_t ext2fs_allocate_inode_bitmap(ext2_filsys fs,
889                                               const char *descr,
890                                               ext2fs_inode_bitmap *ret);
891 extern errcode_t ext2fs_fudge_inode_bitmap_end(ext2fs_inode_bitmap bitmap,
892                                                ext2_ino_t end, ext2_ino_t *oend);
893 extern errcode_t ext2fs_fudge_block_bitmap_end(ext2fs_block_bitmap bitmap,
894                                                blk_t end, blk_t *oend);
895 extern errcode_t ext2fs_fudge_block_bitmap_end2(ext2fs_block_bitmap bitmap,
896                                          blk64_t end, blk64_t *oend);
897 extern void ext2fs_clear_inode_bitmap(ext2fs_inode_bitmap bitmap);
898 extern void ext2fs_clear_block_bitmap(ext2fs_block_bitmap bitmap);
899 extern errcode_t ext2fs_resize_inode_bitmap(__u32 new_end, __u32 new_real_end,
900                                             ext2fs_inode_bitmap bmap);
901 extern errcode_t ext2fs_resize_inode_bitmap2(__u64 new_end,
902                                              __u64 new_real_end,
903                                              ext2fs_inode_bitmap bmap);
904 extern errcode_t ext2fs_resize_block_bitmap(__u32 new_end, __u32 new_real_end,
905                                             ext2fs_block_bitmap bmap);
906 extern errcode_t ext2fs_resize_block_bitmap2(__u64 new_end,
907                                              __u64 new_real_end,
908                                              ext2fs_block_bitmap bmap);
909 extern errcode_t ext2fs_compare_block_bitmap(ext2fs_block_bitmap bm1,
910                                              ext2fs_block_bitmap bm2);
911 extern errcode_t ext2fs_compare_inode_bitmap(ext2fs_inode_bitmap bm1,
912                                              ext2fs_inode_bitmap bm2);
913 extern errcode_t ext2fs_set_inode_bitmap_range(ext2fs_inode_bitmap bmap,
914                                         ext2_ino_t start, unsigned int num,
915                                         void *in);
916 extern errcode_t ext2fs_set_inode_bitmap_range2(ext2fs_inode_bitmap bmap,
917                                          __u64 start, size_t num,
918                                          void *in);
919 extern errcode_t ext2fs_get_inode_bitmap_range(ext2fs_inode_bitmap bmap,
920                                         ext2_ino_t start, unsigned int num,
921                                         void *out);
922 extern errcode_t ext2fs_get_inode_bitmap_range2(ext2fs_inode_bitmap bmap,
923                                          __u64 start, size_t num,
924                                          void *out);
925 extern errcode_t ext2fs_set_block_bitmap_range(ext2fs_block_bitmap bmap,
926                                         blk_t start, unsigned int num,
927                                         void *in);
928 extern errcode_t ext2fs_set_block_bitmap_range2(ext2fs_block_bitmap bmap,
929                                          blk64_t start, size_t num,
930                                          void *in);
931 extern errcode_t ext2fs_get_block_bitmap_range(ext2fs_block_bitmap bmap,
932                                         blk_t start, unsigned int num,
933                                         void *out);
934 extern errcode_t ext2fs_get_block_bitmap_range2(ext2fs_block_bitmap bmap,
935                                          blk64_t start, size_t num,
936                                          void *out);
937
938 /* blknum.c */
939 extern __u32 ext2fs_inode_bitmap_checksum(ext2_filsys fs, dgrp_t group);
940 extern __u32 ext2fs_block_bitmap_checksum(ext2_filsys fs, dgrp_t group);
941 extern dgrp_t ext2fs_group_of_blk2(ext2_filsys fs, blk64_t);
942 extern blk64_t ext2fs_group_first_block2(ext2_filsys fs, dgrp_t group);
943 extern blk64_t ext2fs_group_last_block2(ext2_filsys fs, dgrp_t group);
944 extern int ext2fs_group_blocks_count(ext2_filsys fs, dgrp_t group);
945 extern blk64_t ext2fs_inode_data_blocks2(ext2_filsys fs,
946                                          struct ext2_inode *inode);
947 extern blk64_t ext2fs_inode_i_blocks(ext2_filsys fs,
948                                      struct ext2_inode *inode);
949 extern blk64_t ext2fs_get_stat_i_blocks(ext2_filsys fs,
950                                         struct ext2_inode *inode);
951 extern blk64_t ext2fs_blocks_count(struct ext2_super_block *super);
952 extern void ext2fs_blocks_count_set(struct ext2_super_block *super,
953                                     blk64_t blk);
954 extern void ext2fs_blocks_count_add(struct ext2_super_block *super,
955                                     blk64_t blk);
956 extern blk64_t ext2fs_r_blocks_count(struct ext2_super_block *super);
957 extern void ext2fs_r_blocks_count_set(struct ext2_super_block *super,
958                                       blk64_t blk);
959 extern void ext2fs_r_blocks_count_add(struct ext2_super_block *super,
960                                       blk64_t blk);
961 extern blk64_t ext2fs_free_blocks_count(struct ext2_super_block *super);
962 extern void ext2fs_free_blocks_count_set(struct ext2_super_block *super,
963                                          blk64_t blk);
964 extern void ext2fs_free_blocks_count_add(struct ext2_super_block *super,
965                                          blk64_t blk);
966 /* Block group descriptor accessor functions */
967 extern struct ext2_group_desc *ext2fs_group_desc(ext2_filsys fs,
968                                           struct opaque_ext2_group_desc *gdp,
969                                           dgrp_t group);
970 extern blk64_t ext2fs_block_bitmap_csum(ext2_filsys fs, dgrp_t group);
971 extern blk64_t ext2fs_block_bitmap_loc(ext2_filsys fs, dgrp_t group);
972 extern void ext2fs_block_bitmap_loc_set(ext2_filsys fs, dgrp_t group,
973                                         blk64_t blk);
974 extern __u32 ext2fs_inode_bitmap_csum(ext2_filsys fs, dgrp_t group);
975 extern blk64_t ext2fs_inode_bitmap_loc(ext2_filsys fs, dgrp_t group);
976 extern void ext2fs_inode_bitmap_loc_set(ext2_filsys fs, dgrp_t group,
977                                         blk64_t blk);
978 extern blk64_t ext2fs_inode_table_loc(ext2_filsys fs, dgrp_t group);
979 extern void ext2fs_inode_table_loc_set(ext2_filsys fs, dgrp_t group,
980                                        blk64_t blk);
981 extern __u32 ext2fs_bg_free_blocks_count(ext2_filsys fs, dgrp_t group);
982 extern void ext2fs_bg_free_blocks_count_set(ext2_filsys fs, dgrp_t group,
983                                          __u32 n);
984 extern __u32 ext2fs_bg_free_inodes_count(ext2_filsys fs, dgrp_t group);
985 extern void ext2fs_bg_free_inodes_count_set(ext2_filsys fs, dgrp_t group,
986                                          __u32 n);
987 extern __u32 ext2fs_bg_used_dirs_count(ext2_filsys fs, dgrp_t group);
988 extern void ext2fs_bg_used_dirs_count_set(ext2_filsys fs, dgrp_t group,
989                                        __u32 n);
990 extern __u32 ext2fs_bg_itable_unused(ext2_filsys fs, dgrp_t group);
991 extern void ext2fs_bg_itable_unused_set(ext2_filsys fs, dgrp_t group,
992                                      __u32 n);
993 extern __u16 ext2fs_bg_flags(ext2_filsys fs, dgrp_t group);
994 extern void ext2fs_bg_flags_zap(ext2_filsys fs, dgrp_t group);
995 extern int ext2fs_bg_flags_test(ext2_filsys fs, dgrp_t group, __u16 bg_flag);
996 extern void ext2fs_bg_flags_set(ext2_filsys fs, dgrp_t group, __u16 bg_flags);
997 extern void ext2fs_bg_flags_clear(ext2_filsys fs, dgrp_t group, __u16 bg_flags);
998 extern __u16 ext2fs_bg_checksum(ext2_filsys fs, dgrp_t group);
999 extern void ext2fs_bg_checksum_set(ext2_filsys fs, dgrp_t group, __u16 checksum);
1000 extern blk64_t ext2fs_file_acl_block(ext2_filsys fs,
1001                                      const struct ext2_inode *inode);
1002 extern void ext2fs_file_acl_block_set(ext2_filsys fs,
1003                                       struct ext2_inode *inode, blk64_t blk);
1004 extern errcode_t ext2fs_inode_size_set(ext2_filsys fs, struct ext2_inode *inode,
1005                                        ext2_off64_t size);
1006
1007 /* block.c */
1008 extern errcode_t ext2fs_block_iterate(ext2_filsys fs,
1009                                       ext2_ino_t        ino,
1010                                       int       flags,
1011                                       char *block_buf,
1012                                       int (*func)(ext2_filsys fs,
1013                                                   blk_t *blocknr,
1014                                                   int   blockcnt,
1015                                                   void  *priv_data),
1016                                       void *priv_data);
1017 errcode_t ext2fs_block_iterate2(ext2_filsys fs,
1018                                 ext2_ino_t      ino,
1019                                 int     flags,
1020                                 char *block_buf,
1021                                 int (*func)(ext2_filsys fs,
1022                                             blk_t       *blocknr,
1023                                             e2_blkcnt_t blockcnt,
1024                                             blk_t       ref_blk,
1025                                             int         ref_offset,
1026                                             void        *priv_data),
1027                                 void *priv_data);
1028 errcode_t ext2fs_block_iterate3(ext2_filsys fs,
1029                                 ext2_ino_t ino,
1030                                 int     flags,
1031                                 char *block_buf,
1032                                 int (*func)(ext2_filsys fs,
1033                                             blk64_t     *blocknr,
1034                                             e2_blkcnt_t blockcnt,
1035                                             blk64_t     ref_blk,
1036                                             int         ref_offset,
1037                                             void        *priv_data),
1038                                 void *priv_data);
1039
1040 /* bmap.c */
1041 extern errcode_t ext2fs_bmap(ext2_filsys fs, ext2_ino_t ino,
1042                              struct ext2_inode *inode,
1043                              char *block_buf, int bmap_flags,
1044                              blk_t block, blk_t *phys_blk);
1045 extern errcode_t ext2fs_bmap2(ext2_filsys fs, ext2_ino_t ino,
1046                               struct ext2_inode *inode,
1047                               char *block_buf, int bmap_flags, blk64_t block,
1048                               int *ret_flags, blk64_t *phys_blk);
1049 errcode_t ext2fs_map_cluster_block(ext2_filsys fs, ext2_ino_t ino,
1050                                    struct ext2_inode *inode, blk64_t lblk,
1051                                    blk64_t *pblk);
1052
1053 #if 0
1054 /* bmove.c */
1055 extern errcode_t ext2fs_move_blocks(ext2_filsys fs,
1056                                     ext2fs_block_bitmap reserve,
1057                                     ext2fs_block_bitmap alloc_map,
1058                                     int flags);
1059 #endif
1060
1061 /* check_desc.c */
1062 extern errcode_t ext2fs_check_desc(ext2_filsys fs);
1063
1064 /* closefs.c */
1065 extern errcode_t ext2fs_close(ext2_filsys fs);
1066 extern errcode_t ext2fs_close2(ext2_filsys fs, int flags);
1067 extern errcode_t ext2fs_close_free(ext2_filsys *fs);
1068 extern errcode_t ext2fs_flush(ext2_filsys fs);
1069 extern errcode_t ext2fs_flush2(ext2_filsys fs, int flags);
1070 extern int ext2fs_bg_has_super(ext2_filsys fs, dgrp_t group_block);
1071 extern errcode_t ext2fs_super_and_bgd_loc2(ext2_filsys fs,
1072                                     dgrp_t group,
1073                                     blk64_t *ret_super_blk,
1074                                     blk64_t *ret_old_desc_blk,
1075                                     blk64_t *ret_new_desc_blk,
1076                                     blk_t *ret_used_blks);
1077 extern int ext2fs_super_and_bgd_loc(ext2_filsys fs,
1078                                     dgrp_t group,
1079                                     blk_t *ret_super_blk,
1080                                     blk_t *ret_old_desc_blk,
1081                                     blk_t *ret_new_desc_blk,
1082                                     int *ret_meta_bg);
1083 extern void ext2fs_update_dynamic_rev(ext2_filsys fs);
1084
1085 /* crc32c.c */
1086 extern __u32 ext2fs_crc32_be(__u32 crc, unsigned char const *p, size_t len);
1087 extern __u32 ext2fs_crc32c_le(__u32 crc, unsigned char const *p, size_t len);
1088
1089 /* csum.c */
1090 extern void ext2fs_init_csum_seed(ext2_filsys fs);
1091 extern errcode_t ext2fs_mmp_csum_set(ext2_filsys fs, struct mmp_struct *mmp);
1092 extern int ext2fs_mmp_csum_verify(ext2_filsys, struct mmp_struct *mmp);
1093 extern int ext2fs_verify_csum_type(ext2_filsys fs, struct ext2_super_block *sb);
1094 extern errcode_t ext2fs_superblock_csum_set(ext2_filsys fs,
1095                                             struct ext2_super_block *sb);
1096 extern int ext2fs_superblock_csum_verify(ext2_filsys fs,
1097                                          struct ext2_super_block *sb);
1098 extern errcode_t ext2fs_ext_attr_block_csum_set(ext2_filsys fs,
1099                                         ext2_ino_t inum, blk64_t block,
1100                                         struct ext2_ext_attr_header *hdr);
1101 extern int ext2fs_ext_attr_block_csum_verify(ext2_filsys fs, ext2_ino_t inum,
1102                                              blk64_t block,
1103                                              struct ext2_ext_attr_header *hdr);
1104 #define EXT2_DIRENT_TAIL(block, blocksize) \
1105         ((struct ext2_dir_entry_tail *)(((char *)(block)) + \
1106         (blocksize) - sizeof(struct ext2_dir_entry_tail)))
1107
1108 extern void ext2fs_initialize_dirent_tail(ext2_filsys fs,
1109                                           struct ext2_dir_entry_tail *t);
1110 extern int ext2fs_dirent_has_tail(ext2_filsys fs,
1111                                   struct ext2_dir_entry *dirent);
1112 extern int ext2fs_dirent_csum_verify(ext2_filsys fs, ext2_ino_t inum,
1113                                      struct ext2_dir_entry *dirent);
1114 extern int ext2fs_dir_block_csum_verify(ext2_filsys fs, ext2_ino_t inum,
1115                                         struct ext2_dir_entry *dirent);
1116 extern errcode_t ext2fs_dir_block_csum_set(ext2_filsys fs, ext2_ino_t inum,
1117                                            struct ext2_dir_entry *dirent);
1118 extern errcode_t ext2fs_get_dx_countlimit(ext2_filsys fs,
1119                                           struct ext2_dir_entry *dirent,
1120                                           struct ext2_dx_countlimit **cc,
1121                                           int *offset);
1122 extern errcode_t ext2fs_dx_csum(ext2_filsys fs, ext2_ino_t inum,
1123                                 struct ext2_dir_entry *dirent,
1124                                 __u32 *crc, struct ext2_dx_tail **ret_t);
1125 extern errcode_t ext2fs_extent_block_csum_set(ext2_filsys fs,
1126                                               ext2_ino_t inum,
1127                                               struct ext3_extent_header *eh);
1128 extern int ext2fs_extent_block_csum_verify(ext2_filsys fs,
1129                                            ext2_ino_t inum,
1130                                            struct ext3_extent_header *eh);
1131 extern errcode_t ext2fs_block_bitmap_csum_set(ext2_filsys fs, dgrp_t group,
1132                                               char *bitmap, int size);
1133 extern int ext2fs_block_bitmap_csum_verify(ext2_filsys fs, dgrp_t group,
1134                                            char *bitmap, int size);
1135 extern errcode_t ext2fs_inode_bitmap_csum_set(ext2_filsys fs, dgrp_t group,
1136                                               char *bitmap, int size);
1137 extern int ext2fs_inode_bitmap_csum_verify(ext2_filsys fs, dgrp_t group,
1138                                            char *bitmap, int size);
1139 extern errcode_t ext2fs_inode_csum_set(ext2_filsys fs, ext2_ino_t inum,
1140                                        struct ext2_inode_large *inode);
1141 extern int ext2fs_inode_csum_verify(ext2_filsys fs, ext2_ino_t inum,
1142                                     struct ext2_inode_large *inode);
1143 extern void ext2fs_group_desc_csum_set(ext2_filsys fs, dgrp_t group);
1144 extern int ext2fs_group_desc_csum_verify(ext2_filsys fs, dgrp_t group);
1145 extern errcode_t ext2fs_set_gdt_csum(ext2_filsys fs);
1146 extern __u16 ext2fs_group_desc_csum(ext2_filsys fs, dgrp_t group);
1147
1148 /* dblist.c */
1149 extern errcode_t ext2fs_init_dblist(ext2_filsys fs, ext2_dblist *ret_dblist);
1150 extern errcode_t ext2fs_add_dir_block(ext2_dblist dblist, ext2_ino_t ino,
1151                                       blk_t blk, int blockcnt);
1152 extern errcode_t ext2fs_add_dir_block2(ext2_dblist dblist, ext2_ino_t ino,
1153                                        blk64_t blk, e2_blkcnt_t blockcnt);
1154 extern errcode_t ext2fs_merge_dblist(ext2_dblist src, ext2_dblist dest);
1155 extern void ext2fs_dblist_sort(ext2_dblist dblist,
1156                                EXT2_QSORT_TYPE (*sortfunc)(const void *,
1157                                                            const void *));
1158 extern void ext2fs_dblist_sort2(ext2_dblist dblist,
1159                                 EXT2_QSORT_TYPE (*sortfunc)(const void *,
1160                                                             const void *));
1161 extern errcode_t ext2fs_dblist_iterate(ext2_dblist dblist,
1162         int (*func)(ext2_filsys fs, struct ext2_db_entry *db_info,
1163                     void        *priv_data),
1164         void *priv_data);
1165 extern errcode_t ext2fs_dblist_iterate2(ext2_dblist dblist,
1166         int (*func)(ext2_filsys fs, struct ext2_db_entry2 *db_info,
1167                     void        *priv_data),
1168         void *priv_data);
1169 extern errcode_t ext2fs_dblist_iterate3(ext2_dblist dblist,
1170         int (*func)(ext2_filsys fs, struct ext2_db_entry2 *db_info,
1171                     void        *priv_data),
1172         unsigned long long start,
1173         unsigned long long count,
1174         void *priv_data);
1175 extern errcode_t ext2fs_set_dir_block(ext2_dblist dblist, ext2_ino_t ino,
1176                                       blk_t blk, int blockcnt);
1177 extern errcode_t ext2fs_set_dir_block2(ext2_dblist dblist, ext2_ino_t ino,
1178                                        blk64_t blk, e2_blkcnt_t blockcnt);
1179 extern errcode_t ext2fs_copy_dblist(ext2_dblist src,
1180                                     ext2_dblist *dest);
1181 extern int ext2fs_dblist_count(ext2_dblist dblist);
1182 extern blk64_t ext2fs_dblist_count2(ext2_dblist dblist);
1183 extern errcode_t ext2fs_dblist_get_last(ext2_dblist dblist,
1184                                         struct ext2_db_entry **entry);
1185 extern errcode_t ext2fs_dblist_get_last2(ext2_dblist dblist,
1186                                         struct ext2_db_entry2 **entry);
1187 extern errcode_t ext2fs_dblist_drop_last(ext2_dblist dblist);
1188
1189 /* dblist_dir.c */
1190 extern errcode_t
1191         ext2fs_dblist_dir_iterate(ext2_dblist dblist,
1192                                   int   flags,
1193                                   char  *block_buf,
1194                                   int (*func)(ext2_ino_t        dir,
1195                                               int               entry,
1196                                               struct ext2_dir_entry *dirent,
1197                                               int       offset,
1198                                               int       blocksize,
1199                                               char      *buf,
1200                                               void      *priv_data),
1201                                   void *priv_data);
1202
1203 #if 0
1204 /* digest_encode.c */
1205 #define EXT2FS_DIGEST_SIZE EXT2FS_SHA256_LENGTH
1206 extern int ext2fs_digest_encode(const char *src, int len, char *dst);
1207 extern int ext2fs_digest_decode(const char *src, int len, char *dst);
1208 #endif
1209
1210 /* dirblock.c */
1211 extern errcode_t ext2fs_read_dir_block(ext2_filsys fs, blk_t block,
1212                                        void *buf);
1213 extern errcode_t ext2fs_read_dir_block2(ext2_filsys fs, blk_t block,
1214                                         void *buf, int flags);
1215 extern errcode_t ext2fs_read_dir_block3(ext2_filsys fs, blk64_t block,
1216                                         void *buf, int flags);
1217 extern errcode_t ext2fs_read_dir_block4(ext2_filsys fs, blk64_t block,
1218                                         void *buf, int flags, ext2_ino_t ino);
1219 extern errcode_t ext2fs_write_dir_block(ext2_filsys fs, blk_t block,
1220                                         void *buf);
1221 extern errcode_t ext2fs_write_dir_block2(ext2_filsys fs, blk_t block,
1222                                          void *buf, int flags);
1223 extern errcode_t ext2fs_write_dir_block3(ext2_filsys fs, blk64_t block,
1224                                          void *buf, int flags);
1225 extern errcode_t ext2fs_write_dir_block4(ext2_filsys fs, blk64_t block,
1226                                          void *buf, int flags, ext2_ino_t ino);
1227
1228 /* dirhash.c */
1229 extern errcode_t ext2fs_dirhash(int version, const char *name, int len,
1230                                 const __u32 *seed,
1231                                 ext2_dirhash_t *ret_hash,
1232                                 ext2_dirhash_t *ret_minor_hash);
1233
1234 extern errcode_t ext2fs_dirhash2(int version, const char *name, int len,
1235                                  const struct ext2fs_nls_table *charset,
1236                                  int hash_flags,
1237                                  const __u32 *seed,
1238                                  ext2_dirhash_t *ret_hash,
1239                                  ext2_dirhash_t *ret_minor_hash);
1240
1241 /* dir_iterate.c */
1242 extern errcode_t ext2fs_get_rec_len(ext2_filsys fs,
1243                                     struct ext2_dir_entry *dirent,
1244                                     unsigned int *rec_len);
1245 extern errcode_t ext2fs_set_rec_len(ext2_filsys fs,
1246                                     unsigned int len,
1247                                     struct ext2_dir_entry *dirent);
1248 extern errcode_t ext2fs_dir_iterate(ext2_filsys fs,
1249                               ext2_ino_t dir,
1250                               int flags,
1251                               char *block_buf,
1252                               int (*func)(struct ext2_dir_entry *dirent,
1253                                           int   offset,
1254                                           int   blocksize,
1255                                           char  *buf,
1256                                           void  *priv_data),
1257                               void *priv_data);
1258 extern errcode_t ext2fs_dir_iterate2(ext2_filsys fs,
1259                               ext2_ino_t dir,
1260                               int flags,
1261                               char *block_buf,
1262                               int (*func)(ext2_ino_t    dir,
1263                                           int   entry,
1264                                           struct ext2_dir_entry *dirent,
1265                                           int   offset,
1266                                           int   blocksize,
1267                                           char  *buf,
1268                                           void  *priv_data),
1269                               void *priv_data);
1270
1271 /* dupfs.c */
1272 extern errcode_t ext2fs_dup_handle(ext2_filsys src, ext2_filsys *dest);
1273
1274 /* expanddir.c */
1275 extern errcode_t ext2fs_expand_dir(ext2_filsys fs, ext2_ino_t dir);
1276
1277 /* ext_attr.c */
1278 extern errcode_t ext2fs_attr_get(ext2_filsys fs, struct ext2_inode *inode,
1279                                  int name_index, const char *name, char *buffer,
1280                                  size_t buffer_size, int *easize);
1281
1282 extern __u32 ext2fs_ext_attr_hash_entry(struct ext2_ext_attr_entry *entry,
1283                                         void *data);
1284 extern errcode_t ext2fs_ext_attr_hash_entry2(ext2_filsys fs,
1285                                              struct ext2_ext_attr_entry *entry,
1286                                              void *data, __u32 *hash);
1287 int ext2fs_attr_get_next_attr(struct ext2_ext_attr_entry *entry, int name_index,
1288                               char *buffer, int buffer_size, int start);
1289 errcode_t ext2fs_attr_set(ext2_filsys fs, ext2_ino_t ino,
1290                           struct ext2_inode *inode,
1291                           int name_index, const char *name, const char *value,
1292                           int value_len, int flags);
1293 extern errcode_t ext2fs_expand_extra_isize(ext2_filsys fs, ext2_ino_t ino,
1294                                            struct ext2_inode_large *inode,
1295                                            int new_extra_isize, int *ret,
1296                                            int *needed_size);
1297 extern errcode_t ext2fs_read_ext_attr(ext2_filsys fs, blk_t block, void *buf);
1298 extern errcode_t ext2fs_read_ext_attr2(ext2_filsys fs, blk64_t block,
1299                                        void *buf);
1300 extern errcode_t ext2fs_read_ext_attr3(ext2_filsys fs, blk64_t block,
1301                                        void *buf, ext2_ino_t inum);
1302 extern errcode_t ext2fs_write_ext_attr(ext2_filsys fs, blk_t block,
1303                                        void *buf);
1304 extern errcode_t ext2fs_write_ext_attr2(ext2_filsys fs, blk64_t block,
1305                                        void *buf);
1306 extern errcode_t ext2fs_write_ext_attr3(ext2_filsys fs, blk64_t block,
1307                                        void *buf, ext2_ino_t inum);
1308 extern errcode_t ext2fs_adjust_ea_refcount(ext2_filsys fs, blk_t blk,
1309                                            char *block_buf,
1310                                            int adjust, __u32 *newcount);
1311 extern errcode_t ext2fs_adjust_ea_refcount2(ext2_filsys fs, blk64_t blk,
1312                                            char *block_buf,
1313                                            int adjust, __u32 *newcount);
1314 extern errcode_t ext2fs_adjust_ea_refcount3(ext2_filsys fs, blk64_t blk,
1315                                            char *block_buf,
1316                                            int adjust, __u32 *newcount,
1317                                            ext2_ino_t inum);
1318 errcode_t ext2fs_xattrs_write(struct ext2_xattr_handle *handle);
1319 errcode_t ext2fs_xattrs_read(struct ext2_xattr_handle *handle);
1320 errcode_t ext2fs_xattrs_iterate(struct ext2_xattr_handle *h,
1321                                 int (*func)(char *name, char *value,
1322                                             size_t value_len, void *data),
1323                                 void *data);
1324 errcode_t ext2fs_xattr_get(struct ext2_xattr_handle *h, const char *key,
1325                            void **value, size_t *value_len);
1326 errcode_t ext2fs_xattr_set(struct ext2_xattr_handle *handle,
1327                            const char *key,
1328                            const void *value,
1329                            size_t value_len);
1330 errcode_t ext2fs_xattr_remove(struct ext2_xattr_handle *handle,
1331                               const char *key);
1332 errcode_t ext2fs_xattrs_open(ext2_filsys fs, ext2_ino_t ino,
1333                              struct ext2_xattr_handle **handle);
1334 errcode_t ext2fs_xattrs_close(struct ext2_xattr_handle **handle);
1335 errcode_t ext2fs_free_ext_attr(ext2_filsys fs, ext2_ino_t ino,
1336                                struct ext2_inode_large *inode);
1337 errcode_t ext2fs_xattrs_count(struct ext2_xattr_handle *handle, size_t *count);
1338 errcode_t ext2fs_xattr_inode_max_size(ext2_filsys fs, ext2_ino_t ino,
1339                                       size_t *size);
1340 #define XATTR_HANDLE_FLAG_RAW   0x0001
1341 errcode_t ext2fs_xattrs_flags(struct ext2_xattr_handle *handle,
1342                               unsigned int *new_flags, unsigned int *old_flags);
1343 extern void ext2fs_ext_attr_block_rehash(struct ext2_ext_attr_header *header,
1344                                          struct ext2_ext_attr_entry *end);
1345 extern __u32 ext2fs_get_ea_inode_hash(struct ext2_inode *inode);
1346 extern void ext2fs_set_ea_inode_hash(struct ext2_inode *inode, __u32 hash);
1347 extern __u64 ext2fs_get_ea_inode_ref(struct ext2_inode *inode);
1348 extern void ext2fs_set_ea_inode_ref(struct ext2_inode *inode, __u64 ref_count);
1349
1350 /* extent.c */
1351 extern errcode_t ext2fs_extent_header_verify(void *ptr, int size);
1352 extern errcode_t ext2fs_extent_open(ext2_filsys fs, ext2_ino_t ino,
1353                                     ext2_extent_handle_t *handle);
1354 extern errcode_t ext2fs_extent_open2(ext2_filsys fs, ext2_ino_t ino,
1355                                         struct ext2_inode *inode,
1356                                         ext2_extent_handle_t *ret_handle);
1357 extern void ext2fs_extent_free(ext2_extent_handle_t handle);
1358 extern errcode_t ext2fs_extent_get(ext2_extent_handle_t handle,
1359                                    int flags, struct ext2fs_extent *extent);
1360 extern errcode_t ext2fs_extent_node_split(ext2_extent_handle_t handle);
1361 extern errcode_t ext2fs_extent_replace(ext2_extent_handle_t handle, int flags,
1362                                        struct ext2fs_extent *extent);
1363 extern errcode_t ext2fs_extent_insert(ext2_extent_handle_t handle, int flags,
1364                                       struct ext2fs_extent *extent);
1365 extern errcode_t ext2fs_extent_set_bmap(ext2_extent_handle_t handle,
1366                                         blk64_t logical, blk64_t physical,
1367                                         int flags);
1368 extern errcode_t ext2fs_extent_delete(ext2_extent_handle_t handle, int flags);
1369 extern errcode_t ext2fs_extent_get_info(ext2_extent_handle_t handle,
1370                                         struct ext2_extent_info *info);
1371 extern errcode_t ext2fs_extent_goto(ext2_extent_handle_t handle,
1372                                     blk64_t blk);
1373 extern errcode_t ext2fs_extent_goto2(ext2_extent_handle_t handle,
1374                                      int leaf_level, blk64_t blk);
1375 extern errcode_t ext2fs_extent_fix_parents(ext2_extent_handle_t handle);
1376 extern size_t ext2fs_max_extent_depth(ext2_extent_handle_t handle);
1377 extern errcode_t ext2fs_fix_extents_checksums(ext2_filsys fs, ext2_ino_t ino,
1378                                               struct ext2_inode *inode);
1379 extern errcode_t ext2fs_count_blocks(ext2_filsys fs, ext2_ino_t ino,
1380                                      struct ext2_inode *inode, blk64_t *ret_count);
1381 extern errcode_t ext2fs_decode_extent(struct ext2fs_extent *to, void *from,
1382                                       int len);
1383
1384 /* fallocate.c */
1385 #define EXT2_FALLOCATE_ZERO_BLOCKS      (0x1)
1386 #define EXT2_FALLOCATE_FORCE_INIT       (0x2)
1387 #define EXT2_FALLOCATE_FORCE_UNINIT     (0x4)
1388 #define EXT2_FALLOCATE_INIT_BEYOND_EOF  (0x8)
1389 #define EXT2_FALLOCATE_ALL_FLAGS        (0xF)
1390 errcode_t ext2fs_fallocate(ext2_filsys fs, int flags, ext2_ino_t ino,
1391                            struct ext2_inode *inode, blk64_t goal,
1392                            blk64_t start, blk64_t len);
1393
1394 /* fileio.c */
1395 extern errcode_t ext2fs_file_open2(ext2_filsys fs, ext2_ino_t ino,
1396                                    struct ext2_inode *inode,
1397                                    int flags, ext2_file_t *ret);
1398 extern errcode_t ext2fs_file_open(ext2_filsys fs, ext2_ino_t ino,
1399                                   int flags, ext2_file_t *ret);
1400 extern ext2_filsys ext2fs_file_get_fs(ext2_file_t file);
1401 struct ext2_inode *ext2fs_file_get_inode(ext2_file_t file);
1402 extern ext2_ino_t ext2fs_file_get_inode_num(ext2_file_t file);
1403 extern errcode_t ext2fs_file_close(ext2_file_t file);
1404 extern errcode_t ext2fs_file_flush(ext2_file_t file);
1405 extern errcode_t ext2fs_file_read(ext2_file_t file, void *buf,
1406                                   unsigned int wanted, unsigned int *got);
1407 extern errcode_t ext2fs_file_write(ext2_file_t file, const void *buf,
1408                                    unsigned int nbytes, unsigned int *written);
1409 extern errcode_t ext2fs_file_llseek(ext2_file_t file, __u64 offset,
1410                                    int whence, __u64 *ret_pos);
1411 extern errcode_t ext2fs_file_lseek(ext2_file_t file, ext2_off_t offset,
1412                                    int whence, ext2_off_t *ret_pos);
1413 errcode_t ext2fs_file_get_lsize(ext2_file_t file, __u64 *ret_size);
1414 extern ext2_off_t ext2fs_file_get_size(ext2_file_t file);
1415 extern errcode_t ext2fs_file_set_size(ext2_file_t file, ext2_off_t size);
1416 extern errcode_t ext2fs_file_set_size2(ext2_file_t file, ext2_off64_t size);
1417
1418 /* finddev.c */
1419 extern char *ext2fs_find_block_device(dev_t device);
1420
1421 /* flushb.c */
1422 extern errcode_t ext2fs_sync_device(int fd, int flushb);
1423
1424 /* freefs.c */
1425 extern void ext2fs_free(ext2_filsys fs);
1426 extern void ext2fs_free_dblist(ext2_dblist dblist);
1427 extern void ext2fs_badblocks_list_free(ext2_badblocks_list bb);
1428 extern void ext2fs_u32_list_free(ext2_u32_list bb);
1429
1430 /* gen_bitmap.c */
1431 extern void ext2fs_free_generic_bitmap(ext2fs_inode_bitmap bitmap);
1432 extern errcode_t ext2fs_make_generic_bitmap(errcode_t magic, ext2_filsys fs,
1433                                             __u32 start, __u32 end,
1434                                             __u32 real_end,
1435                                             const char *descr, char *init_map,
1436                                             ext2fs_generic_bitmap *ret);
1437 extern errcode_t ext2fs_allocate_generic_bitmap(__u32 start,
1438                                                 __u32 end,
1439                                                 __u32 real_end,
1440                                                 const char *descr,
1441                                                 ext2fs_generic_bitmap *ret);
1442 extern errcode_t ext2fs_copy_generic_bitmap(ext2fs_generic_bitmap src,
1443                                             ext2fs_generic_bitmap *dest);
1444 extern void ext2fs_clear_generic_bitmap(ext2fs_generic_bitmap bitmap);
1445 extern errcode_t ext2fs_fudge_generic_bitmap_end(ext2fs_inode_bitmap bitmap,
1446                                                  errcode_t magic,
1447                                                  errcode_t neq,
1448                                                  ext2_ino_t end,
1449                                                  ext2_ino_t *oend);
1450 extern void ext2fs_set_generic_bitmap_padding(ext2fs_generic_bitmap map);
1451 extern errcode_t ext2fs_resize_generic_bitmap(errcode_t magic,
1452                                               __u32 new_end,
1453                                               __u32 new_real_end,
1454                                               ext2fs_generic_bitmap bmap);
1455 extern errcode_t ext2fs_compare_generic_bitmap(errcode_t magic, errcode_t neq,
1456                                                ext2fs_generic_bitmap bm1,
1457                                                ext2fs_generic_bitmap bm2);
1458 extern errcode_t ext2fs_get_generic_bitmap_range(ext2fs_generic_bitmap bmap,
1459                                                  errcode_t magic,
1460                                                  __u32 start, __u32 num,
1461                                                  void *out);
1462 extern errcode_t ext2fs_set_generic_bitmap_range(ext2fs_generic_bitmap bmap,
1463                                                  errcode_t magic,
1464                                                  __u32 start, __u32 num,
1465                                                  void *in);
1466 extern errcode_t ext2fs_find_first_zero_generic_bitmap(ext2fs_generic_bitmap bitmap,
1467                                                        __u32 start, __u32 end,
1468                                                        __u32 *out);
1469 extern errcode_t ext2fs_find_first_set_generic_bitmap(ext2fs_generic_bitmap bitmap,
1470                                                        __u32 start, __u32 end,
1471                                                        __u32 *out);
1472
1473 /* gen_bitmap64.c */
1474 void ext2fs_free_generic_bmap(ext2fs_generic_bitmap bmap);
1475 errcode_t ext2fs_alloc_generic_bmap(ext2_filsys fs, errcode_t magic,
1476                                     int type, __u64 start, __u64 end,
1477                                     __u64 real_end,
1478                                     const char *descr,
1479                                     ext2fs_generic_bitmap *ret);
1480 errcode_t ext2fs_copy_generic_bmap(ext2fs_generic_bitmap src,
1481                                    ext2fs_generic_bitmap *dest);
1482 void ext2fs_clear_generic_bmap(ext2fs_generic_bitmap bitmap);
1483 errcode_t ext2fs_fudge_generic_bmap_end(ext2fs_generic_bitmap bitmap,
1484                                         errcode_t neq,
1485                                         __u64 end, __u64 *oend);
1486 void ext2fs_set_generic_bmap_padding(ext2fs_generic_bitmap bmap);
1487 errcode_t ext2fs_resize_generic_bmap(ext2fs_generic_bitmap bmap,
1488                                      __u64 new_end,
1489                                      __u64 new_real_end);
1490 errcode_t ext2fs_merge_generic_bmap(ext2fs_generic_bitmap gen_src,
1491                                     ext2fs_generic_bitmap gen_dest,
1492                                     ext2fs_generic_bitmap gen_dup,
1493                                     ext2fs_generic_bitmap dup_allowed);
1494 errcode_t ext2fs_compare_generic_bmap(errcode_t neq,
1495                                       ext2fs_generic_bitmap bm1,
1496                                       ext2fs_generic_bitmap bm2);
1497 errcode_t ext2fs_get_generic_bmap_range(ext2fs_generic_bitmap bmap,
1498                                         __u64 start, unsigned int num,
1499                                         void *out);
1500 errcode_t ext2fs_set_generic_bmap_range(ext2fs_generic_bitmap bmap,
1501                                         __u64 start, unsigned int num,
1502                                         void *in);
1503 errcode_t ext2fs_convert_subcluster_bitmap(ext2_filsys fs,
1504                                            ext2fs_block_bitmap *bitmap);
1505 errcode_t ext2fs_count_used_clusters(ext2_filsys fs, blk64_t start,
1506                                      blk64_t end, blk64_t *out);
1507
1508 /* get_num_dirs.c */
1509 extern errcode_t ext2fs_get_num_dirs(ext2_filsys fs, ext2_ino_t *ret_num_dirs);
1510
1511 /* getsize.c */
1512 extern errcode_t ext2fs_get_device_size(const char *file, int blocksize,
1513                                         blk_t *retblocks);
1514 extern errcode_t ext2fs_get_device_size2(const char *file, int blocksize,
1515                                         blk64_t *retblocks);
1516
1517 /* getsectsize.c */
1518 extern int ext2fs_get_dio_alignment(int fd);
1519 errcode_t ext2fs_get_device_sectsize(const char *file, int *sectsize);
1520 errcode_t ext2fs_get_device_phys_sectsize(const char *file, int *sectsize);
1521
1522 /* i_block.c */
1523 errcode_t ext2fs_iblk_add_blocks(ext2_filsys fs, struct ext2_inode *inode,
1524                                  blk64_t num_blocks);
1525 errcode_t ext2fs_iblk_sub_blocks(ext2_filsys fs, struct ext2_inode *inode,
1526                                  blk64_t num_blocks);
1527 errcode_t ext2fs_iblk_set(ext2_filsys fs, struct ext2_inode *inode, blk64_t b);
1528
1529 /* imager.c */
1530 extern errcode_t ext2fs_image_inode_write(ext2_filsys fs, int fd, int flags);
1531 extern errcode_t ext2fs_image_inode_read(ext2_filsys fs, int fd, int flags);
1532 extern errcode_t ext2fs_image_super_write(ext2_filsys fs, int fd, int flags);
1533 extern errcode_t ext2fs_image_super_read(ext2_filsys fs, int fd, int flags);
1534 extern errcode_t ext2fs_image_bitmap_write(ext2_filsys fs, int fd, int flags);
1535 extern errcode_t ext2fs_image_bitmap_read(ext2_filsys fs, int fd, int flags);
1536
1537 /* ind_block.c */
1538 errcode_t ext2fs_read_ind_block(ext2_filsys fs, blk_t blk, void *buf);
1539 errcode_t ext2fs_write_ind_block(ext2_filsys fs, blk_t blk, void *buf);
1540
1541 /* initialize.c */
1542 extern errcode_t ext2fs_initialize(const char *name, int flags,
1543                                    struct ext2_super_block *param,
1544                                    io_manager manager, ext2_filsys *ret_fs);
1545 extern errcode_t ext2fs_calculate_summary_stats(ext2_filsys fs, int super_only);
1546
1547 /* icount.c */
1548 extern void ext2fs_free_icount(ext2_icount_t icount);
1549 extern errcode_t ext2fs_create_icount_tdb(ext2_filsys fs, char *tdb_dir,
1550                                           int flags, ext2_icount_t *ret);
1551 extern errcode_t ext2fs_create_icount2(ext2_filsys fs, int flags,
1552                                        unsigned int size,
1553                                        ext2_icount_t hint, ext2_icount_t *ret);
1554 extern errcode_t ext2fs_create_icount(ext2_filsys fs, int flags,
1555                                       unsigned int size,
1556                                       ext2_icount_t *ret);
1557 extern errcode_t ext2fs_icount_fetch(ext2_icount_t icount, ext2_ino_t ino,
1558                                      __u16 *ret);
1559 extern errcode_t ext2fs_icount_increment(ext2_icount_t icount, ext2_ino_t ino,
1560                                          __u16 *ret);
1561 extern errcode_t ext2fs_icount_decrement(ext2_icount_t icount, ext2_ino_t ino,
1562                                          __u16 *ret);
1563 extern errcode_t ext2fs_icount_store(ext2_icount_t icount, ext2_ino_t ino,
1564                                      __u16 count);
1565 extern errcode_t ext2fs_icount_merge(ext2_icount_t src, ext2_icount_t dest);
1566 extern ext2_ino_t ext2fs_get_icount_size(ext2_icount_t icount);
1567 errcode_t ext2fs_icount_validate(ext2_icount_t icount, FILE *);
1568
1569 /* inline.c */
1570
1571 extern errcode_t ext2fs_get_memalign(unsigned long size,
1572                                      unsigned long align, void *ptr);
1573
1574 /* inline_data.c */
1575 extern errcode_t ext2fs_inline_data_init(ext2_filsys fs, ext2_ino_t ino);
1576 extern errcode_t ext2fs_inline_data_size(ext2_filsys fs, ext2_ino_t ino,
1577                                          size_t *size);
1578 extern errcode_t ext2fs_inline_data_get(ext2_filsys fs, ext2_ino_t ino,
1579                                         struct ext2_inode *inode,
1580                                         void *buf, size_t *size);
1581 extern errcode_t ext2fs_inline_data_set(ext2_filsys fs, ext2_ino_t ino,
1582                                         struct ext2_inode *inode,
1583                                         void *buf, size_t size);
1584
1585 /* inode.c */
1586 extern errcode_t ext2fs_create_inode_cache(ext2_filsys fs,
1587                                            unsigned int cache_size);
1588 extern void ext2fs_free_inode_cache(struct ext2_inode_cache *icache);
1589 extern errcode_t ext2fs_flush_icache(ext2_filsys fs);
1590 extern errcode_t ext2fs_get_next_inode_full(ext2_inode_scan scan,
1591                                             ext2_ino_t *ino,
1592                                             struct ext2_inode *inode,
1593                                             int bufsize);
1594 #define EXT2_INODE_SCAN_DEFAULT_BUFFER_BLOCKS   8
1595 extern errcode_t ext2fs_open_inode_scan(ext2_filsys fs, int buffer_blocks,
1596                                   ext2_inode_scan *ret_scan);
1597 extern void ext2fs_close_inode_scan(ext2_inode_scan scan);
1598 extern errcode_t ext2fs_get_next_inode(ext2_inode_scan scan, ext2_ino_t *ino,
1599                                struct ext2_inode *inode);
1600 extern errcode_t ext2fs_inode_scan_goto_blockgroup(ext2_inode_scan scan,
1601                                                    int  group);
1602 extern void ext2fs_set_inode_callback
1603         (ext2_inode_scan scan,
1604          errcode_t (*done_group)(ext2_filsys fs,
1605                                  ext2_inode_scan scan,
1606                                  dgrp_t group,
1607                                  void * priv_data),
1608          void *done_group_data);
1609 extern int ext2fs_inode_scan_flags(ext2_inode_scan scan, int set_flags,
1610                                    int clear_flags);
1611 extern errcode_t ext2fs_read_inode_full(ext2_filsys fs, ext2_ino_t ino,
1612                                         struct ext2_inode * inode,
1613                                         int bufsize);
1614 extern errcode_t ext2fs_read_inode(ext2_filsys fs, ext2_ino_t ino,
1615                             struct ext2_inode * inode);
1616 extern errcode_t ext2fs_read_inode2(ext2_filsys fs, ext2_ino_t ino,
1617                                     struct ext2_inode * inode,
1618                                     int bufsize, int flags);
1619 extern errcode_t ext2fs_write_inode_full(ext2_filsys fs, ext2_ino_t ino,
1620                                          struct ext2_inode * inode,
1621                                          int bufsize);
1622 extern errcode_t ext2fs_write_inode(ext2_filsys fs, ext2_ino_t ino,
1623                             struct ext2_inode * inode);
1624 extern errcode_t ext2fs_write_inode2(ext2_filsys fs, ext2_ino_t ino,
1625                                      struct ext2_inode * inode,
1626                                      int bufsize, int flags);
1627 extern errcode_t ext2fs_write_new_inode(ext2_filsys fs, ext2_ino_t ino,
1628                             struct ext2_inode * inode);
1629 extern errcode_t ext2fs_get_blocks(ext2_filsys fs, ext2_ino_t ino, blk_t *blocks);
1630 extern errcode_t ext2fs_check_directory(ext2_filsys fs, ext2_ino_t ino);
1631
1632 /* inode_io.c */
1633 extern io_manager inode_io_manager;
1634 extern errcode_t ext2fs_inode_io_intern(ext2_filsys fs, ext2_ino_t ino,
1635                                         char **name);
1636 extern errcode_t ext2fs_inode_io_intern2(ext2_filsys fs, ext2_ino_t ino,
1637                                          struct ext2_inode *inode,
1638                                          char **name);
1639
1640 /* ismounted.c */
1641 extern errcode_t ext2fs_check_if_mounted(const char *file, int *mount_flags);
1642 extern errcode_t ext2fs_check_mount_point(const char *device, int *mount_flags,
1643                                           char *mtpt, int mtlen);
1644
1645 /* punch.c */
1646 /*
1647  * NOTE: This function removes from an inode the blocks "start", "end", and
1648  * every block in between.
1649  */
1650 extern errcode_t ext2fs_punch(ext2_filsys fs, ext2_ino_t ino,
1651                               struct ext2_inode *inode,
1652                               char *block_buf, blk64_t start,
1653                               blk64_t end);
1654
1655 /* namei.c */
1656 extern errcode_t ext2fs_lookup(ext2_filsys fs, ext2_ino_t dir, const char *name,
1657                          int namelen, char *buf, ext2_ino_t *inode);
1658 extern errcode_t ext2fs_namei(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
1659                         const char *name, ext2_ino_t *inode);
1660 errcode_t ext2fs_namei_follow(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
1661                               const char *name, ext2_ino_t *inode);
1662 extern errcode_t ext2fs_follow_link(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
1663                         ext2_ino_t inode, ext2_ino_t *res_inode);
1664
1665 /* native.c */
1666 int ext2fs_native_flag(void);
1667
1668 /* newdir.c */
1669 extern errcode_t ext2fs_new_dir_block(ext2_filsys fs, ext2_ino_t dir_ino,
1670                                 ext2_ino_t parent_ino, char **block);
1671 extern errcode_t ext2fs_new_dir_inline_data(ext2_filsys fs, ext2_ino_t dir_ino,
1672                                 ext2_ino_t parent_ino, __u32 *iblock);
1673
1674 /* nls_utf8.c */
1675 extern const struct ext2fs_nls_table *ext2fs_load_nls_table(int encoding);
1676 extern int ext2fs_check_encoded_name(const struct ext2fs_nls_table *table,
1677                                      char *s, size_t len, char **pos);
1678 extern int ext2fs_casefold_cmp(const struct ext2fs_nls_table *table,
1679                                const unsigned char *str1, size_t len1,
1680                                const unsigned char *str2, size_t len2);
1681
1682 /* mkdir.c */
1683 extern errcode_t ext2fs_mkdir(ext2_filsys fs, ext2_ino_t parent, ext2_ino_t inum,
1684                               const char *name);
1685
1686 /* mkjournal.c */
1687 struct ext2fs_journal_params {
1688         blk_t num_journal_blocks;
1689         blk_t num_fc_blocks;
1690 };
1691 extern errcode_t ext2fs_get_journal_params(
1692                 struct ext2fs_journal_params *params, ext2_filsys fs);
1693 extern errcode_t ext2fs_zero_blocks(ext2_filsys fs, blk_t blk, int num,
1694                                     blk_t *ret_blk, int *ret_count);
1695 extern errcode_t ext2fs_zero_blocks2(ext2_filsys fs, blk64_t blk, int num,
1696                                      blk64_t *ret_blk, int *ret_count);
1697 extern errcode_t ext2fs_create_journal_superblock(ext2_filsys fs,
1698                                                   __u32 num_blocks, int flags,
1699                                                   char  **ret_jsb);
1700 extern errcode_t ext2fs_create_journal_superblock2(ext2_filsys fs,
1701                                                   struct ext2fs_journal_params *params,
1702                                                   int flags, char  **ret_jsb);
1703 extern errcode_t ext2fs_add_journal_device(ext2_filsys fs,
1704                                            ext2_filsys journal_dev);
1705 extern errcode_t ext2fs_add_journal_inode(ext2_filsys fs, blk_t num_blocks,
1706                                           int flags);
1707 extern errcode_t ext2fs_add_journal_inode2(ext2_filsys fs, blk_t num_blocks,
1708                                            blk64_t goal, int flags);
1709 extern errcode_t ext2fs_add_journal_inode3(ext2_filsys fs,
1710                                     struct ext2fs_journal_params *params,
1711                                     blk64_t goal, int flags);
1712 extern int ext2fs_default_journal_size(__u64 num_blocks);
1713 extern int ext2fs_journal_sb_start(int blocksize);
1714
1715 /* openfs.c */
1716 extern errcode_t ext2fs_open(const char *name, int flags, int superblock,
1717                              unsigned int block_size, io_manager manager,
1718                              ext2_filsys *ret_fs);
1719 extern errcode_t ext2fs_open2(const char *name, const char *io_options,
1720                               int flags, int superblock,
1721                               unsigned int block_size, io_manager manager,
1722                               ext2_filsys *ret_fs);
1723 errcode_t ext2fs_open_channel(ext2_filsys fs, const char *io_options,
1724                               io_manager manager, int flags,
1725                               int blocksize);
1726 /*
1727  * The dgrp_t argument to these two functions is not actually a group number
1728  * but a block number offset within a group table!  Convert with the formula
1729  * (group_number / groups_per_block).
1730  */
1731 extern blk64_t ext2fs_descriptor_block_loc2(ext2_filsys fs,
1732                                         blk64_t group_block, dgrp_t i);
1733 extern blk_t ext2fs_descriptor_block_loc(ext2_filsys fs, blk_t group_block,
1734                                          dgrp_t i);
1735 errcode_t ext2fs_get_data_io(ext2_filsys fs, io_channel *old_io);
1736 errcode_t ext2fs_set_data_io(ext2_filsys fs, io_channel new_io);
1737 errcode_t ext2fs_rewrite_to_io(ext2_filsys fs, io_channel new_io);
1738
1739 /* get_pathname.c */
1740 extern errcode_t ext2fs_get_pathname(ext2_filsys fs, ext2_ino_t dir, ext2_ino_t ino,
1741                                char **name);
1742
1743 /* link.c */
1744 #define EXT2FS_UNLINK_FORCE             0x1     /* Forcefully unlink even if
1745                                                  * the inode number doesn't
1746                                                  * match the dirent
1747                                                  */
1748 errcode_t ext2fs_link(ext2_filsys fs, ext2_ino_t dir, const char *name,
1749                       ext2_ino_t ino, int flags);
1750 errcode_t ext2fs_unlink(ext2_filsys fs, ext2_ino_t dir, const char *name,
1751                         ext2_ino_t ino, int flags);
1752
1753 /* symlink.c */
1754 errcode_t ext2fs_symlink(ext2_filsys fs, ext2_ino_t parent, ext2_ino_t ino,
1755                          const char *name, const char *target);
1756 int ext2fs_is_fast_symlink(struct ext2_inode *inode);
1757
1758 /* mmp.c */
1759 errcode_t ext2fs_mmp_read(ext2_filsys fs, blk64_t mmp_blk, void *buf);
1760 errcode_t ext2fs_mmp_write(ext2_filsys fs, blk64_t mmp_blk, void *buf);
1761 errcode_t ext2fs_mmp_clear(ext2_filsys fs);
1762 errcode_t ext2fs_mmp_init(ext2_filsys fs);
1763 errcode_t ext2fs_mmp_start(ext2_filsys fs);
1764 errcode_t ext2fs_mmp_update(ext2_filsys fs);
1765 errcode_t ext2fs_mmp_update2(ext2_filsys fs, int immediately);
1766 errcode_t ext2fs_mmp_stop(ext2_filsys fs);
1767 unsigned ext2fs_mmp_new_seq(void);
1768
1769 /* read_bb.c */
1770 extern errcode_t ext2fs_read_bb_inode(ext2_filsys fs,
1771                                       ext2_badblocks_list *bb_list);
1772
1773 /* read_bb_file.c */
1774 extern errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f,
1775                                       ext2_badblocks_list *bb_list,
1776                                       void *priv_data,
1777                                       void (*invalid)(ext2_filsys fs,
1778                                                       blk_t blk,
1779                                                       char *badstr,
1780                                                       void *priv_data));
1781 extern errcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f,
1782                                      ext2_badblocks_list *bb_list,
1783                                      void (*invalid)(ext2_filsys fs,
1784                                                      blk_t blk));
1785
1786 /* res_gdt.c */
1787 extern errcode_t ext2fs_create_resize_inode(ext2_filsys fs);
1788
1789 /* rw_bitmaps.c */
1790 extern errcode_t ext2fs_rw_bitmaps(ext2_filsys fs, int flags, int num_threads);
1791 extern errcode_t ext2fs_read_bitmaps(ext2_filsys fs);
1792 extern errcode_t ext2fs_read_inode_bitmap (ext2_filsys fs);
1793 extern errcode_t ext2fs_read_block_bitmap(ext2_filsys fs);
1794 extern errcode_t ext2fs_write_bitmaps(ext2_filsys fs);
1795 extern errcode_t ext2fs_write_inode_bitmap(ext2_filsys fs);
1796 extern errcode_t ext2fs_write_block_bitmap (ext2_filsys fs);
1797
1798 /*sha256.c */
1799 #define EXT2FS_SHA256_LENGTH 32
1800 #if 0
1801 extern void ext2fs_sha256(const unsigned char *in, unsigned long in_size,
1802                    unsigned char out[EXT2FS_SHA256_LENGTH]);
1803 #endif
1804
1805 /* sha512.c */
1806 #define EXT2FS_SHA512_LENGTH 64
1807 extern void ext2fs_sha512(const unsigned char *in, unsigned long in_size,
1808                           unsigned char out[EXT2FS_SHA512_LENGTH]);
1809
1810 /* swapfs.c */
1811 extern errcode_t ext2fs_dirent_swab_in2(ext2_filsys fs, char *buf, size_t size,
1812                                         int flags);
1813 extern errcode_t ext2fs_dirent_swab_in(ext2_filsys fs, char *buf, int flags);
1814 extern errcode_t ext2fs_dirent_swab_out2(ext2_filsys fs, char *buf, size_t size,
1815                                          int flags);
1816 extern errcode_t ext2fs_dirent_swab_out(ext2_filsys fs, char *buf, int flags);
1817 extern void ext2fs_swap_ext_attr(char *to, char *from, int bufsize,
1818                                  int has_header);
1819 extern void ext2fs_swap_ext_attr_header(struct ext2_ext_attr_header *to_header,
1820                                         struct ext2_ext_attr_header *from_hdr);
1821 extern void ext2fs_swap_ext_attr_entry(struct ext2_ext_attr_entry *to_entry,
1822                                        struct ext2_ext_attr_entry *from_entry);
1823 extern void ext2fs_swap_super(struct ext2_super_block * super);
1824 extern void ext2fs_swap_group_desc(struct ext2_group_desc *gdp);
1825 extern void ext2fs_swap_group_desc2(ext2_filsys, struct ext2_group_desc *gdp);
1826 extern void ext2fs_swap_inode_full(ext2_filsys fs, struct ext2_inode_large *t,
1827                                    struct ext2_inode_large *f, int hostorder,
1828                                    int bufsize);
1829 extern void ext2fs_swap_inode(ext2_filsys fs,struct ext2_inode *t,
1830                               struct ext2_inode *f, int hostorder);
1831 extern void ext2fs_swap_mmp(struct mmp_struct *mmp);
1832
1833 /* unix_io.c */
1834 extern int ext2fs_open_file(const char *pathname, int flags, mode_t mode);
1835 extern int ext2fs_stat(const char *path, ext2fs_struct_stat *buf);
1836 extern int ext2fs_fstat(int fd, ext2fs_struct_stat *buf);
1837
1838 /* valid_blk.c */
1839 extern int ext2fs_inode_has_valid_blocks(struct ext2_inode *inode);
1840 extern int ext2fs_inode_has_valid_blocks2(ext2_filsys fs,
1841                                           struct ext2_inode *inode);
1842
1843 /* version.c */
1844 extern int ext2fs_parse_version_string(const char *ver_string);
1845 extern int ext2fs_get_library_version(const char **ver_string,
1846                                       const char **date_string);
1847
1848 /* write_bb_file.c */
1849 extern errcode_t ext2fs_write_bb_FILE(ext2_badblocks_list bb_list,
1850                                       unsigned int flags,
1851                                       FILE *f);
1852
1853
1854 /* inline functions */
1855 #ifdef NO_INLINE_FUNCS
1856 extern errcode_t ext2fs_get_mem(unsigned long size, void *ptr);
1857 extern errcode_t ext2fs_get_memzero(unsigned long size, void *ptr);
1858 extern errcode_t ext2fs_get_array(unsigned long count,
1859                                   unsigned long size, void *ptr);
1860 extern errcode_t ext2fs_get_arrayzero(unsigned long count,
1861                                       unsigned long size, void *ptr);
1862 extern errcode_t ext2fs_free_mem(void *ptr);
1863 extern errcode_t ext2fs_resize_mem(unsigned long old_size,
1864                                    unsigned long size, void *ptr);
1865 extern errcode_t ext2fs_resize_array(unsigned long old_count, unsigned long count,
1866                                      unsigned long size, void *ptr);
1867 extern void ext2fs_mark_super_dirty(ext2_filsys fs);
1868 extern void ext2fs_mark_changed(ext2_filsys fs);
1869 extern int ext2fs_test_changed(ext2_filsys fs);
1870 extern void ext2fs_mark_valid(ext2_filsys fs);
1871 extern void ext2fs_unmark_valid(ext2_filsys fs);
1872 extern int ext2fs_test_valid(ext2_filsys fs);
1873 extern void ext2fs_mark_ib_dirty(ext2_filsys fs);
1874 extern void ext2fs_mark_bb_dirty(ext2_filsys fs);
1875 extern int ext2fs_test_ib_dirty(ext2_filsys fs);
1876 extern int ext2fs_test_bb_dirty(ext2_filsys fs);
1877 extern dgrp_t ext2fs_group_of_blk(ext2_filsys fs, blk_t blk);
1878 extern dgrp_t ext2fs_group_of_ino(ext2_filsys fs, ext2_ino_t ino);
1879 extern blk_t ext2fs_group_first_block(ext2_filsys fs, dgrp_t group);
1880 extern blk_t ext2fs_group_last_block(ext2_filsys fs, dgrp_t group);
1881 extern blk_t ext2fs_inode_data_blocks(ext2_filsys fs,
1882                                       struct ext2_inode *inode);
1883 extern int ext2fs_htree_intnode_maxrecs(ext2_filsys fs, int blocks);
1884 extern unsigned int ext2fs_div_ceil(unsigned int a, unsigned int b);
1885 extern __u64 ext2fs_div64_ceil(__u64 a, __u64 b);
1886 extern int ext2fs_dirent_name_len(const struct ext2_dir_entry *entry);
1887 extern void ext2fs_dirent_set_name_len(struct ext2_dir_entry *entry, int len);
1888 extern int ext2fs_dirent_file_type(const struct ext2_dir_entry *entry);
1889 extern void ext2fs_dirent_set_file_type(struct ext2_dir_entry *entry, int type);
1890 extern struct ext2_inode *ext2fs_inode(struct ext2_inode_large * large_inode);
1891 extern const struct ext2_inode *ext2fs_const_inode(const struct ext2_inode_large * large_inode);
1892
1893 #endif
1894
1895 /*
1896  * The actual inlined functions definitions themselves...
1897  *
1898  * If NO_INLINE_FUNCS is defined, then we won't try to do inline
1899  * functions at all!
1900  */
1901 #if (defined(INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS))
1902 #ifdef INCLUDE_INLINE_FUNCS
1903 #define _INLINE_ extern
1904 #else
1905 #if (__STDC_VERSION__ >= 199901L)
1906 #define _INLINE_ inline
1907 #else
1908 #ifdef __GNUC__
1909 #define _INLINE_ extern __inline__
1910 #else                           /* For Watcom C */
1911 #define _INLINE_ extern inline
1912 #endif /* __GNUC__ */
1913 #endif /* __STDC_VERSION__ >= 199901L */
1914 #endif
1915
1916 #ifndef EXT2_CUSTOM_MEMORY_ROUTINES
1917 #include <string.h>
1918 /*
1919  *  Allocate memory.  The 'ptr' arg must point to a pointer.
1920  */
1921 _INLINE_ errcode_t ext2fs_get_mem(unsigned long size, void *ptr)
1922 {
1923         void *pp;
1924
1925         pp = malloc(size);
1926         if (!pp)
1927                 return EXT2_ET_NO_MEMORY;
1928         memcpy(ptr, &pp, sizeof (pp));
1929         return 0;
1930 }
1931
1932 _INLINE_ errcode_t ext2fs_get_memzero(unsigned long size, void *ptr)
1933 {
1934         void *pp;
1935
1936         pp = malloc(size);
1937         if (!pp)
1938                 return EXT2_ET_NO_MEMORY;
1939         memset(pp, 0, size);
1940         memcpy(ptr, &pp, sizeof(pp));
1941         return 0;
1942 }
1943
1944 _INLINE_ errcode_t ext2fs_get_array(unsigned long count, unsigned long size,
1945                                     void *ptr)
1946 {
1947         if (count && (~0UL)/count < size)
1948                 return EXT2_ET_NO_MEMORY;
1949         return ext2fs_get_mem(count*size, ptr);
1950 }
1951
1952 _INLINE_ errcode_t ext2fs_get_arrayzero(unsigned long count,
1953                                         unsigned long size, void *ptr)
1954 {
1955         if (count && (~0UL)/count < size)
1956                 return EXT2_ET_NO_MEMORY;
1957
1958         return ext2fs_get_memzero((size_t)count * size, ptr);
1959 }
1960
1961 /*
1962  * Free memory.  The 'ptr' arg must point to a pointer.
1963  */
1964 _INLINE_ errcode_t ext2fs_free_mem(void *ptr)
1965 {
1966         void *p;
1967
1968         memcpy(&p, ptr, sizeof(p));
1969         free(p);
1970         p = 0;
1971         memcpy(ptr, &p, sizeof(p));
1972         return 0;
1973 }
1974
1975 /*
1976  *  Resize memory.  The 'ptr' arg must point to a pointer.
1977  */
1978 _INLINE_ errcode_t ext2fs_resize_mem(unsigned long EXT2FS_ATTR((unused)) old_size,
1979                                      unsigned long size, void *ptr)
1980 {
1981         void *p;
1982
1983         /* Use "memcpy" for pointer assignments here to avoid problems
1984          * with C99 strict type aliasing rules. */
1985         memcpy(&p, ptr, sizeof(p));
1986         p = realloc(p, size);
1987         if (!p)
1988                 return EXT2_ET_NO_MEMORY;
1989         memcpy(ptr, &p, sizeof(p));
1990         return 0;
1991 }
1992
1993 /*
1994  *  Resize array.  The 'ptr' arg must point to a pointer.
1995  */
1996 _INLINE_ errcode_t ext2fs_resize_array(unsigned long size,
1997                                        unsigned long old_count,
1998                                        unsigned long count, void *ptr)
1999 {
2000         unsigned long old_size;
2001         errcode_t retval;
2002
2003         if (count && (~0UL)/count < size)
2004                 return EXT2_ET_NO_MEMORY;
2005
2006         size *= count;
2007         old_size = size * old_count;
2008         retval = ext2fs_resize_mem(old_size, size, ptr);
2009         if (retval)
2010                 return retval;
2011
2012         if (size > old_size) {
2013                 void *p;
2014
2015                 memcpy(&p, ptr, sizeof(p));
2016                 memset((char *)p + old_size, 0, size - old_size);
2017                 memcpy(ptr, &p, sizeof(p));
2018         }
2019
2020         return 0;
2021 }
2022 #endif  /* Custom memory routines */
2023
2024 /*
2025  * Mark a filesystem superblock as dirty
2026  */
2027 _INLINE_ void ext2fs_mark_super_dirty(ext2_filsys fs)
2028 {
2029         fs->flags |= EXT2_FLAG_DIRTY | EXT2_FLAG_CHANGED;
2030 }
2031
2032 /*
2033  * Mark a filesystem as changed
2034  */
2035 _INLINE_ void ext2fs_mark_changed(ext2_filsys fs)
2036 {
2037         fs->flags |= EXT2_FLAG_CHANGED;
2038 }
2039
2040 /*
2041  * Check to see if a filesystem has changed
2042  */
2043 _INLINE_ int ext2fs_test_changed(ext2_filsys fs)
2044 {
2045         return (fs->flags & EXT2_FLAG_CHANGED);
2046 }
2047
2048 /*
2049  * Mark a filesystem as valid
2050  */
2051 _INLINE_ void ext2fs_mark_valid(ext2_filsys fs)
2052 {
2053         fs->flags |= EXT2_FLAG_VALID;
2054 }
2055
2056 /*
2057  * Mark a filesystem as NOT valid
2058  */
2059 _INLINE_ void ext2fs_unmark_valid(ext2_filsys fs)
2060 {
2061         fs->flags &= ~EXT2_FLAG_VALID;
2062 }
2063
2064 /*
2065  * Check to see if a filesystem is valid
2066  */
2067 _INLINE_ int ext2fs_test_valid(ext2_filsys fs)
2068 {
2069         return (fs->flags & EXT2_FLAG_VALID);
2070 }
2071
2072 /*
2073  * Mark the inode bitmap as dirty
2074  */
2075 _INLINE_ void ext2fs_mark_ib_dirty(ext2_filsys fs)
2076 {
2077         fs->flags |= EXT2_FLAG_IB_DIRTY | EXT2_FLAG_CHANGED;
2078 }
2079
2080 /*
2081  * Mark the block bitmap as dirty
2082  */
2083 _INLINE_ void ext2fs_mark_bb_dirty(ext2_filsys fs)
2084 {
2085         fs->flags |= EXT2_FLAG_BB_DIRTY | EXT2_FLAG_CHANGED;
2086 }
2087
2088 /*
2089  * Check to see if a filesystem's inode bitmap is dirty
2090  */
2091 _INLINE_ int ext2fs_test_ib_dirty(ext2_filsys fs)
2092 {
2093         return (fs->flags & EXT2_FLAG_IB_DIRTY);
2094 }
2095
2096 /*
2097  * Check to see if a filesystem's block bitmap is dirty
2098  */
2099 _INLINE_ int ext2fs_test_bb_dirty(ext2_filsys fs)
2100 {
2101         return (fs->flags & EXT2_FLAG_BB_DIRTY);
2102 }
2103
2104 /*
2105  * Return the group # of a block
2106  */
2107 _INLINE_ dgrp_t ext2fs_group_of_blk(ext2_filsys fs, blk_t blk)
2108 {
2109         return ext2fs_group_of_blk2(fs, blk);
2110 }
2111 /*
2112  * Return the group # of an inode number
2113  */
2114 _INLINE_ dgrp_t ext2fs_group_of_ino(ext2_filsys fs, ext2_ino_t ino)
2115 {
2116         return (ino - 1) / fs->super->s_inodes_per_group;
2117 }
2118
2119 /*
2120  * Return the first block (inclusive) in a group
2121  */
2122 _INLINE_ blk_t ext2fs_group_first_block(ext2_filsys fs, dgrp_t group)
2123 {
2124         return (blk_t) ext2fs_group_first_block2(fs, group);
2125 }
2126
2127 /*
2128  * Return the last block (inclusive) in a group
2129  */
2130 _INLINE_ blk_t ext2fs_group_last_block(ext2_filsys fs, dgrp_t group)
2131 {
2132         return (blk_t) ext2fs_group_last_block2(fs, group);
2133 }
2134
2135 _INLINE_ blk_t ext2fs_inode_data_blocks(ext2_filsys fs,
2136                                         struct ext2_inode *inode)
2137 {
2138         return (blk_t) ext2fs_inode_data_blocks2(fs, inode);
2139 }
2140
2141 _INLINE_ int ext2fs_htree_intnode_maxrecs(ext2_filsys fs, int blocks)
2142 {
2143         int csum_size = 0;
2144
2145         if ((EXT2_SB(fs->super)->s_feature_ro_compat &
2146              EXT4_FEATURE_RO_COMPAT_METADATA_CSUM) != 0)
2147                 csum_size = sizeof(struct ext2_dx_tail);
2148         return blocks * ((fs->blocksize - (8 + csum_size)) /
2149                                                 sizeof(struct ext2_dx_entry));
2150 }
2151
2152 /*
2153  * This is an efficient, overflow safe way of calculating ceil((1.0 * a) / b)
2154  */
2155 _INLINE_ unsigned int ext2fs_div_ceil(unsigned int a, unsigned int b)
2156 {
2157         if (!a)
2158                 return 0;
2159         return ((a - 1) / b) + 1;
2160 }
2161
2162 _INLINE_ __u64 ext2fs_div64_ceil(__u64 a, __u64 b)
2163 {
2164         if (!a)
2165                 return 0;
2166         return ((a - 1) / b) + 1;
2167 }
2168
2169 _INLINE_ int ext2fs_dirent_name_len(const struct ext2_dir_entry *entry)
2170 {
2171         return entry->name_len & 0xff;
2172 }
2173
2174 _INLINE_ void ext2fs_dirent_set_name_len(struct ext2_dir_entry *entry, int len)
2175 {
2176         entry->name_len = (entry->name_len & 0xff00) | (len & 0xff);
2177 }
2178
2179 _INLINE_ int ext2fs_dirent_file_type(const struct ext2_dir_entry *entry)
2180 {
2181         return entry->name_len >> 8;
2182 }
2183
2184 _INLINE_ void ext2fs_dirent_set_file_type(struct ext2_dir_entry *entry, int type)
2185 {
2186         entry->name_len = (entry->name_len & 0xff) | (type << 8);
2187 }
2188
2189 _INLINE_ struct ext2_inode *ext2fs_inode(struct ext2_inode_large * large_inode)
2190 {
2191         /* It is always safe to convert large inode to a small inode */
2192         return (struct ext2_inode *) large_inode;
2193 }
2194
2195 _INLINE_ const struct ext2_inode *
2196 ext2fs_const_inode(const struct ext2_inode_large * large_inode)
2197 {
2198         /* It is always safe to convert large inode to a small inode */
2199         return (const struct ext2_inode *) large_inode;
2200 }
2201
2202 #undef _INLINE_
2203 #endif
2204
2205 /* htree levels for ext4 */
2206 #define EXT4_HTREE_LEVEL_COMPAT 2
2207 #define EXT4_HTREE_LEVEL        3
2208
2209 static inline unsigned int ext2_dir_htree_level(ext2_filsys fs)
2210 {
2211         if (ext2fs_has_feature_largedir(fs->super))
2212                 return EXT4_HTREE_LEVEL;
2213
2214         return EXT4_HTREE_LEVEL_COMPAT;
2215 }
2216
2217 #ifdef __cplusplus
2218 }
2219 #endif
2220
2221 #endif /* _EXT2FS_EXT2FS_H */