ext2fs.h 29.8 KB
Newer Older
Theodore Ts'o's avatar
Theodore Ts'o committed
1 2 3
/*
 * ext2fs.h --- ext2fs
 * 
Theodore Ts'o's avatar
Theodore Ts'o committed
4 5 6 7 8 9
 * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o.
 *
 * %Begin-Header%
 * This file may be redistributed under the terms of the GNU Public
 * License.
 * %End-Header%
Theodore Ts'o's avatar
Theodore Ts'o committed
10 11
 */

12 13 14
#ifndef _EXT2FS_EXT2FS_H
#define _EXT2FS_EXT2FS_H

Theodore Ts'o's avatar
Theodore Ts'o committed
15 16 17 18
#ifdef __cplusplus
extern "C" {
#endif

Theodore Ts'o's avatar
Theodore Ts'o committed
19 20 21
/*
 * Non-GNU C compilers won't necessarily understand inline
 */
Theodore Ts'o's avatar
Theodore Ts'o committed
22
#if (!defined(__GNUC__) && !defined(__WATCOMC__))
Theodore Ts'o's avatar
Theodore Ts'o committed
23 24 25
#define NO_INLINE_FUNCS
#endif

Theodore Ts'o's avatar
Theodore Ts'o committed
26 27 28 29 30 31 32 33 34 35
/*
 * Where the master copy of the superblock is located, and how big
 * superblocks are supposed to be.  We define SUPERBLOCK_SIZE because
 * the size of the superblock structure is not necessarily trustworthy
 * (some versions have the padding set up so that the superblock is
 * 1032 bytes long).
 */
#define SUPERBLOCK_OFFSET	1024
#define SUPERBLOCK_SIZE 	1024

Theodore Ts'o's avatar
Theodore Ts'o committed
36 37 38 39 40 41
/*
 * The last ext2fs revision level that this version of the library is
 * able to support.
 */
#define EXT2_LIB_CURRENT_REV	0

Theodore Ts'o's avatar
Theodore Ts'o committed
42
#ifdef HAVE_SYS_TYPES_H
Theodore Ts'o's avatar
Theodore Ts'o committed
43
#include <sys/types.h>
Theodore Ts'o's avatar
Theodore Ts'o committed
44 45
#endif

Theodore Ts'o's avatar
Theodore Ts'o committed
46
#include <stdlib.h>
47 48 49 50

#if EXT2_FLAT_INCLUDES
#include "e2_types.h"
#else
Theodore Ts'o's avatar
Theodore Ts'o committed
51
#include <asm/types.h>
Theodore Ts'o's avatar
Theodore Ts'o committed
52 53 54 55 56 57
#if !defined(__GNUC__) || defined(__STRICT_ANSI__)  /* asm/types.h already defines __s64 and __u64 otherwise */
#if SIZEOF_LONG == 8
typedef __signed__ long __s64;
typedef unsigned long __u64;
#elif SIZEOF_LONG_LONG == 8 || \
  defined(__GNUC__) && (((~0UL) == 0xffffffff) || defined(__i386__))
58 59
typedef __signed__ long long __s64;
typedef unsigned long long __u64;
Theodore Ts'o's avatar
Theodore Ts'o committed
60
#endif /* SIZEOF_LONG == 8 */
61
#endif
Theodore Ts'o's avatar
Theodore Ts'o committed
62
#endif /* EXT2_FLAT_INCLUDES */
Theodore Ts'o's avatar
Theodore Ts'o committed
63 64

typedef __u32		blk_t;
Theodore Ts'o's avatar
Theodore Ts'o committed
65
typedef __u32		dgrp_t;
Theodore Ts'o's avatar
Theodore Ts'o committed
66
typedef __u32		ext2_off_t;
Theodore Ts'o's avatar
Theodore Ts'o committed
67
typedef __s64		e2_blkcnt_t;
Theodore Ts'o's avatar
Theodore Ts'o committed
68

Theodore Ts'o's avatar
Theodore Ts'o committed
69 70 71 72 73
#if EXT2_FLAT_INCLUDES
#include "com_err.h"
#include "ext2_io.h"
#include "ext2_err.h"
#else
Theodore Ts'o's avatar
Theodore Ts'o committed
74
#include "et/com_err.h"
Theodore Ts'o's avatar
Theodore Ts'o committed
75
#include "ext2fs/ext2_io.h"
Theodore Ts'o's avatar
Theodore Ts'o committed
76
#include "ext2fs/ext2_err.h"
Theodore Ts'o's avatar
Theodore Ts'o committed
77
#endif
Theodore Ts'o's avatar
Theodore Ts'o committed
78

79 80 81 82 83 84 85 86 87
/*
 * Portability help for Microsoft Visual C++
 */
#ifdef _MSC_VER
#define EXT2_QSORT_TYPE int __cdecl
#else
#define EXT2_QSORT_TYPE int
#endif

Theodore Ts'o's avatar
Theodore Ts'o committed
88 89
typedef struct struct_ext2_filsys *ext2_filsys;

Theodore Ts'o's avatar
Theodore Ts'o committed
90
struct ext2fs_struct_generic_bitmap {
Theodore Ts'o's avatar
Theodore Ts'o committed
91
	errcode_t	magic;
Theodore Ts'o's avatar
Theodore Ts'o committed
92 93 94 95 96 97 98
	ext2_filsys 	fs;
	__u32		start, end;
	__u32		real_end;
	char	*	description;
	char	*	bitmap;
	errcode_t	base_error_code;
	__u32		reserved[7];
Theodore Ts'o's avatar
Theodore Ts'o committed
99 100
};

Theodore Ts'o's avatar
Theodore Ts'o committed
101 102 103
#define EXT2FS_MARK_ERROR 	0
#define EXT2FS_UNMARK_ERROR 	1
#define EXT2FS_TEST_ERROR	2
Theodore Ts'o's avatar
Theodore Ts'o committed
104

Theodore Ts'o's avatar
Theodore Ts'o committed
105 106 107
typedef struct ext2fs_struct_generic_bitmap *ext2fs_generic_bitmap;
typedef struct ext2fs_struct_generic_bitmap *ext2fs_inode_bitmap;
typedef struct ext2fs_struct_generic_bitmap *ext2fs_block_bitmap;
Theodore Ts'o's avatar
Theodore Ts'o committed
108

Theodore Ts'o's avatar
Theodore Ts'o committed
109 110 111 112 113 114 115
#ifdef EXT2_DYNAMIC_REV
#define EXT2_FIRST_INODE(s)	EXT2_FIRST_INO(s)
#else
#define EXT2_FIRST_INODE(s)	EXT2_FIRST_INO
#define EXT2_INODE_SIZE(s)	sizeof(struct ext2_inode)
#endif

Theodore Ts'o's avatar
Theodore Ts'o committed
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
/*
 * badblocks list definitions
 */

typedef struct ext2_struct_badblocks_list *ext2_badblocks_list;
typedef struct ext2_struct_badblocks_iterate *ext2_badblocks_iterate;

/* old */
typedef struct ext2_struct_badblocks_list *badblocks_list;
typedef struct ext2_struct_badblocks_iterate *badblocks_iterate;

#define BADBLOCKS_FLAG_DIRTY	1

/*
 * ext2_dblist structure and abstractions (see dblist.c)
 */
struct ext2_db_entry {
	ino_t	ino;
	blk_t	blk;
	int	blockcnt;
};

typedef struct ext2_struct_dblist *ext2_dblist;

#define DBLIST_ABORT	1

Theodore Ts'o's avatar
Theodore Ts'o committed
142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
/*
 * ext2_fileio definitions
 */

#define EXT2_FILE_WRITE		0x0001
#define EXT2_FILE_CREATE	0x0002

#define EXT2_FILE_MASK		0x00FF

#define EXT2_FILE_BUF_DIRTY	0x4000
#define EXT2_FILE_BUF_VALID	0x2000

typedef struct ext2_file *ext2_file_t;

#define EXT2_SEEK_SET	0
#define EXT2_SEEK_CUR	1
#define EXT2_SEEK_END	2

Theodore Ts'o's avatar
Theodore Ts'o committed
160 161 162 163
/*
 * Flags for the ext2_filsys structure
 */

Theodore Ts'o's avatar
Theodore Ts'o committed
164 165 166 167 168 169
#define EXT2_FLAG_RW			0x01
#define EXT2_FLAG_CHANGED		0x02
#define EXT2_FLAG_DIRTY			0x04
#define EXT2_FLAG_VALID			0x08
#define EXT2_FLAG_IB_DIRTY		0x10
#define EXT2_FLAG_BB_DIRTY		0x20
Theodore Ts'o's avatar
Theodore Ts'o committed
170 171 172 173
#define EXT2_FLAG_SWAP_BYTES		0x40
#define EXT2_FLAG_SWAP_BYTES_READ	0x80
#define EXT2_FLAG_SWAP_BYTES_WRITE	0x100
#define EXT2_FLAG_MASTER_SB_ONLY	0x200
Theodore Ts'o's avatar
Theodore Ts'o committed
174
#define EXT2_FLAG_FORCE			0x400
Theodore Ts'o's avatar
Theodore Ts'o committed
175

Theodore Ts'o's avatar
Theodore Ts'o committed
176 177 178 179 180 181
/*
 * Special flag in the ext2 inode i_flag field that means that this is
 * a new inode.  (So that ext2_write_inode() can clear extra fields.)
 */
#define EXT2_NEW_INODE_FL	0x80000000

Theodore Ts'o's avatar
Theodore Ts'o committed
182
struct struct_ext2_filsys {
Theodore Ts'o's avatar
Theodore Ts'o committed
183
	errcode_t			magic;
Theodore Ts'o's avatar
Theodore Ts'o committed
184 185 186 187 188 189
	io_channel			io;
	int				flags;
	char *				device_name;
	struct ext2_super_block	* 	super;
	int				blocksize;
	int				fragsize;
Theodore Ts'o's avatar
Theodore Ts'o committed
190
	dgrp_t				group_desc_count;
Theodore Ts'o's avatar
Theodore Ts'o committed
191 192 193
	unsigned long			desc_blocks;
	struct ext2_group_desc *	group_desc;
	int				inode_blocks_per_group;
Theodore Ts'o's avatar
Theodore Ts'o committed
194 195
	ext2fs_inode_bitmap		inode_map;
	ext2fs_block_bitmap		block_map;
Theodore Ts'o's avatar
Theodore Ts'o committed
196 197 198
	errcode_t (*get_blocks)(ext2_filsys fs, ino_t ino, blk_t *blocks);
	errcode_t (*check_directory)(ext2_filsys fs, ino_t ino);
	errcode_t (*write_bitmaps)(ext2_filsys fs);
Theodore Ts'o's avatar
Theodore Ts'o committed
199 200 201 202
	errcode_t (*read_inode)(ext2_filsys fs, ino_t ino,
				struct ext2_inode *inode);
	errcode_t (*write_inode)(ext2_filsys fs, ino_t ino,
				struct ext2_inode *inode);
Theodore Ts'o's avatar
Theodore Ts'o committed
203 204
	badblocks_list			badblocks;
	ext2_dblist			dblist;
Theodore Ts'o's avatar
Theodore Ts'o committed
205
	__u32				stride;	/* for mke2fs */
Theodore Ts'o's avatar
Theodore Ts'o committed
206 207 208
	/*
	 * Reserved for future expansion
	 */
Theodore Ts'o's avatar
Theodore Ts'o committed
209
	__u32				reserved[11];
Theodore Ts'o's avatar
Theodore Ts'o committed
210 211

	/*
Theodore Ts'o's avatar
Theodore Ts'o committed
212
	 * Reserved for the use of the calling application.
Theodore Ts'o's avatar
Theodore Ts'o committed
213
	 */
Theodore Ts'o's avatar
Theodore Ts'o committed
214
	void *				priv_data;
Theodore Ts'o's avatar
Theodore Ts'o committed
215 216 217 218 219

	/*
	 * Inode cache
	 */
	struct ext2_inode_cache		*icache;
Theodore Ts'o's avatar
Theodore Ts'o committed
220 221
};

222 223 224
#if EXT2_FLAT_INCLUDES
#include "e2_bitops.h"
#else
Theodore Ts'o's avatar
Theodore Ts'o committed
225
#include "ext2fs/bitops.h"
226
#endif
Theodore Ts'o's avatar
Theodore Ts'o committed
227

Theodore Ts'o's avatar
Theodore Ts'o committed
228 229 230 231 232 233 234 235 236
/*
 * Return flags for the block iterator functions
 */
#define BLOCK_CHANGED	1
#define BLOCK_ABORT	2
#define BLOCK_ERROR	4

/*
 * Block interate flags
Theodore Ts'o's avatar
Theodore Ts'o committed
237 238 239 240 241 242 243 244 245 246 247 248
 *
 * BLOCK_FLAG_APPEND, or BLOCK_FLAG_HOLE, indicates that the interator
 * function should be called on blocks where the block number is zero.
 * This is used by ext2fs_expand_dir() to be able to add a new block
 * to an inode.  It can also be used for programs that want to be able
 * to deal with files that contain "holes".
 * 
 * BLOCK_FLAG_TRAVERSE indicates that the iterator function for the
 * indirect, doubly indirect, etc. blocks should be called after all
 * of the blocks containined in the indirect blocks are processed.
 * This is useful if you are going to be deallocating blocks from an
 * inode.
Theodore Ts'o's avatar
Theodore Ts'o committed
249 250 251
 *
 * BLOCK_FLAG_DATA_ONLY indicates that the iterator function should be
 * called for data blocks only.
Theodore Ts'o's avatar
Theodore Ts'o committed
252 253
 *
 * BLOCK_FLAG_NO_LARGE is for internal use only.  It informs
Theodore Ts'o's avatar
Theodore Ts'o committed
254
 * ext2fs_block_iterate2 that large files won't be accepted.
Theodore Ts'o's avatar
Theodore Ts'o committed
255 256
 */
#define BLOCK_FLAG_APPEND	1
Theodore Ts'o's avatar
Theodore Ts'o committed
257
#define BLOCK_FLAG_HOLE		1
Theodore Ts'o's avatar
Theodore Ts'o committed
258
#define BLOCK_FLAG_DEPTH_TRAVERSE	2
Theodore Ts'o's avatar
Theodore Ts'o committed
259 260
#define BLOCK_FLAG_DATA_ONLY	4

Theodore Ts'o's avatar
Theodore Ts'o committed
261 262
#define BLOCK_FLAG_NO_LARGE	0x1000

Theodore Ts'o's avatar
Theodore Ts'o committed
263 264 265 266 267 268 269
/*
 * Magic "block count" return values for the block iterator function.
 */
#define BLOCK_COUNT_IND		(-1)
#define BLOCK_COUNT_DIND	(-2)
#define BLOCK_COUNT_TIND	(-3)
#define BLOCK_COUNT_TRANSLATOR	(-4)
Theodore Ts'o's avatar
Theodore Ts'o committed
270

271
#if 0
Theodore Ts'o's avatar
Theodore Ts'o committed
272 273 274 275
/*
 * Flags for ext2fs_move_blocks
 */
#define EXT2_BMOVE_GET_DBLIST	0x0001	
Theodore Ts'o's avatar
Theodore Ts'o committed
276
#define EXT2_BMOVE_DEBUG	0x0002
277
#endif
Theodore Ts'o's avatar
Theodore Ts'o committed
278

Theodore Ts'o's avatar
Theodore Ts'o committed
279 280 281 282 283 284 285 286 287 288 289 290 291
/*
 * Return flags for the directory iterator functions
 */
#define DIRENT_CHANGED	1
#define DIRENT_ABORT	2
#define DIRENT_ERROR	3

/*
 * Directory iterator flags
 */

#define DIRENT_FLAG_INCLUDE_EMPTY	1

Theodore Ts'o's avatar
Theodore Ts'o committed
292 293 294 295 296

#define DIRENT_DOT_FILE		1
#define DIRENT_DOT_DOT_FILE	2
#define DIRENT_OTHER_FILE	3

Theodore Ts'o's avatar
Theodore Ts'o committed
297 298 299
/*
 * Inode scan definitions
 */
Theodore Ts'o's avatar
Theodore Ts'o committed
300 301
typedef struct ext2_struct_inode_scan *ext2_inode_scan;

Theodore Ts'o's avatar
Theodore Ts'o committed
302 303 304 305 306 307 308
/*
 * ext2fs_scan flags
 */
#define EXT2_SF_CHK_BADBLOCKS	0x0001
#define EXT2_SF_BAD_INODE_BLK	0x0002
#define EXT2_SF_BAD_EXTRA_BYTES	0x0004
#define EXT2_SF_SKIP_MISSING_ITABLE	0x0008
Theodore Ts'o's avatar
Theodore Ts'o committed
309

Theodore Ts'o's avatar
Theodore Ts'o committed
310 311 312 313 314
/*
 * ext2fs_check_if_mounted flags
 */
#define EXT2_MF_MOUNTED		1
#define EXT2_MF_ISROOT		2
Theodore Ts'o's avatar
Theodore Ts'o committed
315
#define EXT2_MF_READONLY	4
Theodore Ts'o's avatar
Theodore Ts'o committed
316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333

/*
 * Ext2/linux mode flags.  We define them here so that we don't need
 * to depend on the OS's sys/stat.h, since we may be compiling on a
 * non-Linux system.
 */
#define LINUX_S_IFMT  00170000
#define LINUX_S_IFSOCK 0140000
#define LINUX_S_IFLNK	 0120000
#define LINUX_S_IFREG  0100000
#define LINUX_S_IFBLK  0060000
#define LINUX_S_IFDIR  0040000
#define LINUX_S_IFCHR  0020000
#define LINUX_S_IFIFO  0010000
#define LINUX_S_ISUID  0004000
#define LINUX_S_ISGID  0002000
#define LINUX_S_ISVTX  0001000

Theodore Ts'o's avatar
Theodore Ts'o committed
334 335 336 337 338 339 340 341 342 343 344 345 346 347 348
#define LINUX_S_IRWXU 00700
#define LINUX_S_IRUSR 00400
#define LINUX_S_IWUSR 00200
#define LINUX_S_IXUSR 00100

#define LINUX_S_IRWXG 00070
#define LINUX_S_IRGRP 00040
#define LINUX_S_IWGRP 00020
#define LINUX_S_IXGRP 00010

#define LINUX_S_IRWXO 00007
#define LINUX_S_IROTH 00004
#define LINUX_S_IWOTH 00002
#define LINUX_S_IXOTH 00001

Theodore Ts'o's avatar
Theodore Ts'o committed
349 350 351 352 353 354 355 356
#define LINUX_S_ISLNK(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFLNK)
#define LINUX_S_ISREG(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFREG)
#define LINUX_S_ISDIR(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFDIR)
#define LINUX_S_ISCHR(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFCHR)
#define LINUX_S_ISBLK(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFBLK)
#define LINUX_S_ISFIFO(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFIFO)
#define LINUX_S_ISSOCK(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFSOCK)

Theodore Ts'o's avatar
Theodore Ts'o committed
357 358 359 360 361 362 363
/*
 * ext2_icount_t abstraction
 */
#define EXT2_ICOUNT_OPT_INCREMENT	0x01

typedef struct ext2_icount *ext2_icount_t;

Theodore Ts'o's avatar
Theodore Ts'o committed
364 365 366 367 368
/*
 * Flags for ext2fs_bmap
 */
#define BMAP_ALLOC	1

Theodore Ts'o's avatar
Theodore Ts'o committed
369 370 371
/*
 * For checking structure magic numbers...
 */
Theodore Ts'o's avatar
Theodore Ts'o committed
372

Theodore Ts'o's avatar
Theodore Ts'o committed
373 374
#define EXT2_CHECK_MAGIC(struct, code) \
	  if ((struct)->magic != (code)) return (code)
Theodore Ts'o's avatar
Theodore Ts'o committed
375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429


/*
 * The ext2fs library private definition of the ext2 superblock, so we
 * don't have to depend on the kernel's definition of the superblock,
 * which might not have the latest features.
 */
struct ext2fs_sb {
	__u32	s_inodes_count;		/* Inodes count */
	__u32	s_blocks_count;		/* Blocks count */
	__u32	s_r_blocks_count;	/* Reserved blocks count */
	__u32	s_free_blocks_count;	/* Free blocks count */
	__u32	s_free_inodes_count;	/* Free inodes count */
	__u32	s_first_data_block;	/* First Data Block */
	__u32	s_log_block_size;	/* Block size */
	__s32	s_log_frag_size;	/* Fragment size */
	__u32	s_blocks_per_group;	/* # Blocks per group */
	__u32	s_frags_per_group;	/* # Fragments per group */
	__u32	s_inodes_per_group;	/* # Inodes per group */
	__u32	s_mtime;		/* Mount time */
	__u32	s_wtime;		/* Write time */
	__u16	s_mnt_count;		/* Mount count */
	__s16	s_max_mnt_count;	/* Maximal mount count */
	__u16	s_magic;		/* Magic signature */
	__u16	s_state;		/* File system state */
	__u16	s_errors;		/* Behaviour when detecting errors */
	__u16	s_minor_rev_level; 	/* minor revision level */
	__u32	s_lastcheck;		/* time of last check */
	__u32	s_checkinterval;	/* max. time between checks */
	__u32	s_creator_os;		/* OS */
	__u32	s_rev_level;		/* Revision level */
	__u16	s_def_resuid;		/* Default uid for reserved blocks */
	__u16	s_def_resgid;		/* Default gid for reserved blocks */
	/*
	 * These fields are for EXT2_DYNAMIC_REV superblocks only.
	 *
	 * Note: the difference between the compatible feature set and
	 * the incompatible feature set is that if there is a bit set
	 * in the incompatible feature set that the kernel doesn't
	 * know about, it should refuse to mount the filesystem.
	 * 
	 * e2fsck's requirements are more strict; if it doesn't know
	 * about a feature in either the compatible or incompatible
	 * feature set, it must abort and not try to meddle with
	 * things it doesn't understand...
	 */
	__u32	s_first_ino; 		/* First non-reserved inode */
	__u16   s_inode_size; 		/* size of inode structure */
	__u16	s_block_group_nr; 	/* block group # of this superblock */
	__u32	s_feature_compat; 	/* compatible feature set */
	__u32	s_feature_incompat; 	/* incompatible feature set */
	__u32	s_feature_ro_compat; 	/* readonly-compatible feature set */
	__u8	s_uuid[16];		/* 128-bit uuid for volume */
	char	s_volume_name[16]; 	/* volume name */
	char	s_last_mounted[64]; 	/* directory where last mounted */
Theodore Ts'o's avatar
Theodore Ts'o committed
430 431 432
	__u32	s_algorithm_usage_bitmap; /* For compression */
	/*
	 * Performance hints.  Directory preallocation should only
Theodore Ts'o's avatar
Theodore Ts'o committed
433
	 * happen if the EXT2_FEATURE_COMPAT_DIR_PREALLOC flag is on.
Theodore Ts'o's avatar
Theodore Ts'o committed
434 435 436 437
	 */
	__u8	s_prealloc_blocks;	/* Nr of blocks to try to preallocate*/
	__u8	s_prealloc_dir_blocks;	/* Nr to preallocate for dirs */
	__u16	s_padding1;
438 439 440 441 442
	/* 
	 * Journaling support.
	 */
	__u8	s_journal_uuid[16];	/* uuid of journal superblock */
	__u32	s_journal_inum;		/* inode number of journal file */
Theodore Ts'o's avatar
Theodore Ts'o committed
443 444
	__u32	s_journal_dev;		/* device number of journal file */
	__u32	s_last_orphan;		/* start of list of inodes to delete */
445
	
Theodore Ts'o's avatar
Theodore Ts'o committed
446
	__u32	s_reserved[197];	/* Padding to the end of the block */
Theodore Ts'o's avatar
Theodore Ts'o committed
447
};
Theodore Ts'o's avatar
Theodore Ts'o committed
448

Theodore Ts'o's avatar
Theodore Ts'o committed
449 450 451
#define EXT2FS_COMPRESSED_BLKADDR ((blk_t) 0xffffffff)
#define HOLE_BLKADDR(_b) ((_b) == 0 || (_b) == EXT2FS_COMPRESSED_BLKADDR)

Theodore Ts'o's avatar
Theodore Ts'o committed
452 453 454
/*
 * Feature set definitions (that might not be in ext2_fs.h
 */
Theodore Ts'o's avatar
Theodore Ts'o committed
455 456 457 458 459

#ifndef EXT2_FEATURE_COMPAT_DIR_PREALLOC
#define EXT2_FEATURE_COMPAT_DIR_PREALLOC	0x0001
#endif

Theodore Ts'o's avatar
Theodore Ts'o committed
460 461
#ifndef EXT2_FEATURE_COMPAT_IMAGIC_INODES /* for AFS, etc. */
#define EXT2_FEATURE_COMPAT_IMAGIC_INODES		0x0002
462 463 464 465 466
#define EXT2_IMAGIC_FL		0x00002000
#endif

#ifndef EXT3_FEATURE_COMPAT_HAS_JOURNAL
#define EXT3_FEATURE_COMPAT_HAS_JOURNAL		0x0004
Theodore Ts'o's avatar
Theodore Ts'o committed
467 468
#endif

Theodore Ts'o's avatar
Theodore Ts'o committed
469 470 471 472
#ifndef EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER
#define EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER	0x0001
#endif

Theodore Ts'o's avatar
Theodore Ts'o committed
473 474 475 476 477 478 479 480 481 482 483 484
#ifndef EXT2_FEATURE_RO_COMPAT_LARGE_FILE
#define EXT2_FEATURE_RO_COMPAT_LARGE_FILE	0x0002
#define i_size_high i_dir_acl
#endif

#ifndef EXT2_FEATURE_RO_COMPAT_BTREE_DIR
#define EXT2_FEATURE_RO_COMPAT_BTREE_DIR	0x0004
#endif

#ifndef EXT2_FEATURE_INCOMPAT_COMPRESSION
#define EXT2_FEATURE_INCOMPAT_COMPRESSION	0x0001
#endif
Theodore Ts'o's avatar
Theodore Ts'o committed
485

486
#ifndef EXT2_FEATURE_INCOMPAT_FILETYPE
Theodore Ts'o's avatar
Theodore Ts'o committed
487
#define EXT2_FEATURE_INCOMPAT_FILETYPE	0x0002
Theodore Ts'o's avatar
Theodore Ts'o committed
488 489
#endif

490 491 492 493 494 495 496
#ifndef EXT3_FEATURE_INCOMPAT_RECOVER 
#define EXT3_FEATURE_INCOMPAT_RECOVER	0x0004 /* Needs recovery */
#endif

#define EXT2_LIB_FEATURE_COMPAT_SUPP	(EXT2_FEATURE_COMPAT_DIR_PREALLOC|\
					 EXT2_FEATURE_COMPAT_IMAGIC_INODES|\
					 EXT3_FEATURE_COMPAT_HAS_JOURNAL)
