ext2fs.h 33.7 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 19 20
#ifdef __GNUC__
#define EXT2FS_ATTR(x) __attribute__(x)
#else
#define EXT2FS_ATTR(x)
#endif

Theodore Ts'o's avatar
Theodore Ts'o committed
21 22 23 24
#ifdef __cplusplus
extern "C" {
#endif

Theodore Ts'o's avatar
Theodore Ts'o committed
25 26 27
/*
 * Non-GNU C compilers won't necessarily understand inline
 */
Theodore Ts'o's avatar
Theodore Ts'o committed
28
#if (!defined(__GNUC__) && !defined(__WATCOMC__))
Theodore Ts'o's avatar
Theodore Ts'o committed
29 30 31
#define NO_INLINE_FUNCS
#endif

32 33 34 35 36 37 38 39 40
/*
 * Build in support for byte-swapping filesystems if we the feature
 * has been configured or if we're being built on a CPU architecture
 * with a non-native byte order.
 */
#if defined(ENABLE_SWAPFS) || defined(WORDS_BIGENDIAN)
#define EXT2FS_ENABLE_SWAPFS
#endif

Theodore Ts'o's avatar
Theodore Ts'o committed
41 42 43 44 45 46 47 48 49 50
/*
 * 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
51 52 53 54
/*
 * The last ext2fs revision level that this version of the library is
 * able to support.
 */
Theodore Ts'o's avatar
Theodore Ts'o committed
55
#define EXT2_LIB_CURRENT_REV	EXT2_DYNAMIC_REV
Theodore Ts'o's avatar
Theodore Ts'o committed
56

Theodore Ts'o's avatar
Theodore Ts'o committed
57
#ifdef HAVE_SYS_TYPES_H
Theodore Ts'o's avatar
Theodore Ts'o committed
58
#include <sys/types.h>
Theodore Ts'o's avatar
Theodore Ts'o committed
59 60
#endif

Theodore Ts'o's avatar
Theodore Ts'o committed
61
#include <stdio.h>
Theodore Ts'o's avatar
Theodore Ts'o committed
62
#include <stdlib.h>
63 64 65

#if EXT2_FLAT_INCLUDES
#include "e2_types.h"
Theodore Ts'o's avatar
Theodore Ts'o committed
66
#include "ext2_fs.h"
67
#else
Theodore Ts'o's avatar
Theodore Ts'o committed
68
#include <ext2fs/ext2_types.h>
Theodore Ts'o's avatar
Theodore Ts'o committed
69
#include <ext2fs/ext2_fs.h>
Theodore Ts'o's avatar
Theodore Ts'o committed
70
#endif /* EXT2_FLAT_INCLUDES */
Theodore Ts'o's avatar
Theodore Ts'o committed
71

Theodore Ts'o's avatar
Theodore Ts'o committed
72
typedef __u32		ext2_ino_t;
Theodore Ts'o's avatar
Theodore Ts'o committed
73
typedef __u32		blk_t;
Theodore Ts'o's avatar
Theodore Ts'o committed
74
typedef __u32		dgrp_t;
Theodore Ts'o's avatar
Theodore Ts'o committed
75
typedef __u32		ext2_off_t;
Theodore Ts'o's avatar
Theodore Ts'o committed
76
typedef __s64		e2_blkcnt_t;
77
typedef __u32		ext2_dirhash_t;
Theodore Ts'o's avatar
Theodore Ts'o committed
78

Theodore Ts'o's avatar
Theodore Ts'o committed
79 80 81 82 83
#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
84 85 86
#include <et/com_err.h>
#include <ext2fs/ext2_io.h>
#include <ext2fs/ext2_err.h>
Theodore Ts'o's avatar
Theodore Ts'o committed
87
#endif
Theodore Ts'o's avatar
Theodore Ts'o committed
88

89 90 91 92 93 94 95 96 97
/*
 * 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
98 99
typedef struct struct_ext2_filsys *ext2_filsys;

Theodore Ts'o's avatar
Theodore Ts'o committed
100
struct ext2fs_struct_generic_bitmap {
Theodore Ts'o's avatar
Theodore Ts'o committed
101
	errcode_t	magic;
Theodore Ts'o's avatar
Theodore Ts'o committed
102 103 104 105 106 107 108
	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
109 110
};

Theodore Ts'o's avatar
Theodore Ts'o committed
111 112 113
#define EXT2FS_MARK_ERROR 	0
#define EXT2FS_UNMARK_ERROR 	1
#define EXT2FS_TEST_ERROR	2
Theodore Ts'o's avatar
Theodore Ts'o committed
114

Theodore Ts'o's avatar
Theodore Ts'o committed
115 116 117
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
118

Theodore Ts'o's avatar
Theodore Ts'o committed
119 120 121 122 123 124 125
#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
126 127 128 129
/*
 * badblocks list definitions
 */

130 131 132 133 134
typedef struct ext2_struct_u32_list *ext2_badblocks_list;
typedef struct ext2_struct_u32_iterate *ext2_badblocks_iterate;

typedef struct ext2_struct_u32_list *ext2_u32_list;
typedef struct ext2_struct_u32_iterate *ext2_u32_iterate;
Theodore Ts'o's avatar
Theodore Ts'o committed
135 136

/* old */
137 138
typedef struct ext2_struct_u32_list *badblocks_list;
typedef struct ext2_struct_u32_iterate *badblocks_iterate;
Theodore Ts'o's avatar
Theodore Ts'o committed
139 140 141 142 143 144 145

#define BADBLOCKS_FLAG_DIRTY	1

/*
 * ext2_dblist structure and abstractions (see dblist.c)
 */
struct ext2_db_entry {
Theodore Ts'o's avatar
Theodore Ts'o committed
146
	ext2_ino_t	ino;
Theodore Ts'o's avatar
Theodore Ts'o committed
147 148 149 150 151 152 153 154
	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
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
/*
 * 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
173
/*
174
 * Flags for the ext2_filsys structure and for ext2fs_open()
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
#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
182 183 184 185
#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
186
#define EXT2_FLAG_FORCE			0x400
187
#define EXT2_FLAG_SUPER_ONLY		0x800
188
#define EXT2_FLAG_JOURNAL_DEV_OK	0x1000
Theodore Ts'o's avatar
Theodore Ts'o committed
189
#define EXT2_FLAG_IMAGE_FILE		0x2000
Theodore Ts'o's avatar
Theodore Ts'o committed
190

Theodore Ts'o's avatar
Theodore Ts'o committed
191 192 193 194 195 196
/*
 * 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

197 198 199 200 201 202 203
/*
 * Flags for mkjournal
 *
 * EXT2_MKJOURNAL_V1_SUPER	Make a (deprecated) V1 journal superblock
 */
#define EXT2_MKJOURNAL_V1_SUPER	0x0000001

Theodore Ts'o's avatar
Theodore Ts'o committed
204
struct struct_ext2_filsys {
Theodore Ts'o's avatar
Theodore Ts'o committed
205
	errcode_t			magic;
Theodore Ts'o's avatar
Theodore Ts'o committed
206 207 208 209
	io_channel			io;
	int				flags;
	char *				device_name;
	struct ext2_super_block	* 	super;
Theodore Ts'o's avatar
Theodore Ts'o committed
210
	unsigned int			blocksize;
Theodore Ts'o's avatar
Theodore Ts'o committed
211
	int				fragsize;
Theodore Ts'o's avatar
Theodore Ts'o committed
212
	dgrp_t				group_desc_count;
Theodore Ts'o's avatar
Theodore Ts'o committed
213 214 215
	unsigned long			desc_blocks;
	struct ext2_group_desc *	group_desc;
	int				inode_blocks_per_group;
Theodore Ts'o's avatar
Theodore Ts'o committed
216 217
	ext2fs_inode_bitmap		inode_map;
	ext2fs_block_bitmap		block_map;
Theodore Ts'o's avatar
Theodore Ts'o committed
218 219
	errcode_t (*get_blocks)(ext2_filsys fs, ext2_ino_t ino, blk_t *blocks);
	errcode_t (*check_directory)(ext2_filsys fs, ext2_ino_t ino);
Theodore Ts'o's avatar
Theodore Ts'o committed
220
	errcode_t (*write_bitmaps)(ext2_filsys fs);
Theodore Ts'o's avatar
Theodore Ts'o committed
221
	errcode_t (*read_inode)(ext2_filsys fs, ext2_ino_t ino,
Theodore Ts'o's avatar
Theodore Ts'o committed
222
				struct ext2_inode *inode);
Theodore Ts'o's avatar
Theodore Ts'o committed
223
	errcode_t (*write_inode)(ext2_filsys fs, ext2_ino_t ino,
Theodore Ts'o's avatar
Theodore Ts'o committed
224
				struct ext2_inode *inode);
225
	ext2_badblocks_list		badblocks;
Theodore Ts'o's avatar
Theodore Ts'o committed
226
	ext2_dblist			dblist;
Theodore Ts'o's avatar
Theodore Ts'o committed
227
	__u32				stride;	/* for mke2fs */
Theodore Ts'o's avatar
Theodore Ts'o committed
228
	struct ext2_super_block *	orig_super;
Theodore Ts'o's avatar
Theodore Ts'o committed
229
	struct ext2_image_hdr *		image_header;
230
	__u32				umask;
Theodore Ts'o's avatar
Theodore Ts'o committed
231 232 233
	/*
	 * Reserved for future expansion
	 */
234
	__u32				reserved[8];
Theodore Ts'o's avatar
Theodore Ts'o committed
235 236

	/*
Theodore Ts'o's avatar
Theodore Ts'o committed
237
	 * Reserved for the use of the calling application.
Theodore Ts'o's avatar
Theodore Ts'o committed
238
	 */
Theodore Ts'o's avatar
Theodore Ts'o committed
239
	void *				priv_data;
Theodore Ts'o's avatar
Theodore Ts'o committed
240 241 242 243 244

	/*
	 * Inode cache
	 */
	struct ext2_inode_cache		*icache;
245
	io_channel			image_io;
Theodore Ts'o's avatar
Theodore Ts'o committed
246 247
};

248 249 250
#if EXT2_FLAT_INCLUDES
#include "e2_bitops.h"
#else
Theodore Ts'o's avatar
Theodore Ts'o committed
251
#include <ext2fs/bitops.h>
252
#endif
Theodore Ts'o's avatar
Theodore Ts'o committed
253

Theodore Ts'o's avatar
Theodore Ts'o committed
254 255 256 257 258 259 260 261 262
/*
 * 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
263 264 265 266 267 268 269 270 271 272 273 274
 *
 * 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
275 276 277
 *
 * 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
278 279
 *
 * BLOCK_FLAG_NO_LARGE is for internal use only.  It informs
Theodore Ts'o's avatar
Theodore Ts'o committed
280
 * ext2fs_block_iterate2 that large files won't be accepted.
Theodore Ts'o's avatar
Theodore Ts'o committed
281 282
 */
#define BLOCK_FLAG_APPEND	1
Theodore Ts'o's avatar
Theodore Ts'o committed
283
#define BLOCK_FLAG_HOLE		1
Theodore Ts'o's avatar
Theodore Ts'o committed
284
#define BLOCK_FLAG_DEPTH_TRAVERSE	2
Theodore Ts'o's avatar
Theodore Ts'o committed
285 286
#define BLOCK_FLAG_DATA_ONLY	4

Theodore Ts'o's avatar
Theodore Ts'o committed
287 288
#define BLOCK_FLAG_NO_LARGE	0x1000

Theodore Ts'o's avatar
Theodore Ts'o committed
289 290 291 292 293 294 295
/*
 * 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
296

297
#if 0
Theodore Ts'o's avatar
Theodore Ts'o committed
298 299 300 301
/*
 * Flags for ext2fs_move_blocks
 */
#define EXT2_BMOVE_GET_DBLIST	0x0001	
Theodore Ts'o's avatar
Theodore Ts'o committed
302
#define EXT2_BMOVE_DEBUG	0x0002
303
#endif
Theodore Ts'o's avatar
Theodore Ts'o committed
304

305 306 307 308 309
/*
 * Flags for directory block reading and writing functions
 */
#define EXT2_DIRBLOCK_V2_STRUCT	0x0001

Theodore Ts'o's avatar
Theodore Ts'o committed
310 311 312 313 314 315 316 317 318 319 320 321
/*
 * 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
322
#define DIRENT_FLAG_INCLUDE_REMOVED	2
Theodore Ts'o's avatar
Theodore Ts'o committed
323 324 325 326

#define DIRENT_DOT_FILE		1
#define DIRENT_DOT_DOT_FILE	2
#define DIRENT_OTHER_FILE	3
327
#define DIRENT_DELETED_FILE	4
Theodore Ts'o's avatar
Theodore Ts'o committed
328

Theodore Ts'o's avatar
Theodore Ts'o committed
329 330 331
/*
 * Inode scan definitions
 */
Theodore Ts'o's avatar
Theodore Ts'o committed
332 333
typedef struct ext2_struct_inode_scan *ext2_inode_scan;

Theodore Ts'o's avatar
Theodore Ts'o committed
334 335 336 337 338 339 340
/*
 * 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
341

Theodore Ts'o's avatar
Theodore Ts'o committed
342 343 344 345 346
/*
 * ext2fs_check_if_mounted flags
 */
#define EXT2_MF_MOUNTED		1
#define EXT2_MF_ISROOT		2
Theodore Ts'o's avatar
Theodore Ts'o committed
347
#define EXT2_MF_READONLY	4
348
#define EXT2_MF_SWAP		8
349
#define EXT2_MF_BUSY		16
Theodore Ts'o's avatar
Theodore Ts'o committed
350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367

/*
 * 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
368 369 370 371 372 373 374 375 376 377 378 379 380 381 382
#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
383 384 385 386 387 388 389 390
#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)

391 392 393 394 395
/*
 * ext2 size of an inode
 */
#define EXT2_I_SIZE(i)	((i)->i_size | ((__u64) (i)->i_size_high << 32))

Theodore Ts'o's avatar
Theodore Ts'o committed
396 397 398 399 400 401 402
/*
 * 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
403 404 405
/*
 * Flags for ext2fs_bmap
 */
406 407
#define BMAP_ALLOC	0x0001
#define BMAP_SET	0x0002
Theodore Ts'o's avatar
Theodore Ts'o committed
408

409 410 411 412 413 414
/*
 * Flags for imager.c functions
 */
#define IMAGER_FLAG_INODEMAP	1
#define IMAGER_FLAG_SPARSEWRITE	2

Theodore Ts'o's avatar
Theodore Ts'o committed
415 416 417
/*
 * For checking structure magic numbers...
 */
Theodore Ts'o's avatar
Theodore Ts'o committed
418

Theodore Ts'o's avatar
Theodore Ts'o committed
419 420
#define EXT2_CHECK_MAGIC(struct, code) \
	  if ((struct)->magic != (code)) return (code)
Theodore Ts'o's avatar
Theodore Ts'o committed
421 422 423


/*
Theodore Ts'o's avatar
Theodore Ts'o committed
424
 * For ext2 compression support
Theodore Ts'o's avatar
Theodore Ts'o committed
425
 */
Theodore Ts'o's avatar
Theodore Ts'o committed
426 427 428
#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
429
/*
Theodore Ts'o's avatar
Theodore Ts'o committed
430
 * Features supported by this version of the library
Theodore Ts'o's avatar
Theodore Ts'o committed
431
 */
432 433
#define EXT2_LIB_FEATURE_COMPAT_SUPP	(EXT2_FEATURE_COMPAT_DIR_PREALLOC|\
					 EXT2_FEATURE_COMPAT_IMAGIC_INODES|\
434
					 EXT3_FEATURE_COMPAT_HAS_JOURNAL|\
435
					 EXT2_FEATURE_COMPAT_RESIZE_INODE|\
436
					 EXT2_FEATURE_COMPAT_DIR_INDEX|\
437
					 EXT2_FEATURE_COMPAT_EXT_ATTR)
Theodore Ts'o's avatar
Theodore Ts'o committed
438

Theodore Ts'o's avatar
Theodore Ts'o committed
439 440
/* This #ifdef is temporary until compression is fully supported */
#ifdef ENABLE_COMPRESSION
Theodore Ts'o's avatar
Theodore Ts'o committed
441 442 443 444
#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
445
 #warning "Compression support is experimental"
Theodore Ts'o's avatar
Theodore Ts'o committed
446
#endif
Theodore Ts'o's avatar
Theodore Ts'o committed
447
#define EXT2_LIB_FEATURE_INCOMPAT_SUPP	(EXT2_FEATURE_INCOMPAT_FILETYPE|\
Theodore Ts'o's avatar
Theodore Ts'o committed
448
					 EXT2_FEATURE_INCOMPAT_COMPRESSION|\
449
					 EXT3_FEATURE_INCOMPAT_JOURNAL_DEV|\
450
					 EXT2_FEATURE_INCOMPAT_META_BG|\
Theodore Ts'o's avatar
Theodore Ts'o committed
451
					 EXT3_FEATURE_INCOMPAT_RECOVER)
