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