Theodore Ts'o's avatar
Theodore Ts'o committed
497 498
/* This #ifdef is temporary until compression is fully supported */
#ifdef ENABLE_COMPRESSION
Theodore Ts'o's avatar
Theodore Ts'o committed
499 500 501 502
#ifndef I_KNOW_THAT_COMPRESSION_IS_EXPERIMENTAL
/* If the below warning bugs you, then have
   `CPPFLAGS=-DI_KNOW_THAT_COMPRESSION_IS_EXPERIMENTAL' in your
   environment at configure time. */
Theodore Ts'o's avatar
Theodore Ts'o committed
503
#warning "Compression support is experimental"
Theodore Ts'o's avatar
Theodore Ts'o committed
504
#endif
Theodore Ts'o's avatar
Theodore Ts'o committed
505
#define EXT2_LIB_FEATURE_INCOMPAT_SUPP	(EXT2_FEATURE_INCOMPAT_FILETYPE|\
Theodore Ts'o's avatar
Theodore Ts'o committed
506 507
					 EXT2_FEATURE_INCOMPAT_COMPRESSION|\
					 EXT3_FEATURE_INCOMPAT_RECOVER)
Theodore Ts'o's avatar
Theodore Ts'o committed
508
#else
Theodore Ts'o's avatar
Theodore Ts'o committed
509 510
#define EXT2_LIB_FEATURE_INCOMPAT_SUPP	(EXT2_FEATURE_INCOMPAT_FILETYPE|\
					 EXT3_FEATURE_INCOMPAT_RECOVER)
