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