Theodore Ts'o's avatar
Theodore Ts'o committed
452
#else
Theodore Ts'o's avatar
Theodore Ts'o committed
453
#define EXT2_LIB_FEATURE_INCOMPAT_SUPP	(EXT2_FEATURE_INCOMPAT_FILETYPE|\
454
					 EXT3_FEATURE_INCOMPAT_JOURNAL_DEV|\
455
					 EXT2_FEATURE_INCOMPAT_META_BG|\
Theodore Ts'o's avatar
Theodore Ts'o committed
456
					 EXT3_FEATURE_INCOMPAT_RECOVER)
Theodore Ts'o's avatar
Theodore Ts'o committed
457
#endif
Theodore Ts'o's avatar
Theodore Ts'o committed
458 459
#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
460 461 462 463 464
/*
 * function prototypes
 */

/* alloc.c */
Theodore Ts'o's avatar
Theodore Ts'o committed
465 466
extern errcode_t ext2fs_new_inode(ext2_filsys fs, ext2_ino_t dir, int mode,
				  ext2fs_inode_bitmap map, ext2_ino_t *ret);
Theodore Ts'o's avatar
Theodore Ts'o committed
467
extern errcode_t ext2fs_new_block(ext2_filsys fs, blk_t goal,
Theodore Ts'o's avatar
Theodore Ts'o committed
468
				  ext2fs_block_bitmap map, blk_t *ret);