Theodore Ts'o's avatar
Theodore Ts'o committed
511
#endif
Theodore Ts'o's avatar
Theodore Ts'o committed
512 513
#define EXT2_LIB_FEATURE_RO_COMPAT_SUPP	(EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER|\
					 EXT2_FEATURE_RO_COMPAT_LARGE_FILE)
Theodore Ts'o's avatar
Theodore Ts'o committed
514 515 516 517 518 519
/*
 * function prototypes
 */

/* alloc.c */
extern errcode_t ext2fs_new_inode(ext2_filsys fs, ino_t dir, int mode,
Theodore Ts'o's avatar
Theodore Ts'o committed
520
				  ext2fs_inode_bitmap map, ino_t *ret);
Theodore Ts'o's avatar
Theodore Ts'o committed
521
extern errcode_t ext2fs_new_block(ext2_filsys fs, blk_t goal,
Theodore Ts'o's avatar
Theodore Ts'o committed
522
				  ext2fs_block_bitmap map, blk_t *ret);
Theodore Ts'o's avatar
Theodore Ts'o committed
523
extern errcode_t ext2fs_get_free_blocks(ext2_filsys fs, blk_t start,
Theodore Ts'o's avatar
Theodore Ts'o committed
524 525
					blk_t finish, int num,
					ext2fs_block_bitmap map,
Theodore Ts'o's avatar
Theodore Ts'o committed
526
					blk_t *ret);
