ext2fs.h revision 1d667534e93e78eedbf2efcef6d7844041675f26
13839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
23839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * ext2fs.h --- ext2fs
33839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o *
419c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o.
519c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o *
619c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * %Begin-Header%
719c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * This file may be redistributed under the terms of the GNU Public
819c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * License.
919c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * %End-Header%
103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
129abd2ce914f9373fb676f0bb620ffba3a0e3c49eTheodore Ts'o#ifndef _EXT2FS_EXT2FS_H
139abd2ce914f9373fb676f0bb620ffba3a0e3c49eTheodore Ts'o#define _EXT2FS_EXT2FS_H
149abd2ce914f9373fb676f0bb620ffba3a0e3c49eTheodore Ts'o
15544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o#ifdef __GNUC__
16544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o#define EXT2FS_ATTR(x) __attribute__(x)
17544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o#else
18544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o#define EXT2FS_ATTR(x)
19544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o#endif
20544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o
21fa7ef7176ee66aaaec58a24c5a5523c4afb550ddTheodore Ts'o#ifdef __cplusplus
22fa7ef7176ee66aaaec58a24c5a5523c4afb550ddTheodore Ts'oextern "C" {
23fa7ef7176ee66aaaec58a24c5a5523c4afb550ddTheodore Ts'o#endif
24fa7ef7176ee66aaaec58a24c5a5523c4afb550ddTheodore Ts'o
253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
2619c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * Non-GNU C compilers won't necessarily understand inline
2719c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o */
2876f875daa1c9c2cdc72f0c6f0f7be4bbc7f0fc07Theodore Ts'o#if (!defined(__GNUC__) && !defined(__WATCOMC__))
2919c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o#define NO_INLINE_FUNCS
3019c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o#endif
3119c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o
3219c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o/*
335df55d7f847e29d23227592a0bb23daad1a61500Theodore Ts'o * Build in support for byte-swapping filesystems if we the feature
345df55d7f847e29d23227592a0bb23daad1a61500Theodore Ts'o * has been configured or if we're being built on a CPU architecture
355df55d7f847e29d23227592a0bb23daad1a61500Theodore Ts'o * with a non-native byte order.
365df55d7f847e29d23227592a0bb23daad1a61500Theodore Ts'o */
375df55d7f847e29d23227592a0bb23daad1a61500Theodore Ts'o#if defined(ENABLE_SWAPFS) || defined(WORDS_BIGENDIAN)
385df55d7f847e29d23227592a0bb23daad1a61500Theodore Ts'o#define EXT2FS_ENABLE_SWAPFS
395df55d7f847e29d23227592a0bb23daad1a61500Theodore Ts'o#endif
405df55d7f847e29d23227592a0bb23daad1a61500Theodore Ts'o
415df55d7f847e29d23227592a0bb23daad1a61500Theodore Ts'o/*
423839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Where the master copy of the superblock is located, and how big
433839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * superblocks are supposed to be.  We define SUPERBLOCK_SIZE because
443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * the size of the superblock structure is not necessarily trustworthy
453839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * (some versions have the padding set up so that the superblock is
463839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * 1032 bytes long).
473839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
483839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define SUPERBLOCK_OFFSET	1024
493839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define SUPERBLOCK_SIZE 	1024
503839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
51f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o/*
52f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o * The last ext2fs revision level that this version of the library is
53f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o * able to support.
54f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o */
55e5b38a5fafe4807b54d90a2e70bddf4b41b1695bTheodore Ts'o#define EXT2_LIB_CURRENT_REV	EXT2_DYNAMIC_REV
56f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
57d40259fd552d942903f2fd0b426c75a5c2516017Theodore Ts'o#ifdef HAVE_SYS_TYPES_H
581e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#include <sys/types.h>
59d40259fd552d942903f2fd0b426c75a5c2516017Theodore Ts'o#endif
60d40259fd552d942903f2fd0b426c75a5c2516017Theodore Ts'o
613e69906495d5898849a6154b0311b5d4a84a27aeTheodore Ts'o#include <stdio.h>
625be8dc2143c7b3b21a9b8fb56797dd855ee87560Theodore Ts'o#include <stdlib.h>
635953b9de9ce59661640f851b217421d734bb0302Theodore Ts'o
645953b9de9ce59661640f851b217421d734bb0302Theodore Ts'o#if EXT2_FLAT_INCLUDES
655953b9de9ce59661640f851b217421d734bb0302Theodore Ts'o#include "e2_types.h"
663e69906495d5898849a6154b0311b5d4a84a27aeTheodore Ts'o#include "ext2_fs.h"
675953b9de9ce59661640f851b217421d734bb0302Theodore Ts'o#else
68797f5ef14e92294b329e52971d467d7af5b2993eTheodore Ts'o#include <ext2fs/ext2_types.h>
693e69906495d5898849a6154b0311b5d4a84a27aeTheodore Ts'o#include <ext2fs/ext2_fs.h>
70e589f678e1ed5efa8dd4450f37bee0486caa3504Theodore Ts'o#endif /* EXT2_FLAT_INCLUDES */
7150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
7231dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'otypedef __u32		ext2_ino_t;
7350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'otypedef __u32		blk_t;
742eb374c9401079aa56aa12f0047ca3866e69b754Theodore Ts'otypedef __u32		dgrp_t;
7530fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'otypedef __u32		ext2_off_t;
7603673dbb04a3458ce78a394f27d17d434b51a714Theodore Ts'otypedef __s64		e2_blkcnt_t;
7752783e0ca72a80c549e9d266b3472f78fc61bdb2Theodore Ts'otypedef __u32		ext2_dirhash_t;
783839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
79b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o#if EXT2_FLAT_INCLUDES
80b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o#include "com_err.h"
81b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o#include "ext2_io.h"
82b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o#include "ext2_err.h"
83b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o#else
847c2d25699f2da458ba8201a375b00562d7a2469eTheodore Ts'o#include <et/com_err.h>
857c2d25699f2da458ba8201a375b00562d7a2469eTheodore Ts'o#include <ext2fs/ext2_io.h>
867c2d25699f2da458ba8201a375b00562d7a2469eTheodore Ts'o#include <ext2fs/ext2_err.h>
87b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o#endif
883839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
894c77fe50d97a773e32a4756c79dade3adbb6a601Theodore Ts'o/*
904c77fe50d97a773e32a4756c79dade3adbb6a601Theodore Ts'o * Portability help for Microsoft Visual C++
914c77fe50d97a773e32a4756c79dade3adbb6a601Theodore Ts'o */
924c77fe50d97a773e32a4756c79dade3adbb6a601Theodore Ts'o#ifdef _MSC_VER
934c77fe50d97a773e32a4756c79dade3adbb6a601Theodore Ts'o#define EXT2_QSORT_TYPE int __cdecl
944c77fe50d97a773e32a4756c79dade3adbb6a601Theodore Ts'o#else
954c77fe50d97a773e32a4756c79dade3adbb6a601Theodore Ts'o#define EXT2_QSORT_TYPE int
964c77fe50d97a773e32a4756c79dade3adbb6a601Theodore Ts'o#endif
974c77fe50d97a773e32a4756c79dade3adbb6a601Theodore Ts'o
98f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'otypedef struct struct_ext2_filsys *ext2_filsys;
99f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
1001e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'ostruct ext2fs_struct_generic_bitmap {
1014cbe8af4b0d0c72fb28bb500c1bd8a46b00fdde3Theodore Ts'o	errcode_t	magic;
1021e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	ext2_filsys 	fs;
1031e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	__u32		start, end;
1041e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	__u32		real_end;
1051e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	char	*	description;
1061e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	char	*	bitmap;
1071e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	errcode_t	base_error_code;
1081e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o	__u32		reserved[7];
109f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o};
110f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
1111e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#define EXT2FS_MARK_ERROR 	0
1121e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#define EXT2FS_UNMARK_ERROR 	1
1131e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#define EXT2FS_TEST_ERROR	2
114f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
1151e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'otypedef struct ext2fs_struct_generic_bitmap *ext2fs_generic_bitmap;
1161e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'otypedef struct ext2fs_struct_generic_bitmap *ext2fs_inode_bitmap;
1171e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'otypedef struct ext2fs_struct_generic_bitmap *ext2fs_block_bitmap;
118f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
1197f88b04341d88c5df0360d930832c38040303b61Theodore Ts'o#ifdef EXT2_DYNAMIC_REV
1207f88b04341d88c5df0360d930832c38040303b61Theodore Ts'o#define EXT2_FIRST_INODE(s)	EXT2_FIRST_INO(s)
1217f88b04341d88c5df0360d930832c38040303b61Theodore Ts'o#else
1227f88b04341d88c5df0360d930832c38040303b61Theodore Ts'o#define EXT2_FIRST_INODE(s)	EXT2_FIRST_INO
1237f88b04341d88c5df0360d930832c38040303b61Theodore Ts'o#define EXT2_INODE_SIZE(s)	sizeof(struct ext2_inode)
1247f88b04341d88c5df0360d930832c38040303b61Theodore Ts'o#endif
1257f88b04341d88c5df0360d930832c38040303b61Theodore Ts'o
1263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
12719c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * badblocks list definitions
12819c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o */
12919c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o
130b7a00563b22b0ea47ddc7117508c0b8e0d65df43Theodore Ts'otypedef struct ext2_struct_u32_list *ext2_badblocks_list;
131b7a00563b22b0ea47ddc7117508c0b8e0d65df43Theodore Ts'otypedef struct ext2_struct_u32_iterate *ext2_badblocks_iterate;
132b7a00563b22b0ea47ddc7117508c0b8e0d65df43Theodore Ts'o
133b7a00563b22b0ea47ddc7117508c0b8e0d65df43Theodore Ts'otypedef struct ext2_struct_u32_list *ext2_u32_list;
134b7a00563b22b0ea47ddc7117508c0b8e0d65df43Theodore Ts'otypedef struct ext2_struct_u32_iterate *ext2_u32_iterate;
13519c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o
13619c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o/* old */
137b7a00563b22b0ea47ddc7117508c0b8e0d65df43Theodore Ts'otypedef struct ext2_struct_u32_list *badblocks_list;
138b7a00563b22b0ea47ddc7117508c0b8e0d65df43Theodore Ts'otypedef struct ext2_struct_u32_iterate *badblocks_iterate;
13919c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o
14019c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o#define BADBLOCKS_FLAG_DIRTY	1
14119c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o
14219c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o/*
14319c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * ext2_dblist structure and abstractions (see dblist.c)
14419c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o */
14519c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'ostruct ext2_db_entry {
14631dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o	ext2_ino_t	ino;
14719c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o	blk_t	blk;
14819c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o	int	blockcnt;
14919c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o};
15019c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o
15119c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'otypedef struct ext2_struct_dblist *ext2_dblist;
15219c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o
15319c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o#define DBLIST_ABORT	1
15419c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o
15519c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o/*
15630fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o * ext2_fileio definitions
15730fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o */
15830fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o
15930fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o#define EXT2_FILE_WRITE		0x0001
16030fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o#define EXT2_FILE_CREATE	0x0002
16130fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o
16230fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o#define EXT2_FILE_MASK		0x00FF
16330fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o
16430fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o#define EXT2_FILE_BUF_DIRTY	0x4000
16530fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o#define EXT2_FILE_BUF_VALID	0x2000
16630fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o
16730fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'otypedef struct ext2_file *ext2_file_t;
16830fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o
16930fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o#define EXT2_SEEK_SET	0
17030fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o#define EXT2_SEEK_CUR	1
17130fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o#define EXT2_SEEK_END	2
17230fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o
17330fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o/*
174a112847b39386f9e7332ba5e5a0a5e54cfe301ccTheodore Ts'o * Flags for the ext2_filsys structure and for ext2fs_open()
1753839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
17619c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o#define EXT2_FLAG_RW			0x01
17719c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o#define EXT2_FLAG_CHANGED		0x02
17819c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o#define EXT2_FLAG_DIRTY			0x04
17919c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o#define EXT2_FLAG_VALID			0x08
18019c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o#define EXT2_FLAG_IB_DIRTY		0x10
18119c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o#define EXT2_FLAG_BB_DIRTY		0x20
1825c576477ccb2f0ca8c5d5af2e2354fd8eeff1589Theodore Ts'o#define EXT2_FLAG_SWAP_BYTES		0x40
1835c576477ccb2f0ca8c5d5af2e2354fd8eeff1589Theodore Ts'o#define EXT2_FLAG_SWAP_BYTES_READ	0x80
1845c576477ccb2f0ca8c5d5af2e2354fd8eeff1589Theodore Ts'o#define EXT2_FLAG_SWAP_BYTES_WRITE	0x100
1855c576477ccb2f0ca8c5d5af2e2354fd8eeff1589Theodore Ts'o#define EXT2_FLAG_MASTER_SB_ONLY	0x200
18619c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o#define EXT2_FLAG_FORCE			0x400
18743ec8734f2ecd0a345e831f45fd3dfb077426811Theodore Ts'o#define EXT2_FLAG_SUPER_ONLY		0x800
188a112847b39386f9e7332ba5e5a0a5e54cfe301ccTheodore Ts'o#define EXT2_FLAG_JOURNAL_DEV_OK	0x1000
189a78926effb15bbabb1c0ed3e438b03be25c4d48cTheodore Ts'o#define EXT2_FLAG_IMAGE_FILE		0x2000
1903839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
1917f88b04341d88c5df0360d930832c38040303b61Theodore Ts'o/*
1927f88b04341d88c5df0360d930832c38040303b61Theodore Ts'o * Special flag in the ext2 inode i_flag field that means that this is
1937f88b04341d88c5df0360d930832c38040303b61Theodore Ts'o * a new inode.  (So that ext2_write_inode() can clear extra fields.)
1947f88b04341d88c5df0360d930832c38040303b61Theodore Ts'o */
1957f88b04341d88c5df0360d930832c38040303b61Theodore Ts'o#define EXT2_NEW_INODE_FL	0x80000000
1967f88b04341d88c5df0360d930832c38040303b61Theodore Ts'o
1974e246704eab31407ac15be9ab206c6f929507cf0Theodore Ts'o/*
1984e246704eab31407ac15be9ab206c6f929507cf0Theodore Ts'o * Flags for mkjournal
1994e246704eab31407ac15be9ab206c6f929507cf0Theodore Ts'o *
2004e246704eab31407ac15be9ab206c6f929507cf0Theodore Ts'o * EXT2_MKJOURNAL_V1_SUPER	Make a (deprecated) V1 journal superblock
2014e246704eab31407ac15be9ab206c6f929507cf0Theodore Ts'o */
2024e246704eab31407ac15be9ab206c6f929507cf0Theodore Ts'o#define EXT2_MKJOURNAL_V1_SUPER	0x0000001
2034e246704eab31407ac15be9ab206c6f929507cf0Theodore Ts'o
2043839e65723771b85975f4263102dd3ceec4523cTheodore Ts'ostruct struct_ext2_filsys {
2054cbe8af4b0d0c72fb28bb500c1bd8a46b00fdde3Theodore Ts'o	errcode_t			magic;
2063839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	io_channel			io;
2073839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	int				flags;
2083839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	char *				device_name;
2093839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	struct ext2_super_block	* 	super;
210544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o	unsigned int			blocksize;
2113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	int				fragsize;
2122eb374c9401079aa56aa12f0047ca3866e69b754Theodore Ts'o	dgrp_t				group_desc_count;
2133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	unsigned long			desc_blocks;
2143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	struct ext2_group_desc *	group_desc;
2153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	int				inode_blocks_per_group;
216f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	ext2fs_inode_bitmap		inode_map;
217f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	ext2fs_block_bitmap		block_map;
21831dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o	errcode_t (*get_blocks)(ext2_filsys fs, ext2_ino_t ino, blk_t *blocks);
21931dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o	errcode_t (*check_directory)(ext2_filsys fs, ext2_ino_t ino);
2203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	errcode_t (*write_bitmaps)(ext2_filsys fs);
22131dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o	errcode_t (*read_inode)(ext2_filsys fs, ext2_ino_t ino,
2221e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o				struct ext2_inode *inode);
22331dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o	errcode_t (*write_inode)(ext2_filsys fs, ext2_ino_t ino,
2241e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o				struct ext2_inode *inode);
225b7a00563b22b0ea47ddc7117508c0b8e0d65df43Theodore Ts'o	ext2_badblocks_list		badblocks;
22619c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o	ext2_dblist			dblist;
227a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o	__u32				stride;	/* for mke2fs */
228c180ac86533bcbfb1560bd4aa01464785a760f70Theodore Ts'o	struct ext2_super_block *	orig_super;
229a78926effb15bbabb1c0ed3e438b03be25c4d48cTheodore Ts'o	struct ext2_image_hdr *		image_header;
2306a525069a99787ef3ae1156f12230044b3568f4bTheodore Ts'o	__u32				umask;
23119c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o	/*
23219c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o	 * Reserved for future expansion
23319c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o	 */
2346a525069a99787ef3ae1156f12230044b3568f4bTheodore Ts'o	__u32				reserved[8];
2353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
2363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	/*
237a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o	 * Reserved for the use of the calling application.
2383839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	 */
239b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o	void *				priv_data;
240a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o
241a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o	/*
242a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o	 * Inode cache
243a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o	 */
244a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o	struct ext2_inode_cache		*icache;
2451ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'o	io_channel			image_io;
2463839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o};
2473839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
2485953b9de9ce59661640f851b217421d734bb0302Theodore Ts'o#if EXT2_FLAT_INCLUDES
2495953b9de9ce59661640f851b217421d734bb0302Theodore Ts'o#include "e2_bitops.h"
2505953b9de9ce59661640f851b217421d734bb0302Theodore Ts'o#else
2517c2d25699f2da458ba8201a375b00562d7a2469eTheodore Ts'o#include <ext2fs/bitops.h>
2525953b9de9ce59661640f851b217421d734bb0302Theodore Ts'o#endif
253d40259fd552d942903f2fd0b426c75a5c2516017Theodore Ts'o
2543839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
2553839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Return flags for the block iterator functions
2563839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
2573839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define BLOCK_CHANGED	1
2583839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define BLOCK_ABORT	2
2593839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define BLOCK_ERROR	4
2603839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
2613839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
2623839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Block interate flags
26350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o *
26450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o * BLOCK_FLAG_APPEND, or BLOCK_FLAG_HOLE, indicates that the interator
26550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o * function should be called on blocks where the block number is zero.
26650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o * This is used by ext2fs_expand_dir() to be able to add a new block
26750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o * to an inode.  It can also be used for programs that want to be able
26850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o * to deal with files that contain "holes".
26950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o *
27050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o * BLOCK_FLAG_TRAVERSE indicates that the iterator function for the
27150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o * indirect, doubly indirect, etc. blocks should be called after all
27250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o * of the blocks containined in the indirect blocks are processed.
27350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o * This is useful if you are going to be deallocating blocks from an
27450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o * inode.
2751e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o *
2761e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o * BLOCK_FLAG_DATA_ONLY indicates that the iterator function should be
2771e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o * called for data blocks only.
278674a4ee1e3e05133ddad701730bfc21c283272a4Theodore Ts'o *
279674a4ee1e3e05133ddad701730bfc21c283272a4Theodore Ts'o * BLOCK_FLAG_NO_LARGE is for internal use only.  It informs
28036a43d675ef61d0f5d5b2ad62d2e670c408d14acTheodore Ts'o * ext2fs_block_iterate2 that large files won't be accepted.
2813839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
2823839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define BLOCK_FLAG_APPEND	1
28350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define BLOCK_FLAG_HOLE		1
2843839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define BLOCK_FLAG_DEPTH_TRAVERSE	2
2851e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#define BLOCK_FLAG_DATA_ONLY	4
2861e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
287674a4ee1e3e05133ddad701730bfc21c283272a4Theodore Ts'o#define BLOCK_FLAG_NO_LARGE	0x1000
288674a4ee1e3e05133ddad701730bfc21c283272a4Theodore Ts'o
2891e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o/*
2901e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o * Magic "block count" return values for the block iterator function.
2911e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o */
2921e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#define BLOCK_COUNT_IND		(-1)
2931e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#define BLOCK_COUNT_DIND	(-2)
2941e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#define BLOCK_COUNT_TIND	(-3)
2951e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#define BLOCK_COUNT_TRANSLATOR	(-4)
2963839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
2974a31c48b827f378f386b28461fd14b41d709e4ebTheodore Ts'o#if 0
2983839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
2991e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o * Flags for ext2fs_move_blocks
3001e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o */
3011e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o#define EXT2_BMOVE_GET_DBLIST	0x0001
30236f21439f5d8b2233d13e042833d4d921a5c2c40Theodore Ts'o#define EXT2_BMOVE_DEBUG	0x0002
3034a31c48b827f378f386b28461fd14b41d709e4ebTheodore Ts'o#endif
3041e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o
3051e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o/*
306f9190c8a95c6b76eac567d5896b3ed06ed2a3adaTheodore Ts'o * Flags for directory block reading and writing functions
307f9190c8a95c6b76eac567d5896b3ed06ed2a3adaTheodore Ts'o */
308f9190c8a95c6b76eac567d5896b3ed06ed2a3adaTheodore Ts'o#define EXT2_DIRBLOCK_V2_STRUCT	0x0001
309f9190c8a95c6b76eac567d5896b3ed06ed2a3adaTheodore Ts'o
310f9190c8a95c6b76eac567d5896b3ed06ed2a3adaTheodore Ts'o/*
3113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Return flags for the directory iterator functions
3123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
3133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define DIRENT_CHANGED	1
3143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define DIRENT_ABORT	2
3153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define DIRENT_ERROR	3
3163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
3173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
3183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Directory iterator flags
3193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
3203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
3213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define DIRENT_FLAG_INCLUDE_EMPTY	1
3228bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o#define DIRENT_FLAG_INCLUDE_REMOVED	2
32319c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o
32419c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o#define DIRENT_DOT_FILE		1
32519c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o#define DIRENT_DOT_DOT_FILE	2
32619c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o#define DIRENT_OTHER_FILE	3
3278bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o#define DIRENT_DELETED_FILE	4
32819c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o
3293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
3303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Inode scan definitions
3313839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
332f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'otypedef struct ext2_struct_inode_scan *ext2_inode_scan;
333f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
33419c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o/*
33519c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * ext2fs_scan flags
33619c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o */
33719c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o#define EXT2_SF_CHK_BADBLOCKS	0x0001
33819c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o#define EXT2_SF_BAD_INODE_BLK	0x0002
33919c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o#define EXT2_SF_BAD_EXTRA_BYTES	0x0004
34019c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o#define EXT2_SF_SKIP_MISSING_ITABLE	0x0008
3413839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
342f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o/*
34350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o * ext2fs_check_if_mounted flags
34450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o */
34550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define EXT2_MF_MOUNTED		1
34650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define EXT2_MF_ISROOT		2
34719c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o#define EXT2_MF_READONLY	4
34807cefe7a7051e32f14b93d9003a6dbb308597bd3Theodore Ts'o#define EXT2_MF_SWAP		8
34950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
35050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o/*
35150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o * Ext2/linux mode flags.  We define them here so that we don't need
35250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o * to depend on the OS's sys/stat.h, since we may be compiling on a
35350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o * non-Linux system.
35450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o */
35550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define LINUX_S_IFMT  00170000
35650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define LINUX_S_IFSOCK 0140000
35750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define LINUX_S_IFLNK	 0120000
35850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define LINUX_S_IFREG  0100000
35950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define LINUX_S_IFBLK  0060000
36050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define LINUX_S_IFDIR  0040000
36150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define LINUX_S_IFCHR  0020000
36250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define LINUX_S_IFIFO  0010000
36350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define LINUX_S_ISUID  0004000
36450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define LINUX_S_ISGID  0002000
36550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define LINUX_S_ISVTX  0001000
36650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
3671e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#define LINUX_S_IRWXU 00700
3681e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#define LINUX_S_IRUSR 00400
3691e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#define LINUX_S_IWUSR 00200
3701e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#define LINUX_S_IXUSR 00100
3711e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
3721e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#define LINUX_S_IRWXG 00070
3731e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#define LINUX_S_IRGRP 00040
3741e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#define LINUX_S_IWGRP 00020
3751e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#define LINUX_S_IXGRP 00010
3761e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
3771e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#define LINUX_S_IRWXO 00007
3781e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#define LINUX_S_IROTH 00004
3791e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#define LINUX_S_IWOTH 00002
3801e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o#define LINUX_S_IXOTH 00001
3811e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
38250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define LINUX_S_ISLNK(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFLNK)
38350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define LINUX_S_ISREG(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFREG)
38450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define LINUX_S_ISDIR(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFDIR)
38550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define LINUX_S_ISCHR(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFCHR)
38650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define LINUX_S_ISBLK(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFBLK)
38750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define LINUX_S_ISFIFO(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFIFO)
38850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o#define LINUX_S_ISSOCK(m)	(((m) & LINUX_S_IFMT) == LINUX_S_IFSOCK)
38950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
39050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o/*
391819157db798cd514aa2f3ae421d64e2e0c9b7fa8Theodore Ts'o * ext2 size of an inode
392819157db798cd514aa2f3ae421d64e2e0c9b7fa8Theodore Ts'o */
393819157db798cd514aa2f3ae421d64e2e0c9b7fa8Theodore Ts'o#define EXT2_I_SIZE(i)	((i)->i_size | ((__u64) (i)->i_size_high << 32))
394819157db798cd514aa2f3ae421d64e2e0c9b7fa8Theodore Ts'o
395819157db798cd514aa2f3ae421d64e2e0c9b7fa8Theodore Ts'o/*
39619c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o * ext2_icount_t abstraction
39719c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o */
39819c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o#define EXT2_ICOUNT_OPT_INCREMENT	0x01
39919c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o
40019c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'otypedef struct ext2_icount *ext2_icount_t;
40119c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o
40219c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o/*
40330fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o * Flags for ext2fs_bmap
40430fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o */
4051d667534e93e78eedbf2efcef6d7844041675f26Theodore Ts'o#define BMAP_ALLOC	0x0001
4061d667534e93e78eedbf2efcef6d7844041675f26Theodore Ts'o#define BMAP_SET	0x0002
40730fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o
40830fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o/*
40972ed12648368b3f3ea14e8102e20bf5d3a3be6d3Theodore Ts'o * Flags for imager.c functions
41072ed12648368b3f3ea14e8102e20bf5d3a3be6d3Theodore Ts'o */
41172ed12648368b3f3ea14e8102e20bf5d3a3be6d3Theodore Ts'o#define IMAGER_FLAG_INODEMAP	1
41272ed12648368b3f3ea14e8102e20bf5d3a3be6d3Theodore Ts'o#define IMAGER_FLAG_SPARSEWRITE	2
41372ed12648368b3f3ea14e8102e20bf5d3a3be6d3Theodore Ts'o
41472ed12648368b3f3ea14e8102e20bf5d3a3be6d3Theodore Ts'o/*
415f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o * For checking structure magic numbers...
416f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o */
4173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
418f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o#define EXT2_CHECK_MAGIC(struct, code) \
419f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o	  if ((struct)->magic != (code)) return (code)
4201e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
4211e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
4221e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o/*
423e5b38a5fafe4807b54d90a2e70bddf4b41b1695bTheodore Ts'o * For ext2 compression support
4241e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o */
4255a63dd28f23e31f4ed47073b558fc701adf83536Theodore Ts'o#define EXT2FS_COMPRESSED_BLKADDR ((blk_t) 0xffffffff)
4265a63dd28f23e31f4ed47073b558fc701adf83536Theodore Ts'o#define HOLE_BLKADDR(_b) ((_b) == 0 || (_b) == EXT2FS_COMPRESSED_BLKADDR)
4275a63dd28f23e31f4ed47073b558fc701adf83536Theodore Ts'o
428521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o/*
429426d734ff06e769cf5117053b6264c4a9decd3b2Theodore Ts'o * Features supported by this version of the library
430521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o */
4313a5f8eaa9741f6f14520ddd263a996e2764dd437Theodore Ts'o#define EXT2_LIB_FEATURE_COMPAT_SUPP	(EXT2_FEATURE_COMPAT_DIR_PREALLOC|\
4323a5f8eaa9741f6f14520ddd263a996e2764dd437Theodore Ts'o					 EXT2_FEATURE_COMPAT_IMAGIC_INODES|\
433342d847db355d81299218e07a1e58ece82080a04Theodore Ts'o					 EXT3_FEATURE_COMPAT_HAS_JOURNAL|\
434d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o					 EXT2_FEATURE_COMPAT_RESIZE_INODE|\
43552783e0ca72a80c549e9d266b3472f78fc61bdb2Theodore Ts'o					 EXT2_FEATURE_COMPAT_DIR_INDEX|\
436342d847db355d81299218e07a1e58ece82080a04Theodore Ts'o					 EXT2_FEATURE_COMPAT_EXT_ATTR)
4372fe1efe2e56dc9f8223992301aec3844dd9563e6Theodore Ts'o
4385a63dd28f23e31f4ed47073b558fc701adf83536Theodore Ts'o/* This #ifdef is temporary until compression is fully supported */
4395a63dd28f23e31f4ed47073b558fc701adf83536Theodore Ts'o#ifdef ENABLE_COMPRESSION
440e589f678e1ed5efa8dd4450f37bee0486caa3504Theodore Ts'o#ifndef I_KNOW_THAT_COMPRESSION_IS_EXPERIMENTAL
441e589f678e1ed5efa8dd4450f37bee0486caa3504Theodore Ts'o/* If the below warning bugs you, then have
442e589f678e1ed5efa8dd4450f37bee0486caa3504Theodore Ts'o   `CPPFLAGS=-DI_KNOW_THAT_COMPRESSION_IS_EXPERIMENTAL' in your
443e589f678e1ed5efa8dd4450f37bee0486caa3504Theodore Ts'o   environment at configure time. */
444cdaf1fa78f6d63457eb5337c14b23e567d1346a7Theodore Ts'o #warning "Compression support is experimental"
445e589f678e1ed5efa8dd4450f37bee0486caa3504Theodore Ts'o#endif
4465a63dd28f23e31f4ed47073b558fc701adf83536Theodore Ts'o#define EXT2_LIB_FEATURE_INCOMPAT_SUPP	(EXT2_FEATURE_INCOMPAT_FILETYPE|\
447ab146766e3c773ef532381328772ec5e9db9e40bTheodore Ts'o					 EXT2_FEATURE_INCOMPAT_COMPRESSION|\
448a112847b39386f9e7332ba5e5a0a5e54cfe301ccTheodore Ts'o					 EXT3_FEATURE_INCOMPAT_JOURNAL_DEV|\
449c046ac7f2e4c53e20cf1e909bbe511f91074b396Theodore Ts'o					 EXT2_FEATURE_INCOMPAT_META_BG|\
450ab146766e3c773ef532381328772ec5e9db9e40bTheodore Ts'o					 EXT3_FEATURE_INCOMPAT_RECOVER)
4515a63dd28f23e31f4ed47073b558fc701adf83536Theodore Ts'o#else
452ab146766e3c773ef532381328772ec5e9db9e40bTheodore Ts'o#define EXT2_LIB_FEATURE_INCOMPAT_SUPP	(EXT2_FEATURE_INCOMPAT_FILETYPE|\
453a112847b39386f9e7332ba5e5a0a5e54cfe301ccTheodore Ts'o					 EXT3_FEATURE_INCOMPAT_JOURNAL_DEV|\
454c046ac7f2e4c53e20cf1e909bbe511f91074b396Theodore Ts'o					 EXT2_FEATURE_INCOMPAT_META_BG|\
455ab146766e3c773ef532381328772ec5e9db9e40bTheodore Ts'o					 EXT3_FEATURE_INCOMPAT_RECOVER)
4565a63dd28f23e31f4ed47073b558fc701adf83536Theodore Ts'o#endif
457674a4ee1e3e05133ddad701730bfc21c283272a4Theodore Ts'o#define EXT2_LIB_FEATURE_RO_COMPAT_SUPP	(EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER|\
458674a4ee1e3e05133ddad701730bfc21c283272a4Theodore Ts'o					 EXT2_FEATURE_RO_COMPAT_LARGE_FILE)
4593839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
4603839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * function prototypes
4613839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
4623839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
4633839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* alloc.c */
46431dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern errcode_t ext2fs_new_inode(ext2_filsys fs, ext2_ino_t dir, int mode,
46531dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o				  ext2fs_inode_bitmap map, ext2_ino_t *ret);
4663839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern errcode_t ext2fs_new_block(ext2_filsys fs, blk_t goal,
467f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o				  ext2fs_block_bitmap map, blk_t *ret);
4683839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern errcode_t ext2fs_get_free_blocks(ext2_filsys fs, blk_t start,
469f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o					blk_t finish, int num,
470f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o					ext2fs_block_bitmap map,
4713839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o					blk_t *ret);
47230fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'oextern errcode_t ext2fs_alloc_block(ext2_filsys fs, blk_t goal,
47330fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o				    char *block_buf, blk_t *ret);
4743839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
475ef344e13d2125e9dae3764b98f9fe3a170cd79e2Theodore Ts'o/* alloc_sb.c */
476ef344e13d2125e9dae3764b98f9fe3a170cd79e2Theodore Ts'oextern int ext2fs_reserve_super_and_bgd(ext2_filsys fs,
477ef344e13d2125e9dae3764b98f9fe3a170cd79e2Theodore Ts'o					dgrp_t group,
478ef344e13d2125e9dae3764b98f9fe3a170cd79e2Theodore Ts'o					ext2fs_block_bitmap bmap);
479ef344e13d2125e9dae3764b98f9fe3a170cd79e2Theodore Ts'o
4808bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o/* alloc_stats.c */
4818bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'ovoid ext2fs_inode_alloc_stats(ext2_filsys fs, ext2_ino_t ino, int inuse);
4827f961d424b1ba527e835d01ad24e0e4c3f4088c5Theodore Ts'ovoid ext2fs_inode_alloc_stats2(ext2_filsys fs, ext2_ino_t ino,
4837f961d424b1ba527e835d01ad24e0e4c3f4088c5Theodore Ts'o			       int inuse, int isdir);
4848bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'ovoid ext2fs_block_alloc_stats(ext2_filsys fs, blk_t blk, int inuse);
4858bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o
4861e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o/* alloc_tables.c */
4871e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'oextern errcode_t ext2fs_allocate_tables(ext2_filsys fs);
4882eb374c9401079aa56aa12f0047ca3866e69b754Theodore Ts'oextern errcode_t ext2fs_allocate_group_table(ext2_filsys fs, dgrp_t group,
4891e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o					     ext2fs_block_bitmap bmap);
49019c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o
4913839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* badblocks.c */
492b7a00563b22b0ea47ddc7117508c0b8e0d65df43Theodore Ts'oextern errcode_t ext2fs_u32_list_create(ext2_u32_list *ret, int size);
493b7a00563b22b0ea47ddc7117508c0b8e0d65df43Theodore Ts'oextern errcode_t ext2fs_u32_list_add(ext2_u32_list bb, __u32 blk);
494544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'oextern int ext2fs_u32_list_find(ext2_u32_list bb, __u32 blk);
495b7a00563b22b0ea47ddc7117508c0b8e0d65df43Theodore Ts'oextern int ext2fs_u32_list_test(ext2_u32_list bb, blk_t blk);
496b7a00563b22b0ea47ddc7117508c0b8e0d65df43Theodore Ts'oextern errcode_t ext2fs_u32_list_iterate_begin(ext2_u32_list bb,
497b7a00563b22b0ea47ddc7117508c0b8e0d65df43Theodore Ts'o					       ext2_u32_iterate *ret);
498b7a00563b22b0ea47ddc7117508c0b8e0d65df43Theodore Ts'oextern int ext2fs_u32_list_iterate(ext2_u32_iterate iter, blk_t *blk);
499b7a00563b22b0ea47ddc7117508c0b8e0d65df43Theodore Ts'oextern void ext2fs_u32_list_iterate_end(ext2_u32_iterate iter);
500b7a00563b22b0ea47ddc7117508c0b8e0d65df43Theodore Ts'oextern errcode_t ext2fs_u32_copy(ext2_u32_list src, ext2_u32_list *dest);
501b7a00563b22b0ea47ddc7117508c0b8e0d65df43Theodore Ts'oextern int ext2fs_u32_list_equal(ext2_u32_list bb1, ext2_u32_list bb2);
502b7a00563b22b0ea47ddc7117508c0b8e0d65df43Theodore Ts'o
50319c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'oextern errcode_t ext2fs_badblocks_list_create(ext2_badblocks_list *ret,
50419c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o					    int size);
50519c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'oextern errcode_t ext2fs_badblocks_list_add(ext2_badblocks_list bb,
50619c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o					   blk_t blk);
50719c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'oextern int ext2fs_badblocks_list_test(ext2_badblocks_list bb,
50819c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o				    blk_t blk);
5097d7bdd578b307cad1dc248310eb279c6fb73b682Theodore Ts'oextern int ext2fs_u32_list_del(ext2_u32_list bb, __u32 blk);
5107d7bdd578b307cad1dc248310eb279c6fb73b682Theodore Ts'oextern void ext2fs_badblocks_list_del(ext2_u32_list bb, __u32 blk);
51119c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'oextern errcode_t
51219c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o	ext2fs_badblocks_list_iterate_begin(ext2_badblocks_list bb,
51319c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o					    ext2_badblocks_iterate *ret);
51419c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'oextern int ext2fs_badblocks_list_iterate(ext2_badblocks_iterate iter,
51519c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o					 blk_t *blk);
51619c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'oextern void ext2fs_badblocks_list_iterate_end(ext2_badblocks_iterate iter);
517a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'oextern errcode_t ext2fs_badblocks_copy(ext2_badblocks_list src,
518a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o				       ext2_badblocks_list *dest);
51957dca85467cf3fc61565e916a5f2e35db8020d88Theodore Ts'oextern int ext2fs_badblocks_equal(ext2_badblocks_list bb1,
52057dca85467cf3fc61565e916a5f2e35db8020d88Theodore Ts'o				  ext2_badblocks_list bb2);
521220c0040fb4a5e8a2a091a9e3a936bb8a85223d8Theodore Ts'oextern int ext2fs_u32_list_count(ext2_u32_list bb);
52219c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o
52319c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o/* bb_compat */
5243839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern errcode_t badblocks_list_create(badblocks_list *ret, int size);
5253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern errcode_t badblocks_list_add(badblocks_list bb, blk_t blk);
5263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern int badblocks_list_test(badblocks_list bb, blk_t blk);
5273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern errcode_t badblocks_list_iterate_begin(badblocks_list bb,
5283839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o					      badblocks_iterate *ret);
5293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern int badblocks_list_iterate(badblocks_iterate iter, blk_t *blk);
5303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern void badblocks_list_iterate_end(badblocks_iterate iter);
531a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'oextern void badblocks_list_free(badblocks_list bb);
5323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
5333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* bb_inode.c */
5343839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern errcode_t ext2fs_update_bb_inode(ext2_filsys fs,
53519c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o					ext2_badblocks_list bb_list);
5363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
5373839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* bitmaps.c */
5383839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern errcode_t ext2fs_write_inode_bitmap(ext2_filsys fs);
5393839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern errcode_t ext2fs_write_block_bitmap (ext2_filsys fs);
5403839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern errcode_t ext2fs_read_inode_bitmap (ext2_filsys fs);
5413839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern errcode_t ext2fs_read_block_bitmap(ext2_filsys fs);
5421e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'oextern errcode_t ext2fs_allocate_generic_bitmap(__u32 start,
5431e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o						__u32 end,
5441e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o						__u32 real_end,
5451e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o						const char *descr,
5461e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o						ext2fs_generic_bitmap *ret);
54750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern errcode_t ext2fs_allocate_block_bitmap(ext2_filsys fs,
54850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					      const char *descr,
54950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					      ext2fs_block_bitmap *ret);
55050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern errcode_t ext2fs_allocate_inode_bitmap(ext2_filsys fs,
55150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					      const char *descr,
55250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					      ext2fs_inode_bitmap *ret);
55350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern errcode_t ext2fs_fudge_inode_bitmap_end(ext2fs_inode_bitmap bitmap,
55431dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o					       ext2_ino_t end, ext2_ino_t *oend);
55550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern errcode_t ext2fs_fudge_block_bitmap_end(ext2fs_block_bitmap bitmap,
55650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					       blk_t end, blk_t *oend);
55750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern void ext2fs_clear_inode_bitmap(ext2fs_inode_bitmap bitmap);
55850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern void ext2fs_clear_block_bitmap(ext2fs_block_bitmap bitmap);
5593839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern errcode_t ext2fs_read_bitmaps(ext2_filsys fs);
5603839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern errcode_t ext2fs_write_bitmaps(ext2_filsys fs);
5613839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
5623839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* block.c */
5633839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern errcode_t ext2fs_block_iterate(ext2_filsys fs,
56431dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o				      ext2_ino_t	ino,
5653839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o				      int	flags,
5663839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o				      char *block_buf,
5673839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o				      int (*func)(ext2_filsys fs,
5683839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o						  blk_t	*blocknr,
5693839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o						  int	blockcnt,
570b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o						  void	*priv_data),
571b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o				      void *priv_data);
57219c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'oerrcode_t ext2fs_block_iterate2(ext2_filsys fs,
57331dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o				ext2_ino_t	ino,
57419c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o				int	flags,
57519c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o				char *block_buf,
57619c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o				int (*func)(ext2_filsys fs,
57719c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o					    blk_t	*blocknr,
57803673dbb04a3458ce78a394f27d17d434b51a714Theodore Ts'o					    e2_blkcnt_t	blockcnt,
579674a4ee1e3e05133ddad701730bfc21c283272a4Theodore Ts'o					    blk_t	ref_blk,
580674a4ee1e3e05133ddad701730bfc21c283272a4Theodore Ts'o					    int		ref_offset,
581674a4ee1e3e05133ddad701730bfc21c283272a4Theodore Ts'o					    void	*priv_data),
582674a4ee1e3e05133ddad701730bfc21c283272a4Theodore Ts'o				void *priv_data);
58319c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o
58430fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o/* bmap.c */
58531dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern errcode_t ext2fs_bmap(ext2_filsys fs, ext2_ino_t ino,
58630fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o			     struct ext2_inode *inode,
58730fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o			     char *block_buf, int bmap_flags,
58830fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o			     blk_t block, blk_t *phys_blk);
58930fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o
59030fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o
5914a31c48b827f378f386b28461fd14b41d709e4ebTheodore Ts'o#if 0
5921e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o/* bmove.c */
5931e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'oextern errcode_t ext2fs_move_blocks(ext2_filsys fs,
5941e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o				    ext2fs_block_bitmap reserve,
5959941fb73f530b11d3d1dcc97a585f63449703f5aTheodore Ts'o				    ext2fs_block_bitmap alloc_map,
5961e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o				    int flags);
5974a31c48b827f378f386b28461fd14b41d709e4ebTheodore Ts'o#endif
5981e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o
599f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o/* check_desc.c */
600f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'oextern errcode_t ext2fs_check_desc(ext2_filsys fs);
601f3db3566b5e1342e49dffc5ec3f418a838584194Theodore Ts'o
6023839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* closefs.c */
6033839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern errcode_t ext2fs_close(ext2_filsys fs);
6043839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern errcode_t ext2fs_flush(ext2_filsys fs);
6051b4cd9c7464d5bd0f5b416c7303bcc827e312473Theodore Ts'oextern int ext2fs_bg_has_super(ext2_filsys fs, int group_block);
606ef344e13d2125e9dae3764b98f9fe3a170cd79e2Theodore Ts'oextern int ext2fs_super_and_bgd_loc(ext2_filsys fs,
607ef344e13d2125e9dae3764b98f9fe3a170cd79e2Theodore Ts'o				    dgrp_t group,
608ef344e13d2125e9dae3764b98f9fe3a170cd79e2Theodore Ts'o				    blk_t *ret_super_blk,
609ef344e13d2125e9dae3764b98f9fe3a170cd79e2Theodore Ts'o				    blk_t *ret_old_desc_blk,
610ef344e13d2125e9dae3764b98f9fe3a170cd79e2Theodore Ts'o				    blk_t *ret_new_desc_blk,
611ef344e13d2125e9dae3764b98f9fe3a170cd79e2Theodore Ts'o				    int *ret_meta_bg);
6121b4cd9c7464d5bd0f5b416c7303bcc827e312473Theodore Ts'oextern void ext2fs_update_dynamic_rev(ext2_filsys fs);
6133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
61450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o/* cmp_bitmaps.c */
61550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern errcode_t ext2fs_compare_block_bitmap(ext2fs_block_bitmap bm1,
61650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					     ext2fs_block_bitmap bm2);
61750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern errcode_t ext2fs_compare_inode_bitmap(ext2fs_inode_bitmap bm1,
61850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					     ext2fs_inode_bitmap bm2);
61950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
62019c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o/* dblist.c */
62119c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o
62231dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern errcode_t ext2fs_get_num_dirs(ext2_filsys fs, ext2_ino_t *ret_num_dirs);
623a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'oextern errcode_t ext2fs_init_dblist(ext2_filsys fs, ext2_dblist *ret_dblist);
62431dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern errcode_t ext2fs_add_dir_block(ext2_dblist dblist, ext2_ino_t ino,
625a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o				      blk_t blk, int blockcnt);
626ea1959f01523ffc105747d660ccc5b7f02805928Theodore Ts'oextern void ext2fs_dblist_sort(ext2_dblist dblist,
627ea1959f01523ffc105747d660ccc5b7f02805928Theodore Ts'o			       EXT2_QSORT_TYPE (*sortfunc)(const void *,
628ea1959f01523ffc105747d660ccc5b7f02805928Theodore Ts'o							   const void *));
629a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'oextern errcode_t ext2fs_dblist_iterate(ext2_dblist dblist,
630a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o	int (*func)(ext2_filsys fs, struct ext2_db_entry *db_info,
631b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o		    void	*priv_data),
632b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o       void *priv_data);
63331dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern errcode_t ext2fs_set_dir_block(ext2_dblist dblist, ext2_ino_t ino,
634a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o				      blk_t blk, int blockcnt);
635a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'oextern errcode_t ext2fs_copy_dblist(ext2_dblist src,
636a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o				    ext2_dblist *dest);
637549860c5c7a5a2974c103a55d881fbd5701aff13Theodore Ts'oextern int ext2fs_dblist_count(ext2_dblist dblist);
63819c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o
63919c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o/* dblist_dir.c */
64019c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'oextern errcode_t
64119c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o	ext2fs_dblist_dir_iterate(ext2_dblist dblist,
64219c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o				  int	flags,
64319c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o				  char	*block_buf,
64431dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o				  int (*func)(ext2_ino_t	dir,
64519c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o					      int		entry,
64619c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o					      struct ext2_dir_entry *dirent,
64719c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o					      int	offset,
64819c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o					      int	blocksize,
64919c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o					      char	*buf,
650b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o					      void	*priv_data),
651b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o				  void *priv_data);
65250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
65350e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o/* dirblock.c */
65450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern errcode_t ext2fs_read_dir_block(ext2_filsys fs, blk_t block,
65550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o				       void *buf);
656f9190c8a95c6b76eac567d5896b3ed06ed2a3adaTheodore Ts'oextern errcode_t ext2fs_read_dir_block2(ext2_filsys fs, blk_t block,
657f9190c8a95c6b76eac567d5896b3ed06ed2a3adaTheodore Ts'o					void *buf, int flags);
65850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern errcode_t ext2fs_write_dir_block(ext2_filsys fs, blk_t block,
65950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					void *buf);
660f9190c8a95c6b76eac567d5896b3ed06ed2a3adaTheodore Ts'oextern errcode_t ext2fs_write_dir_block2(ext2_filsys fs, blk_t block,
661f9190c8a95c6b76eac567d5896b3ed06ed2a3adaTheodore Ts'o					 void *buf, int flags);
66250e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
66352783e0ca72a80c549e9d266b3472f78fc61bdb2Theodore Ts'o/* dirhash.c */
66452783e0ca72a80c549e9d266b3472f78fc61bdb2Theodore Ts'oextern errcode_t ext2fs_dirhash(int version, const char *name, int len,
665b33278c4d640c3fc8f99a314b637b7e502fceb9cTheodore Ts'o				const __u32 *seed,
666503f9e7f6eb331c5b75d7f1ad126f71bcdcfb4e3Theodore Ts'o				ext2_dirhash_t *ret_hash,
667503f9e7f6eb331c5b75d7f1ad126f71bcdcfb4e3Theodore Ts'o				ext2_dirhash_t *ret_minor_hash);
66852783e0ca72a80c549e9d266b3472f78fc61bdb2Theodore Ts'o
66952783e0ca72a80c549e9d266b3472f78fc61bdb2Theodore Ts'o
67019c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o/* dir_iterate.c */
67119c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'oextern errcode_t ext2fs_dir_iterate(ext2_filsys fs,
67231dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o			      ext2_ino_t dir,
67319c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o			      int flags,
67419c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o			      char *block_buf,
67519c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o			      int (*func)(struct ext2_dir_entry *dirent,
67619c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o					  int	offset,
67719c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o					  int	blocksize,
67819c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o					  char	*buf,
679b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o					  void	*priv_data),
680b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o			      void *priv_data);
6818bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'oextern errcode_t ext2fs_dir_iterate2(ext2_filsys fs,
6828bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o			      ext2_ino_t dir,
6838bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o			      int flags,
6848bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o			      char *block_buf,
6858bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o			      int (*func)(ext2_ino_t	dir,
6868bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o					  int	entry,
6878bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o					  struct ext2_dir_entry *dirent,
6888bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o					  int	offset,
6898bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o					  int	blocksize,
6908bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o					  char	*buf,
6918bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o					  void	*priv_data),
6928bd0c95908baa3af706b9e731daff9472bec74c9Theodore Ts'o			      void *priv_data);
69319c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o
694a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o/* dupfs.c */
695a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'oextern errcode_t ext2fs_dup_handle(ext2_filsys src, ext2_filsys *dest);
69619c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o
6973839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* expanddir.c */
69831dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern errcode_t ext2fs_expand_dir(ext2_filsys fs, ext2_ino_t dir);
6993839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
700342d847db355d81299218e07a1e58ece82080a04Theodore Ts'o/* ext_attr.c */
701342d847db355d81299218e07a1e58ece82080a04Theodore Ts'ovoid ext2fs_swap_ext_attr(ext2_filsys fs, char *to, char *from);
702342d847db355d81299218e07a1e58ece82080a04Theodore Ts'oextern errcode_t ext2fs_read_ext_attr(ext2_filsys fs, blk_t block, void *buf);
7030684a4f33b5c268fe12f57fcbc77a880c79ab282Theodore Ts'oextern errcode_t ext2fs_write_ext_attr(ext2_filsys fs, blk_t block,
7040684a4f33b5c268fe12f57fcbc77a880c79ab282Theodore Ts'o				       void *buf);
7050684a4f33b5c268fe12f57fcbc77a880c79ab282Theodore Ts'oextern errcode_t ext2fs_adjust_ea_refcount(ext2_filsys fs, blk_t blk,
7060684a4f33b5c268fe12f57fcbc77a880c79ab282Theodore Ts'o					   char *block_buf,
7070684a4f33b5c268fe12f57fcbc77a880c79ab282Theodore Ts'o					   int adjust, __u32 *newcount);
7080684a4f33b5c268fe12f57fcbc77a880c79ab282Theodore Ts'o
70930fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o/* fileio.c */
710a435ec3449694a8fa299337197cc09624960a3a6Theodore Ts'oextern errcode_t ext2fs_file_open2(ext2_filsys fs, ext2_ino_t ino,
711a435ec3449694a8fa299337197cc09624960a3a6Theodore Ts'o				   struct ext2_inode *inode,
712a435ec3449694a8fa299337197cc09624960a3a6Theodore Ts'o				   int flags, ext2_file_t *ret);
71331dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern errcode_t ext2fs_file_open(ext2_filsys fs, ext2_ino_t ino,
71430fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o				  int flags, ext2_file_t *ret);
71579a90bdad033e101c38bb3c3207c8f4be47a2de7Theodore Ts'oextern ext2_filsys ext2fs_file_get_fs(ext2_file_t file);
71630fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'oextern errcode_t ext2fs_file_close(ext2_file_t file);
717f12e285ffd9ff0b37c4f91d5ab2b021ed1eb43beTheodore Ts'oextern errcode_t ext2fs_file_flush(ext2_file_t file);
71830fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'oextern errcode_t ext2fs_file_read(ext2_file_t file, void *buf,
71979a90bdad033e101c38bb3c3207c8f4be47a2de7Theodore Ts'o				  unsigned int wanted, unsigned int *got);
720f12e285ffd9ff0b37c4f91d5ab2b021ed1eb43beTheodore Ts'oextern errcode_t ext2fs_file_write(ext2_file_t file, const void *buf,
72179a90bdad033e101c38bb3c3207c8f4be47a2de7Theodore Ts'o				   unsigned int nbytes, unsigned int *written);
722819157db798cd514aa2f3ae421d64e2e0c9b7fa8Theodore Ts'oextern errcode_t ext2fs_file_llseek(ext2_file_t file, __u64 offset,
723819157db798cd514aa2f3ae421d64e2e0c9b7fa8Theodore Ts'o				   int whence, __u64 *ret_pos);
724674a4ee1e3e05133ddad701730bfc21c283272a4Theodore Ts'oextern errcode_t ext2fs_file_lseek(ext2_file_t file, ext2_off_t offset,
725674a4ee1e3e05133ddad701730bfc21c283272a4Theodore Ts'o				   int whence, ext2_off_t *ret_pos);
726819157db798cd514aa2f3ae421d64e2e0c9b7fa8Theodore Ts'oerrcode_t ext2fs_file_get_lsize(ext2_file_t file, __u64 *ret_size);
72779a90bdad033e101c38bb3c3207c8f4be47a2de7Theodore Ts'oextern ext2_off_t ext2fs_file_get_size(ext2_file_t file);
72879a90bdad033e101c38bb3c3207c8f4be47a2de7Theodore Ts'oextern errcode_t ext2fs_file_set_size(ext2_file_t file, ext2_off_t size);
72930fab293065b7fc6d7d138e8e9eea533a3560873Theodore Ts'o
730de23aa1d177a67283f5f5a1f172b00527fe3b63aTheodore Ts'o/* finddev.c */
731de23aa1d177a67283f5f5a1f172b00527fe3b63aTheodore Ts'oextern char *ext2fs_find_block_device(dev_t device);
732de23aa1d177a67283f5f5a1f172b00527fe3b63aTheodore Ts'o
7334d0f3e17a5b7556505fe437680070fe3bb140d67Theodore Ts'o/* flushb.c */
7344d0f3e17a5b7556505fe437680070fe3bb140d67Theodore Ts'oextern errcode_t ext2fs_sync_device(int fd, int flushb);
7354d0f3e17a5b7556505fe437680070fe3bb140d67Theodore Ts'o
7363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* freefs.c */
7373839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern void ext2fs_free(ext2_filsys fs);
7381e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'oextern void ext2fs_free_generic_bitmap(ext2fs_inode_bitmap bitmap);
73950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern void ext2fs_free_block_bitmap(ext2fs_block_bitmap bitmap);
74050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern void ext2fs_free_inode_bitmap(ext2fs_inode_bitmap bitmap);
741a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'oextern void ext2fs_free_dblist(ext2_dblist dblist);
742b7a00563b22b0ea47ddc7117508c0b8e0d65df43Theodore Ts'oextern void ext2fs_badblocks_list_free(ext2_badblocks_list bb);
743b7a00563b22b0ea47ddc7117508c0b8e0d65df43Theodore Ts'oextern void ext2fs_u32_list_free(ext2_u32_list bb);
74450e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
74550e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o/* getsize.c */
74650e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern errcode_t ext2fs_get_device_size(const char *file, int blocksize,
74750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o					blk_t *retblocks);
7483839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
74993d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o/* getsectsize.c */
75093d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'oerrcode_t ext2fs_get_device_sectsize(const char *file, int *sectsize);
75193d5c38791a3778eed18fe968cdd136d23d0fa07Theodore Ts'o
75272ed12648368b3f3ea14e8102e20bf5d3a3be6d3Theodore Ts'o/* imager.c */
75372ed12648368b3f3ea14e8102e20bf5d3a3be6d3Theodore Ts'oextern errcode_t ext2fs_image_inode_write(ext2_filsys fs, int fd, int flags);
75472ed12648368b3f3ea14e8102e20bf5d3a3be6d3Theodore Ts'oextern errcode_t ext2fs_image_inode_read(ext2_filsys fs, int fd, int flags);
75572ed12648368b3f3ea14e8102e20bf5d3a3be6d3Theodore Ts'oextern errcode_t ext2fs_image_super_write(ext2_filsys fs, int fd, int flags);
75672ed12648368b3f3ea14e8102e20bf5d3a3be6d3Theodore Ts'oextern errcode_t ext2fs_image_super_read(ext2_filsys fs, int fd, int flags);
75772ed12648368b3f3ea14e8102e20bf5d3a3be6d3Theodore Ts'oextern errcode_t ext2fs_image_bitmap_write(ext2_filsys fs, int fd, int flags);
75872ed12648368b3f3ea14e8102e20bf5d3a3be6d3Theodore Ts'oextern errcode_t ext2fs_image_bitmap_read(ext2_filsys fs, int fd, int flags);
75972ed12648368b3f3ea14e8102e20bf5d3a3be6d3Theodore Ts'o
7603839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* initialize.c */
7613839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern errcode_t ext2fs_initialize(const char *name, int flags,
7623839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o				   struct ext2_super_block *param,
7633839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o				   io_manager manager, ext2_filsys *ret_fs);
7643839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
765f12e285ffd9ff0b37c4f91d5ab2b021ed1eb43beTheodore Ts'o/* icount.c */
766f12e285ffd9ff0b37c4f91d5ab2b021ed1eb43beTheodore Ts'oextern void ext2fs_free_icount(ext2_icount_t icount);
767544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'oextern errcode_t ext2fs_create_icount2(ext2_filsys fs, int flags,
768544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o				       unsigned int size,
769f12e285ffd9ff0b37c4f91d5ab2b021ed1eb43beTheodore Ts'o				       ext2_icount_t hint, ext2_icount_t *ret);
770544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'oextern errcode_t ext2fs_create_icount(ext2_filsys fs, int flags,
771544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o				      unsigned int size,
772f12e285ffd9ff0b37c4f91d5ab2b021ed1eb43beTheodore Ts'o				      ext2_icount_t *ret);
773f12e285ffd9ff0b37c4f91d5ab2b021ed1eb43beTheodore Ts'oextern errcode_t ext2fs_icount_fetch(ext2_icount_t icount, ext2_ino_t ino,
774f12e285ffd9ff0b37c4f91d5ab2b021ed1eb43beTheodore Ts'o				     __u16 *ret);
775f12e285ffd9ff0b37c4f91d5ab2b021ed1eb43beTheodore Ts'oextern errcode_t ext2fs_icount_increment(ext2_icount_t icount, ext2_ino_t ino,
776f12e285ffd9ff0b37c4f91d5ab2b021ed1eb43beTheodore Ts'o					 __u16 *ret);
777f12e285ffd9ff0b37c4f91d5ab2b021ed1eb43beTheodore Ts'oextern errcode_t ext2fs_icount_decrement(ext2_icount_t icount, ext2_ino_t ino,
778f12e285ffd9ff0b37c4f91d5ab2b021ed1eb43beTheodore Ts'o					 __u16 *ret);
779f12e285ffd9ff0b37c4f91d5ab2b021ed1eb43beTheodore Ts'oextern errcode_t ext2fs_icount_store(ext2_icount_t icount, ext2_ino_t ino,
780f12e285ffd9ff0b37c4f91d5ab2b021ed1eb43beTheodore Ts'o				     __u16 count);
781f12e285ffd9ff0b37c4f91d5ab2b021ed1eb43beTheodore Ts'oextern ext2_ino_t ext2fs_get_icount_size(ext2_icount_t icount);
782f12e285ffd9ff0b37c4f91d5ab2b021ed1eb43beTheodore Ts'oerrcode_t ext2fs_icount_validate(ext2_icount_t icount, FILE *);
783f12e285ffd9ff0b37c4f91d5ab2b021ed1eb43beTheodore Ts'o
7843839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* inode.c */
78572ed12648368b3f3ea14e8102e20bf5d3a3be6d3Theodore Ts'oextern errcode_t ext2fs_flush_icache(ext2_filsys fs);
7863839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern errcode_t ext2fs_open_inode_scan(ext2_filsys fs, int buffer_blocks,
7873839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o				  ext2_inode_scan *ret_scan);
7883839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern void ext2fs_close_inode_scan(ext2_inode_scan scan);
78931dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern errcode_t ext2fs_get_next_inode(ext2_inode_scan scan, ext2_ino_t *ino,
7903839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o			       struct ext2_inode *inode);
79119c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'oextern errcode_t ext2fs_inode_scan_goto_blockgroup(ext2_inode_scan scan,
79219c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o						   int	group);
79319c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'oextern void ext2fs_set_inode_callback
79419c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o	(ext2_inode_scan scan,
79519c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o	 errcode_t (*done_group)(ext2_filsys fs,
79619c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o				 ext2_inode_scan scan,
79719c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o				 dgrp_t group,
798b5abe6fac9c9e7caf4710501d1657d30e4857ef6Theodore Ts'o				 void * priv_data),
79919c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o	 void *done_group_data);
80019c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'oextern int ext2fs_inode_scan_flags(ext2_inode_scan scan, int set_flags,
80119c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o				   int clear_flags);
80231dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern errcode_t ext2fs_read_inode (ext2_filsys fs, ext2_ino_t ino,
8033839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o			    struct ext2_inode * inode);
80431dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern errcode_t ext2fs_write_inode(ext2_filsys fs, ext2_ino_t ino,
8053839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o			    struct ext2_inode * inode);
80631dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern errcode_t ext2fs_get_blocks(ext2_filsys fs, ext2_ino_t ino, blk_t *blocks);
80731dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern errcode_t ext2fs_check_directory(ext2_filsys fs, ext2_ino_t ino);
8083839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
809f12e285ffd9ff0b37c4f91d5ab2b021ed1eb43beTheodore Ts'o/* inode_io.c */
810f12e285ffd9ff0b37c4f91d5ab2b021ed1eb43beTheodore Ts'oextern io_manager inode_io_manager;
811546a1ff18cc912003883ff67ba3e87c69f700fc4Theodore Ts'oextern errcode_t ext2fs_inode_io_intern(ext2_filsys fs, ext2_ino_t ino,
812546a1ff18cc912003883ff67ba3e87c69f700fc4Theodore Ts'o					char **name);
813a435ec3449694a8fa299337197cc09624960a3a6Theodore Ts'oextern errcode_t ext2fs_inode_io_intern2(ext2_filsys fs, ext2_ino_t ino,
814a435ec3449694a8fa299337197cc09624960a3a6Theodore Ts'o					 struct ext2_inode *inode,
815a435ec3449694a8fa299337197cc09624960a3a6Theodore Ts'o					 char **name);
816f12e285ffd9ff0b37c4f91d5ab2b021ed1eb43beTheodore Ts'o
81750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o/* ismounted.c */
81850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern errcode_t ext2fs_check_if_mounted(const char *file, int *mount_flags);
81943ec8734f2ecd0a345e831f45fd3dfb077426811Theodore Ts'oextern errcode_t ext2fs_check_mount_point(const char *device, int *mount_flags,
82043ec8734f2ecd0a345e831f45fd3dfb077426811Theodore Ts'o					  char *mtpt, int mtlen);
82150e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
8223839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* namei.c */
82331dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern errcode_t ext2fs_lookup(ext2_filsys fs, ext2_ino_t dir, const char *name,
82431dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o			 int namelen, char *buf, ext2_ino_t *inode);
82531dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern errcode_t ext2fs_namei(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
82631dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o			const char *name, ext2_ino_t *inode);
82731dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oerrcode_t ext2fs_namei_follow(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
82831dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o			      const char *name, ext2_ino_t *inode);
82931dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern errcode_t ext2fs_follow_link(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
83031dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o			ext2_ino_t inode, ext2_ino_t *res_inode);
8311e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
8321e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o/* native.c */
8331e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'oint ext2fs_native_flag(void);
8343839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
8353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* newdir.c */
83631dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern errcode_t ext2fs_new_dir_block(ext2_filsys fs, ext2_ino_t dir_ino,
83731dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o				ext2_ino_t parent_ino, char **block);
8383839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
8393839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* mkdir.c */
84031dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern errcode_t ext2fs_mkdir(ext2_filsys fs, ext2_ino_t parent, ext2_ino_t inum,
8413839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o			      const char *name);
8423839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
843d3cd93cabeac8c153c8ae7b1b7358d6ced86b15eTheodore Ts'o/* mkjournal.c */
844a112847b39386f9e7332ba5e5a0a5e54cfe301ccTheodore Ts'oextern errcode_t ext2fs_create_journal_superblock(ext2_filsys fs,
845a112847b39386f9e7332ba5e5a0a5e54cfe301ccTheodore Ts'o						  __u32 size, int flags,
846a112847b39386f9e7332ba5e5a0a5e54cfe301ccTheodore Ts'o						  char  **ret_jsb);
847a112847b39386f9e7332ba5e5a0a5e54cfe301ccTheodore Ts'oextern errcode_t ext2fs_add_journal_device(ext2_filsys fs,
848a112847b39386f9e7332ba5e5a0a5e54cfe301ccTheodore Ts'o					   ext2_filsys journal_dev);
84931a17b36d5f7d875f9de8e86501eaf2338f94d2bTheodore Ts'oextern errcode_t ext2fs_add_journal_inode(ext2_filsys fs, blk_t size,
85031a17b36d5f7d875f9de8e86501eaf2338f94d2bTheodore Ts'o					  int flags);
851d3cd93cabeac8c153c8ae7b1b7358d6ced86b15eTheodore Ts'o
8523839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* openfs.c */
8533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern errcode_t ext2fs_open(const char *name, int flags, int superblock,
854544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o			     unsigned int block_size, io_manager manager,
8553839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o			     ext2_filsys *ret_fs);
8562e8ca9a26b0bd7dae546a3f9a98df67b043fe3beTheodore Ts'oextern errcode_t ext2fs_open2(const char *name, const char *io_options,
8572e8ca9a26b0bd7dae546a3f9a98df67b043fe3beTheodore Ts'o			      int flags, int superblock,
8582e8ca9a26b0bd7dae546a3f9a98df67b043fe3beTheodore Ts'o			      unsigned int block_size, io_manager manager,
8592e8ca9a26b0bd7dae546a3f9a98df67b043fe3beTheodore Ts'o			      ext2_filsys *ret_fs);
860c046ac7f2e4c53e20cf1e909bbe511f91074b396Theodore Ts'oextern blk_t ext2fs_descriptor_block_loc(ext2_filsys fs, blk_t group_block,
861c046ac7f2e4c53e20cf1e909bbe511f91074b396Theodore Ts'o					 dgrp_t i);
8621ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'oerrcode_t ext2fs_get_data_io(ext2_filsys fs, io_channel *old_io);
8631ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'oerrcode_t ext2fs_set_data_io(ext2_filsys fs, io_channel new_io);
8641ad54a940c499a66241f624882f1ffa03ce56d90Theodore Ts'oerrcode_t ext2fs_rewrite_to_io(ext2_filsys fs, io_channel new_io);
8653839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
8663839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* get_pathname.c */
86731dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern errcode_t ext2fs_get_pathname(ext2_filsys fs, ext2_ino_t dir, ext2_ino_t ino,
8683839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o			       char **name);
8693839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
8703839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* link.c */
87131dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oerrcode_t ext2fs_link(ext2_filsys fs, ext2_ino_t dir, const char *name,
87231dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o		      ext2_ino_t ino, int flags);
87331dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oerrcode_t ext2fs_unlink(ext2_filsys fs, ext2_ino_t dir, const char *name,
87431dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o			ext2_ino_t ino, int flags);
8753839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
8763839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* read_bb.c */
87719c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'oextern errcode_t ext2fs_read_bb_inode(ext2_filsys fs,
87819c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o				      ext2_badblocks_list *bb_list);
8793839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
8803839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* read_bb_file.c */
88157dca85467cf3fc61565e916a5f2e35db8020d88Theodore Ts'oextern errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f,
88257dca85467cf3fc61565e916a5f2e35db8020d88Theodore Ts'o				      ext2_badblocks_list *bb_list,
88350cd7e06e26d8cb232819b3d94b67e37ade80c0fTheodore Ts'o				      void *priv_data,
88457dca85467cf3fc61565e916a5f2e35db8020d88Theodore Ts'o				      void (*invalid)(ext2_filsys fs,
88557dca85467cf3fc61565e916a5f2e35db8020d88Theodore Ts'o						      blk_t blk,
88657dca85467cf3fc61565e916a5f2e35db8020d88Theodore Ts'o						      char *badstr,
88750cd7e06e26d8cb232819b3d94b67e37ade80c0fTheodore Ts'o						      void *priv_data));
8883839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern errcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f,
88919c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o				     ext2_badblocks_list *bb_list,
8903839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o				     void (*invalid)(ext2_filsys fs,
8913839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o						     blk_t blk));
8923839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
893d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o/* res_gdt.c */
894d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'oextern errcode_t ext2fs_create_resize_inode(ext2_filsys fs);
895d323f8fb369089b97d6f3bf0f8d64ceeab0b10f5Theodore Ts'o
89619c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o/* rs_bitmap.c */
89719c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'oextern errcode_t ext2fs_resize_generic_bitmap(__u32 new_end,
89819c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o					      __u32 new_real_end,
89919c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o					      ext2fs_generic_bitmap bmap);
90019c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'oextern errcode_t ext2fs_resize_inode_bitmap(__u32 new_end, __u32 new_real_end,
90119c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o					    ext2fs_inode_bitmap bmap);
90219c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'oextern errcode_t ext2fs_resize_block_bitmap(__u32 new_end, __u32 new_real_end,
90319c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o					    ext2fs_block_bitmap bmap);
904a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'oextern errcode_t ext2fs_copy_bitmap(ext2fs_generic_bitmap src,
905a29f4d30f24d68f1f1c75548e020689ede532c05Theodore Ts'o				    ext2fs_generic_bitmap *dest);
90619c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o
90750e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o/* swapfs.c */
90850e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern void ext2fs_swap_super(struct ext2_super_block * super);
90950e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'oextern void ext2fs_swap_group_desc(struct ext2_group_desc *gdp);
9101e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'oextern void ext2fs_swap_inode(ext2_filsys fs,struct ext2_inode *t,
9111e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o			      struct ext2_inode *f, int hostorder);
9121e3472c5f37ca3686dd69b079d4d02a302f5798dTheodore Ts'o
91319c78dc07fce2d6f39b5e541562afc3ca1ea38ffTheodore Ts'o/* valid_blk.c */
914521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'oextern int ext2fs_inode_has_valid_blocks(struct ext2_inode *inode);
915521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o
916521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o/* version.c */
917521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'oextern int ext2fs_parse_version_string(const char *ver_string);
918521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'oextern int ext2fs_get_library_version(const char **ver_string,
919521e36857227b21e7ab47b0a97f788d2af9f9717Theodore Ts'o				      const char **date_string);
92050e1e10fa0ac12a3e2a9d20a75ee9041873cda96Theodore Ts'o
92131dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o/* write_bb_file.c */
92231dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern errcode_t ext2fs_write_bb_FILE(ext2_badblocks_list bb_list,
92331dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o				      unsigned int flags,
92431dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o				      FILE *f);
92531dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o
92631dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o
9273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/* inline functions */
928c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'oextern errcode_t ext2fs_get_mem(unsigned long size, void *ptr);
929c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'oextern errcode_t ext2fs_free_mem(void *ptr);
93076f875daa1c9c2cdc72f0c6f0f7be4bbc7f0fc07Theodore Ts'oextern errcode_t ext2fs_resize_mem(unsigned long old_size,
931c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o				   unsigned long size, void *ptr);
9323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern void ext2fs_mark_super_dirty(ext2_filsys fs);
9333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern void ext2fs_mark_changed(ext2_filsys fs);
9343839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern int ext2fs_test_changed(ext2_filsys fs);
9353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern void ext2fs_mark_valid(ext2_filsys fs);
9363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern void ext2fs_unmark_valid(ext2_filsys fs);
9373839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern int ext2fs_test_valid(ext2_filsys fs);
9383839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern void ext2fs_mark_ib_dirty(ext2_filsys fs);
9393839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern void ext2fs_mark_bb_dirty(ext2_filsys fs);
9403839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern int ext2fs_test_ib_dirty(ext2_filsys fs);
9413839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern int ext2fs_test_bb_dirty(ext2_filsys fs);
9423839e65723771b85975f4263102dd3ceec4523cTheodore Ts'oextern int ext2fs_group_of_blk(ext2_filsys fs, blk_t blk);
94331dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'oextern int ext2fs_group_of_ino(ext2_filsys fs, ext2_ino_t ino);
9440684a4f33b5c268fe12f57fcbc77a880c79ab282Theodore Ts'oextern blk_t ext2fs_inode_data_blocks(ext2_filsys fs,
9450684a4f33b5c268fe12f57fcbc77a880c79ab282Theodore Ts'o				      struct ext2_inode *inode);
9463839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
9473839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
9483839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * The actual inlined functions definitions themselves...
9493839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o *
9503839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * If NO_INLINE_FUNCS is defined, then we won't try to do inline
9513839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * functions at all!
9523839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
9533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#if (defined(INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS))
9543839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#ifdef INCLUDE_INLINE_FUNCS
9553839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define _INLINE_ extern
9563839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#else
95776f875daa1c9c2cdc72f0c6f0f7be4bbc7f0fc07Theodore Ts'o#ifdef __GNUC__
9583839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#define _INLINE_ extern __inline__
95976f875daa1c9c2cdc72f0c6f0f7be4bbc7f0fc07Theodore Ts'o#else				/* For Watcom C */
96076f875daa1c9c2cdc72f0c6f0f7be4bbc7f0fc07Theodore Ts'o#define _INLINE_ extern inline
96176f875daa1c9c2cdc72f0c6f0f7be4bbc7f0fc07Theodore Ts'o#endif
9623839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#endif
9633839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
9647b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o#ifndef EXT2_CUSTOM_MEMORY_ROUTINES
9657b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o/*
9667b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o *  Allocate memory
9677b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o */
968c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o_INLINE_ errcode_t ext2fs_get_mem(unsigned long size, void *ptr)
9697b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o{
970c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o	void **pp = (void **)ptr;
971c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o
972c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o	*pp = malloc(size);
973c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o	if (!*pp)
974291c9049ba70bb6256099a066243cec1359c9c15Theodore Ts'o		return EXT2_ET_NO_MEMORY;
9757b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o	return 0;
9767b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o}
9777b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o
9787b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o/*
9797b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o * Free memory
9807b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o */
981c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o_INLINE_ errcode_t ext2fs_free_mem(void *ptr)
9827b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o{
983c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o	void **pp = (void **)ptr;
984c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o
985c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o	free(*pp);
986c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o	*pp = 0;
9877b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o	return 0;
9887b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o}
9897b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o
9907b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o/*
9917b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o *  Resize memory
9927b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o */
993e47fd8414d3bd4632792cc52310e53edcfeea27cTheodore Ts'o_INLINE_ errcode_t ext2fs_resize_mem(unsigned long EXT2FS_ATTR((unused)) old_size,
994c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o				     unsigned long size, void *ptr)
9957b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o{
9967b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o	void *p;
997c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o	void **pp = (void **)ptr;
9987b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o
999c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o	p = realloc(*pp, size);
10007b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o	if (!p)
1001291c9049ba70bb6256099a066243cec1359c9c15Theodore Ts'o		return EXT2_ET_NO_MEMORY;
1002c4e3d3f374b409500e3dd05c0b0eca6ac98a6b4eTheodore Ts'o	*pp = p;
10037b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o	return 0;
10047b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o}
10057b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o#endif	/* Custom memory routines */
10067b4e4534f9361b21d3fafdd88a58f133decee38cTheodore Ts'o
10073839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
10083839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Mark a filesystem superblock as dirty
10093839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
10103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o_INLINE_ void ext2fs_mark_super_dirty(ext2_filsys fs)
10113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
10123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	fs->flags |= EXT2_FLAG_DIRTY | EXT2_FLAG_CHANGED;
10133839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
10143839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
10153839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
10163839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Mark a filesystem as changed
10173839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
10183839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o_INLINE_ void ext2fs_mark_changed(ext2_filsys fs)
10193839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
10203839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	fs->flags |= EXT2_FLAG_CHANGED;
10213839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
10223839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
10233839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
10243839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Check to see if a filesystem has changed
10253839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
10263839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o_INLINE_ int ext2fs_test_changed(ext2_filsys fs)
10273839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
10283839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return (fs->flags & EXT2_FLAG_CHANGED);
10293839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
10303839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
10313839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
10323839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Mark a filesystem as valid
10333839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
10343839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o_INLINE_ void ext2fs_mark_valid(ext2_filsys fs)
10353839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
10363839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	fs->flags |= EXT2_FLAG_VALID;
10373839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
10383839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
10393839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
10403839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Mark a filesystem as NOT valid
10413839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
10423839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o_INLINE_ void ext2fs_unmark_valid(ext2_filsys fs)
10433839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
10443839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	fs->flags &= ~EXT2_FLAG_VALID;
10453839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
10463839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
10473839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
10483839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Check to see if a filesystem is valid
10493839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
10503839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o_INLINE_ int ext2fs_test_valid(ext2_filsys fs)
10513839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
10523839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return (fs->flags & EXT2_FLAG_VALID);
10533839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
10543839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
10553839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
10563839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Mark the inode bitmap as dirty
10573839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
10583839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o_INLINE_ void ext2fs_mark_ib_dirty(ext2_filsys fs)
10593839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
10603839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	fs->flags |= EXT2_FLAG_IB_DIRTY | EXT2_FLAG_CHANGED;
10613839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
10623839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
10633839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
10643839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Mark the block bitmap as dirty
10653839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
10663839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o_INLINE_ void ext2fs_mark_bb_dirty(ext2_filsys fs)
10673839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
10683839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	fs->flags |= EXT2_FLAG_BB_DIRTY | EXT2_FLAG_CHANGED;
10693839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
10703839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
10713839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
10723839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Check to see if a filesystem's inode bitmap is dirty
10733839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
10743839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o_INLINE_ int ext2fs_test_ib_dirty(ext2_filsys fs)
10753839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
10763839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return (fs->flags & EXT2_FLAG_IB_DIRTY);
10773839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
10783839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
10793839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
10803839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Check to see if a filesystem's block bitmap is dirty
10813839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
10823839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o_INLINE_ int ext2fs_test_bb_dirty(ext2_filsys fs)
10833839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
10843839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return (fs->flags & EXT2_FLAG_BB_DIRTY);
10853839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
10863839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
10873839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
10883839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Return the group # of a block
10893839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
10903839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o_INLINE_ int ext2fs_group_of_blk(ext2_filsys fs, blk_t blk)
10913839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
10923839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return (blk - fs->super->s_first_data_block) /
10933839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o		fs->super->s_blocks_per_group;
10943839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
10953839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
10963839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o/*
10973839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o * Return the group # of an inode number
10983839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o */
109931dbecd482405e0d3a67eb58e1a1c8cb9f2ad83eTheodore Ts'o_INLINE_ int ext2fs_group_of_ino(ext2_filsys fs, ext2_ino_t ino)
11003839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o{
11013839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o	return (ino - 1) / fs->super->s_inodes_per_group;
11023839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o}
11030684a4f33b5c268fe12f57fcbc77a880c79ab282Theodore Ts'o
11040684a4f33b5c268fe12f57fcbc77a880c79ab282Theodore Ts'o_INLINE_ blk_t ext2fs_inode_data_blocks(ext2_filsys fs,
11050684a4f33b5c268fe12f57fcbc77a880c79ab282Theodore Ts'o					struct ext2_inode *inode)
11060684a4f33b5c268fe12f57fcbc77a880c79ab282Theodore Ts'o{
11070684a4f33b5c268fe12f57fcbc77a880c79ab282Theodore Ts'o       return inode->i_blocks -
11080684a4f33b5c268fe12f57fcbc77a880c79ab282Theodore Ts'o              (inode->i_file_acl ? fs->blocksize >> 9 : 0);
11090684a4f33b5c268fe12f57fcbc77a880c79ab282Theodore Ts'o}
11103839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#undef _INLINE_
11113839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o#endif
11123839e65723771b85975f4263102dd3ceec4523cTheodore Ts'o
1113fa7ef7176ee66aaaec58a24c5a5523c4afb550ddTheodore Ts'o#ifdef __cplusplus
1114fa7ef7176ee66aaaec58a24c5a5523c4afb550ddTheodore Ts'o}
1115fa7ef7176ee66aaaec58a24c5a5523c4afb550ddTheodore Ts'o#endif
1116fa7ef7176ee66aaaec58a24c5a5523c4afb550ddTheodore Ts'o
11179abd2ce914f9373fb676f0bb620ffba3a0e3c49eTheodore Ts'o#endif /* _EXT2FS_EXT2FS_H */
1118