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