Theodore Ts'o's avatar
Theodore Ts'o committed
527 528
extern errcode_t ext2fs_alloc_block(ext2_filsys fs, blk_t goal,
				    char *block_buf, blk_t *ret);
Theodore Ts'o's avatar
Theodore Ts'o committed
529

Theodore Ts'o's avatar
Theodore Ts'o committed
530 531
/* alloc_tables.c */
extern errcode_t ext2fs_allocate_tables(ext2_filsys fs);
Theodore Ts'o's avatar
Theodore Ts'o committed
532
extern errcode_t ext2fs_allocate_group_table(ext2_filsys fs, dgrp_t group,
Theodore Ts'o's avatar
Theodore Ts'o committed
533
					     ext2fs_block_bitmap bmap);
Theodore Ts'o's avatar
Theodore Ts'o committed
534

Theodore Ts'o's avatar
Theodore Ts'o committed
535
/* badblocks.c */
Theodore Ts'o's avatar
Theodore Ts'o committed
536 537 538 539 540 541 542 543 544 545 546 547
extern errcode_t ext2fs_badblocks_list_create(ext2_badblocks_list *ret,
					    int size);
extern errcode_t ext2fs_badblocks_list_add(ext2_badblocks_list bb,
					   blk_t blk);
extern int ext2fs_badblocks_list_test(ext2_badblocks_list bb,
				    blk_t blk);
