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