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