extern errcode_t
	ext2fs_badblocks_list_iterate_begin(ext2_badblocks_list bb,
					    ext2_badblocks_iterate *ret);
extern int ext2fs_badblocks_list_iterate(ext2_badblocks_iterate iter,
					 blk_t *blk);
extern void ext2fs_badblocks_list_iterate_end(ext2_badblocks_iterate iter);
Theodore Ts'o's avatar
Theodore Ts'o committed
548 549
extern errcode_t ext2fs_badblocks_copy(ext2_badblocks_list src,
				       ext2_badblocks_list *dest);
Theodore Ts'o's avatar
Theodore Ts'o committed
550 551
extern int ext2fs_badblocks_equal(ext2_badblocks_list bb1,
				  ext2_badblocks_list bb2);
Theodore Ts'o's avatar
Theodore Ts'o committed
552 553

/* bb_compat */
Theodore Ts'o's avatar
Theodore Ts'o committed
554 555 556 557 558 559 560
extern errcode_t badblocks_list_create(badblocks_list *ret, int size);
extern errcode_t badblocks_list_add(badblocks_list bb, blk_t blk);
extern int badblocks_list_test(badblocks_list bb, blk_t blk);
extern errcode_t badblocks_list_iterate_begin(badblocks_list bb,
					      badblocks_iterate *ret);
extern int badblocks_list_iterate(badblocks_iterate iter, blk_t *blk);
extern void badblocks_list_iterate_end(badblocks_iterate iter);
Theodore Ts'o's avatar
Theodore Ts'o committed
561
extern void badblocks_list_free(badblocks_list bb);
Theodore Ts'o's avatar
Theodore Ts'o committed
562 563 564

/* bb_inode.c */
extern errcode_t ext2fs_update_bb_inode(ext2_filsys fs,
Theodore Ts'o's avatar
Theodore Ts'o committed
565
					ext2_badblocks_list bb_list);
Theodore Ts'o's avatar
Theodore Ts'o committed
566 567 568 569 570 571

/* bitmaps.c */
extern errcode_t ext2fs_write_inode_bitmap(ext2_filsys fs);
extern errcode_t ext2fs_write_block_bitmap (ext2_filsys fs);
extern errcode_t ext2fs_read_inode_bitmap (ext2_filsys fs);
extern errcode_t ext2fs_read_block_bitmap(ext2_filsys fs);
Theodore Ts'o's avatar
Theodore Ts'o committed
572 573 574 575 576
extern errcode_t ext2fs_allocate_generic_bitmap(__u32 start,
						__u32 end,
						__u32 real_end,
						const char *descr,
						ext2fs_generic_bitmap *ret);
Theodore Ts'o's avatar
Theodore Ts'o committed
577 578 579 580 581 582 583 584 585 586 587 588
extern errcode_t ext2fs_allocate_block_bitmap(ext2_filsys fs,
					      const char *descr,
					      ext2fs_block_bitmap *ret);
extern errcode_t ext2fs_allocate_inode_bitmap(ext2_filsys fs,
					      const char *descr,
					      ext2fs_inode_bitmap *ret);
extern errcode_t ext2fs_fudge_inode_bitmap_end(ext2fs_inode_bitmap bitmap,
					       ino_t end, ino_t *oend);
extern errcode_t ext2fs_fudge_block_bitmap_end(ext2fs_block_bitmap bitmap,
					       blk_t end, blk_t *oend);
extern void ext2fs_clear_inode_bitmap(ext2fs_inode_bitmap bitmap);
extern void ext2fs_clear_block_bitmap(ext2fs_block_bitmap bitmap);
Theodore Ts'o's avatar
Theodore Ts'o committed
589 590 591 592 593 594 595 596 597 598 599
extern errcode_t ext2fs_read_bitmaps(ext2_filsys fs);
extern errcode_t ext2fs_write_bitmaps(ext2_filsys fs);

/* block.c */
extern errcode_t ext2fs_block_iterate(ext2_filsys fs,
				      ino_t	ino,
				      int	flags,
				      char *block_buf,
				      int (*func)(ext2_filsys fs,
						  blk_t	*blocknr,
						  int	blockcnt,
Theodore Ts'o's avatar
Theodore Ts'o committed
600 601
						  void	*priv_data),
				      void *priv_data);
Theodore Ts'o's avatar
Theodore Ts'o committed
602
errcode_t ext2fs_block_iterate2(ext2_filsys fs,
Theodore Ts'o's avatar
Theodore Ts'o committed
603 604 605 606 607
				ino_t	ino,
				int	flags,
				char *block_buf,
				int (*func)(ext2_filsys fs,
					    blk_t	*blocknr,
Theodore Ts'o's avatar
Theodore Ts'o committed
608
					    e2_blkcnt_t	blockcnt,
Theodore Ts'o's avatar
Theodore Ts'o committed
609 610 611 612
					    blk_t	ref_blk,
					    int		ref_offset,
					    void	*priv_data),
				void *priv_data);
Theodore Ts'o's avatar
Theodore Ts'o committed
613

Theodore Ts'o's avatar
Theodore Ts'o committed
614 615 616 617 618 619 620
/* bmap.c */
extern errcode_t ext2fs_bmap(ext2_filsys fs, ino_t ino,
			     struct ext2_inode *inode, 
			     char *block_buf, int bmap_flags,
			     blk_t block, blk_t *phys_blk);


621
#if 0
Theodore Ts'o's avatar
Theodore Ts'o committed
622 623 624
/* bmove.c */
extern errcode_t ext2fs_move_blocks(ext2_filsys fs,
				    ext2fs_block_bitmap reserve,
Theodore Ts'o's avatar
Theodore Ts'o committed
625
				    ext2fs_block_bitmap alloc_map,
Theodore Ts'o's avatar
Theodore Ts'o committed
626
				    int flags);
