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