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