627
#endif
Theodore Ts'o's avatar
Theodore Ts'o committed
628

Theodore Ts'o's avatar
Theodore Ts'o committed
629 630 631
/* check_desc.c */
extern errcode_t ext2fs_check_desc(ext2_filsys fs);

Theodore Ts'o's avatar
Theodore Ts'o committed
632 633 634
/* closefs.c */
extern errcode_t ext2fs_close(ext2_filsys fs);
extern errcode_t ext2fs_flush(ext2_filsys fs);
Theodore Ts'o's avatar
Theodore Ts'o committed
635
extern int ext2fs_bg_has_super(ext2_filsys fs, int group_block);
Theodore Ts'o's avatar
Theodore Ts'o committed
636

Theodore Ts'o's avatar
Theodore Ts'o committed
637 638 639 640 641 642
/* cmp_bitmaps.c */
extern errcode_t ext2fs_compare_block_bitmap(ext2fs_block_bitmap bm1,
					     ext2fs_block_bitmap bm2);
extern errcode_t ext2fs_compare_inode_bitmap(ext2fs_inode_bitmap bm1,
					     ext2fs_inode_bitmap bm2);

Theodore Ts'o's avatar
Theodore Ts'o committed
643 644
/* dblist.c */

Theodore Ts'o's avatar
Theodore Ts'o committed
645 646 647 648 649 650
extern errcode_t ext2fs_get_num_dirs(ext2_filsys fs, ino_t *ret_num_dirs);
extern errcode_t ext2fs_init_dblist(ext2_filsys fs, ext2_dblist *ret_dblist);
extern errcode_t ext2fs_add_dir_block(ext2_dblist dblist, ino_t ino,
				      blk_t blk, int blockcnt);
extern errcode_t ext2fs_dblist_iterate(ext2_dblist dblist,
	int (*func)(ext2_filsys fs, struct ext2_db_entry *db_info,
Theodore Ts'o's avatar
Theodore Ts'o committed
651 652
		    void	*priv_data),
       void *priv_data);
Theodore Ts'o's avatar
Theodore Ts'o committed
653 654 655 656
extern errcode_t ext2fs_set_dir_block(ext2_dblist dblist, ino_t ino,
				      blk_t blk, int blockcnt);
extern errcode_t ext2fs_copy_dblist(ext2_dblist src,
				    ext2_dblist *dest);
657
extern int ext2fs_dblist_count(ext2_dblist dblist);
Theodore Ts'o's avatar
Theodore Ts'o committed
658 659 660 661 662 663 664 665 666 667 668 669

/* dblist_dir.c */
extern errcode_t
	ext2fs_dblist_dir_iterate(ext2_dblist dblist,
				  int	flags,
				  char	*block_buf,
				  int (*func)(ino_t	dir,
					      int		entry,
					      struct ext2_dir_entry *dirent,
					      int	offset,
					      int	blocksize,
					      char	*buf,
Theodore Ts'o's avatar
Theodore Ts'o committed
670 671
					      void	*priv_data),
				  void *priv_data);
Theodore Ts'o's avatar
Theodore Ts'o committed
672 673 674 675 676 677 678

/* dirblock.c */
extern errcode_t ext2fs_read_dir_block(ext2_filsys fs, blk_t block,
				       void *buf);
extern errcode_t ext2fs_write_dir_block(ext2_filsys fs, blk_t block,
					void *buf);

Theodore Ts'o's avatar
Theodore Ts'o committed
679 680 681 682 683 684 685 686 687
/* dir_iterate.c */
extern errcode_t ext2fs_dir_iterate(ext2_filsys fs, 
			      ino_t dir,
			      int flags,
			      char *block_buf,
			      int (*func)(struct ext2_dir_entry *dirent,
					  int	offset,
					  int	blocksize,
					  char	*buf,
Theodore Ts'o's avatar
Theodore Ts'o committed
688 689
					  void	*priv_data),
			      void *priv_data);
Theodore Ts'o's avatar
Theodore Ts'o committed
690

Theodore Ts'o's avatar
Theodore Ts'o committed
691 692
/* dupfs.c */
extern errcode_t ext2fs_dup_handle(ext2_filsys src, ext2_filsys *dest);
Theodore Ts'o's avatar
Theodore Ts'o committed
693

Theodore Ts'o's avatar
Theodore Ts'o committed
694 695 696
/* expanddir.c */
extern errcode_t ext2fs_expand_dir(ext2_filsys fs, ino_t dir);

Theodore Ts'o's avatar
Theodore Ts'o committed
697 698 699
/* fileio.c */
extern errcode_t ext2fs_file_open(ext2_filsys fs, ino_t ino,
				  int flags, ext2_file_t *ret);
700
extern ext2_filsys ext2fs_file_get_fs(ext2_file_t file);
Theodore Ts'o's avatar
Theodore Ts'o committed
701 702
extern errcode_t ext2fs_file_close(ext2_file_t file);
extern errcode_t ext2fs_file_read(ext2_file_t file, void *buf,
703
				  unsigned int wanted, unsigned int *got);
Theodore Ts'o's avatar
Theodore Ts'o committed
704
extern errcode_t ext2fs_file_write(ext2_file_t file, void *buf,
705
				   unsigned int nbytes, unsigned int *written);
Theodore Ts'o's avatar
Theodore Ts'o committed
706 707
extern errcode_t ext2fs_file_lseek(ext2_file_t file, ext2_off_t offset,
				   int whence, ext2_off_t *ret_pos);
708 709
extern ext2_off_t ext2fs_file_get_size(ext2_file_t file);
extern errcode_t ext2fs_file_set_size(ext2_file_t file, ext2_off_t size);
Theodore Ts'o's avatar
Theodore Ts'o committed
710

711 712 713
/* finddev.c */
extern char *ext2fs_find_block_device(dev_t device);

Theodore Ts'o's avatar
Theodore Ts'o committed
714 715
/* freefs.c */
extern void ext2fs_free(ext2_filsys fs);
Theodore Ts'o's avatar
Theodore Ts'o committed
716
extern void ext2fs_free_generic_bitmap(ext2fs_inode_bitmap bitmap);
Theodore Ts'o's avatar
Theodore Ts'o committed
717 718
extern void ext2fs_free_block_bitmap(ext2fs_block_bitmap bitmap);
extern void ext2fs_free_inode_bitmap(ext2fs_inode_bitmap bitmap);
Theodore Ts'o's avatar
Theodore Ts'o committed
719 720
extern void ext2fs_free_dblist(ext2_dblist dblist);
extern void ext2fs_badblocks_list_free(badblocks_list bb);
Theodore Ts'o's avatar
Theodore Ts'o committed
721 722 723 724

/* getsize.c */
extern errcode_t ext2fs_get_device_size(const char *file, int blocksize,
					blk_t *retblocks);
Theodore Ts'o's avatar
Theodore Ts'o committed
725 726 727 728 729 730 731 732 733 734 735 736

/* initialize.c */
extern errcode_t ext2fs_initialize(const char *name, int flags,
				   struct ext2_super_block *param,
				   io_manager manager, ext2_filsys *ret_fs);

/* inode.c */
extern errcode_t ext2fs_open_inode_scan(ext2_filsys fs, int buffer_blocks,
				  ext2_inode_scan *ret_scan);