Theodore Ts'o's avatar
Theodore Ts'o committed
469
extern errcode_t ext2fs_get_free_blocks(ext2_filsys fs, blk_t start,
Theodore Ts'o's avatar
Theodore Ts'o committed
470 471
					blk_t finish, int num,
					ext2fs_block_bitmap map,
Theodore Ts'o's avatar
Theodore Ts'o committed
472
					blk_t *ret);
Theodore Ts'o's avatar
Theodore Ts'o committed
473 474
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
475

476 477 478 479 480
/* alloc_sb.c */
extern int ext2fs_reserve_super_and_bgd(ext2_filsys fs, 
					dgrp_t group,
					ext2fs_block_bitmap bmap);

481 482
/* alloc_stats.c */
void ext2fs_inode_alloc_stats(ext2_filsys fs, ext2_ino_t ino, int inuse);
483 484
void ext2fs_inode_alloc_stats2(ext2_filsys fs, ext2_ino_t ino,
			       int inuse, int isdir);
485 486
void ext2fs_block_alloc_stats(ext2_filsys fs, blk_t blk, int inuse);

Theodore Ts'o's avatar
Theodore Ts'o committed
487 488
/* alloc_tables.c */
extern errcode_t ext2fs_allocate_tables(ext2_filsys fs);
Theodore Ts'o's avatar
Theodore Ts'o committed
489
extern errcode_t ext2fs_allocate_group_table(ext2_filsys fs, dgrp_t group,
Theodore Ts'o's avatar
Theodore Ts'o committed
490
					     ext2fs_block_bitmap bmap);
