ext2fs.h revision 6d8b37fa7661484ca50a4951cffbf531ab1bccbb
1/* 2 * ext2fs.h --- ext2fs 3 * 4 * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o. 5 * 6 * %Begin-Header% 7 * This file may be redistributed under the terms of the GNU Library 8 * General Public License, version 2. 9 * %End-Header% 10 */ 11 12#ifndef _EXT2FS_EXT2FS_H 13#define _EXT2FS_EXT2FS_H 14 15#ifdef __GNUC__ 16#define EXT2FS_ATTR(x) __attribute__(x) 17#else 18#define EXT2FS_ATTR(x) 19#endif 20 21#ifdef __cplusplus 22extern "C" { 23#endif 24 25/* 26 * Non-GNU C compilers won't necessarily understand inline 27 */ 28#if (!defined(__GNUC__) && !defined(__WATCOMC__)) 29#define NO_INLINE_FUNCS 30#endif 31 32/* 33 * Where the master copy of the superblock is located, and how big 34 * superblocks are supposed to be. We define SUPERBLOCK_SIZE because 35 * the size of the superblock structure is not necessarily trustworthy 36 * (some versions have the padding set up so that the superblock is 37 * 1032 bytes long). 38 */ 39#define SUPERBLOCK_OFFSET 1024 40#define SUPERBLOCK_SIZE 1024 41 42/* 43 * The last ext2fs revision level that this version of the library is 44 * able to support. 45 */ 46#define EXT2_LIB_CURRENT_REV EXT2_DYNAMIC_REV 47 48#ifdef HAVE_SYS_TYPES_H 49#include <sys/types.h> 50#endif 51 52#include <stdio.h> 53#include <stdlib.h> 54#include <string.h> 55 56#if EXT2_FLAT_INCLUDES 57#include "e2_types.h" 58#include "ext2_fs.h" 59#include "ext3_extents.h" 60#else 61#include <ext2fs/ext2_types.h> 62#include <ext2fs/ext2_fs.h> 63#include <ext2fs/ext3_extents.h> 64#endif /* EXT2_FLAT_INCLUDES */ 65 66typedef __u32 ext2_ino_t; 67typedef __u32 blk_t; 68typedef __u64 blk64_t; 69typedef __u32 dgrp_t; 70typedef __u32 ext2_off_t; 71typedef __u64 ext2_off64_t; 72typedef __s64 e2_blkcnt_t; 73typedef __u32 ext2_dirhash_t; 74 75#if EXT2_FLAT_INCLUDES 76#include "com_err.h" 77#include "ext2_io.h" 78#include "ext2_err.h" 79#include "ext2_ext_attr.h" 80#else 81#include <et/com_err.h> 82#include <ext2fs/ext2_io.h> 83#include <ext2fs/ext2_err.h> 84#include <ext2fs/ext2_ext_attr.h> 85#endif 86 87/* 88 * Portability help for Microsoft Visual C++ 89 */ 90#ifdef _MSC_VER 91#define EXT2_QSORT_TYPE int __cdecl 92#else 93#define EXT2_QSORT_TYPE int 94#endif 95 96typedef struct struct_ext2_filsys *ext2_filsys; 97 98#define EXT2FS_MARK_ERROR 0 99#define EXT2FS_UNMARK_ERROR 1 100#define EXT2FS_TEST_ERROR 2 101 102typedef struct ext2fs_struct_generic_bitmap *ext2fs_generic_bitmap; 103typedef struct ext2fs_struct_generic_bitmap *ext2fs_inode_bitmap; 104typedef struct ext2fs_struct_generic_bitmap *ext2fs_block_bitmap; 105 106#define EXT2_FIRST_INODE(s) EXT2_FIRST_INO(s) 107 108 109/* 110 * Badblocks list definitions 111 */ 112 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; 118 119/* old */ 120typedef struct ext2_struct_u32_list *badblocks_list; 121typedef struct ext2_struct_u32_iterate *badblocks_iterate; 122 123#define BADBLOCKS_FLAG_DIRTY 1 124 125/* 126 * ext2_dblist structure and abstractions (see dblist.c) 127 */ 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 */ 135struct ext2_db_entry { 136 ext2_ino_t ino; 137 blk_t blk; 138 int blockcnt; 139}; 140 141typedef struct ext2_struct_dblist *ext2_dblist; 142 143#define DBLIST_ABORT 1 144 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 163/* 164 * Flags for the ext2_filsys structure and for ext2fs_open() 165 */ 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 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 176#define EXT2_FLAG_FORCE 0x400 177#define EXT2_FLAG_SUPER_ONLY 0x800 178#define EXT2_FLAG_JOURNAL_DEV_OK 0x1000 179#define EXT2_FLAG_IMAGE_FILE 0x2000 180#define EXT2_FLAG_EXCLUSIVE 0x4000 181#define EXT2_FLAG_SOFTSUPP_FEATURES 0x8000 182#define EXT2_FLAG_NOFREE_ON_ERROR 0x10000 183#define EXT2_FLAG_64BITS 0x20000 184#define EXT2_FLAG_PRINT_PROGRESS 0x40000 185 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 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 199struct struct_ext2_filsys { 200 errcode_t magic; 201 io_channel io; 202 int flags; 203 char * device_name; 204 struct ext2_super_block * super; 205 unsigned int blocksize; 206 int fragsize; 207 dgrp_t group_desc_count; 208 unsigned long desc_blocks; 209 struct ext2_group_desc * group_desc; 210 int inode_blocks_per_group; 211 ext2fs_inode_bitmap inode_map; 212 ext2fs_block_bitmap block_map; 213 /* XXX FIXME-64: not 64-bit safe, but not used? */ 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); 216 errcode_t (*write_bitmaps)(ext2_filsys fs); 217 errcode_t (*read_inode)(ext2_filsys fs, ext2_ino_t ino, 218 struct ext2_inode *inode); 219 errcode_t (*write_inode)(ext2_filsys fs, ext2_ino_t ino, 220 struct ext2_inode *inode); 221 ext2_badblocks_list badblocks; 222 ext2_dblist dblist; 223 __u32 stride; /* for mke2fs */ 224 struct ext2_super_block * orig_super; 225 struct ext2_image_hdr * image_header; 226 __u32 umask; 227 time_t now; 228 /* 229 * Reserved for future expansion 230 */ 231 __u32 reserved[7]; 232 233 /* 234 * Reserved for the use of the calling application. 235 */ 236 void * priv_data; 237 238 /* 239 * Inode cache 240 */ 241 struct ext2_inode_cache *icache; 242 io_channel image_io; 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); 250}; 251 252#if EXT2_FLAT_INCLUDES 253#include "e2_bitops.h" 254#else 255#include <ext2fs/bitops.h> 256#endif 257 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 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". 273 * 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. 277 * This is useful if you are going to be deallocating blocks from an 278 * inode. 279 * 280 * BLOCK_FLAG_DATA_ONLY indicates that the iterator function should be 281 * called for data blocks only. 282 * 283 * BLOCK_FLAG_READ_ONLY is a promise by the caller that it will not 284 * modify returned block number. 285 * 286 * BLOCK_FLAG_NO_LARGE is for internal use only. It informs 287 * ext2fs_block_iterate2 that large files won't be accepted. 288 */ 289#define BLOCK_FLAG_APPEND 1 290#define BLOCK_FLAG_HOLE 1 291#define BLOCK_FLAG_DEPTH_TRAVERSE 2 292#define BLOCK_FLAG_DATA_ONLY 4 293#define BLOCK_FLAG_READ_ONLY 8 294 295#define BLOCK_FLAG_NO_LARGE 0x1000 296 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) 304 305#if 0 306/* 307 * Flags for ext2fs_move_blocks 308 */ 309#define EXT2_BMOVE_GET_DBLIST 0x0001 310#define EXT2_BMOVE_DEBUG 0x0002 311#endif 312 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 */ 353#define EXT2_EXTENT_INSERT_AFTER 0x0001 /* insert after handle loc'n */ 354#define EXT2_EXTENT_INSERT_NOSPLIT 0x0002 /* insert may not cause split */ 355 356/* 357 * Flags used by ext2fs_extent_delete() 358 */ 359#define EXT2_EXTENT_DELETE_KEEP_EMPTY 0x001 /* keep node if last extnt gone */ 360 361/* 362 * Flags used by ext2fs_extent_set_bmap() 363 */ 364#define EXT2_EXTENT_SET_BMAP_UNINIT 0x0001 365 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 382/* 383 * Flags for directory block reading and writing functions 384 */ 385#define EXT2_DIRBLOCK_V2_STRUCT 0x0001 386 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 399#define DIRENT_FLAG_INCLUDE_REMOVED 2 400 401#define DIRENT_DOT_FILE 1 402#define DIRENT_DOT_DOT_FILE 2 403#define DIRENT_OTHER_FILE 3 404#define DIRENT_DELETED_FILE 4 405 406/* 407 * Inode scan definitions 408 */ 409typedef struct ext2_struct_inode_scan *ext2_inode_scan; 410 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 418#define EXT2_SF_DO_LAZY 0x0010 419 420/* 421 * ext2fs_check_if_mounted flags 422 */ 423#define EXT2_MF_MOUNTED 1 424#define EXT2_MF_ISROOT 2 425#define EXT2_MF_READONLY 4 426#define EXT2_MF_SWAP 8 427#define EXT2_MF_BUSY 16 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 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 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 469/* 470 * ext2 size of an inode 471 */ 472#define EXT2_I_SIZE(i) ((i)->i_size | ((__u64) (i)->i_size_high << 32)) 473 474/* 475 * ext2_icount_t abstraction 476 */ 477#define EXT2_ICOUNT_OPT_INCREMENT 0x01 478 479typedef struct ext2_icount *ext2_icount_t; 480 481/* 482 * Flags for ext2fs_bmap 483 */ 484#define BMAP_ALLOC 0x0001 485#define BMAP_SET 0x0002 486 487/* 488 * Returned flags from ext2fs_bmap 489 */ 490#define BMAP_RET_UNINIT 0x0001 491 492/* 493 * Flags for imager.c functions 494 */ 495#define IMAGER_FLAG_INODEMAP 1 496#define IMAGER_FLAG_SPARSEWRITE 2 497 498/* 499 * For checking structure magic numbers... 500 */ 501 502#define EXT2_CHECK_MAGIC(struct, code) \ 503 if ((struct)->magic != (code)) return (code) 504 505 506/* 507 * For ext2 compression support 508 */ 509#define EXT2FS_COMPRESSED_BLKADDR ((blk_t) -1) 510#define HOLE_BLKADDR(_b) ((_b) == 0 || (_b) == EXT2FS_COMPRESSED_BLKADDR) 511 512/* 513 * Features supported by this version of the library 514 */ 515#define EXT2_LIB_FEATURE_COMPAT_SUPP (EXT2_FEATURE_COMPAT_DIR_PREALLOC|\ 516 EXT2_FEATURE_COMPAT_IMAGIC_INODES|\ 517 EXT3_FEATURE_COMPAT_HAS_JOURNAL|\ 518 EXT2_FEATURE_COMPAT_RESIZE_INODE|\ 519 EXT2_FEATURE_COMPAT_DIR_INDEX|\ 520 EXT2_FEATURE_COMPAT_EXT_ATTR) 521 522/* This #ifdef is temporary until compression is fully supported */ 523#ifdef ENABLE_COMPRESSION 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. */ 528 #warning "Compression support is experimental" 529#endif 530#define EXT2_LIB_FEATURE_INCOMPAT_SUPP (EXT2_FEATURE_INCOMPAT_FILETYPE|\ 531 EXT2_FEATURE_INCOMPAT_COMPRESSION|\ 532 EXT3_FEATURE_INCOMPAT_JOURNAL_DEV|\ 533 EXT2_FEATURE_INCOMPAT_META_BG|\ 534 EXT3_FEATURE_INCOMPAT_RECOVER|\ 535 EXT3_FEATURE_INCOMPAT_EXTENTS|\ 536 EXT4_FEATURE_INCOMPAT_FLEX_BG) 537#else 538#define EXT2_LIB_FEATURE_INCOMPAT_SUPP (EXT2_FEATURE_INCOMPAT_FILETYPE|\ 539 EXT3_FEATURE_INCOMPAT_JOURNAL_DEV|\ 540 EXT2_FEATURE_INCOMPAT_META_BG|\ 541 EXT3_FEATURE_INCOMPAT_RECOVER|\ 542 EXT3_FEATURE_INCOMPAT_EXTENTS|\ 543 EXT4_FEATURE_INCOMPAT_FLEX_BG) 544#endif 545#define EXT2_LIB_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER|\ 546 EXT4_FEATURE_RO_COMPAT_HUGE_FILE|\ 547 EXT2_FEATURE_RO_COMPAT_LARGE_FILE|\ 548 EXT4_FEATURE_RO_COMPAT_DIR_NLINK|\ 549 EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE|\ 550 EXT4_FEATURE_RO_COMPAT_GDT_CSUM) 551 552/* 553 * These features are only allowed if EXT2_FLAG_SOFTSUPP_FEATURES is passed 554 * to ext2fs_openfs() 555 */ 556#define EXT2_LIB_SOFTSUPP_INCOMPAT (0) 557#define EXT2_LIB_SOFTSUPP_RO_COMPAT (0) 558 559/* 560 * function prototypes 561 */ 562 563/* alloc.c */ 564extern errcode_t ext2fs_new_inode(ext2_filsys fs, ext2_ino_t dir, int mode, 565 ext2fs_inode_bitmap map, ext2_ino_t *ret); 566extern errcode_t ext2fs_new_block(ext2_filsys fs, blk_t goal, 567 ext2fs_block_bitmap map, blk_t *ret); 568extern errcode_t ext2fs_new_block2(ext2_filsys fs, blk64_t goal, 569 ext2fs_block_bitmap map, blk64_t *ret); 570extern errcode_t ext2fs_get_free_blocks(ext2_filsys fs, blk_t start, 571 blk_t finish, int num, 572 ext2fs_block_bitmap map, 573 blk_t *ret); 574extern errcode_t ext2fs_get_free_blocks2(ext2_filsys fs, blk64_t start, 575 blk64_t finish, int num, 576 ext2fs_block_bitmap map, 577 blk64_t *ret); 578extern errcode_t ext2fs_alloc_block(ext2_filsys fs, blk_t goal, 579 char *block_buf, blk_t *ret); 580extern errcode_t ext2fs_alloc_block2(ext2_filsys fs, blk64_t goal, 581 char *block_buf, blk64_t *ret); 582extern void ext2fs_set_alloc_block_callback(ext2_filsys fs, 583 errcode_t (*func)(ext2_filsys fs, 584 blk64_t goal, 585 blk64_t *ret), 586 errcode_t (**old)(ext2_filsys fs, 587 blk64_t goal, 588 blk64_t *ret)); 589 590/* alloc_sb.c */ 591extern int ext2fs_reserve_super_and_bgd(ext2_filsys fs, 592 dgrp_t group, 593 ext2fs_block_bitmap bmap); 594extern void ext2fs_set_block_alloc_stats_callback(ext2_filsys fs, 595 void (*func)(ext2_filsys fs, 596 blk64_t blk, 597 int inuse), 598 void (**old)(ext2_filsys fs, 599 blk64_t blk, 600 int inuse)); 601 602/* alloc_stats.c */ 603void ext2fs_inode_alloc_stats(ext2_filsys fs, ext2_ino_t ino, int inuse); 604void ext2fs_inode_alloc_stats2(ext2_filsys fs, ext2_ino_t ino, 605 int inuse, int isdir); 606void ext2fs_block_alloc_stats(ext2_filsys fs, blk_t blk, int inuse); 607void ext2fs_block_alloc_stats2(ext2_filsys fs, blk64_t blk, int inuse); 608 609/* alloc_tables.c */ 610extern errcode_t ext2fs_allocate_tables(ext2_filsys fs); 611extern errcode_t ext2fs_allocate_group_table(ext2_filsys fs, dgrp_t group, 612 ext2fs_block_bitmap bmap); 613 614/* badblocks.c */ 615extern errcode_t ext2fs_u32_list_create(ext2_u32_list *ret, int size); 616extern errcode_t ext2fs_u32_list_add(ext2_u32_list bb, __u32 blk); 617extern int ext2fs_u32_list_find(ext2_u32_list bb, __u32 blk); 618extern int ext2fs_u32_list_test(ext2_u32_list bb, blk_t blk); 619extern errcode_t ext2fs_u32_list_iterate_begin(ext2_u32_list bb, 620 ext2_u32_iterate *ret); 621extern int ext2fs_u32_list_iterate(ext2_u32_iterate iter, blk_t *blk); 622extern void ext2fs_u32_list_iterate_end(ext2_u32_iterate iter); 623extern errcode_t ext2fs_u32_copy(ext2_u32_list src, ext2_u32_list *dest); 624extern int ext2fs_u32_list_equal(ext2_u32_list bb1, ext2_u32_list bb2); 625 626extern errcode_t ext2fs_badblocks_list_create(ext2_badblocks_list *ret, 627 int size); 628extern errcode_t ext2fs_badblocks_list_add(ext2_badblocks_list bb, 629 blk_t blk); 630extern int ext2fs_badblocks_list_test(ext2_badblocks_list bb, 631 blk_t blk); 632extern int ext2fs_u32_list_del(ext2_u32_list bb, __u32 blk); 633extern void ext2fs_badblocks_list_del(ext2_u32_list bb, __u32 blk); 634extern errcode_t 635 ext2fs_badblocks_list_iterate_begin(ext2_badblocks_list bb, 636 ext2_badblocks_iterate *ret); 637extern int ext2fs_badblocks_list_iterate(ext2_badblocks_iterate iter, 638 blk_t *blk); 639extern void ext2fs_badblocks_list_iterate_end(ext2_badblocks_iterate iter); 640extern errcode_t ext2fs_badblocks_copy(ext2_badblocks_list src, 641 ext2_badblocks_list *dest); 642extern int ext2fs_badblocks_equal(ext2_badblocks_list bb1, 643 ext2_badblocks_list bb2); 644extern int ext2fs_u32_list_count(ext2_u32_list bb); 645 646/* bb_compat */ 647extern errcode_t badblocks_list_create(badblocks_list *ret, int size); 648extern errcode_t badblocks_list_add(badblocks_list bb, blk_t blk); 649extern int badblocks_list_test(badblocks_list bb, blk_t blk); 650extern errcode_t badblocks_list_iterate_begin(badblocks_list bb, 651 badblocks_iterate *ret); 652extern int badblocks_list_iterate(badblocks_iterate iter, blk_t *blk); 653extern void badblocks_list_iterate_end(badblocks_iterate iter); 654extern void badblocks_list_free(badblocks_list bb); 655 656/* bb_inode.c */ 657extern errcode_t ext2fs_update_bb_inode(ext2_filsys fs, 658 ext2_badblocks_list bb_list); 659 660/* bitmaps.c */ 661extern void ext2fs_free_block_bitmap(ext2fs_block_bitmap bitmap); 662extern void ext2fs_free_inode_bitmap(ext2fs_inode_bitmap bitmap); 663extern errcode_t ext2fs_copy_bitmap(ext2fs_generic_bitmap src, 664 ext2fs_generic_bitmap *dest); 665extern errcode_t ext2fs_write_inode_bitmap(ext2_filsys fs); 666extern errcode_t ext2fs_write_block_bitmap (ext2_filsys fs); 667extern errcode_t ext2fs_read_inode_bitmap (ext2_filsys fs); 668extern errcode_t ext2fs_read_block_bitmap(ext2_filsys fs); 669extern errcode_t ext2fs_allocate_block_bitmap(ext2_filsys fs, 670 const char *descr, 671 ext2fs_block_bitmap *ret); 672extern errcode_t ext2fs_allocate_inode_bitmap(ext2_filsys fs, 673 const char *descr, 674 ext2fs_inode_bitmap *ret); 675extern errcode_t ext2fs_fudge_inode_bitmap_end(ext2fs_inode_bitmap bitmap, 676 ext2_ino_t end, ext2_ino_t *oend); 677extern errcode_t ext2fs_fudge_block_bitmap_end(ext2fs_block_bitmap bitmap, 678 blk_t end, blk_t *oend); 679extern errcode_t ext2fs_fudge_block_bitmap_end2(ext2fs_block_bitmap bitmap, 680 blk64_t end, blk64_t *oend); 681extern void ext2fs_clear_inode_bitmap(ext2fs_inode_bitmap bitmap); 682extern void ext2fs_clear_block_bitmap(ext2fs_block_bitmap bitmap); 683extern errcode_t ext2fs_read_bitmaps(ext2_filsys fs); 684extern errcode_t ext2fs_write_bitmaps(ext2_filsys fs); 685extern errcode_t ext2fs_resize_inode_bitmap(__u32 new_end, __u32 new_real_end, 686 ext2fs_inode_bitmap bmap); 687extern errcode_t ext2fs_resize_inode_bitmap2(__u64 new_end, 688 __u64 new_real_end, 689 ext2fs_inode_bitmap bmap); 690extern errcode_t ext2fs_resize_block_bitmap(__u32 new_end, __u32 new_real_end, 691 ext2fs_block_bitmap bmap); 692extern errcode_t ext2fs_resize_block_bitmap2(__u64 new_end, 693 __u64 new_real_end, 694 ext2fs_block_bitmap bmap); 695extern errcode_t ext2fs_compare_block_bitmap(ext2fs_block_bitmap bm1, 696 ext2fs_block_bitmap bm2); 697extern errcode_t ext2fs_compare_inode_bitmap(ext2fs_inode_bitmap bm1, 698 ext2fs_inode_bitmap bm2); 699extern errcode_t ext2fs_set_inode_bitmap_range(ext2fs_inode_bitmap bmap, 700 ext2_ino_t start, unsigned int num, 701 void *in); 702extern errcode_t ext2fs_set_inode_bitmap_range2(ext2fs_inode_bitmap bmap, 703 __u64 start, size_t num, 704 void *in); 705extern errcode_t ext2fs_get_inode_bitmap_range(ext2fs_inode_bitmap bmap, 706 ext2_ino_t start, unsigned int num, 707 void *out); 708extern errcode_t ext2fs_get_inode_bitmap_range2(ext2fs_inode_bitmap bmap, 709 __u64 start, size_t num, 710 void *out); 711extern errcode_t ext2fs_set_block_bitmap_range(ext2fs_block_bitmap bmap, 712 blk_t start, unsigned int num, 713 void *in); 714extern errcode_t ext2fs_set_block_bitmap_range2(ext2fs_block_bitmap bmap, 715 blk64_t start, size_t num, 716 void *in); 717extern errcode_t ext2fs_get_block_bitmap_range(ext2fs_block_bitmap bmap, 718 blk_t start, unsigned int num, 719 void *out); 720extern errcode_t ext2fs_get_block_bitmap_range2(ext2fs_block_bitmap bmap, 721 blk64_t start, size_t num, 722 void *out); 723 724/* blknum.c */ 725extern dgrp_t ext2fs_group_of_blk2(ext2_filsys fs, blk64_t); 726extern blk64_t ext2fs_group_first_block2(ext2_filsys fs, dgrp_t group); 727extern blk64_t ext2fs_group_last_block2(ext2_filsys fs, dgrp_t group); 728extern blk64_t ext2fs_inode_data_blocks2(ext2_filsys fs, 729 struct ext2_inode *inode); 730extern blk64_t ext2fs_inode_i_blocks(ext2_filsys fs, 731 struct ext2_inode *inode); 732extern blk64_t ext2fs_blocks_count(struct ext2_super_block *super); 733extern void ext2fs_blocks_count_set(struct ext2_super_block *super, 734 blk64_t blk); 735extern void ext2fs_blocks_count_add(struct ext2_super_block *super, 736 blk64_t blk); 737extern blk64_t ext2fs_r_blocks_count(struct ext2_super_block *super); 738extern void ext2fs_r_blocks_count_set(struct ext2_super_block *super, 739 blk64_t blk); 740extern void ext2fs_r_blocks_count_add(struct ext2_super_block *super, 741 blk64_t blk); 742extern blk64_t ext2fs_free_blocks_count(struct ext2_super_block *super); 743extern void ext2fs_free_blocks_count_set(struct ext2_super_block *super, 744 blk64_t blk); 745extern void ext2fs_free_blocks_count_add(struct ext2_super_block *super, 746 blk64_t blk); 747/* Block group descriptor accessor functions */ 748extern struct ext2_group_desc *ext2fs_group_desc(ext2_filsys fs, 749 struct ext2_group_desc *gdp, 750 dgrp_t group); 751extern blk64_t ext2fs_block_bitmap_loc(ext2_filsys fs, dgrp_t group); 752extern void ext2fs_block_bitmap_loc_set(ext2_filsys fs, dgrp_t group, 753 blk64_t blk); 754extern blk64_t ext2fs_inode_bitmap_loc(ext2_filsys fs, dgrp_t group); 755extern void ext2fs_inode_bitmap_loc_set(ext2_filsys fs, dgrp_t group, 756 blk64_t blk); 757extern blk64_t ext2fs_inode_table_loc(ext2_filsys fs, dgrp_t group); 758extern void ext2fs_inode_table_loc_set(ext2_filsys fs, dgrp_t group, 759 blk64_t blk); 760extern __u32 ext2fs_bg_free_blocks_count(ext2_filsys fs, dgrp_t group); 761extern void ext2fs_bg_free_blocks_count_set(ext2_filsys fs, dgrp_t group, 762 __u32 n); 763extern __u32 ext2fs_bg_free_inodes_count(ext2_filsys fs, dgrp_t group); 764extern void ext2fs_bg_free_inodes_count_set(ext2_filsys fs, dgrp_t group, 765 __u32 n); 766extern __u32 ext2fs_bg_used_dirs_count(ext2_filsys fs, dgrp_t group); 767extern void ext2fs_bg_used_dirs_count_set(ext2_filsys fs, dgrp_t group, 768 __u32 n); 769extern __u32 ext2fs_bg_itable_unused(ext2_filsys fs, dgrp_t group); 770extern void ext2fs_bg_itable_unused_set(ext2_filsys fs, dgrp_t group, 771 __u32 n); 772extern __u16 ext2fs_bg_flags(ext2_filsys fs, dgrp_t group); 773extern void ext2fs_bg_flags_zap(ext2_filsys fs, dgrp_t group); 774extern int ext2fs_bg_flags_test(ext2_filsys fs, dgrp_t group, __u16 bg_flag); 775extern void ext2fs_bg_flags_set(ext2_filsys fs, dgrp_t group, __u16 bg_flags); 776extern void ext2fs_bg_flags_clear(ext2_filsys fs, dgrp_t group, __u16 bg_flags); 777extern __u16 ext2fs_bg_checksum(ext2_filsys fs, dgrp_t group); 778extern void ext2fs_bg_checksum_set(ext2_filsys fs, dgrp_t group, __u16 checksum); 779extern blk64_t ext2fs_file_acl_block(const struct ext2_inode *inode); 780extern void ext2fs_file_acl_block_set(struct ext2_inode *inode, blk64_t blk); 781 782/* block.c */ 783extern errcode_t ext2fs_block_iterate(ext2_filsys fs, 784 ext2_ino_t ino, 785 int flags, 786 char *block_buf, 787 int (*func)(ext2_filsys fs, 788 blk_t *blocknr, 789 int blockcnt, 790 void *priv_data), 791 void *priv_data); 792errcode_t ext2fs_block_iterate2(ext2_filsys fs, 793 ext2_ino_t ino, 794 int flags, 795 char *block_buf, 796 int (*func)(ext2_filsys fs, 797 blk_t *blocknr, 798 e2_blkcnt_t blockcnt, 799 blk_t ref_blk, 800 int ref_offset, 801 void *priv_data), 802 void *priv_data); 803errcode_t ext2fs_block_iterate3(ext2_filsys fs, 804 ext2_ino_t ino, 805 int flags, 806 char *block_buf, 807 int (*func)(ext2_filsys fs, 808 blk64_t *blocknr, 809 e2_blkcnt_t blockcnt, 810 blk64_t ref_blk, 811 int ref_offset, 812 void *priv_data), 813 void *priv_data); 814 815/* bmap.c */ 816extern errcode_t ext2fs_bmap(ext2_filsys fs, ext2_ino_t ino, 817 struct ext2_inode *inode, 818 char *block_buf, int bmap_flags, 819 blk_t block, blk_t *phys_blk); 820extern errcode_t ext2fs_bmap2(ext2_filsys fs, ext2_ino_t ino, 821 struct ext2_inode *inode, 822 char *block_buf, int bmap_flags, blk64_t block, 823 int *ret_flags, blk64_t *phys_blk); 824 825#if 0 826/* bmove.c */ 827extern errcode_t ext2fs_move_blocks(ext2_filsys fs, 828 ext2fs_block_bitmap reserve, 829 ext2fs_block_bitmap alloc_map, 830 int flags); 831#endif 832 833/* check_desc.c */ 834extern errcode_t ext2fs_check_desc(ext2_filsys fs); 835 836/* closefs.c */ 837extern errcode_t ext2fs_close(ext2_filsys fs); 838extern errcode_t ext2fs_flush(ext2_filsys fs); 839extern int ext2fs_bg_has_super(ext2_filsys fs, int group_block); 840extern errcode_t ext2fs_super_and_bgd_loc2(ext2_filsys fs, 841 dgrp_t group, 842 blk64_t *ret_super_blk, 843 blk64_t *ret_old_desc_blk, 844 blk64_t *ret_new_desc_blk, 845 blk_t *ret_used_blks); 846extern int ext2fs_super_and_bgd_loc(ext2_filsys fs, 847 dgrp_t group, 848 blk_t *ret_super_blk, 849 blk_t *ret_old_desc_blk, 850 blk_t *ret_new_desc_blk, 851 int *ret_meta_bg); 852extern void ext2fs_update_dynamic_rev(ext2_filsys fs); 853 854/* csum.c */ 855extern void ext2fs_group_desc_csum_set(ext2_filsys fs, dgrp_t group); 856extern int ext2fs_group_desc_csum_verify(ext2_filsys fs, dgrp_t group); 857extern errcode_t ext2fs_set_gdt_csum(ext2_filsys fs); 858 859/* dblist.c */ 860 861extern errcode_t ext2fs_get_num_dirs(ext2_filsys fs, ext2_ino_t *ret_num_dirs); 862extern errcode_t ext2fs_init_dblist(ext2_filsys fs, ext2_dblist *ret_dblist); 863extern errcode_t ext2fs_add_dir_block(ext2_dblist dblist, ext2_ino_t ino, 864 blk_t blk, int blockcnt); 865extern errcode_t ext2fs_add_dir_block2(ext2_dblist dblist, ext2_ino_t ino, 866 blk64_t blk, e2_blkcnt_t blockcnt); 867extern void ext2fs_dblist_sort(ext2_dblist dblist, 868 EXT2_QSORT_TYPE (*sortfunc)(const void *, 869 const void *)); 870extern void ext2fs_dblist_sort2(ext2_dblist dblist, 871 EXT2_QSORT_TYPE (*sortfunc)(const void *, 872 const void *)); 873extern errcode_t ext2fs_dblist_iterate(ext2_dblist dblist, 874 int (*func)(ext2_filsys fs, struct ext2_db_entry *db_info, 875 void *priv_data), 876 void *priv_data); 877extern errcode_t ext2fs_dblist_iterate2(ext2_dblist dblist, 878 int (*func)(ext2_filsys fs, struct ext2_db_entry2 *db_info, 879 void *priv_data), 880 void *priv_data); 881extern errcode_t ext2fs_set_dir_block(ext2_dblist dblist, ext2_ino_t ino, 882 blk_t blk, int blockcnt); 883extern errcode_t ext2fs_set_dir_block2(ext2_dblist dblist, ext2_ino_t ino, 884 blk64_t blk, e2_blkcnt_t blockcnt); 885extern errcode_t ext2fs_copy_dblist(ext2_dblist src, 886 ext2_dblist *dest); 887extern int ext2fs_dblist_count(ext2_dblist dblist); 888extern blk64_t ext2fs_dblist_count2(ext2_dblist dblist); 889extern errcode_t ext2fs_dblist_get_last(ext2_dblist dblist, 890 struct ext2_db_entry **entry); 891extern errcode_t ext2fs_dblist_get_last2(ext2_dblist dblist, 892 struct ext2_db_entry2 **entry); 893extern errcode_t ext2fs_dblist_drop_last(ext2_dblist dblist); 894 895/* dblist_dir.c */ 896extern errcode_t 897 ext2fs_dblist_dir_iterate(ext2_dblist dblist, 898 int flags, 899 char *block_buf, 900 int (*func)(ext2_ino_t dir, 901 int entry, 902 struct ext2_dir_entry *dirent, 903 int offset, 904 int blocksize, 905 char *buf, 906 void *priv_data), 907 void *priv_data); 908 909/* dirblock.c */ 910extern errcode_t ext2fs_read_dir_block(ext2_filsys fs, blk_t block, 911 void *buf); 912extern errcode_t ext2fs_read_dir_block2(ext2_filsys fs, blk_t block, 913 void *buf, int flags); 914extern errcode_t ext2fs_read_dir_block3(ext2_filsys fs, blk64_t block, 915 void *buf, int flags); 916extern errcode_t ext2fs_write_dir_block(ext2_filsys fs, blk_t block, 917 void *buf); 918extern errcode_t ext2fs_write_dir_block2(ext2_filsys fs, blk_t block, 919 void *buf, int flags); 920extern errcode_t ext2fs_write_dir_block3(ext2_filsys fs, blk64_t block, 921 void *buf, int flags); 922 923/* dirhash.c */ 924extern errcode_t ext2fs_dirhash(int version, const char *name, int len, 925 const __u32 *seed, 926 ext2_dirhash_t *ret_hash, 927 ext2_dirhash_t *ret_minor_hash); 928 929 930/* dir_iterate.c */ 931extern errcode_t ext2fs_get_rec_len(ext2_filsys fs, 932 struct ext2_dir_entry *dirent, 933 unsigned int *rec_len); 934extern errcode_t ext2fs_set_rec_len(ext2_filsys fs, 935 unsigned int len, 936 struct ext2_dir_entry *dirent); 937extern errcode_t ext2fs_dir_iterate(ext2_filsys fs, 938 ext2_ino_t dir, 939 int flags, 940 char *block_buf, 941 int (*func)(struct ext2_dir_entry *dirent, 942 int offset, 943 int blocksize, 944 char *buf, 945 void *priv_data), 946 void *priv_data); 947extern errcode_t ext2fs_dir_iterate2(ext2_filsys fs, 948 ext2_ino_t dir, 949 int flags, 950 char *block_buf, 951 int (*func)(ext2_ino_t dir, 952 int entry, 953 struct ext2_dir_entry *dirent, 954 int offset, 955 int blocksize, 956 char *buf, 957 void *priv_data), 958 void *priv_data); 959 960/* dupfs.c */ 961extern errcode_t ext2fs_dup_handle(ext2_filsys src, ext2_filsys *dest); 962 963/* expanddir.c */ 964extern errcode_t ext2fs_expand_dir(ext2_filsys fs, ext2_ino_t dir); 965 966/* ext_attr.c */ 967extern __u32 ext2fs_ext_attr_hash_entry(struct ext2_ext_attr_entry *entry, 968 void *data); 969extern errcode_t ext2fs_read_ext_attr(ext2_filsys fs, blk_t block, void *buf); 970extern errcode_t ext2fs_read_ext_attr2(ext2_filsys fs, blk64_t block, 971 void *buf); 972extern errcode_t ext2fs_write_ext_attr(ext2_filsys fs, blk_t block, 973 void *buf); 974extern errcode_t ext2fs_write_ext_attr2(ext2_filsys fs, blk64_t block, 975 void *buf); 976extern errcode_t ext2fs_adjust_ea_refcount(ext2_filsys fs, blk_t blk, 977 char *block_buf, 978 int adjust, __u32 *newcount); 979extern errcode_t ext2fs_adjust_ea_refcount2(ext2_filsys fs, blk64_t blk, 980 char *block_buf, 981 int adjust, __u32 *newcount); 982 983/* extent.c */ 984extern errcode_t ext2fs_extent_header_verify(void *ptr, int size); 985extern errcode_t ext2fs_extent_open(ext2_filsys fs, ext2_ino_t ino, 986 ext2_extent_handle_t *handle); 987extern errcode_t ext2fs_extent_open2(ext2_filsys fs, ext2_ino_t ino, 988 struct ext2_inode *inode, 989 ext2_extent_handle_t *ret_handle); 990extern void ext2fs_extent_free(ext2_extent_handle_t handle); 991extern errcode_t ext2fs_extent_get(ext2_extent_handle_t handle, 992 int flags, struct ext2fs_extent *extent); 993extern errcode_t ext2fs_extent_replace(ext2_extent_handle_t handle, int flags, 994 struct ext2fs_extent *extent); 995extern errcode_t ext2fs_extent_insert(ext2_extent_handle_t handle, int flags, 996 struct ext2fs_extent *extent); 997extern errcode_t ext2fs_extent_set_bmap(ext2_extent_handle_t handle, 998 blk64_t logical, blk64_t physical, 999 int flags); 1000extern errcode_t ext2fs_extent_delete(ext2_extent_handle_t handle, int flags); 1001extern errcode_t ext2fs_extent_get_info(ext2_extent_handle_t handle, 1002 struct ext2_extent_info *info); 1003extern errcode_t ext2fs_extent_goto(ext2_extent_handle_t handle, 1004 blk64_t blk); 1005 1006/* fileio.c */ 1007extern errcode_t ext2fs_file_open2(ext2_filsys fs, ext2_ino_t ino, 1008 struct ext2_inode *inode, 1009 int flags, ext2_file_t *ret); 1010extern errcode_t ext2fs_file_open(ext2_filsys fs, ext2_ino_t ino, 1011 int flags, ext2_file_t *ret); 1012extern ext2_filsys ext2fs_file_get_fs(ext2_file_t file); 1013extern errcode_t ext2fs_file_close(ext2_file_t file); 1014extern errcode_t ext2fs_file_flush(ext2_file_t file); 1015extern errcode_t ext2fs_file_read(ext2_file_t file, void *buf, 1016 unsigned int wanted, unsigned int *got); 1017extern errcode_t ext2fs_file_write(ext2_file_t file, const void *buf, 1018 unsigned int nbytes, unsigned int *written); 1019extern errcode_t ext2fs_file_llseek(ext2_file_t file, __u64 offset, 1020 int whence, __u64 *ret_pos); 1021extern errcode_t ext2fs_file_lseek(ext2_file_t file, ext2_off_t offset, 1022 int whence, ext2_off_t *ret_pos); 1023errcode_t ext2fs_file_get_lsize(ext2_file_t file, __u64 *ret_size); 1024extern ext2_off_t ext2fs_file_get_size(ext2_file_t file); 1025extern errcode_t ext2fs_file_set_size(ext2_file_t file, ext2_off_t size); 1026 1027/* finddev.c */ 1028extern char *ext2fs_find_block_device(dev_t device); 1029 1030/* flushb.c */ 1031extern errcode_t ext2fs_sync_device(int fd, int flushb); 1032 1033/* freefs.c */ 1034extern void ext2fs_free(ext2_filsys fs); 1035extern void ext2fs_free_dblist(ext2_dblist dblist); 1036extern void ext2fs_badblocks_list_free(ext2_badblocks_list bb); 1037extern void ext2fs_u32_list_free(ext2_u32_list bb); 1038 1039/* gen_bitmap.c */ 1040extern void ext2fs_free_generic_bitmap(ext2fs_inode_bitmap bitmap); 1041extern errcode_t ext2fs_make_generic_bitmap(errcode_t magic, ext2_filsys fs, 1042 __u32 start, __u32 end, 1043 __u32 real_end, 1044 const char *descr, char *init_map, 1045 ext2fs_generic_bitmap *ret); 1046extern errcode_t ext2fs_allocate_generic_bitmap(__u32 start, 1047 __u32 end, 1048 __u32 real_end, 1049 const char *descr, 1050 ext2fs_generic_bitmap *ret); 1051extern errcode_t ext2fs_copy_generic_bitmap(ext2fs_generic_bitmap src, 1052 ext2fs_generic_bitmap *dest); 1053extern void ext2fs_clear_generic_bitmap(ext2fs_generic_bitmap bitmap); 1054extern errcode_t ext2fs_fudge_generic_bitmap_end(ext2fs_inode_bitmap bitmap, 1055 errcode_t magic, 1056 errcode_t neq, 1057 ext2_ino_t end, 1058 ext2_ino_t *oend); 1059extern void ext2fs_set_generic_bitmap_padding(ext2fs_generic_bitmap map); 1060extern errcode_t ext2fs_resize_generic_bitmap(errcode_t magic, 1061 __u32 new_end, 1062 __u32 new_real_end, 1063 ext2fs_generic_bitmap bmap); 1064extern errcode_t ext2fs_compare_generic_bitmap(errcode_t magic, errcode_t neq, 1065 ext2fs_generic_bitmap bm1, 1066 ext2fs_generic_bitmap bm2); 1067extern errcode_t ext2fs_get_generic_bitmap_range(ext2fs_generic_bitmap bmap, 1068 errcode_t magic, 1069 __u32 start, __u32 num, 1070 void *out); 1071extern errcode_t ext2fs_set_generic_bitmap_range(ext2fs_generic_bitmap bmap, 1072 errcode_t magic, 1073 __u32 start, __u32 num, 1074 void *in); 1075 1076/* gen_bitmap64.c */ 1077void ext2fs_free_generic_bmap(ext2fs_generic_bitmap bmap); 1078errcode_t ext2fs_alloc_generic_bmap(ext2_filsys fs, errcode_t magic, 1079 int type, __u64 start, __u64 end, 1080 __u64 real_end, 1081 const char *descr, 1082 ext2fs_generic_bitmap *ret); 1083errcode_t ext2fs_copy_generic_bmap(ext2fs_generic_bitmap src, 1084 ext2fs_generic_bitmap *dest); 1085void ext2fs_clear_generic_bmap(ext2fs_generic_bitmap bitmap); 1086errcode_t ext2fs_fudge_generic_bmap_end(ext2fs_generic_bitmap bitmap, 1087 errcode_t neq, 1088 __u64 end, __u64 *oend); 1089void ext2fs_set_generic_bmap_padding(ext2fs_generic_bitmap bmap); 1090errcode_t ext2fs_resize_generic_bmap(ext2fs_generic_bitmap bmap, 1091 __u64 new_end, 1092 __u64 new_real_end); 1093errcode_t ext2fs_compare_generic_bmap(errcode_t neq, 1094 ext2fs_generic_bitmap bm1, 1095 ext2fs_generic_bitmap bm2); 1096errcode_t ext2fs_get_generic_bmap_range(ext2fs_generic_bitmap bmap, 1097 __u64 start, unsigned int num, 1098 void *out); 1099errcode_t ext2fs_set_generic_bmap_range(ext2fs_generic_bitmap bmap, 1100 __u64 start, unsigned int num, 1101 void *in); 1102 1103/* getsize.c */ 1104extern errcode_t ext2fs_get_device_size(const char *file, int blocksize, 1105 blk_t *retblocks); 1106extern errcode_t ext2fs_get_device_size2(const char *file, int blocksize, 1107 blk64_t *retblocks); 1108 1109/* getsectsize.c */ 1110errcode_t ext2fs_get_device_sectsize(const char *file, int *sectsize); 1111errcode_t ext2fs_get_device_phys_sectsize(const char *file, int *sectsize); 1112 1113/* i_block.c */ 1114errcode_t ext2fs_iblk_add_blocks(ext2_filsys fs, struct ext2_inode *inode, 1115 blk64_t num_blocks); 1116errcode_t ext2fs_iblk_sub_blocks(ext2_filsys fs, struct ext2_inode *inode, 1117 blk64_t num_blocks); 1118errcode_t ext2fs_iblk_set(ext2_filsys fs, struct ext2_inode *inode, blk64_t b); 1119 1120/* imager.c */ 1121extern errcode_t ext2fs_image_inode_write(ext2_filsys fs, int fd, int flags); 1122extern errcode_t ext2fs_image_inode_read(ext2_filsys fs, int fd, int flags); 1123extern errcode_t ext2fs_image_super_write(ext2_filsys fs, int fd, int flags); 1124extern errcode_t ext2fs_image_super_read(ext2_filsys fs, int fd, int flags); 1125extern errcode_t ext2fs_image_bitmap_write(ext2_filsys fs, int fd, int flags); 1126extern errcode_t ext2fs_image_bitmap_read(ext2_filsys fs, int fd, int flags); 1127 1128/* ind_block.c */ 1129errcode_t ext2fs_read_ind_block(ext2_filsys fs, blk_t blk, void *buf); 1130errcode_t ext2fs_write_ind_block(ext2_filsys fs, blk_t blk, void *buf); 1131 1132/* initialize.c */ 1133extern errcode_t ext2fs_initialize(const char *name, int flags, 1134 struct ext2_super_block *param, 1135 io_manager manager, ext2_filsys *ret_fs); 1136 1137/* icount.c */ 1138extern void ext2fs_free_icount(ext2_icount_t icount); 1139extern errcode_t ext2fs_create_icount_tdb(ext2_filsys fs, char *tdb_dir, 1140 int flags, ext2_icount_t *ret); 1141extern errcode_t ext2fs_create_icount2(ext2_filsys fs, int flags, 1142 unsigned int size, 1143 ext2_icount_t hint, ext2_icount_t *ret); 1144extern errcode_t ext2fs_create_icount(ext2_filsys fs, int flags, 1145 unsigned int size, 1146 ext2_icount_t *ret); 1147extern errcode_t ext2fs_icount_fetch(ext2_icount_t icount, ext2_ino_t ino, 1148 __u16 *ret); 1149extern errcode_t ext2fs_icount_increment(ext2_icount_t icount, ext2_ino_t ino, 1150 __u16 *ret); 1151extern errcode_t ext2fs_icount_decrement(ext2_icount_t icount, ext2_ino_t ino, 1152 __u16 *ret); 1153extern errcode_t ext2fs_icount_store(ext2_icount_t icount, ext2_ino_t ino, 1154 __u16 count); 1155extern ext2_ino_t ext2fs_get_icount_size(ext2_icount_t icount); 1156errcode_t ext2fs_icount_validate(ext2_icount_t icount, FILE *); 1157 1158/* inode.c */ 1159extern errcode_t ext2fs_flush_icache(ext2_filsys fs); 1160extern errcode_t ext2fs_get_next_inode_full(ext2_inode_scan scan, 1161 ext2_ino_t *ino, 1162 struct ext2_inode *inode, 1163 int bufsize); 1164extern errcode_t ext2fs_open_inode_scan(ext2_filsys fs, int buffer_blocks, 1165 ext2_inode_scan *ret_scan); 1166extern void ext2fs_close_inode_scan(ext2_inode_scan scan); 1167extern errcode_t ext2fs_get_next_inode(ext2_inode_scan scan, ext2_ino_t *ino, 1168 struct ext2_inode *inode); 1169extern errcode_t ext2fs_inode_scan_goto_blockgroup(ext2_inode_scan scan, 1170 int group); 1171extern void ext2fs_set_inode_callback 1172 (ext2_inode_scan scan, 1173 errcode_t (*done_group)(ext2_filsys fs, 1174 ext2_inode_scan scan, 1175 dgrp_t group, 1176 void * priv_data), 1177 void *done_group_data); 1178extern int ext2fs_inode_scan_flags(ext2_inode_scan scan, int set_flags, 1179 int clear_flags); 1180extern errcode_t ext2fs_read_inode_full(ext2_filsys fs, ext2_ino_t ino, 1181 struct ext2_inode * inode, 1182 int bufsize); 1183extern errcode_t ext2fs_read_inode (ext2_filsys fs, ext2_ino_t ino, 1184 struct ext2_inode * inode); 1185extern errcode_t ext2fs_write_inode_full(ext2_filsys fs, ext2_ino_t ino, 1186 struct ext2_inode * inode, 1187 int bufsize); 1188extern errcode_t ext2fs_write_inode(ext2_filsys fs, ext2_ino_t ino, 1189 struct ext2_inode * inode); 1190extern errcode_t ext2fs_write_new_inode(ext2_filsys fs, ext2_ino_t ino, 1191 struct ext2_inode * inode); 1192extern errcode_t ext2fs_get_blocks(ext2_filsys fs, ext2_ino_t ino, blk_t *blocks); 1193extern errcode_t ext2fs_check_directory(ext2_filsys fs, ext2_ino_t ino); 1194 1195/* inode_io.c */ 1196extern io_manager inode_io_manager; 1197extern errcode_t ext2fs_inode_io_intern(ext2_filsys fs, ext2_ino_t ino, 1198 char **name); 1199extern errcode_t ext2fs_inode_io_intern2(ext2_filsys fs, ext2_ino_t ino, 1200 struct ext2_inode *inode, 1201 char **name); 1202 1203/* ismounted.c */ 1204extern errcode_t ext2fs_check_if_mounted(const char *file, int *mount_flags); 1205extern errcode_t ext2fs_check_mount_point(const char *device, int *mount_flags, 1206 char *mtpt, int mtlen); 1207 1208/* namei.c */ 1209extern errcode_t ext2fs_lookup(ext2_filsys fs, ext2_ino_t dir, const char *name, 1210 int namelen, char *buf, ext2_ino_t *inode); 1211extern errcode_t ext2fs_namei(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd, 1212 const char *name, ext2_ino_t *inode); 1213errcode_t ext2fs_namei_follow(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd, 1214 const char *name, ext2_ino_t *inode); 1215extern errcode_t ext2fs_follow_link(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd, 1216 ext2_ino_t inode, ext2_ino_t *res_inode); 1217 1218/* native.c */ 1219int ext2fs_native_flag(void); 1220 1221/* newdir.c */ 1222extern errcode_t ext2fs_new_dir_block(ext2_filsys fs, ext2_ino_t dir_ino, 1223 ext2_ino_t parent_ino, char **block); 1224 1225/* mkdir.c */ 1226extern errcode_t ext2fs_mkdir(ext2_filsys fs, ext2_ino_t parent, ext2_ino_t inum, 1227 const char *name); 1228 1229/* mkjournal.c */ 1230extern errcode_t ext2fs_zero_blocks(ext2_filsys fs, blk_t blk, int num, 1231 blk_t *ret_blk, int *ret_count); 1232extern errcode_t ext2fs_zero_blocks2(ext2_filsys fs, blk64_t blk, int num, 1233 blk64_t *ret_blk, int *ret_count); 1234extern errcode_t ext2fs_create_journal_superblock(ext2_filsys fs, 1235 __u32 size, int flags, 1236 char **ret_jsb); 1237extern errcode_t ext2fs_add_journal_device(ext2_filsys fs, 1238 ext2_filsys journal_dev); 1239extern errcode_t ext2fs_add_journal_inode(ext2_filsys fs, blk_t size, 1240 int flags); 1241extern int ext2fs_default_journal_size(__u64 blocks); 1242 1243/* openfs.c */ 1244extern errcode_t ext2fs_open(const char *name, int flags, int superblock, 1245 unsigned int block_size, io_manager manager, 1246 ext2_filsys *ret_fs); 1247extern errcode_t ext2fs_open2(const char *name, const char *io_options, 1248 int flags, int superblock, 1249 unsigned int block_size, io_manager manager, 1250 ext2_filsys *ret_fs); 1251extern blk64_t ext2fs_descriptor_block_loc2(ext2_filsys fs, 1252 blk64_t group_block, dgrp_t i); 1253extern blk_t ext2fs_descriptor_block_loc(ext2_filsys fs, blk_t group_block, 1254 dgrp_t i); 1255errcode_t ext2fs_get_data_io(ext2_filsys fs, io_channel *old_io); 1256errcode_t ext2fs_set_data_io(ext2_filsys fs, io_channel new_io); 1257errcode_t ext2fs_rewrite_to_io(ext2_filsys fs, io_channel new_io); 1258 1259/* get_pathname.c */ 1260extern errcode_t ext2fs_get_pathname(ext2_filsys fs, ext2_ino_t dir, ext2_ino_t ino, 1261 char **name); 1262 1263/* link.c */ 1264errcode_t ext2fs_link(ext2_filsys fs, ext2_ino_t dir, const char *name, 1265 ext2_ino_t ino, int flags); 1266errcode_t ext2fs_unlink(ext2_filsys fs, ext2_ino_t dir, const char *name, 1267 ext2_ino_t ino, int flags); 1268 1269/* read_bb.c */ 1270extern errcode_t ext2fs_read_bb_inode(ext2_filsys fs, 1271 ext2_badblocks_list *bb_list); 1272 1273/* read_bb_file.c */ 1274extern errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f, 1275 ext2_badblocks_list *bb_list, 1276 void *priv_data, 1277 void (*invalid)(ext2_filsys fs, 1278 blk_t blk, 1279 char *badstr, 1280 void *priv_data)); 1281extern errcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f, 1282 ext2_badblocks_list *bb_list, 1283 void (*invalid)(ext2_filsys fs, 1284 blk_t blk)); 1285 1286/* res_gdt.c */ 1287extern errcode_t ext2fs_create_resize_inode(ext2_filsys fs); 1288 1289/* swapfs.c */ 1290extern void ext2fs_swap_ext_attr(char *to, char *from, int bufsize, 1291 int has_header); 1292extern void ext2fs_swap_ext_attr_header(struct ext2_ext_attr_header *to_header, 1293 struct ext2_ext_attr_header *from_hdr); 1294extern void ext2fs_swap_ext_attr_entry(struct ext2_ext_attr_entry *to_entry, 1295 struct ext2_ext_attr_entry *from_entry); 1296extern void ext2fs_swap_super(struct ext2_super_block * super); 1297extern void ext2fs_swap_group_desc(struct ext2_group_desc *gdp); 1298extern void ext2fs_swap_group_desc2(ext2_filsys, struct ext2_group_desc *gdp); 1299extern void ext2fs_swap_inode_full(ext2_filsys fs, struct ext2_inode_large *t, 1300 struct ext2_inode_large *f, int hostorder, 1301 int bufsize); 1302extern void ext2fs_swap_inode(ext2_filsys fs,struct ext2_inode *t, 1303 struct ext2_inode *f, int hostorder); 1304 1305/* valid_blk.c */ 1306extern int ext2fs_inode_has_valid_blocks(struct ext2_inode *inode); 1307 1308/* version.c */ 1309extern int ext2fs_parse_version_string(const char *ver_string); 1310extern int ext2fs_get_library_version(const char **ver_string, 1311 const char **date_string); 1312 1313/* write_bb_file.c */ 1314extern errcode_t ext2fs_write_bb_FILE(ext2_badblocks_list bb_list, 1315 unsigned int flags, 1316 FILE *f); 1317 1318 1319/* inline functions */ 1320extern errcode_t ext2fs_get_mem(unsigned long size, void *ptr); 1321extern errcode_t ext2fs_get_array(unsigned long count, unsigned long size, void *ptr); 1322extern errcode_t ext2fs_free_mem(void *ptr); 1323extern errcode_t ext2fs_resize_mem(unsigned long old_size, 1324 unsigned long size, void *ptr); 1325extern void ext2fs_mark_super_dirty(ext2_filsys fs); 1326extern void ext2fs_mark_changed(ext2_filsys fs); 1327extern int ext2fs_test_changed(ext2_filsys fs); 1328extern void ext2fs_mark_valid(ext2_filsys fs); 1329extern void ext2fs_unmark_valid(ext2_filsys fs); 1330extern int ext2fs_test_valid(ext2_filsys fs); 1331extern void ext2fs_mark_ib_dirty(ext2_filsys fs); 1332extern void ext2fs_mark_bb_dirty(ext2_filsys fs); 1333extern int ext2fs_test_ib_dirty(ext2_filsys fs); 1334extern int ext2fs_test_bb_dirty(ext2_filsys fs); 1335extern int ext2fs_group_of_blk(ext2_filsys fs, blk_t blk); 1336extern int ext2fs_group_of_ino(ext2_filsys fs, ext2_ino_t ino); 1337extern blk_t ext2fs_group_first_block(ext2_filsys fs, dgrp_t group); 1338extern blk_t ext2fs_group_last_block(ext2_filsys fs, dgrp_t group); 1339extern blk_t ext2fs_inode_data_blocks(ext2_filsys fs, 1340 struct ext2_inode *inode); 1341extern unsigned int ext2fs_div_ceil(unsigned int a, unsigned int b); 1342extern __u64 ext2fs_div64_ceil(__u64 a, __u64 b); 1343 1344/* 1345 * The actual inlined functions definitions themselves... 1346 * 1347 * If NO_INLINE_FUNCS is defined, then we won't try to do inline 1348 * functions at all! 1349 */ 1350#if (defined(INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS)) 1351#ifdef INCLUDE_INLINE_FUNCS 1352#define _INLINE_ extern 1353#else 1354#ifdef __GNUC__ 1355#define _INLINE_ extern __inline__ 1356#else /* For Watcom C */ 1357#define _INLINE_ extern inline 1358#endif 1359#endif 1360 1361#ifndef EXT2_CUSTOM_MEMORY_ROUTINES 1362#include <string.h> 1363/* 1364 * Allocate memory 1365 */ 1366_INLINE_ errcode_t ext2fs_get_mem(unsigned long size, void *ptr) 1367{ 1368 void *pp; 1369 1370 pp = malloc(size); 1371 if (!pp) 1372 return EXT2_ET_NO_MEMORY; 1373 memcpy(ptr, &pp, sizeof (pp)); 1374 return 0; 1375} 1376 1377_INLINE_ errcode_t ext2fs_get_array(unsigned long count, unsigned long size, void *ptr) 1378{ 1379 if (count && (-1UL)/count<size) 1380 return EXT2_ET_NO_MEMORY; //maybe define EXT2_ET_OVERFLOW ? 1381 return ext2fs_get_mem(count*size, ptr); 1382} 1383 1384/* 1385 * Free memory 1386 */ 1387_INLINE_ errcode_t ext2fs_free_mem(void *ptr) 1388{ 1389 void *p; 1390 1391 memcpy(&p, ptr, sizeof(p)); 1392 free(p); 1393 p = 0; 1394 memcpy(ptr, &p, sizeof(p)); 1395 return 0; 1396} 1397 1398/* 1399 * Resize memory 1400 */ 1401_INLINE_ errcode_t ext2fs_resize_mem(unsigned long EXT2FS_ATTR((unused)) old_size, 1402 unsigned long size, void *ptr) 1403{ 1404 void *p; 1405 1406 /* Use "memcpy" for pointer assignments here to avoid problems 1407 * with C99 strict type aliasing rules. */ 1408 memcpy(&p, ptr, sizeof(p)); 1409 p = realloc(p, size); 1410 if (!p) 1411 return EXT2_ET_NO_MEMORY; 1412 memcpy(ptr, &p, sizeof(p)); 1413 return 0; 1414} 1415#endif /* Custom memory routines */ 1416 1417/* 1418 * Mark a filesystem superblock as dirty 1419 */ 1420_INLINE_ void ext2fs_mark_super_dirty(ext2_filsys fs) 1421{ 1422 fs->flags |= EXT2_FLAG_DIRTY | EXT2_FLAG_CHANGED; 1423} 1424 1425/* 1426 * Mark a filesystem as changed 1427 */ 1428_INLINE_ void ext2fs_mark_changed(ext2_filsys fs) 1429{ 1430 fs->flags |= EXT2_FLAG_CHANGED; 1431} 1432 1433/* 1434 * Check to see if a filesystem has changed 1435 */ 1436_INLINE_ int ext2fs_test_changed(ext2_filsys fs) 1437{ 1438 return (fs->flags & EXT2_FLAG_CHANGED); 1439} 1440 1441/* 1442 * Mark a filesystem as valid 1443 */ 1444_INLINE_ void ext2fs_mark_valid(ext2_filsys fs) 1445{ 1446 fs->flags |= EXT2_FLAG_VALID; 1447} 1448 1449/* 1450 * Mark a filesystem as NOT valid 1451 */ 1452_INLINE_ void ext2fs_unmark_valid(ext2_filsys fs) 1453{ 1454 fs->flags &= ~EXT2_FLAG_VALID; 1455} 1456 1457/* 1458 * Check to see if a filesystem is valid 1459 */ 1460_INLINE_ int ext2fs_test_valid(ext2_filsys fs) 1461{ 1462 return (fs->flags & EXT2_FLAG_VALID); 1463} 1464 1465/* 1466 * Mark the inode bitmap as dirty 1467 */ 1468_INLINE_ void ext2fs_mark_ib_dirty(ext2_filsys fs) 1469{ 1470 fs->flags |= EXT2_FLAG_IB_DIRTY | EXT2_FLAG_CHANGED; 1471} 1472 1473/* 1474 * Mark the block bitmap as dirty 1475 */ 1476_INLINE_ void ext2fs_mark_bb_dirty(ext2_filsys fs) 1477{ 1478 fs->flags |= EXT2_FLAG_BB_DIRTY | EXT2_FLAG_CHANGED; 1479} 1480 1481/* 1482 * Check to see if a filesystem's inode bitmap is dirty 1483 */ 1484_INLINE_ int ext2fs_test_ib_dirty(ext2_filsys fs) 1485{ 1486 return (fs->flags & EXT2_FLAG_IB_DIRTY); 1487} 1488 1489/* 1490 * Check to see if a filesystem's block bitmap is dirty 1491 */ 1492_INLINE_ int ext2fs_test_bb_dirty(ext2_filsys fs) 1493{ 1494 return (fs->flags & EXT2_FLAG_BB_DIRTY); 1495} 1496 1497/* 1498 * Return the group # of a block 1499 */ 1500_INLINE_ int ext2fs_group_of_blk(ext2_filsys fs, blk_t blk) 1501{ 1502 return ext2fs_group_of_blk2(fs, blk); 1503} 1504/* 1505 * Return the group # of an inode number 1506 */ 1507_INLINE_ int ext2fs_group_of_ino(ext2_filsys fs, ext2_ino_t ino) 1508{ 1509 return (ino - 1) / fs->super->s_inodes_per_group; 1510} 1511 1512/* 1513 * Return the first block (inclusive) in a group 1514 */ 1515_INLINE_ blk_t ext2fs_group_first_block(ext2_filsys fs, dgrp_t group) 1516{ 1517 return ext2fs_group_first_block2(fs, group); 1518} 1519 1520/* 1521 * Return the last block (inclusive) in a group 1522 */ 1523_INLINE_ blk_t ext2fs_group_last_block(ext2_filsys fs, dgrp_t group) 1524{ 1525 return ext2fs_group_last_block2(fs, group); 1526} 1527 1528_INLINE_ blk_t ext2fs_inode_data_blocks(ext2_filsys fs, 1529 struct ext2_inode *inode) 1530{ 1531 return ext2fs_inode_data_blocks2(fs, inode); 1532} 1533 1534/* 1535 * This is an efficient, overflow safe way of calculating ceil((1.0 * a) / b) 1536 */ 1537_INLINE_ unsigned int ext2fs_div_ceil(unsigned int a, unsigned int b) 1538{ 1539 if (!a) 1540 return 0; 1541 return ((a - 1) / b) + 1; 1542} 1543 1544_INLINE_ __u64 ext2fs_div64_ceil(__u64 a, __u64 b) 1545{ 1546 if (!a) 1547 return 0; 1548 return ((a - 1) / b) + 1; 1549} 1550 1551#undef _INLINE_ 1552#endif 1553 1554#ifdef __cplusplus 1555} 1556#endif 1557 1558#endif /* _EXT2FS_EXT2FS_H */ 1559