extern void ext2fs_close_inode_scan(ext2_inode_scan scan);
extern errcode_t ext2fs_get_next_inode(ext2_inode_scan scan, ino_t *ino,
			       struct ext2_inode *inode);
Theodore Ts'o's avatar
Theodore Ts'o committed
737 738 739 740 741 742 743
extern errcode_t ext2fs_inode_scan_goto_blockgroup(ext2_inode_scan scan,
						   int	group);
extern void ext2fs_set_inode_callback
	(ext2_inode_scan scan,
	 errcode_t (*done_group)(ext2_filsys fs,
				 ext2_inode_scan scan,
				 dgrp_t group,
Theodore Ts'o's avatar
Theodore Ts'o committed
744
				 void * priv_data),
Theodore Ts'o's avatar
Theodore Ts'o committed
745 746 747 748
	 void *done_group_data);
extern int ext2fs_inode_scan_flags(ext2_inode_scan scan, int set_flags,
				   int clear_flags);
extern errcode_t ext2fs_read_inode (ext2_filsys fs, ino_t ino,
Theodore Ts'o's avatar
Theodore Ts'o committed
749
			    struct ext2_inode * inode);
Theodore Ts'o's avatar
Theodore Ts'o committed
750
extern errcode_t ext2fs_write_inode(ext2_filsys fs, ino_t ino,
Theodore Ts'o's avatar
Theodore Ts'o committed
751 752 753 754
			    struct ext2_inode * inode);
extern errcode_t ext2fs_get_blocks(ext2_filsys fs, ino_t ino, blk_t *blocks);
extern errcode_t ext2fs_check_directory(ext2_filsys fs, ino_t ino);

Theodore Ts'o's avatar
Theodore Ts'o committed
755 756
/* icount.c */
extern void ext2fs_free_icount(ext2_icount_t icount);
Theodore Ts'o's avatar
Theodore Ts'o committed
757 758
extern errcode_t ext2fs_create_icount2(ext2_filsys fs, int flags, int size,
				       ext2_icount_t hint, ext2_icount_t *ret);
Theodore Ts'o's avatar
Theodore Ts'o committed
759 760 761 762 763 764 765 766 767 768 769
extern errcode_t ext2fs_create_icount(ext2_filsys fs, int flags, int size,
				      ext2_icount_t *ret);
extern errcode_t ext2fs_icount_fetch(ext2_icount_t icount, ino_t ino,
				     __u16 *ret);
extern errcode_t ext2fs_icount_increment(ext2_icount_t icount, ino_t ino,
					 __u16 *ret);
extern errcode_t ext2fs_icount_decrement(ext2_icount_t icount, ino_t ino,
					 __u16 *ret);
extern errcode_t ext2fs_icount_store(ext2_icount_t icount, ino_t ino,
				     __u16 count);
extern ino_t ext2fs_get_icount_size(ext2_icount_t icount);
Theodore Ts'o's avatar
Theodore Ts'o committed
770
errcode_t ext2fs_icount_validate(ext2_icount_t icount, FILE *);
Theodore Ts'o's avatar
Theodore Ts'o committed
771

Theodore Ts'o's avatar
Theodore Ts'o committed
772 773 774
/* ismounted.c */
extern errcode_t ext2fs_check_if_mounted(const char *file, int *mount_flags);

Theodore Ts'o's avatar
Theodore Ts'o committed
775 776 777 778 779
/* namei.c */
extern errcode_t ext2fs_lookup(ext2_filsys fs, ino_t dir, const char *name,
			 int namelen, char *buf, ino_t *inode);
extern errcode_t ext2fs_namei(ext2_filsys fs, ino_t root, ino_t cwd,
			const char *name, ino_t *inode);
Theodore Ts'o's avatar
Theodore Ts'o committed
780 781 782 783 784 785 786
errcode_t ext2fs_namei_follow(ext2_filsys fs, ino_t root, ino_t cwd,
			      const char *name, ino_t *inode);
extern errcode_t ext2fs_follow_link(ext2_filsys fs, ino_t root, ino_t cwd,
			ino_t inode, ino_t *res_inode);

/* native.c */
int ext2fs_native_flag(void);
Theodore Ts'o's avatar
Theodore Ts'o committed
787 788 789 790 791 792 793 794 795

/* newdir.c */
extern errcode_t ext2fs_new_dir_block(ext2_filsys fs, ino_t dir_ino,
				ino_t parent_ino, char **block);

/* mkdir.c */
extern errcode_t ext2fs_mkdir(ext2_filsys fs, ino_t parent, ino_t inum,
			      const char *name);

796 797 798 799 800
/* mkjournal.c */
extern errcode_t ext2fs_add_journal_device(ext2_filsys fs, char *device,
					   blk_t size);
extern errcode_t ext2fs_add_journal_fs(ext2_filsys fs, blk_t size);

Theodore Ts'o's avatar
Theodore Ts'o committed
801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816
/* openfs.c */
extern errcode_t ext2fs_open(const char *name, int flags, int superblock,
			     int block_size, io_manager manager,
			     ext2_filsys *ret_fs);

/* get_pathname.c */
extern errcode_t ext2fs_get_pathname(ext2_filsys fs, ino_t dir, ino_t ino,
			       char **name);

/* link.c */
errcode_t ext2fs_link(ext2_filsys fs, ino_t dir, const char *name,
		      ino_t ino, int flags);
errcode_t ext2fs_unlink(ext2_filsys fs, ino_t dir, const char *name,
			ino_t ino, int flags);

/* read_bb.c */
Theodore Ts'o's avatar
Theodore Ts'o committed
817 818
extern errcode_t ext2fs_read_bb_inode(ext2_filsys fs,
				      ext2_badblocks_list *bb_list);
Theodore Ts'o's avatar
Theodore Ts'o committed
819 820

/* read_bb_file.c */
Theodore Ts'o's avatar
Theodore Ts'o committed
821 822 823 824 825 826 827
extern errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f, 
				      ext2_badblocks_list *bb_list,
				      void *private,
				      void (*invalid)(ext2_filsys fs,
						      blk_t blk,
						      char *badstr,
						      void *private));
Theodore Ts'o's avatar
Theodore Ts'o committed
828
extern errcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f, 
Theodore Ts'o's avatar
Theodore Ts'o committed
829
				     ext2_badblocks_list *bb_list,
Theodore Ts'o's avatar
Theodore Ts'o committed
830 831 832
				     void (*invalid)(ext2_filsys fs,
						     blk_t blk));

Theodore Ts'o's avatar
Theodore Ts'o committed
833 834 835 836 837 838 839 840
/* rs_bitmap.c */
extern errcode_t ext2fs_resize_generic_bitmap(__u32 new_end,
					      __u32 new_real_end,
					      ext2fs_generic_bitmap bmap);
extern errcode_t ext2fs_resize_inode_bitmap(__u32 new_end, __u32 new_real_end,
					    ext2fs_inode_bitmap bmap);
extern errcode_t ext2fs_resize_block_bitmap(__u32 new_end, __u32 new_real_end,
					    ext2fs_block_bitmap bmap);
Theodore Ts'o's avatar
Theodore Ts'o committed
841 842
extern errcode_t ext2fs_copy_bitmap(ext2fs_generic_bitmap src,
				    ext2fs_generic_bitmap *dest);
Theodore Ts'o's avatar
Theodore Ts'o committed
843