Theodore Ts'o's avatar
Theodore Ts'o committed
491

Theodore Ts'o's avatar
Theodore Ts'o committed
492
/* badblocks.c */
493 494
extern errcode_t ext2fs_u32_list_create(ext2_u32_list *ret, int size);
extern errcode_t ext2fs_u32_list_add(ext2_u32_list bb, __u32 blk);
Theodore Ts'o's avatar
Theodore Ts'o committed
495
extern int ext2fs_u32_list_find(ext2_u32_list bb, __u32 blk);
496 497 498 499 500 501 502 503
extern int ext2fs_u32_list_test(ext2_u32_list bb, blk_t blk);
extern errcode_t ext2fs_u32_list_iterate_begin(ext2_u32_list bb,
					       ext2_u32_iterate *ret);
extern int ext2fs_u32_list_iterate(ext2_u32_iterate iter, blk_t *blk);
extern void ext2fs_u32_list_iterate_end(ext2_u32_iterate iter);
extern errcode_t ext2fs_u32_copy(ext2_u32_list src, ext2_u32_list *dest);
extern int ext2fs_u32_list_equal(ext2_u32_list bb1, ext2_u32_list bb2);

Theodore Ts'o's avatar
Theodore Ts'o committed
504 505 506 507 508 509
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);
510 511
extern int ext2fs_u32_list_del(ext2_u32_list bb, __u32 blk);
extern void ext2fs_badblocks_list_del(ext2_u32_list bb, __u32 blk);
Theodore Ts'o's avatar
Theodore Ts'o committed
512 513 514 515 516 517
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
518 519
extern errcode_t ext2fs_badblocks_copy(ext2_badblocks_list src,
				       ext2_badblocks_list *dest);
Theodore Ts'o's avatar
Theodore Ts'o committed
520 521
extern int ext2fs_badblocks_equal(ext2_badblocks_list bb1,
				  ext2_badblocks_list bb2);
522
extern int ext2fs_u32_list_count(ext2_u32_list bb);
Theodore Ts'o's avatar
Theodore Ts'o committed
523 524

/* bb_compat */
Theodore Ts'o's avatar
Theodore Ts'o committed
525 526 527 528 529 530 531
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
532
extern void badblocks_list_free(badblocks_list bb);
Theodore Ts'o's avatar
Theodore Ts'o committed
533 534 535

/* bb_inode.c */
extern errcode_t ext2fs_update_bb_inode(ext2_filsys fs,
Theodore Ts'o's avatar
Theodore Ts'o committed
536
					ext2_badblocks_list bb_list);
Theodore Ts'o's avatar
Theodore Ts'o committed
537 538 539 540 541 542

/* 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
543 544 545 546 547
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
548 549 550 551 552 553 554
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,
Theodore Ts'o's avatar
Theodore Ts'o committed
555
					       ext2_ino_t end, ext2_ino_t *oend);
Theodore Ts'o's avatar
Theodore Ts'o committed
556 557 558 559
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
560 561 562 563 564
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,
Theodore Ts'o's avatar
Theodore Ts'o committed
565
				      ext2_ino_t	ino,
Theodore Ts'o's avatar
Theodore Ts'o committed
566 567 568 569 570
				      int	flags,
				      char *block_buf,
				      int (*func)(ext2_filsys fs,
						  blk_t	*blocknr,
						  int	blockcnt,
Theodore Ts'o's avatar
Theodore Ts'o committed
571 572
						  void	*priv_data),
				      void *priv_data);
Theodore Ts'o's avatar
Theodore Ts'o committed
573
errcode_t ext2fs_block_iterate2(ext2_filsys fs,
Theodore Ts'o's avatar
Theodore Ts'o committed
574
				ext2_ino_t	ino,
Theodore Ts'o's avatar
Theodore Ts'o committed
575 576 577 578
				int	flags,
				char *block_buf,
				int (*func)(ext2_filsys fs,
					    blk_t	*blocknr,
Theodore Ts'o's avatar
Theodore Ts'o committed
579
					    e2_blkcnt_t	blockcnt,
Theodore Ts'o's avatar
Theodore Ts'o committed
580 581 582 583
					    blk_t	ref_blk,
					    int		ref_offset,
					    void	*priv_data),
				void *priv_data);
Theodore Ts'o's avatar
Theodore Ts'o committed
584

Theodore Ts'o's avatar
Theodore Ts'o committed
585
/* bmap.c */
Theodore Ts'o's avatar
Theodore Ts'o committed
586
extern errcode_t ext2fs_bmap(ext2_filsys fs, ext2_ino_t ino,
Theodore Ts'o's avatar
Theodore Ts'o committed
587 588 589 590 591
			     struct ext2_inode *inode, 
			     char *block_buf, int bmap_flags,
			     blk_t block, blk_t *phys_blk);


592
#if 0
Theodore Ts'o's avatar
Theodore Ts'o committed
593 594 595
/* bmove.c */
extern errcode_t ext2fs_move_blocks(ext2_filsys fs,
				    ext2fs_block_bitmap reserve,
Theodore Ts'o's avatar
Theodore Ts'o committed
596
				    ext2fs_block_bitmap alloc_map,
Theodore Ts'o's avatar
Theodore Ts'o committed
597
				    int flags);
598
#endif
Theodore Ts'o's avatar
Theodore Ts'o committed
599

