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