Theodore Ts'o's avatar
Theodore Ts'o committed
844 845 846
/* swapfs.c */
extern void ext2fs_swap_super(struct ext2_super_block * super);
extern void ext2fs_swap_group_desc(struct ext2_group_desc *gdp);
Theodore Ts'o's avatar
Theodore Ts'o committed
847 848 849
extern void ext2fs_swap_inode(ext2_filsys fs,struct ext2_inode *t,
			      struct ext2_inode *f, int hostorder);

Theodore Ts'o's avatar
Theodore Ts'o committed
850
/* valid_blk.c */
Theodore Ts'o's avatar
Theodore Ts'o committed
851 852 853 854 855 856
extern int ext2fs_inode_has_valid_blocks(struct ext2_inode *inode);

/* version.c */
extern int ext2fs_parse_version_string(const char *ver_string);
extern int ext2fs_get_library_version(const char **ver_string,
				      const char **date_string);
Theodore Ts'o's avatar
Theodore Ts'o committed
857

Theodore Ts'o's avatar
Theodore Ts'o committed
858
/* inline functions */
859
extern errcode_t ext2fs_get_mem(unsigned long size, void **ptr);
Theodore Ts'o's avatar
Theodore Ts'o committed
860
extern errcode_t ext2fs_free_mem(void **ptr);
Theodore Ts'o's avatar
Theodore Ts'o committed
861 862
extern errcode_t ext2fs_resize_mem(unsigned long old_size,
				   unsigned long size, void **ptr);
Theodore Ts'o's avatar
Theodore Ts'o committed
863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885
extern void ext2fs_mark_super_dirty(ext2_filsys fs);
extern void ext2fs_mark_changed(ext2_filsys fs);
extern int ext2fs_test_changed(ext2_filsys fs);
extern void ext2fs_mark_valid(ext2_filsys fs);
extern void ext2fs_unmark_valid(ext2_filsys fs);
extern int ext2fs_test_valid(ext2_filsys fs);
extern void ext2fs_mark_ib_dirty(ext2_filsys fs);
extern void ext2fs_mark_bb_dirty(ext2_filsys fs);
extern int ext2fs_test_ib_dirty(ext2_filsys fs);
extern int ext2fs_test_bb_dirty(ext2_filsys fs);
extern int ext2fs_group_of_blk(ext2_filsys fs, blk_t blk);
extern int ext2fs_group_of_ino(ext2_filsys fs, ino_t ino);

/*
 * The actual inlined functions definitions themselves...
 *
 * If NO_INLINE_FUNCS is defined, then we won't try to do inline
 * functions at all!
 */
#if (defined(INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS))
#ifdef INCLUDE_INLINE_FUNCS
#define _INLINE_ extern
#else
Theodore Ts'o's avatar
Theodore Ts'o committed
886
#ifdef __GNUC__
Theodore Ts'o's avatar
Theodore Ts'o committed
887
#define _INLINE_ extern __inline__
Theodore Ts'o's avatar
Theodore Ts'o committed
888 889 890
#else				/* For Watcom C */
#define _INLINE_ extern inline
#endif
Theodore Ts'o's avatar
Theodore Ts'o committed
891 892
#endif

Theodore Ts'o's avatar
Theodore Ts'o committed
893 894 895 896
#ifndef EXT2_CUSTOM_MEMORY_ROUTINES
/*
 *  Allocate memory
 */
897
_INLINE_ errcode_t ext2fs_get_mem(unsigned long size, void **ptr)
Theodore Ts'o's avatar
Theodore Ts'o committed
898 899 900
{
	*ptr = malloc(size);
	if (!*ptr)
901
		return EXT2_ET_NO_MEMORY;
Theodore Ts'o's avatar
Theodore Ts'o committed
902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917
	return 0;
}

/*
 * Free memory
 */
_INLINE_ errcode_t ext2fs_free_mem(void **ptr)
{
	free(*ptr);
	*ptr = 0;
	return 0;
}
	
/*
 *  Resize memory
 */
Theodore Ts'o's avatar
Theodore Ts'o committed
918 919
_INLINE_ errcode_t ext2fs_resize_mem(unsigned long old_size,
				     unsigned long size, void **ptr)
Theodore Ts'o's avatar
Theodore Ts'o committed
920 921 922 923 924
{
	void *p;

	p = realloc(*ptr, size);
	if (!p)
925
		return EXT2_ET_NO_MEMORY;
Theodore Ts'o's avatar
Theodore Ts'o committed
926 927 928 929 930
	*ptr = p;
	return 0;
}
#endif	/* Custom memory routines */

Theodore Ts'o's avatar
Theodore Ts'o committed
931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029
/*
 * Mark a filesystem superblock as dirty
 */
_INLINE_ void ext2fs_mark_super_dirty(ext2_filsys fs)
{
	fs->flags |= EXT2_FLAG_DIRTY | EXT2_FLAG_CHANGED;
}

/*
 * Mark a filesystem as changed
 */
_INLINE_ void ext2fs_mark_changed(ext2_filsys fs)
{
	fs->flags |= EXT2_FLAG_CHANGED;
}

/*
 * Check to see if a filesystem has changed
 */
_INLINE_ int ext2fs_test_changed(ext2_filsys fs)
{
	return (fs->flags & EXT2_FLAG_CHANGED);
}

/*
 * Mark a filesystem as valid
 */
_INLINE_ void ext2fs_mark_valid(ext2_filsys fs)
{
	fs->flags |= EXT2_FLAG_VALID;
}

/*
 * Mark a filesystem as NOT valid
 */
_INLINE_ void ext2fs_unmark_valid(ext2_filsys fs)
{
	fs->flags &= ~EXT2_FLAG_VALID;
}

/*
 * Check to see if a filesystem is valid
 */
_INLINE_ int ext2fs_test_valid(ext2_filsys fs)
{
	return (fs->flags & EXT2_FLAG_VALID);
}

/*
 * Mark the inode bitmap as dirty
 */
_INLINE_ void ext2fs_mark_ib_dirty(ext2_filsys fs)
{
	fs->flags |= EXT2_FLAG_IB_DIRTY | EXT2_FLAG_CHANGED;
}

/*
 * Mark the block bitmap as dirty
 */
_INLINE_ void ext2fs_mark_bb_dirty(ext2_filsys fs)
{
	fs->flags |= EXT2_FLAG_BB_DIRTY | EXT2_FLAG_CHANGED;
}

/*
 * Check to see if a filesystem's inode bitmap is dirty
 */
_INLINE_ int ext2fs_test_ib_dirty(ext2_filsys fs)
{
	return (fs->flags & EXT2_FLAG_IB_DIRTY);
}

/*
 * Check to see if a filesystem's block bitmap is dirty
 */
_INLINE_ int ext2fs_test_bb_dirty(ext2_filsys fs)
{
	return (fs->flags & EXT2_FLAG_BB_DIRTY);
}

/*
 * Return the group # of a block
 */
_INLINE_ int ext2fs_group_of_blk(ext2_filsys fs, blk_t blk)
{
	return (blk - fs->super->s_first_data_block) /
		fs->super->s_blocks_per_group;
}

/*
 * Return the group # of an inode number
 */
_INLINE_ int ext2fs_group_of_ino(ext2_filsys fs, ino_t ino)
{
	return (ino - 1) / fs->super->s_inodes_per_group;
}
#undef _INLINE_
#endif

Theodore Ts'o's avatar
Theodore Ts'o committed
1030 1031 1032 1033
#ifdef __cplusplus
}
#endif

1034
#endif /* _EXT2FS_EXT2FS_H */