Theodore Ts'o's avatar
Theodore Ts'o committed
600 601 602
/* check_desc.c */
extern errcode_t ext2fs_check_desc(ext2_filsys fs);

Theodore Ts'o's avatar
Theodore Ts'o committed
603 604 605
/* closefs.c */
extern errcode_t ext2fs_close(ext2_filsys fs);
extern errcode_t ext2fs_flush(ext2_filsys fs);
606
extern int ext2fs_bg_has_super(ext2_filsys fs, int group_block);
607 608 609 610 611 612
extern int ext2fs_super_and_bgd_loc(ext2_filsys fs, 
				    dgrp_t group,
				    blk_t *ret_super_blk,
				    blk_t *ret_old_desc_blk,
				    blk_t *ret_new_desc_blk,
				    int *ret_meta_bg);
613
extern void ext2fs_update_dynamic_rev(ext2_filsys fs);
Theodore Ts'o's avatar
Theodore Ts'o committed
614

Theodore Ts'o's avatar
Theodore Ts'o committed
615 616 617 618 619 620
/* 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
621 622
/* dblist.c */

Theodore Ts'o's avatar
Theodore Ts'o committed
623
extern errcode_t ext2fs_get_num_dirs(ext2_filsys fs, ext2_ino_t *ret_num_dirs);
Theodore Ts'o's avatar
Theodore Ts'o committed
624
extern errcode_t ext2fs_init_dblist(ext2_filsys fs, ext2_dblist *ret_dblist);
Theodore Ts'o's avatar
Theodore Ts'o committed
625
extern errcode_t ext2fs_add_dir_block(ext2_dblist dblist, ext2_ino_t ino,
Theodore Ts'o's avatar
Theodore Ts'o committed
626
				      blk_t blk, int blockcnt);
627 628 629
extern void ext2fs_dblist_sort(ext2_dblist dblist,
			       EXT2_QSORT_TYPE (*sortfunc)(const void *,
							   const void *));
Theodore Ts'o's avatar
Theodore Ts'o committed
630 631
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
632 633
		    void	*priv_data),
       void *priv_data);
Theodore Ts'o's avatar
Theodore Ts'o committed
634
extern errcode_t ext2fs_set_dir_block(ext2_dblist dblist, ext2_ino_t ino,
Theodore Ts'o's avatar
Theodore Ts'o committed
635 636 637
				      blk_t blk, int blockcnt);
extern errcode_t ext2fs_copy_dblist(ext2_dblist src,
				    ext2_dblist *dest);
638
extern int ext2fs_dblist_count(ext2_dblist dblist);
Theodore Ts'o's avatar
Theodore Ts'o committed
639 640 641 642 643 644

