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