/* dblist_dir.c */
extern errcode_t
	ext2fs_dblist_dir_iterate(ext2_dblist dblist,
				  int	flags,
				  char	*block_buf,
Theodore Ts'o's avatar
Theodore Ts'o committed
645
				  int (*func)(ext2_ino_t	dir,
Theodore Ts'o's avatar
Theodore Ts'o committed
646 647 648 649 650
					      int		entry,
					      struct ext2_dir_entry *dirent,
					      int	offset,
					      int	blocksize,
					      char	*buf,
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

/* dirblock.c */
extern errcode_t ext2fs_read_dir_block(ext2_filsys fs, blk_t block,
				       void *buf);
657 658
extern errcode_t ext2fs_read_dir_block2(ext2_filsys fs, blk_t block,
					void *buf, int flags);
Theodore Ts'o's avatar
Theodore Ts'o committed
659 660
extern errcode_t ext2fs_write_dir_block(ext2_filsys fs, blk_t block,
					void *buf);
661 662
extern errcode_t ext2fs_write_dir_block2(ext2_filsys fs, blk_t block,
					 void *buf, int flags);
Theodore Ts'o's avatar
Theodore Ts'o committed
663

664 665
/* dirhash.c */
extern errcode_t ext2fs_dirhash(int version, const char *name, int len,
666
				const __u32 *seed,
667 668
				ext2_dirhash_t *ret_hash,
				ext2_dirhash_t *ret_minor_hash);
669 670


Theodore Ts'o's avatar
Theodore Ts'o committed
671 672
/* dir_iterate.c */
extern errcode_t ext2fs_dir_iterate(ext2_filsys fs, 
Theodore Ts'o's avatar
Theodore Ts'o committed
673
			      ext2_ino_t dir,
Theodore Ts'o's avatar
Theodore Ts'o committed
674 675 676 677 678 679
			      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
680 681
					  void	*priv_data),
			      void *priv_data);
682 683 684 685 686 687 688 689 690 691 692 693
extern errcode_t ext2fs_dir_iterate2(ext2_filsys fs, 
			      ext2_ino_t dir,
			      int flags,
			      char *block_buf,
			      int (*func)(ext2_ino_t	dir,
					  int	entry,
					  struct ext2_dir_entry *dirent,
					  int	offset,
					  int	blocksize,
					  char	*buf,
					  void	*priv_data),
			      void *priv_data);
Theodore Ts'o's avatar
Theodore Ts'o committed
694

Theodore Ts'o's avatar
Theodore Ts'o committed
695 696
/* dupfs.c */
extern errcode_t ext2fs_dup_handle(ext2_filsys src, ext2_filsys *dest);
Theodore Ts'o's avatar
Theodore Ts'o committed
697

Theodore Ts'o's avatar
Theodore Ts'o committed
698
/* expanddir.c */
Theodore Ts'o's avatar
Theodore Ts'o committed
699
extern errcode_t ext2fs_expand_dir(ext2_filsys fs, ext2_ino_t dir);
Theodore Ts'o's avatar
Theodore Ts'o committed
700

701 702
/* ext_attr.c */
extern errcode_t ext2fs_read_ext_attr(ext2_filsys fs, blk_t block, void *buf);
703 704 705 706 707 708
extern errcode_t ext2fs_write_ext_attr(ext2_filsys fs, blk_t block,
				       void *buf);
extern errcode_t ext2fs_adjust_ea_refcount(ext2_filsys fs, blk_t blk,
					   char *block_buf,
					   int adjust, __u32 *newcount);

Theodore Ts'o's avatar
Theodore Ts'o committed
709
/* fileio.c */
710 711 712
extern errcode_t ext2fs_file_open2(ext2_filsys fs, ext2_ino_t ino,
				   struct ext2_inode *inode,
				   int flags, ext2_file_t *ret);
Theodore Ts'o's avatar
Theodore Ts'o committed
713
extern errcode_t ext2fs_file_open(ext2_filsys fs, ext2_ino_t ino,
Theodore Ts'o's avatar
Theodore Ts'o committed
714
				  int flags, ext2_file_t *ret);
715
extern ext2_filsys ext2fs_file_get_fs(ext2_file_t file);
Theodore Ts'o's avatar
Theodore Ts'o committed
716
extern errcode_t ext2fs_file_close(ext2_file_t file);
717
extern errcode_t ext2fs_file_flush(ext2_file_t file);
Theodore Ts'o's avatar
Theodore Ts'o committed
718
extern errcode_t ext2fs_file_read(ext2_file_t file, void *buf,
719
				  unsigned int wanted, unsigned int *got);
720
extern errcode_t ext2fs_file_write(ext2_file_t file, const void *buf,
721
				   unsigned int nbytes, unsigned int *written);
722 723
extern errcode_t ext2fs_file_llseek(ext2_file_t file, __u64 offset,
				   int whence, __u64 *ret_pos);
Theodore Ts'o's avatar
Theodore Ts'o committed
724 725
extern errcode_t ext2fs_file_lseek(ext2_file_t file, ext2_off_t offset,
				   int whence, ext2_off_t *ret_pos);
726
errcode_t ext2fs_file_get_lsize(ext2_file_t file, __u64 *ret_size);
727 728
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
729

730 731 732
/* finddev.c */
extern char *ext2fs_find_block_device(dev_t device);

733 734 735
/* flushb.c */
extern errcode_t ext2fs_sync_device(int fd, int flushb);

Theodore Ts'o's avatar
Theodore Ts'o committed
736 737
/* freefs.c */
extern void ext2fs_free(ext2_filsys fs);
Theodore Ts'o's avatar
Theodore Ts'o committed
738
extern void ext2fs_free_generic_bitmap(ext2fs_inode_bitmap bitmap);
Theodore Ts'o's avatar
Theodore Ts'o committed
739 740
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
741
extern void ext2fs_free_dblist(ext2_dblist dblist);
742 743
extern void ext2fs_badblocks_list_free(ext2_badblocks_list bb);
extern void ext2fs_u32_list_free(ext2_u32_list bb);
Theodore Ts'o's avatar
Theodore Ts'o committed
744 745 746 747

/* 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
748

749 750 751
/* getsectsize.c */
errcode_t ext2fs_get_device_sectsize(const char *file, int *sectsize);

752 753 754 755 756 757 758 759
/* imager.c */
extern errcode_t ext2fs_image_inode_write(ext2_filsys fs, int fd, int flags);
extern errcode_t ext2fs_image_inode_read(ext2_filsys fs, int fd, int flags);
extern errcode_t ext2fs_image_super_write(ext2_filsys fs, int fd, int flags);
extern errcode_t ext2fs_image_super_read(ext2_filsys fs, int fd, int flags);
extern errcode_t ext2fs_image_bitmap_write(ext2_filsys fs, int fd, int flags);
extern errcode_t ext2fs_image_bitmap_read(ext2_filsys fs, int fd, int flags);

760 761 762 763
/* ind_block.c */
errcode_t ext2fs_read_ind_block(ext2_filsys fs, blk_t blk, void *buf);
errcode_t ext2fs_write_ind_block(ext2_filsys fs, blk_t blk, void *buf);

Theodore Ts'o's avatar
Theodore Ts'o committed
764 765 766 767 768
/* initialize.c */
extern errcode_t ext2fs_initialize(const char *name, int flags,
				   struct ext2_super_block *param,
				   io_manager manager, ext2_filsys *ret_fs);

769 770
/* icount.c */
extern void ext2fs_free_icount(ext2_icount_t icount);
Theodore Ts'o's avatar
Theodore Ts'o committed
771 772
extern errcode_t ext2fs_create_icount2(ext2_filsys fs, int flags, 
				       unsigned int size,
773
				       ext2_icount_t hint, ext2_icount_t *ret);
Theodore Ts'o's avatar
Theodore Ts'o committed
774 775
extern errcode_t ext2fs_create_icount(ext2_filsys fs, int flags, 
				      unsigned int size,
776 777 778 779 780 781 782 783 784 785 786 787
				      ext2_icount_t *ret);
extern errcode_t ext2fs_icount_fetch(ext2_icount_t icount, ext2_ino_t ino,
				     __u16 *ret);
extern errcode_t ext2fs_icount_increment(ext2_icount_t icount, ext2_ino_t ino,
					 __u16 *ret);
extern errcode_t ext2fs_icount_decrement(ext2_icount_t icount, ext2_ino_t ino,
					 __u16 *ret);
extern errcode_t ext2fs_icount_store(ext2_icount_t icount, ext2_ino_t ino,
				     __u16 count);
extern ext2_ino_t ext2fs_get_icount_size(ext2_icount_t icount);
errcode_t ext2fs_icount_validate(ext2_icount_t icount, FILE *);

Theodore Ts'o's avatar
Theodore Ts'o committed
788
/* inode.c */
789
extern errcode_t ext2fs_flush_icache(ext2_filsys fs);
790 791 792 793
extern errcode_t ext2fs_get_next_inode_full(ext2_inode_scan scan, 
					    ext2_ino_t *ino,
					    struct ext2_inode *inode, 
					    int bufsize);
Theodore Ts'o's avatar
Theodore Ts'o committed
794 795 796
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);
Theodore Ts'o's avatar
Theodore Ts'o committed
797
extern errcode_t ext2fs_get_next_inode(ext2_inode_scan scan, ext2_ino_t *ino,
Theodore Ts'o's avatar
Theodore Ts'o committed
798
			       struct ext2_inode *inode);
Theodore Ts'o's avatar
Theodore Ts'o committed
799 800 801 802 803 804 805
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
806
				 void * priv_data),
Theodore Ts'o's avatar
Theodore Ts'o committed
807 808 809
	 void *done_group_data);
extern int ext2fs_inode_scan_flags(ext2_inode_scan scan, int set_flags,
				   int clear_flags);
810 811 812
extern errcode_t ext2fs_read_inode_full(ext2_filsys fs, ext2_ino_t ino,
					struct ext2_inode * inode, 
					int bufsize);
Theodore Ts'o's avatar
Theodore Ts'o committed
813
extern errcode_t ext2fs_read_inode (ext2_filsys fs, ext2_ino_t ino,
Theodore Ts'o's avatar
Theodore Ts'o committed
814
			    struct ext2_inode * inode);
815 816 817
extern errcode_t ext2fs_write_inode_full(ext2_filsys fs, ext2_ino_t ino,
					 struct ext2_inode * inode, 
					 int bufsize);
Theodore Ts'o's avatar
Theodore Ts'o committed
818
extern errcode_t ext2fs_write_inode(ext2_filsys fs, ext2_ino_t ino,
Theodore Ts'o's avatar
Theodore Ts'o committed
819
			    struct ext2_inode * inode);
820 821
extern errcode_t ext2fs_write_new_inode(ext2_filsys fs, ext2_ino_t ino,
			    struct ext2_inode * inode);
Theodore Ts'o's avatar
Theodore Ts'o committed
822 823
extern errcode_t ext2fs_get_blocks(ext2_filsys fs, ext2_ino_t ino, blk_t *blocks);
extern errcode_t ext2fs_check_directory(ext2_filsys fs, ext2_ino_t ino);
Theodore Ts'o's avatar
Theodore Ts'o committed
824

825 826
/* inode_io.c */
extern io_manager inode_io_manager;
827 828
extern errcode_t ext2fs_inode_io_intern(ext2_filsys fs, ext2_ino_t ino, 
					char **name);
829 830 831
extern errcode_t ext2fs_inode_io_intern2(ext2_filsys fs, ext2_ino_t ino,
					 struct ext2_inode *inode,
					 char **name);
832
	
Theodore Ts'o's avatar
Theodore Ts'o committed
833 834
/* ismounted.c */
extern errcode_t ext2fs_check_if_mounted(const char *file, int *mount_flags);
835 836
extern errcode_t ext2fs_check_mount_point(const char *device, int *mount_flags,
					  char *mtpt, int mtlen);
Theodore Ts'o's avatar
Theodore Ts'o committed
837

Theodore Ts'o's avatar
Theodore Ts'o committed
838
/* namei.c */
Theodore Ts'o's avatar
Theodore Ts'o committed
839 840 841 842 843 844 845 846
extern errcode_t ext2fs_lookup(ext2_filsys fs, ext2_ino_t dir, const char *name,
			 int namelen, char *buf, ext2_ino_t *inode);
extern errcode_t ext2fs_namei(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
			const char *name, ext2_ino_t *inode);
errcode_t ext2fs_namei_follow(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
			      const char *name, ext2_ino_t *inode);
extern errcode_t ext2fs_follow_link(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
			ext2_ino_t inode, ext2_ino_t *res_inode);
Theodore Ts'o's avatar
Theodore Ts'o committed
847 848 849

/* native.c */
int ext2fs_native_flag(void);
Theodore Ts'o's avatar
Theodore Ts'o committed
850 851

/* newdir.c */
Theodore Ts'o's avatar
Theodore Ts'o committed
852 853
extern errcode_t ext2fs_new_dir_block(ext2_filsys fs, ext2_ino_t dir_ino,
				ext2_ino_t parent_ino, char **block);
Theodore Ts'o's avatar
Theodore Ts'o committed
854 855

/* mkdir.c */
Theodore Ts'o's avatar
Theodore Ts'o committed
856
extern errcode_t ext2fs_mkdir(ext2_filsys fs, ext2_ino_t parent, ext2_ino_t inum,
Theodore Ts'o's avatar
Theodore Ts'o committed
857 858
			      const char *name);

859
/* mkjournal.c */
860 861 862 863 864
extern errcode_t ext2fs_create_journal_superblock(ext2_filsys fs,
						  __u32 size, int flags,
						  char  **ret_jsb);
extern errcode_t ext2fs_add_journal_device(ext2_filsys fs,
					   ext2_filsys journal_dev);
865 866
extern errcode_t ext2fs_add_journal_inode(ext2_filsys fs, blk_t size,
					  int flags);
867

Theodore Ts'o's avatar
Theodore Ts'o committed
868 869
/* openfs.c */
extern errcode_t ext2fs_open(const char *name, int flags, int superblock,
Theodore Ts'o's avatar
Theodore Ts'o committed
870
			     unsigned int block_size, io_manager manager,
Theodore Ts'o's avatar
Theodore Ts'o committed
871
			     ext2_filsys *ret_fs);
872 873 874 875
extern errcode_t ext2fs_open2(const char *name, const char *io_options, 
			      int flags, int superblock, 
			      unsigned int block_size, io_manager manager,
			      ext2_filsys *ret_fs);
876 877
extern blk_t ext2fs_descriptor_block_loc(ext2_filsys fs, blk_t group_block, 
					 dgrp_t i);
878 879 880
errcode_t ext2fs_get_data_io(ext2_filsys fs, io_channel *old_io);
errcode_t ext2fs_set_data_io(ext2_filsys fs, io_channel new_io);
errcode_t ext2fs_rewrite_to_io(ext2_filsys fs, io_channel new_io);
Theodore Ts'o's avatar
Theodore Ts'o committed
881 882

/* get_pathname.c */
Theodore Ts'o's avatar
Theodore Ts'o committed
883
extern errcode_t ext2fs_get_pathname(ext2_filsys fs, ext2_ino_t dir, ext2_ino_t ino,
Theodore Ts'o's avatar
Theodore Ts'o committed
884 885 886
			       char **name);

/* link.c */
Theodore Ts'o's avatar
Theodore Ts'o committed
887 888 889 890
errcode_t ext2fs_link(ext2_filsys fs, ext2_ino_t dir, const char *name,
		      ext2_ino_t ino, int flags);
errcode_t ext2fs_unlink(ext2_filsys fs, ext2_ino_t dir, const char *name,
			ext2_ino_t ino, int flags);
Theodore Ts'o's avatar
Theodore Ts'o committed
891 892

/* read_bb.c */
Theodore Ts'o's avatar
Theodore Ts'o committed
893 894
extern errcode_t ext2fs_read_bb_inode(ext2_filsys fs,
				      ext2_badblocks_list *bb_list);
Theodore Ts'o's avatar
Theodore Ts'o committed
895 896

/* read_bb_file.c */
Theodore Ts'o's avatar
Theodore Ts'o committed
897 898
extern errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f, 
				      ext2_badblocks_list *bb_list,
899
				      void *priv_data,
Theodore Ts'o's avatar
Theodore Ts'o committed
900 901 902
				      void (*invalid)(ext2_filsys fs,
						      blk_t blk,
						      char *badstr,
903
						      void *priv_data));
Theodore Ts'o's avatar
Theodore Ts'o committed
904
extern errcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f, 
Theodore Ts'o's avatar
Theodore Ts'o committed
905
				     ext2_badblocks_list *bb_list,
Theodore Ts'o's avatar
Theodore Ts'o committed
906 907 908
				     void (*invalid)(ext2_filsys fs,
						     blk_t blk));

909 910 911
/* res_gdt.c */
extern errcode_t ext2fs_create_resize_inode(ext2_filsys fs);

Theodore Ts'o's avatar
Theodore Ts'o committed
912 913 914 915 916 917 918 919
/* 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
920 921
extern errcode_t ext2fs_copy_bitmap(ext2fs_generic_bitmap src,
				    ext2fs_generic_bitmap *dest);
Theodore Ts'o's avatar
Theodore Ts'o committed
922

Theodore Ts'o's avatar
Theodore Ts'o committed
923
/* swapfs.c */
924 925
extern void ext2fs_swap_ext_attr(char *to, char *from, int bufsize, 
				 int has_header);
Theodore Ts'o's avatar
Theodore Ts'o committed
926 927
extern void ext2fs_swap_super(struct ext2_super_block * super);
extern void ext2fs_swap_group_desc(struct ext2_group_desc *gdp);
928 929 930
extern void ext2fs_swap_inode_full(ext2_filsys fs, struct ext2_inode_large *t,
				   struct ext2_inode_large *f, int hostorder,
				   int bufsize);
Theodore Ts'o's avatar
Theodore Ts'o committed
931 932 933
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
934
/* valid_blk.c */
Theodore Ts'o's avatar
Theodore Ts'o committed
935 936 937 938 939 940
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
941

Theodore Ts'o's avatar
Theodore Ts'o committed
942 943 944 945 946 947
/* write_bb_file.c */
extern errcode_t ext2fs_write_bb_FILE(ext2_badblocks_list bb_list,
				      unsigned int flags,
				      FILE *f);


Theodore Ts'o's avatar
Theodore Ts'o committed
948
/* inline functions */
949 950
extern errcode_t ext2fs_get_mem(unsigned long size, void *ptr);
extern errcode_t ext2fs_free_mem(void *ptr);
Theodore Ts'o's avatar
Theodore Ts'o committed
951
extern errcode_t ext2fs_resize_mem(unsigned long old_size,
952
				   unsigned long size, void *ptr);
Theodore Ts'o's avatar
Theodore Ts'o committed
953 954 955 956 957 958 959 960 961 962 963
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);
Theodore Ts'o's avatar
Theodore Ts'o committed
964
extern int ext2fs_group_of_ino(ext2_filsys fs, ext2_ino_t ino);
965 966
extern blk_t ext2fs_inode_data_blocks(ext2_filsys fs,
				      struct ext2_inode *inode);
Theodore Ts'o's avatar
Theodore Ts'o committed
967 968 969 970 971 972 973 974 975 976 977

/*
 * 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
978
#ifdef __GNUC__
Theodore Ts'o's avatar
Theodore Ts'o committed
979
#define _INLINE_ extern __inline__
Theodore Ts'o's avatar
Theodore Ts'o committed
980 981 982
#else				/* For Watcom C */
#define _INLINE_ extern inline
#endif
Theodore Ts'o's avatar
Theodore Ts'o committed
983 984
#endif

Theodore Ts'o's avatar
Theodore Ts'o committed
985 986 987 988
#ifndef EXT2_CUSTOM_MEMORY_ROUTINES
/*
 *  Allocate memory
 */
989
_INLINE_ errcode_t ext2fs_get_mem(unsigned long size, void *ptr)
Theodore Ts'o's avatar
Theodore Ts'o committed
990
{
991 992 993 994
	void **pp = (void **)ptr;

	*pp = malloc(size);
	if (!*pp)
995
		return EXT2_ET_NO_MEMORY;
Theodore Ts'o's avatar
Theodore Ts'o committed
996 997 998 999 1000 1001
	return 0;
}

/*
 * Free memory
 */
1002
_INLINE_ errcode_t ext2fs_free_mem(void *ptr)
Theodore Ts'o's avatar
Theodore Ts'o committed
1003
{
1004 1005 1006 1007
	void **pp = (void **)ptr;

	free(*pp);
	*pp = 0;
Theodore Ts'o's avatar
Theodore Ts'o committed
1008 1009 1010 1011 1012 1013
	return 0;
}
	
/*
 *  Resize memory
 */
1014
_INLINE_ errcode_t ext2fs_resize_mem(unsigned long EXT2FS_ATTR((unused)) old_size,
1015
				     unsigned long size, void *ptr)
Theodore Ts'o's avatar
Theodore Ts'o committed
1016 1017 1018
{
	void *p;

1019 1020 1021 1022
	/* Use "memcpy" for pointer assignments here to avoid problems
	 * with C99 strict type aliasing rules. */
	memcpy(&p, ptr, sizeof (p));
	p = realloc(p, size);
Theodore Ts'o's avatar
Theodore Ts'o committed
1023
	if (!p)
1024
		return EXT2_ET_NO_MEMORY;
1025
	memcpy(ptr, &p, sizeof (p));
Theodore Ts'o's avatar
Theodore Ts'o committed
1026 1027 1028 1029
	return 0;
}
#endif	/* Custom memory routines */

Theodore Ts'o's avatar
Theodore Ts'o committed
1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121
/*
 * 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
 */
Theodore Ts'o's avatar
Theodore Ts'o committed
1122
_INLINE_ int ext2fs_group_of_ino(ext2_filsys fs, ext2_ino_t ino)
Theodore Ts'o's avatar
Theodore Ts'o committed
1123 1124 1125
{
	return (ino - 1) / fs->super->s_inodes_per_group;
}
1126 1127 1128 1129 1130 1131 1132

_INLINE_ blk_t ext2fs_inode_data_blocks(ext2_filsys fs,
					struct ext2_inode *inode)
{
       return inode->i_blocks -
              (inode->i_file_acl ? fs->blocksize >> 9 : 0);
}
Theodore Ts'o's avatar
Theodore Ts'o committed
1133 1134 1135
#undef _INLINE_
#endif

Theodore Ts'o's avatar
Theodore Ts'o committed
1136 1137 1138 1139
#ifdef __cplusplus
}
#endif

1140
#endif /* _EXT2FS_EXT2FS_H */