blob: b7a784eec5cc865a4b4bcee504a847d44868bea2 [file] [log] [blame]
Theodore Ts'o3839e651997-04-26 13:21:57 +00001/*
2 * ext2fs.h --- ext2fs
Theodore Ts'oefc6f622008-08-27 23:07:54 -04003 *
Theodore Ts'o19c78dc1997-04-29 16:17:09 +00004 * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o.
5 *
6 * %Begin-Header%
Theodore Ts'o543547a2010-05-17 21:31:56 -04007 * This file may be redistributed under the terms of the GNU Library
8 * General Public License, version 2.
Theodore Ts'o19c78dc1997-04-29 16:17:09 +00009 * %End-Header%
Theodore Ts'o3839e651997-04-26 13:21:57 +000010 */
11
Theodore Ts'o9abd2ce1998-02-16 22:00:37 +000012#ifndef _EXT2FS_EXT2FS_H
13#define _EXT2FS_EXT2FS_H
14
Theodore Ts'o54434922003-12-07 01:28:50 -050015#ifdef __GNUC__
16#define EXT2FS_ATTR(x) __attribute__(x)
17#else
18#define EXT2FS_ATTR(x)
19#endif
20
Theodore Ts'ofa7ef712000-05-19 02:11:41 +000021#ifdef __cplusplus
22extern "C" {
23#endif
24
Theodore Ts'o3839e651997-04-26 13:21:57 +000025/*
Theodore Ts'o19c78dc1997-04-29 16:17:09 +000026 * Non-GNU C compilers won't necessarily understand inline
27 */
Theodore Ts'o76f875d1998-04-27 01:41:13 +000028#if (!defined(__GNUC__) && !defined(__WATCOMC__))
Theodore Ts'o19c78dc1997-04-29 16:17:09 +000029#define NO_INLINE_FUNCS
30#endif
31
32/*
Theodore Ts'o3839e651997-04-26 13:21:57 +000033 * Where the master copy of the superblock is located, and how big
34 * superblocks are supposed to be. We define SUPERBLOCK_SIZE because
35 * the size of the superblock structure is not necessarily trustworthy
36 * (some versions have the padding set up so that the superblock is
37 * 1032 bytes long).
38 */
39#define SUPERBLOCK_OFFSET 1024
Andreas Dilger1ac2aa22011-06-11 11:04:42 -040040#define SUPERBLOCK_SIZE 1024
Theodore Ts'o3839e651997-04-26 13:21:57 +000041
Theodore Ts'of3db3561997-04-26 13:34:30 +000042/*
43 * The last ext2fs revision level that this version of the library is
44 * able to support.
45 */
Theodore Ts'oe5b38a52001-01-01 16:17:12 +000046#define EXT2_LIB_CURRENT_REV EXT2_DYNAMIC_REV
Theodore Ts'of3db3561997-04-26 13:34:30 +000047
Theodore Ts'od40259f1997-10-20 00:44:26 +000048#ifdef HAVE_SYS_TYPES_H
Theodore Ts'o1e3472c1997-04-29 14:53:37 +000049#include <sys/types.h>
Theodore Ts'od40259f1997-10-20 00:44:26 +000050#endif
51
Theodore Ts'o3e699062002-10-13 23:56:28 -040052#include <stdio.h>
Theodore Ts'o5be8dc21997-12-01 18:24:10 +000053#include <stdlib.h>
Theodore Ts'oa82a5702005-11-14 14:49:15 -050054#include <string.h>
Theodore Ts'o023a1df2010-09-23 12:56:46 -040055#include <errno.h>
Andreas Dilger1ac2aa22011-06-11 11:04:42 -040056
Theodore Ts'o5953b9d1998-02-01 13:23:02 +000057#if EXT2_FLAT_INCLUDES
58#include "e2_types.h"
Theodore Ts'o3e699062002-10-13 23:56:28 -040059#include "ext2_fs.h"
Theodore Ts'o89dd6572006-11-12 22:54:35 -050060#include "ext3_extents.h"
Theodore Ts'o5953b9d1998-02-01 13:23:02 +000061#else
Theodore Ts'o797f5ef2001-06-01 23:49:46 +000062#include <ext2fs/ext2_types.h>
Theodore Ts'o3e699062002-10-13 23:56:28 -040063#include <ext2fs/ext2_fs.h>
Theodore Ts'o89dd6572006-11-12 22:54:35 -050064#include <ext2fs/ext3_extents.h>
Theodore Ts'oe589f672000-04-03 13:45:40 +000065#endif /* EXT2_FLAT_INCLUDES */
Theodore Ts'o50e1e101997-04-26 13:58:21 +000066
Darrick J. Wong832cb612013-10-11 23:02:12 -040067#ifdef __CHECK_ENDIAN__
68#define __bitwise __attribute__((bitwise))
69#else
70#define __bitwise
71#endif
72
73typedef __u32 __bitwise ext2_ino_t;
74typedef __u32 __bitwise blk_t;
75typedef __u64 __bitwise blk64_t;
76typedef __u32 __bitwise dgrp_t;
77typedef __u32 __bitwise ext2_off_t;
78typedef __u64 __bitwise ext2_off64_t;
79typedef __s64 __bitwise e2_blkcnt_t;
80typedef __u32 __bitwise ext2_dirhash_t;
Theodore Ts'o3839e651997-04-26 13:21:57 +000081
Theodore Ts'ob5abe6f1998-01-19 14:47:53 +000082#if EXT2_FLAT_INCLUDES
83#include "com_err.h"
84#include "ext2_io.h"
85#include "ext2_err.h"
Andreas Dilgerfefaef32008-02-02 01:16:32 -070086#include "ext2_ext_attr.h"
Theodore Ts'ob5abe6f1998-01-19 14:47:53 +000087#else
Theodore Ts'o7c2d2562001-05-21 02:54:21 +000088#include <et/com_err.h>
89#include <ext2fs/ext2_io.h>
90#include <ext2fs/ext2_err.h>
Andreas Dilgerfefaef32008-02-02 01:16:32 -070091#include <ext2fs/ext2_ext_attr.h>
Theodore Ts'ob5abe6f1998-01-19 14:47:53 +000092#endif
Theodore Ts'o3839e651997-04-26 13:21:57 +000093
Theodore Ts'o4c77fe51998-04-30 17:35:59 +000094/*
95 * Portability help for Microsoft Visual C++
96 */
97#ifdef _MSC_VER
98#define EXT2_QSORT_TYPE int __cdecl
99#else
100#define EXT2_QSORT_TYPE int
101#endif
102
Theodore Ts'of3db3561997-04-26 13:34:30 +0000103typedef struct struct_ext2_filsys *ext2_filsys;
104
Theodore Ts'o1e3472c1997-04-29 14:53:37 +0000105#define EXT2FS_MARK_ERROR 0
106#define EXT2FS_UNMARK_ERROR 1
107#define EXT2FS_TEST_ERROR 2
Theodore Ts'of3db3561997-04-26 13:34:30 +0000108
Theodore Ts'o1e3472c1997-04-29 14:53:37 +0000109typedef struct ext2fs_struct_generic_bitmap *ext2fs_generic_bitmap;
Theodore Ts'o1e3472c1997-04-29 14:53:37 +0000110typedef struct ext2fs_struct_generic_bitmap *ext2fs_inode_bitmap;
Theodore Ts'o1e3472c1997-04-29 14:53:37 +0000111typedef struct ext2fs_struct_generic_bitmap *ext2fs_block_bitmap;
Theodore Ts'of3db3561997-04-26 13:34:30 +0000112
Theodore Ts'o7f88b041997-04-26 14:48:50 +0000113#define EXT2_FIRST_INODE(s) EXT2_FIRST_INO(s)
Andreas Dilger067911a2006-07-15 22:08:20 -0400114
Theodore Ts'o7f88b041997-04-26 14:48:50 +0000115
Theodore Ts'o3839e651997-04-26 13:21:57 +0000116/*
Andreas Dilger067911a2006-07-15 22:08:20 -0400117 * Badblocks list definitions
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000118 */
119
Theodore Ts'ob7a00562002-07-20 00:28:07 -0400120typedef struct ext2_struct_u32_list *ext2_badblocks_list;
121typedef struct ext2_struct_u32_iterate *ext2_badblocks_iterate;
122
123typedef struct ext2_struct_u32_list *ext2_u32_list;
124typedef struct ext2_struct_u32_iterate *ext2_u32_iterate;
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000125
126/* old */
Theodore Ts'ob7a00562002-07-20 00:28:07 -0400127typedef struct ext2_struct_u32_list *badblocks_list;
128typedef struct ext2_struct_u32_iterate *badblocks_iterate;
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000129
130#define BADBLOCKS_FLAG_DIRTY 1
131
132/*
133 * ext2_dblist structure and abstractions (see dblist.c)
134 */
Theodore Ts'oab13b5a2010-06-13 10:00:00 -0400135struct ext2_db_entry2 {
136 ext2_ino_t ino;
137 blk64_t blk;
138 e2_blkcnt_t blockcnt;
139};
140
141/* Ye Olde 32-bit version */
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000142struct ext2_db_entry {
Theodore Ts'o31dbecd2001-01-11 04:54:39 +0000143 ext2_ino_t ino;
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000144 blk_t blk;
145 int blockcnt;
146};
147
148typedef struct ext2_struct_dblist *ext2_dblist;
149
150#define DBLIST_ABORT 1
151
152/*
Theodore Ts'o30fab291997-10-25 22:37:42 +0000153 * ext2_fileio definitions
154 */
155
156#define EXT2_FILE_WRITE 0x0001
157#define EXT2_FILE_CREATE 0x0002
158
159#define EXT2_FILE_MASK 0x00FF
160
161#define EXT2_FILE_BUF_DIRTY 0x4000
162#define EXT2_FILE_BUF_VALID 0x2000
163
164typedef struct ext2_file *ext2_file_t;
165
166#define EXT2_SEEK_SET 0
167#define EXT2_SEEK_CUR 1
168#define EXT2_SEEK_END 2
169
170/*
Theodore Ts'oa1128472001-01-16 06:56:14 +0000171 * Flags for the ext2_filsys structure and for ext2fs_open()
Theodore Ts'o3839e651997-04-26 13:21:57 +0000172 */
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000173#define EXT2_FLAG_RW 0x01
174#define EXT2_FLAG_CHANGED 0x02
175#define EXT2_FLAG_DIRTY 0x04
176#define EXT2_FLAG_VALID 0x08
177#define EXT2_FLAG_IB_DIRTY 0x10
178#define EXT2_FLAG_BB_DIRTY 0x20
Theodore Ts'o5c576471997-04-29 15:29:49 +0000179#define EXT2_FLAG_SWAP_BYTES 0x40
180#define EXT2_FLAG_SWAP_BYTES_READ 0x80
181#define EXT2_FLAG_SWAP_BYTES_WRITE 0x100
182#define EXT2_FLAG_MASTER_SB_ONLY 0x200
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000183#define EXT2_FLAG_FORCE 0x400
Theodore Ts'o43ec8732001-01-03 14:56:46 +0000184#define EXT2_FLAG_SUPER_ONLY 0x800
Theodore Ts'oa1128472001-01-16 06:56:14 +0000185#define EXT2_FLAG_JOURNAL_DEV_OK 0x1000
Theodore Ts'oa78926e2001-05-03 04:02:29 +0000186#define EXT2_FLAG_IMAGE_FILE 0x2000
Theodore Ts'o39c47ce2006-03-18 19:16:10 -0500187#define EXT2_FLAG_EXCLUSIVE 0x4000
Theodore Ts'ocf8272e2006-11-12 23:26:46 -0500188#define EXT2_FLAG_SOFTSUPP_FEATURES 0x8000
Theodore Ts'oab52e122008-02-26 20:45:36 -0500189#define EXT2_FLAG_NOFREE_ON_ERROR 0x10000
Theodore Ts'o69365c62009-08-22 13:27:40 -0400190#define EXT2_FLAG_64BITS 0x20000
Valerie Aurora Henson95fd65b2009-08-23 19:20:03 -0400191#define EXT2_FLAG_PRINT_PROGRESS 0x40000
Theodore Ts'o73fbe232010-09-24 22:22:09 -0400192#define EXT2_FLAG_DIRECT_IO 0x80000
Andreas Dilger0f5eba72011-09-24 13:48:55 -0400193#define EXT2_FLAG_SKIP_MMP 0x100000
Theodore Ts'o3839e651997-04-26 13:21:57 +0000194
Theodore Ts'o7f88b041997-04-26 14:48:50 +0000195/*
196 * Special flag in the ext2 inode i_flag field that means that this is
197 * a new inode. (So that ext2_write_inode() can clear extra fields.)
198 */
199#define EXT2_NEW_INODE_FL 0x80000000
200
Theodore Ts'o4e246702000-12-09 14:39:16 +0000201/*
202 * Flags for mkjournal
Theodore Ts'o4e246702000-12-09 14:39:16 +0000203 */
Andreas Dilger6c546892011-06-11 12:17:29 -0400204#define EXT2_MKJOURNAL_V1_SUPER 0x0000001 /* create V1 superblock (deprecated) */
205#define EXT2_MKJOURNAL_LAZYINIT 0x0000002 /* don't zero journal inode before use*/
Theodore Ts'o304e11c2012-04-05 12:30:02 -0700206#define EXT2_MKJOURNAL_NO_MNT_CHECK 0x0000004 /* don't check mount status */
Theodore Ts'o4e246702000-12-09 14:39:16 +0000207
Eric Sandeenefe0b402010-06-13 21:00:00 -0400208struct opaque_ext2_group_desc;
209
Theodore Ts'o3839e651997-04-26 13:21:57 +0000210struct struct_ext2_filsys {
Theodore Ts'o4cbe8af1997-08-10 23:07:40 +0000211 errcode_t magic;
Theodore Ts'o3839e651997-04-26 13:21:57 +0000212 io_channel io;
213 int flags;
214 char * device_name;
215 struct ext2_super_block * super;
Theodore Ts'o54434922003-12-07 01:28:50 -0500216 unsigned int blocksize;
Theodore Ts'o3fbfad52011-09-15 15:44:56 -0400217 int fragsize;
Theodore Ts'o2eb374c1998-09-03 01:22:57 +0000218 dgrp_t group_desc_count;
Theodore Ts'o3839e651997-04-26 13:21:57 +0000219 unsigned long desc_blocks;
Eric Sandeenefe0b402010-06-13 21:00:00 -0400220 struct opaque_ext2_group_desc * group_desc;
Theodore Ts'od32c9152011-07-07 13:50:22 -0400221 unsigned int inode_blocks_per_group;
Theodore Ts'of3db3561997-04-26 13:34:30 +0000222 ext2fs_inode_bitmap inode_map;
223 ext2fs_block_bitmap block_map;
Valerie Aurora Henson6d8b37f2010-06-13 11:00:00 -0400224 /* XXX FIXME-64: not 64-bit safe, but not used? */
Theodore Ts'o31dbecd2001-01-11 04:54:39 +0000225 errcode_t (*get_blocks)(ext2_filsys fs, ext2_ino_t ino, blk_t *blocks);
226 errcode_t (*check_directory)(ext2_filsys fs, ext2_ino_t ino);
Theodore Ts'o3839e651997-04-26 13:21:57 +0000227 errcode_t (*write_bitmaps)(ext2_filsys fs);
Theodore Ts'o31dbecd2001-01-11 04:54:39 +0000228 errcode_t (*read_inode)(ext2_filsys fs, ext2_ino_t ino,
Theodore Ts'o1e3472c1997-04-29 14:53:37 +0000229 struct ext2_inode *inode);
Theodore Ts'o31dbecd2001-01-11 04:54:39 +0000230 errcode_t (*write_inode)(ext2_filsys fs, ext2_ino_t ino,
Theodore Ts'o1e3472c1997-04-29 14:53:37 +0000231 struct ext2_inode *inode);
Theodore Ts'ob7a00562002-07-20 00:28:07 -0400232 ext2_badblocks_list badblocks;
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000233 ext2_dblist dblist;
Theodore Ts'oa29f4d31997-04-29 21:26:48 +0000234 __u32 stride; /* for mke2fs */
Theodore Ts'oc180ac82000-10-26 20:24:43 +0000235 struct ext2_super_block * orig_super;
Theodore Ts'oa78926e2001-05-03 04:02:29 +0000236 struct ext2_image_hdr * image_header;
Theodore Ts'o6a525062001-12-24 09:40:00 -0500237 __u32 umask;
Theodore Ts'o9b9a7802005-12-10 21:50:30 -0500238 time_t now;
Theodore Ts'o3fbfad52011-09-15 15:44:56 -0400239 int cluster_ratio_bits;
Theodore Ts'o67861e52011-12-16 11:24:23 -0500240 __u16 default_bitmap_type;
241 __u16 pad;
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000242 /*
243 * Reserved for future expansion
244 */
Theodore Ts'o67861e52011-12-16 11:24:23 -0500245 __u32 reserved[5];
Theodore Ts'o3839e651997-04-26 13:21:57 +0000246
247 /*
Theodore Ts'oa29f4d31997-04-29 21:26:48 +0000248 * Reserved for the use of the calling application.
Theodore Ts'o3839e651997-04-26 13:21:57 +0000249 */
Theodore Ts'ob5abe6f1998-01-19 14:47:53 +0000250 void * priv_data;
Theodore Ts'oa29f4d31997-04-29 21:26:48 +0000251
252 /*
253 * Inode cache
254 */
255 struct ext2_inode_cache *icache;
Theodore Ts'o1ad54a92004-07-28 21:11:48 -0400256 io_channel image_io;
Theodore Ts'of5c562e2008-06-02 17:21:37 -0400257
258 /*
Theodore Ts'o5fff8632011-11-25 21:23:18 -0500259 * More callback functions
260 */
261 errcode_t (*get_alloc_block)(ext2_filsys fs, blk64_t goal,
262 blk64_t *ret);
263 void (*block_alloc_stats)(ext2_filsys fs, blk64_t blk, int inuse);
264
265 /*
Andreas Dilger0f5eba72011-09-24 13:48:55 -0400266 * Buffers for Multiple mount protection(MMP) block.
267 */
268 void *mmp_buf;
269 void *mmp_cmp;
270 int mmp_fd;
271
272 /*
273 * Time at which e2fsck last updated the MMP block.
274 */
275 long mmp_last_written;
Theodore Ts'o3839e651997-04-26 13:21:57 +0000276};
277
Theodore Ts'o5953b9d1998-02-01 13:23:02 +0000278#if EXT2_FLAT_INCLUDES
279#include "e2_bitops.h"
280#else
Theodore Ts'o7c2d2562001-05-21 02:54:21 +0000281#include <ext2fs/bitops.h>
Theodore Ts'o5953b9d1998-02-01 13:23:02 +0000282#endif
Theodore Ts'od40259f1997-10-20 00:44:26 +0000283
Theodore Ts'o3839e651997-04-26 13:21:57 +0000284/*
Theodore Ts'o67861e52011-12-16 11:24:23 -0500285 * 64-bit bitmap backend types
286 */
Theodore Ts'o67861e52011-12-16 11:24:23 -0500287#define EXT2FS_BMAP64_BITARRAY 1
Lukas Czernerc1359d92011-12-18 00:29:33 -0500288#define EXT2FS_BMAP64_RBTREE 2
Theodore Ts'od1828312011-12-18 00:31:27 -0500289#define EXT2FS_BMAP64_AUTODIR 3
Theodore Ts'o67861e52011-12-16 11:24:23 -0500290
291/*
Theodore Ts'o3839e651997-04-26 13:21:57 +0000292 * Return flags for the block iterator functions
293 */
294#define BLOCK_CHANGED 1
295#define BLOCK_ABORT 2
296#define BLOCK_ERROR 4
297
298/*
299 * Block interate flags
Theodore Ts'o50e1e101997-04-26 13:58:21 +0000300 *
301 * BLOCK_FLAG_APPEND, or BLOCK_FLAG_HOLE, indicates that the interator
302 * function should be called on blocks where the block number is zero.
303 * This is used by ext2fs_expand_dir() to be able to add a new block
304 * to an inode. It can also be used for programs that want to be able
305 * to deal with files that contain "holes".
Theodore Ts'oefc6f622008-08-27 23:07:54 -0400306 *
Theodore Ts'o74479212006-03-18 08:26:36 -0500307 * BLOCK_FLAG_DEPTH_TRAVERSE indicates that the iterator function for
308 * the indirect, doubly indirect, etc. blocks should be called after
309 * all of the blocks containined in the indirect blocks are processed.
Theodore Ts'o50e1e101997-04-26 13:58:21 +0000310 * This is useful if you are going to be deallocating blocks from an
311 * inode.
Theodore Ts'o1e3472c1997-04-29 14:53:37 +0000312 *
313 * BLOCK_FLAG_DATA_ONLY indicates that the iterator function should be
314 * called for data blocks only.
Theodore Ts'o674a4ee1998-03-23 02:06:52 +0000315 *
Theodore Ts'oefc6f622008-08-27 23:07:54 -0400316 * BLOCK_FLAG_READ_ONLY is a promise by the caller that it will not
Theodore Ts'o357d1862008-02-02 21:26:54 -0500317 * modify returned block number.
318 *
Theodore Ts'o674a4ee1998-03-23 02:06:52 +0000319 * BLOCK_FLAG_NO_LARGE is for internal use only. It informs
Theodore Ts'o36a43d61998-03-24 16:17:51 +0000320 * ext2fs_block_iterate2 that large files won't be accepted.
Theodore Ts'o3839e651997-04-26 13:21:57 +0000321 */
322#define BLOCK_FLAG_APPEND 1
Theodore Ts'o50e1e101997-04-26 13:58:21 +0000323#define BLOCK_FLAG_HOLE 1
Theodore Ts'o3839e651997-04-26 13:21:57 +0000324#define BLOCK_FLAG_DEPTH_TRAVERSE 2
Theodore Ts'o1e3472c1997-04-29 14:53:37 +0000325#define BLOCK_FLAG_DATA_ONLY 4
Theodore Ts'o357d1862008-02-02 21:26:54 -0500326#define BLOCK_FLAG_READ_ONLY 8
Theodore Ts'o1e3472c1997-04-29 14:53:37 +0000327
Theodore Ts'o674a4ee1998-03-23 02:06:52 +0000328#define BLOCK_FLAG_NO_LARGE 0x1000
329
Theodore Ts'o1e3472c1997-04-29 14:53:37 +0000330/*
331 * Magic "block count" return values for the block iterator function.
332 */
333#define BLOCK_COUNT_IND (-1)
334#define BLOCK_COUNT_DIND (-2)
335#define BLOCK_COUNT_TIND (-3)
336#define BLOCK_COUNT_TRANSLATOR (-4)
Theodore Ts'o3839e651997-04-26 13:21:57 +0000337
Theodore Ts'o4a31c481998-03-30 01:27:25 +0000338#if 0
Theodore Ts'o3839e651997-04-26 13:21:57 +0000339/*
Theodore Ts'o1e1da291997-06-09 14:51:29 +0000340 * Flags for ext2fs_move_blocks
341 */
Theodore Ts'oefc6f622008-08-27 23:07:54 -0400342#define EXT2_BMOVE_GET_DBLIST 0x0001
Theodore Ts'o36f21431997-06-14 07:25:40 +0000343#define EXT2_BMOVE_DEBUG 0x0002
Theodore Ts'o4a31c481998-03-30 01:27:25 +0000344#endif
Theodore Ts'o1e1da291997-06-09 14:51:29 +0000345
346/*
Theodore Ts'o3eb07f62007-10-14 23:04:58 -0400347 * Generic (non-filesystem layout specific) extents structure
348 */
349
350#define EXT2_EXTENT_FLAGS_LEAF 0x0001
351#define EXT2_EXTENT_FLAGS_UNINIT 0x0002
352#define EXT2_EXTENT_FLAGS_SECOND_VISIT 0x0004
353
354struct ext2fs_extent {
355 blk64_t e_pblk; /* first physical block */
356 blk64_t e_lblk; /* first logical block extent covers */
357 __u32 e_len; /* number of blocks covered by extent */
358 __u32 e_flags; /* extent flags */
359};
360
361typedef struct ext2_extent_handle *ext2_extent_handle_t;
362typedef struct ext2_extent_path *ext2_extent_path_t;
363
364/*
365 * Flags used by ext2fs_extent_get()
366 */
367#define EXT2_EXTENT_CURRENT 0x0000
368#define EXT2_EXTENT_MOVE_MASK 0x000F
369#define EXT2_EXTENT_ROOT 0x0001
370#define EXT2_EXTENT_LAST_LEAF 0x0002
371#define EXT2_EXTENT_FIRST_SIB 0x0003
372#define EXT2_EXTENT_LAST_SIB 0x0004
373#define EXT2_EXTENT_NEXT_SIB 0x0005
374#define EXT2_EXTENT_PREV_SIB 0x0006
375#define EXT2_EXTENT_NEXT_LEAF 0x0007
376#define EXT2_EXTENT_PREV_LEAF 0x0008
377#define EXT2_EXTENT_NEXT 0x0009
378#define EXT2_EXTENT_PREV 0x000A
379#define EXT2_EXTENT_UP 0x000B
380#define EXT2_EXTENT_DOWN 0x000C
381#define EXT2_EXTENT_DOWN_AND_LAST 0x000D
382
383/*
384 * Flags used by ext2fs_extent_insert()
385 */
Eric Sandeen01229db2008-05-20 10:15:27 -0500386#define EXT2_EXTENT_INSERT_AFTER 0x0001 /* insert after handle loc'n */
387#define EXT2_EXTENT_INSERT_NOSPLIT 0x0002 /* insert may not cause split */
Theodore Ts'o3eb07f62007-10-14 23:04:58 -0400388
389/*
Eric Sandeenc802ad92008-05-20 16:13:41 -0500390 * Flags used by ext2fs_extent_delete()
391 */
392#define EXT2_EXTENT_DELETE_KEEP_EMPTY 0x001 /* keep node if last extnt gone */
393
394/*
Eric Sandeenf4e99632008-05-20 10:17:46 -0500395 * Flags used by ext2fs_extent_set_bmap()
396 */
397#define EXT2_EXTENT_SET_BMAP_UNINIT 0x0001
398
399/*
Theodore Ts'o3eb07f62007-10-14 23:04:58 -0400400 * Data structure returned by ext2fs_extent_get_info()
401 */
402struct ext2_extent_info {
403 int curr_entry;
404 int curr_level;
405 int num_entries;
406 int max_entries;
407 int max_depth;
408 int bytes_avail;
409 blk64_t max_lblk;
410 blk64_t max_pblk;
411 __u32 max_len;
412 __u32 max_uninit_len;
413};
414
415/*
Theodore Ts'of9190c82002-03-12 01:05:06 -0500416 * Flags for directory block reading and writing functions
417 */
418#define EXT2_DIRBLOCK_V2_STRUCT 0x0001
419
420/*
Theodore Ts'o3839e651997-04-26 13:21:57 +0000421 * Return flags for the directory iterator functions
422 */
423#define DIRENT_CHANGED 1
424#define DIRENT_ABORT 2
425#define DIRENT_ERROR 3
426
427/*
428 * Directory iterator flags
429 */
430
431#define DIRENT_FLAG_INCLUDE_EMPTY 1
Theodore Ts'o8bd0c952002-01-03 03:29:19 -0500432#define DIRENT_FLAG_INCLUDE_REMOVED 2
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000433
434#define DIRENT_DOT_FILE 1
435#define DIRENT_DOT_DOT_FILE 2
436#define DIRENT_OTHER_FILE 3
Theodore Ts'o8bd0c952002-01-03 03:29:19 -0500437#define DIRENT_DELETED_FILE 4
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000438
Theodore Ts'o3839e651997-04-26 13:21:57 +0000439/*
440 * Inode scan definitions
441 */
Theodore Ts'of3db3561997-04-26 13:34:30 +0000442typedef struct ext2_struct_inode_scan *ext2_inode_scan;
443
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000444/*
445 * ext2fs_scan flags
446 */
447#define EXT2_SF_CHK_BADBLOCKS 0x0001
448#define EXT2_SF_BAD_INODE_BLK 0x0002
449#define EXT2_SF_BAD_EXTRA_BYTES 0x0004
450#define EXT2_SF_SKIP_MISSING_ITABLE 0x0008
Theodore Ts'of5fa2002006-05-08 20:17:26 -0400451#define EXT2_SF_DO_LAZY 0x0010
Theodore Ts'o3839e651997-04-26 13:21:57 +0000452
Theodore Ts'of3db3561997-04-26 13:34:30 +0000453/*
Theodore Ts'o50e1e101997-04-26 13:58:21 +0000454 * ext2fs_check_if_mounted flags
455 */
456#define EXT2_MF_MOUNTED 1
457#define EXT2_MF_ISROOT 2
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000458#define EXT2_MF_READONLY 4
Theodore Ts'o07cefe72001-12-24 15:20:22 -0500459#define EXT2_MF_SWAP 8
Theodore Ts'o2fa8f372005-06-05 16:05:22 -0400460#define EXT2_MF_BUSY 16
Theodore Ts'o50e1e101997-04-26 13:58:21 +0000461
462/*
463 * Ext2/linux mode flags. We define them here so that we don't need
464 * to depend on the OS's sys/stat.h, since we may be compiling on a
465 * non-Linux system.
466 */
467#define LINUX_S_IFMT 00170000
468#define LINUX_S_IFSOCK 0140000
469#define LINUX_S_IFLNK 0120000
470#define LINUX_S_IFREG 0100000
471#define LINUX_S_IFBLK 0060000
472#define LINUX_S_IFDIR 0040000
473#define LINUX_S_IFCHR 0020000
474#define LINUX_S_IFIFO 0010000
475#define LINUX_S_ISUID 0004000
476#define LINUX_S_ISGID 0002000
477#define LINUX_S_ISVTX 0001000
478
Theodore Ts'o1e3472c1997-04-29 14:53:37 +0000479#define LINUX_S_IRWXU 00700
480#define LINUX_S_IRUSR 00400
481#define LINUX_S_IWUSR 00200
482#define LINUX_S_IXUSR 00100
483
484#define LINUX_S_IRWXG 00070
485#define LINUX_S_IRGRP 00040
486#define LINUX_S_IWGRP 00020
487#define LINUX_S_IXGRP 00010
488
489#define LINUX_S_IRWXO 00007
490#define LINUX_S_IROTH 00004
491#define LINUX_S_IWOTH 00002
492#define LINUX_S_IXOTH 00001
493
Theodore Ts'o50e1e101997-04-26 13:58:21 +0000494#define LINUX_S_ISLNK(m) (((m) & LINUX_S_IFMT) == LINUX_S_IFLNK)
495#define LINUX_S_ISREG(m) (((m) & LINUX_S_IFMT) == LINUX_S_IFREG)
496#define LINUX_S_ISDIR(m) (((m) & LINUX_S_IFMT) == LINUX_S_IFDIR)
497#define LINUX_S_ISCHR(m) (((m) & LINUX_S_IFMT) == LINUX_S_IFCHR)
498#define LINUX_S_ISBLK(m) (((m) & LINUX_S_IFMT) == LINUX_S_IFBLK)
499#define LINUX_S_ISFIFO(m) (((m) & LINUX_S_IFMT) == LINUX_S_IFIFO)
500#define LINUX_S_ISSOCK(m) (((m) & LINUX_S_IFMT) == LINUX_S_IFSOCK)
501
502/*
Theodore Ts'o819157d2003-01-22 18:25:39 -0500503 * ext2 size of an inode
504 */
505#define EXT2_I_SIZE(i) ((i)->i_size | ((__u64) (i)->i_size_high << 32))
506
507/*
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000508 * ext2_icount_t abstraction
509 */
510#define EXT2_ICOUNT_OPT_INCREMENT 0x01
511
512typedef struct ext2_icount *ext2_icount_t;
513
514/*
Theodore Ts'o30fab291997-10-25 22:37:42 +0000515 * Flags for ext2fs_bmap
516 */
Theodore Ts'o1d667532004-12-23 13:55:34 -0500517#define BMAP_ALLOC 0x0001
518#define BMAP_SET 0x0002
Theodore Ts'o30fab291997-10-25 22:37:42 +0000519
520/*
Theodore Ts'occ9bf5d2008-02-18 14:59:45 -0500521 * Returned flags from ext2fs_bmap
522 */
523#define BMAP_RET_UNINIT 0x0001
524
525/*
Theodore Ts'o72ed1262000-11-12 19:32:20 +0000526 * Flags for imager.c functions
527 */
528#define IMAGER_FLAG_INODEMAP 1
529#define IMAGER_FLAG_SPARSEWRITE 2
530
531/*
Theodore Ts'of3db3561997-04-26 13:34:30 +0000532 * For checking structure magic numbers...
533 */
Theodore Ts'o3839e651997-04-26 13:21:57 +0000534
Theodore Ts'of3db3561997-04-26 13:34:30 +0000535#define EXT2_CHECK_MAGIC(struct, code) \
536 if ((struct)->magic != (code)) return (code)
Theodore Ts'o1e3472c1997-04-29 14:53:37 +0000537
538
539/*
Theodore Ts'oe5b38a52001-01-01 16:17:12 +0000540 * For ext2 compression support
Theodore Ts'o1e3472c1997-04-29 14:53:37 +0000541 */
Valerie Clement5d38ef12007-08-30 17:33:40 +0200542#define EXT2FS_COMPRESSED_BLKADDR ((blk_t) -1)
Theodore Ts'o5a63dd22000-02-11 15:44:08 +0000543#define HOLE_BLKADDR(_b) ((_b) == 0 || (_b) == EXT2FS_COMPRESSED_BLKADDR)
544
Theodore Ts'o521e3681997-04-29 17:48:10 +0000545/*
Theodore Ts'o426d7342001-01-13 01:29:05 +0000546 * Features supported by this version of the library
Theodore Ts'o521e3681997-04-29 17:48:10 +0000547 */
Theodore Ts'o3a5f8ea1999-09-14 20:21:26 +0000548#define EXT2_LIB_FEATURE_COMPAT_SUPP (EXT2_FEATURE_COMPAT_DIR_PREALLOC|\
549 EXT2_FEATURE_COMPAT_IMAGIC_INODES|\
Theodore Ts'o342d8472001-07-02 11:54:09 -0400550 EXT3_FEATURE_COMPAT_HAS_JOURNAL|\
Theodore Ts'od323f8f2004-12-15 14:39:16 -0500551 EXT2_FEATURE_COMPAT_RESIZE_INODE|\
Theodore Ts'o52783e02002-03-11 15:04:45 -0500552 EXT2_FEATURE_COMPAT_DIR_INDEX|\
Theodore Ts'o342d8472001-07-02 11:54:09 -0400553 EXT2_FEATURE_COMPAT_EXT_ATTR)
Theodore Ts'o2fe1efe2000-12-31 13:39:17 +0000554
Theodore Ts'o5a63dd22000-02-11 15:44:08 +0000555/* This #ifdef is temporary until compression is fully supported */
556#ifdef ENABLE_COMPRESSION
Theodore Ts'oe589f672000-04-03 13:45:40 +0000557#ifndef I_KNOW_THAT_COMPRESSION_IS_EXPERIMENTAL
558/* If the below warning bugs you, then have
559 `CPPFLAGS=-DI_KNOW_THAT_COMPRESSION_IS_EXPERIMENTAL' in your
560 environment at configure time. */
Theodore Ts'ocdaf1fa2001-01-05 22:23:22 +0000561 #warning "Compression support is experimental"
Theodore Ts'oe589f672000-04-03 13:45:40 +0000562#endif
Theodore Ts'o5a63dd22000-02-11 15:44:08 +0000563#define EXT2_LIB_FEATURE_INCOMPAT_SUPP (EXT2_FEATURE_INCOMPAT_FILETYPE|\
Theodore Ts'oab146762000-07-07 04:37:35 +0000564 EXT2_FEATURE_INCOMPAT_COMPRESSION|\
Theodore Ts'oa1128472001-01-16 06:56:14 +0000565 EXT3_FEATURE_INCOMPAT_JOURNAL_DEV|\
Theodore Ts'oc046ac72002-10-20 00:38:57 -0400566 EXT2_FEATURE_INCOMPAT_META_BG|\
Jose R. Santosc2d43002007-08-13 23:32:57 -0500567 EXT3_FEATURE_INCOMPAT_RECOVER|\
Theodore Ts'o15d482b2007-08-20 21:31:11 -0400568 EXT3_FEATURE_INCOMPAT_EXTENTS|\
Jose R. Santos02d6f472010-06-13 13:00:00 -0400569 EXT4_FEATURE_INCOMPAT_FLEX_BG|\
Andreas Dilger0f5eba72011-09-24 13:48:55 -0400570 EXT4_FEATURE_INCOMPAT_MMP|\
Jose R. Santos02d6f472010-06-13 13:00:00 -0400571 EXT4_FEATURE_INCOMPAT_64BIT)
Theodore Ts'o5a63dd22000-02-11 15:44:08 +0000572#else
Theodore Ts'oab146762000-07-07 04:37:35 +0000573#define EXT2_LIB_FEATURE_INCOMPAT_SUPP (EXT2_FEATURE_INCOMPAT_FILETYPE|\
Theodore Ts'oa1128472001-01-16 06:56:14 +0000574 EXT3_FEATURE_INCOMPAT_JOURNAL_DEV|\
Theodore Ts'oc046ac72002-10-20 00:38:57 -0400575 EXT2_FEATURE_INCOMPAT_META_BG|\
Jose R. Santosc2d43002007-08-13 23:32:57 -0500576 EXT3_FEATURE_INCOMPAT_RECOVER|\
Theodore Ts'o15d482b2007-08-20 21:31:11 -0400577 EXT3_FEATURE_INCOMPAT_EXTENTS|\
Jose R. Santos02d6f472010-06-13 13:00:00 -0400578 EXT4_FEATURE_INCOMPAT_FLEX_BG|\
Andreas Dilger0f5eba72011-09-24 13:48:55 -0400579 EXT4_FEATURE_INCOMPAT_MMP|\
Jose R. Santos02d6f472010-06-13 13:00:00 -0400580 EXT4_FEATURE_INCOMPAT_64BIT)
Theodore Ts'o5a63dd22000-02-11 15:44:08 +0000581#endif
Theodore Ts'o7becb202011-11-14 10:40:43 -0500582#ifdef CONFIG_QUOTA
Theodore Ts'o674a4ee1998-03-23 02:06:52 +0000583#define EXT2_LIB_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER|\
Theodore Ts'o1ca10592008-04-09 11:39:11 -0400584 EXT4_FEATURE_RO_COMPAT_HUGE_FILE|\
Andreas Dilgera7c9cb72008-02-02 01:25:03 -0700585 EXT2_FEATURE_RO_COMPAT_LARGE_FILE|\
Jose R. Santosd4f34d42007-10-21 21:03:25 -0500586 EXT4_FEATURE_RO_COMPAT_DIR_NLINK|\
Theodore Ts'o2be8fe42008-07-10 10:49:59 -0400587 EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE|\
Theodore Ts'o44fe08f2011-06-10 18:58:16 -0400588 EXT4_FEATURE_RO_COMPAT_GDT_CSUM|\
Aditya Kali624e4a62011-07-20 11:40:06 -0700589 EXT4_FEATURE_RO_COMPAT_BIGALLOC|\
590 EXT4_FEATURE_RO_COMPAT_QUOTA)
Theodore Ts'o7becb202011-11-14 10:40:43 -0500591#else
592#define EXT2_LIB_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER|\
593 EXT4_FEATURE_RO_COMPAT_HUGE_FILE|\
594 EXT2_FEATURE_RO_COMPAT_LARGE_FILE|\
595 EXT4_FEATURE_RO_COMPAT_DIR_NLINK|\
596 EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE|\
597 EXT4_FEATURE_RO_COMPAT_GDT_CSUM|\
598 EXT4_FEATURE_RO_COMPAT_BIGALLOC)
599#endif
Theodore Ts'ocf8272e2006-11-12 23:26:46 -0500600
601/*
602 * These features are only allowed if EXT2_FLAG_SOFTSUPP_FEATURES is passed
603 * to ext2fs_openfs()
604 */
Theodore Ts'o1ca10592008-04-09 11:39:11 -0400605#define EXT2_LIB_SOFTSUPP_INCOMPAT (0)
Theodore Ts'o991211f2012-02-17 13:54:47 -0500606#define EXT2_LIB_SOFTSUPP_RO_COMPAT (EXT4_FEATURE_RO_COMPAT_REPLICA)
Theodore Ts'ocf8272e2006-11-12 23:26:46 -0500607
Theodore Ts'o1da5ef72011-06-04 10:20:47 -0400608
609/* Translate a block number to a cluster number */
610#define EXT2FS_CLUSTER_RATIO(fs) (1 << (fs)->cluster_ratio_bits)
611#define EXT2FS_CLUSTER_MASK(fs) (EXT2FS_CLUSTER_RATIO(fs) - 1)
612#define EXT2FS_B2C(fs, blk) ((blk) >> (fs)->cluster_ratio_bits)
613/* Translate a cluster number to a block number */
614#define EXT2FS_C2B(fs, cluster) ((cluster) << (fs)->cluster_ratio_bits)
615/* Translate # of blks to # of clusters */
616#define EXT2FS_NUM_B2C(fs, blks) (((blks) + EXT2FS_CLUSTER_MASK(fs)) >> \
617 (fs)->cluster_ratio_bits)
618
Theodore Ts'oa9f46072011-11-10 07:33:02 -0500619#if defined(HAVE_FSTAT64) && !defined(__OSX_AVAILABLE_BUT_DEPRECATED)
Lukas Czernerc859cb12011-09-15 23:44:48 -0400620typedef struct stat64 ext2fs_struct_stat;
621#else
622typedef struct stat ext2fs_struct_stat;
623#endif
624
Theodore Ts'o3839e651997-04-26 13:21:57 +0000625/*
Richard W.M. Jones9d9a53e2011-09-24 10:50:42 -0400626 * For ext2fs_close2() and ext2fs_flush2(), this flag allows you to
627 * avoid the fsync call.
628 */
629#define EXT2_FLAG_FLUSH_NO_SYNC 1
630
631/*
Theodore Ts'o3839e651997-04-26 13:21:57 +0000632 * function prototypes
633 */
634
635/* alloc.c */
Theodore Ts'o31dbecd2001-01-11 04:54:39 +0000636extern errcode_t ext2fs_new_inode(ext2_filsys fs, ext2_ino_t dir, int mode,
637 ext2fs_inode_bitmap map, ext2_ino_t *ret);
Theodore Ts'o3839e651997-04-26 13:21:57 +0000638extern errcode_t ext2fs_new_block(ext2_filsys fs, blk_t goal,
Theodore Ts'of3db3561997-04-26 13:34:30 +0000639 ext2fs_block_bitmap map, blk_t *ret);
Jose R. Santos8a5e1812009-06-01 16:15:40 -0400640extern errcode_t ext2fs_new_block2(ext2_filsys fs, blk64_t goal,
641 ext2fs_block_bitmap map, blk64_t *ret);
Theodore Ts'o3839e651997-04-26 13:21:57 +0000642extern errcode_t ext2fs_get_free_blocks(ext2_filsys fs, blk_t start,
Theodore Ts'of3db3561997-04-26 13:34:30 +0000643 blk_t finish, int num,
644 ext2fs_block_bitmap map,
Theodore Ts'o3839e651997-04-26 13:21:57 +0000645 blk_t *ret);
Jose R. Santos8a5e1812009-06-01 16:15:40 -0400646extern errcode_t ext2fs_get_free_blocks2(ext2_filsys fs, blk64_t start,
647 blk64_t finish, int num,
648 ext2fs_block_bitmap map,
649 blk64_t *ret);
Theodore Ts'o30fab291997-10-25 22:37:42 +0000650extern errcode_t ext2fs_alloc_block(ext2_filsys fs, blk_t goal,
651 char *block_buf, blk_t *ret);
Jose R. Santos8a5e1812009-06-01 16:15:40 -0400652extern errcode_t ext2fs_alloc_block2(ext2_filsys fs, blk64_t goal,
653 char *block_buf, blk64_t *ret);
Theodore Ts'oefc6f622008-08-27 23:07:54 -0400654extern void ext2fs_set_alloc_block_callback(ext2_filsys fs,
Theodore Ts'of5c562e2008-06-02 17:21:37 -0400655 errcode_t (*func)(ext2_filsys fs,
656 blk64_t goal,
657 blk64_t *ret),
658 errcode_t (**old)(ext2_filsys fs,
659 blk64_t goal,
660 blk64_t *ret));
Theodore Ts'o3839e651997-04-26 13:21:57 +0000661
Theodore Ts'oef344e12003-11-21 09:02:21 -0500662/* alloc_sb.c */
Theodore Ts'oefc6f622008-08-27 23:07:54 -0400663extern int ext2fs_reserve_super_and_bgd(ext2_filsys fs,
Theodore Ts'oef344e12003-11-21 09:02:21 -0500664 dgrp_t group,
665 ext2fs_block_bitmap bmap);
Theodore Ts'oefc6f622008-08-27 23:07:54 -0400666extern void ext2fs_set_block_alloc_stats_callback(ext2_filsys fs,
Theodore Ts'of5c562e2008-06-02 17:21:37 -0400667 void (*func)(ext2_filsys fs,
668 blk64_t blk,
669 int inuse),
670 void (**old)(ext2_filsys fs,
671 blk64_t blk,
672 int inuse));
Theodore Ts'oef344e12003-11-21 09:02:21 -0500673
Theodore Ts'o8bd0c952002-01-03 03:29:19 -0500674/* alloc_stats.c */
675void ext2fs_inode_alloc_stats(ext2_filsys fs, ext2_ino_t ino, int inuse);
Theodore Ts'o7f961d42002-02-03 01:28:52 -0500676void ext2fs_inode_alloc_stats2(ext2_filsys fs, ext2_ino_t ino,
677 int inuse, int isdir);
Theodore Ts'o8bd0c952002-01-03 03:29:19 -0500678void ext2fs_block_alloc_stats(ext2_filsys fs, blk_t blk, int inuse);
Jose R. Santose8328e32009-06-01 16:15:40 -0400679void ext2fs_block_alloc_stats2(ext2_filsys fs, blk64_t blk, int inuse);
Theodore Ts'o8bd0c952002-01-03 03:29:19 -0500680
Theodore Ts'o1e1da291997-06-09 14:51:29 +0000681/* alloc_tables.c */
682extern errcode_t ext2fs_allocate_tables(ext2_filsys fs);
Theodore Ts'o2eb374c1998-09-03 01:22:57 +0000683extern errcode_t ext2fs_allocate_group_table(ext2_filsys fs, dgrp_t group,
Theodore Ts'o1e1da291997-06-09 14:51:29 +0000684 ext2fs_block_bitmap bmap);
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000685
Theodore Ts'o3839e651997-04-26 13:21:57 +0000686/* badblocks.c */
Theodore Ts'ob7a00562002-07-20 00:28:07 -0400687extern errcode_t ext2fs_u32_list_create(ext2_u32_list *ret, int size);
688extern errcode_t ext2fs_u32_list_add(ext2_u32_list bb, __u32 blk);
Theodore Ts'o54434922003-12-07 01:28:50 -0500689extern int ext2fs_u32_list_find(ext2_u32_list bb, __u32 blk);
Theodore Ts'ob7a00562002-07-20 00:28:07 -0400690extern int ext2fs_u32_list_test(ext2_u32_list bb, blk_t blk);
691extern errcode_t ext2fs_u32_list_iterate_begin(ext2_u32_list bb,
692 ext2_u32_iterate *ret);
693extern int ext2fs_u32_list_iterate(ext2_u32_iterate iter, blk_t *blk);
694extern void ext2fs_u32_list_iterate_end(ext2_u32_iterate iter);
695extern errcode_t ext2fs_u32_copy(ext2_u32_list src, ext2_u32_list *dest);
696extern int ext2fs_u32_list_equal(ext2_u32_list bb1, ext2_u32_list bb2);
697
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000698extern errcode_t ext2fs_badblocks_list_create(ext2_badblocks_list *ret,
699 int size);
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000700extern errcode_t ext2fs_badblocks_list_add(ext2_badblocks_list bb,
701 blk_t blk);
702extern int ext2fs_badblocks_list_test(ext2_badblocks_list bb,
703 blk_t blk);
Theodore Ts'o7d7bdd52003-06-24 17:34:02 -0400704extern int ext2fs_u32_list_del(ext2_u32_list bb, __u32 blk);
705extern void ext2fs_badblocks_list_del(ext2_u32_list bb, __u32 blk);
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000706extern errcode_t
707 ext2fs_badblocks_list_iterate_begin(ext2_badblocks_list bb,
708 ext2_badblocks_iterate *ret);
709extern int ext2fs_badblocks_list_iterate(ext2_badblocks_iterate iter,
710 blk_t *blk);
711extern void ext2fs_badblocks_list_iterate_end(ext2_badblocks_iterate iter);
Theodore Ts'oa29f4d31997-04-29 21:26:48 +0000712extern errcode_t ext2fs_badblocks_copy(ext2_badblocks_list src,
713 ext2_badblocks_list *dest);
Theodore Ts'o57dca852000-07-04 19:20:25 +0000714extern int ext2fs_badblocks_equal(ext2_badblocks_list bb1,
715 ext2_badblocks_list bb2);
Theodore Ts'o220c0042003-03-14 00:59:42 -0500716extern int ext2fs_u32_list_count(ext2_u32_list bb);
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000717
718/* bb_compat */
Theodore Ts'o3839e651997-04-26 13:21:57 +0000719extern errcode_t badblocks_list_create(badblocks_list *ret, int size);
Theodore Ts'o3839e651997-04-26 13:21:57 +0000720extern errcode_t badblocks_list_add(badblocks_list bb, blk_t blk);
721extern int badblocks_list_test(badblocks_list bb, blk_t blk);
722extern errcode_t badblocks_list_iterate_begin(badblocks_list bb,
723 badblocks_iterate *ret);
724extern int badblocks_list_iterate(badblocks_iterate iter, blk_t *blk);
725extern void badblocks_list_iterate_end(badblocks_iterate iter);
Theodore Ts'oa29f4d31997-04-29 21:26:48 +0000726extern void badblocks_list_free(badblocks_list bb);
Theodore Ts'o3839e651997-04-26 13:21:57 +0000727
728/* bb_inode.c */
729extern errcode_t ext2fs_update_bb_inode(ext2_filsys fs,
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000730 ext2_badblocks_list bb_list);
Theodore Ts'o3839e651997-04-26 13:21:57 +0000731
732/* bitmaps.c */
Theodore Ts'oa0553c92007-07-22 22:59:50 -0400733extern void ext2fs_free_block_bitmap(ext2fs_block_bitmap bitmap);
734extern void ext2fs_free_inode_bitmap(ext2fs_inode_bitmap bitmap);
Theodore Ts'of1f115a2007-07-23 04:32:48 -0400735extern errcode_t ext2fs_copy_bitmap(ext2fs_generic_bitmap src,
736 ext2fs_generic_bitmap *dest);
Theodore Ts'o3839e651997-04-26 13:21:57 +0000737extern errcode_t ext2fs_write_inode_bitmap(ext2_filsys fs);
738extern errcode_t ext2fs_write_block_bitmap (ext2_filsys fs);
739extern errcode_t ext2fs_read_inode_bitmap (ext2_filsys fs);
740extern errcode_t ext2fs_read_block_bitmap(ext2_filsys fs);
Theodore Ts'o50e1e101997-04-26 13:58:21 +0000741extern errcode_t ext2fs_allocate_block_bitmap(ext2_filsys fs,
742 const char *descr,
743 ext2fs_block_bitmap *ret);
Theodore Ts'o94968e72011-06-10 17:55:09 -0400744extern errcode_t ext2fs_allocate_subcluster_bitmap(ext2_filsys fs,
745 const char *descr,
746 ext2fs_block_bitmap *ret);
747extern int ext2fs_get_bitmap_granularity(ext2fs_block_bitmap bitmap);
Theodore Ts'o50e1e101997-04-26 13:58:21 +0000748extern errcode_t ext2fs_allocate_inode_bitmap(ext2_filsys fs,
749 const char *descr,
750 ext2fs_inode_bitmap *ret);
751extern errcode_t ext2fs_fudge_inode_bitmap_end(ext2fs_inode_bitmap bitmap,
Theodore Ts'o31dbecd2001-01-11 04:54:39 +0000752 ext2_ino_t end, ext2_ino_t *oend);
Theodore Ts'o50e1e101997-04-26 13:58:21 +0000753extern errcode_t ext2fs_fudge_block_bitmap_end(ext2fs_block_bitmap bitmap,
754 blk_t end, blk_t *oend);
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -0400755extern errcode_t ext2fs_fudge_block_bitmap_end2(ext2fs_block_bitmap bitmap,
756 blk64_t end, blk64_t *oend);
Theodore Ts'o50e1e101997-04-26 13:58:21 +0000757extern void ext2fs_clear_inode_bitmap(ext2fs_inode_bitmap bitmap);
758extern void ext2fs_clear_block_bitmap(ext2fs_block_bitmap bitmap);
Theodore Ts'o3839e651997-04-26 13:21:57 +0000759extern errcode_t ext2fs_read_bitmaps(ext2_filsys fs);
760extern errcode_t ext2fs_write_bitmaps(ext2_filsys fs);
Theodore Ts'o50448d32007-07-22 23:42:14 -0400761extern errcode_t ext2fs_resize_inode_bitmap(__u32 new_end, __u32 new_real_end,
762 ext2fs_inode_bitmap bmap);
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -0400763extern errcode_t ext2fs_resize_inode_bitmap2(__u64 new_end,
764 __u64 new_real_end,
765 ext2fs_inode_bitmap bmap);
Theodore Ts'o50448d32007-07-22 23:42:14 -0400766extern errcode_t ext2fs_resize_block_bitmap(__u32 new_end, __u32 new_real_end,
767 ext2fs_block_bitmap bmap);
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -0400768extern errcode_t ext2fs_resize_block_bitmap2(__u64 new_end,
769 __u64 new_real_end,
770 ext2fs_block_bitmap bmap);
Theodore Ts'o50448d32007-07-22 23:42:14 -0400771extern errcode_t ext2fs_compare_block_bitmap(ext2fs_block_bitmap bm1,
772 ext2fs_block_bitmap bm2);
773extern errcode_t ext2fs_compare_inode_bitmap(ext2fs_inode_bitmap bm1,
774 ext2fs_inode_bitmap bm2);
Theodore Ts'of1f115a2007-07-23 04:32:48 -0400775extern errcode_t ext2fs_set_inode_bitmap_range(ext2fs_inode_bitmap bmap,
776 ext2_ino_t start, unsigned int num,
777 void *in);
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -0400778extern errcode_t ext2fs_set_inode_bitmap_range2(ext2fs_inode_bitmap bmap,
779 __u64 start, size_t num,
780 void *in);
Theodore Ts'of1f115a2007-07-23 04:32:48 -0400781extern errcode_t ext2fs_get_inode_bitmap_range(ext2fs_inode_bitmap bmap,
782 ext2_ino_t start, unsigned int num,
783 void *out);
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -0400784extern errcode_t ext2fs_get_inode_bitmap_range2(ext2fs_inode_bitmap bmap,
785 __u64 start, size_t num,
786 void *out);
Theodore Ts'of1f115a2007-07-23 04:32:48 -0400787extern errcode_t ext2fs_set_block_bitmap_range(ext2fs_block_bitmap bmap,
788 blk_t start, unsigned int num,
789 void *in);
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -0400790extern errcode_t ext2fs_set_block_bitmap_range2(ext2fs_block_bitmap bmap,
791 blk64_t start, size_t num,
792 void *in);
Theodore Ts'of1f115a2007-07-23 04:32:48 -0400793extern errcode_t ext2fs_get_block_bitmap_range(ext2fs_block_bitmap bmap,
794 blk_t start, unsigned int num,
795 void *out);
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -0400796extern errcode_t ext2fs_get_block_bitmap_range2(ext2fs_block_bitmap bmap,
797 blk64_t start, size_t num,
798 void *out);
Theodore Ts'o50448d32007-07-22 23:42:14 -0400799
Jose R. Santose3854b32009-06-06 15:22:43 -0400800/* blknum.c */
801extern dgrp_t ext2fs_group_of_blk2(ext2_filsys fs, blk64_t);
802extern blk64_t ext2fs_group_first_block2(ext2_filsys fs, dgrp_t group);
803extern blk64_t ext2fs_group_last_block2(ext2_filsys fs, dgrp_t group);
Eric Sandeen98f45472011-09-16 09:21:53 -0400804extern int ext2fs_group_blocks_count(ext2_filsys fs, dgrp_t group);
Jose R. Santose3854b32009-06-06 15:22:43 -0400805extern blk64_t ext2fs_inode_data_blocks2(ext2_filsys fs,
806 struct ext2_inode *inode);
807extern blk64_t ext2fs_inode_i_blocks(ext2_filsys fs,
808 struct ext2_inode *inode);
809extern blk64_t ext2fs_blocks_count(struct ext2_super_block *super);
810extern void ext2fs_blocks_count_set(struct ext2_super_block *super,
811 blk64_t blk);
812extern void ext2fs_blocks_count_add(struct ext2_super_block *super,
813 blk64_t blk);
814extern blk64_t ext2fs_r_blocks_count(struct ext2_super_block *super);
815extern void ext2fs_r_blocks_count_set(struct ext2_super_block *super,
816 blk64_t blk);
817extern void ext2fs_r_blocks_count_add(struct ext2_super_block *super,
818 blk64_t blk);
819extern blk64_t ext2fs_free_blocks_count(struct ext2_super_block *super);
820extern void ext2fs_free_blocks_count_set(struct ext2_super_block *super,
821 blk64_t blk);
822extern void ext2fs_free_blocks_count_add(struct ext2_super_block *super,
823 blk64_t blk);
824/* Block group descriptor accessor functions */
825extern struct ext2_group_desc *ext2fs_group_desc(ext2_filsys fs,
Eric Sandeenefe0b402010-06-13 21:00:00 -0400826 struct opaque_ext2_group_desc *gdp,
Jose R. Santose3854b32009-06-06 15:22:43 -0400827 dgrp_t group);
828extern blk64_t ext2fs_block_bitmap_loc(ext2_filsys fs, dgrp_t group);
829extern void ext2fs_block_bitmap_loc_set(ext2_filsys fs, dgrp_t group,
830 blk64_t blk);
831extern blk64_t ext2fs_inode_bitmap_loc(ext2_filsys fs, dgrp_t group);
832extern void ext2fs_inode_bitmap_loc_set(ext2_filsys fs, dgrp_t group,
833 blk64_t blk);
834extern blk64_t ext2fs_inode_table_loc(ext2_filsys fs, dgrp_t group);
835extern void ext2fs_inode_table_loc_set(ext2_filsys fs, dgrp_t group,
836 blk64_t blk);
Nick Dokosd62d2182009-09-07 21:13:59 -0400837extern __u32 ext2fs_bg_free_blocks_count(ext2_filsys fs, dgrp_t group);
Jose R. Santose3854b32009-06-06 15:22:43 -0400838extern void ext2fs_bg_free_blocks_count_set(ext2_filsys fs, dgrp_t group,
Nick Dokosd62d2182009-09-07 21:13:59 -0400839 __u32 n);
840extern __u32 ext2fs_bg_free_inodes_count(ext2_filsys fs, dgrp_t group);
Jose R. Santose3854b32009-06-06 15:22:43 -0400841extern void ext2fs_bg_free_inodes_count_set(ext2_filsys fs, dgrp_t group,
Nick Dokosd62d2182009-09-07 21:13:59 -0400842 __u32 n);
843extern __u32 ext2fs_bg_used_dirs_count(ext2_filsys fs, dgrp_t group);
Jose R. Santose3854b32009-06-06 15:22:43 -0400844extern void ext2fs_bg_used_dirs_count_set(ext2_filsys fs, dgrp_t group,
Nick Dokosd62d2182009-09-07 21:13:59 -0400845 __u32 n);
846extern __u32 ext2fs_bg_itable_unused(ext2_filsys fs, dgrp_t group);
Jose R. Santose3854b32009-06-06 15:22:43 -0400847extern void ext2fs_bg_itable_unused_set(ext2_filsys fs, dgrp_t group,
Nick Dokosd62d2182009-09-07 21:13:59 -0400848 __u32 n);
Jose R. Santose3854b32009-06-06 15:22:43 -0400849extern __u16 ext2fs_bg_flags(ext2_filsys fs, dgrp_t group);
Eric Sandeene633b582009-10-25 21:41:32 -0400850extern void ext2fs_bg_flags_zap(ext2_filsys fs, dgrp_t group);
Theodore Ts'ocd65a242009-10-25 21:42:12 -0400851extern int ext2fs_bg_flags_test(ext2_filsys fs, dgrp_t group, __u16 bg_flag);
Eric Sandeene633b582009-10-25 21:41:32 -0400852extern void ext2fs_bg_flags_set(ext2_filsys fs, dgrp_t group, __u16 bg_flags);
853extern void ext2fs_bg_flags_clear(ext2_filsys fs, dgrp_t group, __u16 bg_flags);
Jose R. Santose3854b32009-06-06 15:22:43 -0400854extern __u16 ext2fs_bg_checksum(ext2_filsys fs, dgrp_t group);
855extern void ext2fs_bg_checksum_set(ext2_filsys fs, dgrp_t group, __u16 checksum);
Theodore Ts'o0c80c442011-10-16 20:29:00 -0400856extern blk64_t ext2fs_file_acl_block(ext2_filsys fs,
857 const struct ext2_inode *inode);
858extern void ext2fs_file_acl_block_set(ext2_filsys fs,
859 struct ext2_inode *inode, blk64_t blk);
Theodore Ts'o3839e651997-04-26 13:21:57 +0000860
861/* block.c */
862extern errcode_t ext2fs_block_iterate(ext2_filsys fs,
Theodore Ts'o31dbecd2001-01-11 04:54:39 +0000863 ext2_ino_t ino,
Theodore Ts'o3839e651997-04-26 13:21:57 +0000864 int flags,
865 char *block_buf,
866 int (*func)(ext2_filsys fs,
867 blk_t *blocknr,
868 int blockcnt,
Theodore Ts'ob5abe6f1998-01-19 14:47:53 +0000869 void *priv_data),
870 void *priv_data);
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000871errcode_t ext2fs_block_iterate2(ext2_filsys fs,
Theodore Ts'o31dbecd2001-01-11 04:54:39 +0000872 ext2_ino_t ino,
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000873 int flags,
874 char *block_buf,
875 int (*func)(ext2_filsys fs,
876 blk_t *blocknr,
Theodore Ts'o03673db1998-06-10 20:39:43 +0000877 e2_blkcnt_t blockcnt,
Theodore Ts'o674a4ee1998-03-23 02:06:52 +0000878 blk_t ref_blk,
879 int ref_offset,
880 void *priv_data),
881 void *priv_data);
Theodore Ts'o272631e2009-06-01 16:15:40 -0400882errcode_t ext2fs_block_iterate3(ext2_filsys fs,
883 ext2_ino_t ino,
884 int flags,
885 char *block_buf,
886 int (*func)(ext2_filsys fs,
887 blk64_t *blocknr,
888 e2_blkcnt_t blockcnt,
889 blk64_t ref_blk,
890 int ref_offset,
891 void *priv_data),
892 void *priv_data);
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000893
Theodore Ts'o30fab291997-10-25 22:37:42 +0000894/* bmap.c */
Theodore Ts'o31dbecd2001-01-11 04:54:39 +0000895extern errcode_t ext2fs_bmap(ext2_filsys fs, ext2_ino_t ino,
Theodore Ts'oefc6f622008-08-27 23:07:54 -0400896 struct ext2_inode *inode,
Theodore Ts'o30fab291997-10-25 22:37:42 +0000897 char *block_buf, int bmap_flags,
898 blk_t block, blk_t *phys_blk);
Theodore Ts'oefc6f622008-08-27 23:07:54 -0400899extern errcode_t ext2fs_bmap2(ext2_filsys fs, ext2_ino_t ino,
Theodore Ts'occ9bf5d2008-02-18 14:59:45 -0500900 struct ext2_inode *inode,
901 char *block_buf, int bmap_flags, blk64_t block,
902 int *ret_flags, blk64_t *phys_blk);
Theodore Ts'o30fab291997-10-25 22:37:42 +0000903
Theodore Ts'o4a31c481998-03-30 01:27:25 +0000904#if 0
Theodore Ts'o1e1da291997-06-09 14:51:29 +0000905/* bmove.c */
906extern errcode_t ext2fs_move_blocks(ext2_filsys fs,
907 ext2fs_block_bitmap reserve,
Theodore Ts'o9941fb71997-06-11 22:27:41 +0000908 ext2fs_block_bitmap alloc_map,
Theodore Ts'o1e1da291997-06-09 14:51:29 +0000909 int flags);
Theodore Ts'o4a31c481998-03-30 01:27:25 +0000910#endif
Theodore Ts'o1e1da291997-06-09 14:51:29 +0000911
Theodore Ts'of3db3561997-04-26 13:34:30 +0000912/* check_desc.c */
913extern errcode_t ext2fs_check_desc(ext2_filsys fs);
914
Theodore Ts'o3839e651997-04-26 13:21:57 +0000915/* closefs.c */
916extern errcode_t ext2fs_close(ext2_filsys fs);
Richard W.M. Jones9d9a53e2011-09-24 10:50:42 -0400917extern errcode_t ext2fs_close2(ext2_filsys fs, int flags);
Theodore Ts'o3839e651997-04-26 13:21:57 +0000918extern errcode_t ext2fs_flush(ext2_filsys fs);
Richard W.M. Jones9d9a53e2011-09-24 10:50:42 -0400919extern errcode_t ext2fs_flush2(ext2_filsys fs, int flags);
Theodore Ts'o47183952013-06-15 18:29:52 -0400920extern int ext2fs_bg_has_super(ext2_filsys fs, dgrp_t group_block);
Jose R. Santos71300f32009-06-01 16:15:40 -0400921extern errcode_t ext2fs_super_and_bgd_loc2(ext2_filsys fs,
922 dgrp_t group,
923 blk64_t *ret_super_blk,
924 blk64_t *ret_old_desc_blk,
925 blk64_t *ret_new_desc_blk,
926 blk_t *ret_used_blks);
Theodore Ts'oefc6f622008-08-27 23:07:54 -0400927extern int ext2fs_super_and_bgd_loc(ext2_filsys fs,
Theodore Ts'oef344e12003-11-21 09:02:21 -0500928 dgrp_t group,
929 blk_t *ret_super_blk,
930 blk_t *ret_old_desc_blk,
931 blk_t *ret_new_desc_blk,
932 int *ret_meta_bg);
Theodore Ts'o1b4cd9c2004-12-15 18:06:52 -0500933extern void ext2fs_update_dynamic_rev(ext2_filsys fs);
Theodore Ts'o3839e651997-04-26 13:21:57 +0000934
Darrick J. Wongdb8bbf22011-09-15 23:46:37 -0400935/* crc32c.c */
Darrick J. Wonga7a63672011-09-30 12:38:43 -0700936extern __u32 ext2fs_crc32c_be(__u32 crc, unsigned char const *p, size_t len);
937extern __u32 ext2fs_crc32c_le(__u32 crc, unsigned char const *p, size_t len);
Darrick J. Wongdb8bbf22011-09-15 23:46:37 -0400938
Jose R. Santosca2634a2007-10-21 21:03:19 -0500939/* csum.c */
940extern void ext2fs_group_desc_csum_set(ext2_filsys fs, dgrp_t group);
941extern int ext2fs_group_desc_csum_verify(ext2_filsys fs, dgrp_t group);
Andreas Dilgerf628ace2008-03-31 10:50:19 -0400942extern errcode_t ext2fs_set_gdt_csum(ext2_filsys fs);
Theodore Ts'o87141782012-03-15 12:13:25 -0400943extern __u16 ext2fs_group_desc_csum(ext2_filsys fs, dgrp_t group);
Jose R. Santosca2634a2007-10-21 21:03:19 -0500944
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000945/* dblist.c */
946
Theodore Ts'o31dbecd2001-01-11 04:54:39 +0000947extern errcode_t ext2fs_get_num_dirs(ext2_filsys fs, ext2_ino_t *ret_num_dirs);
Theodore Ts'oa29f4d31997-04-29 21:26:48 +0000948extern errcode_t ext2fs_init_dblist(ext2_filsys fs, ext2_dblist *ret_dblist);
Theodore Ts'o31dbecd2001-01-11 04:54:39 +0000949extern errcode_t ext2fs_add_dir_block(ext2_dblist dblist, ext2_ino_t ino,
Theodore Ts'oa29f4d31997-04-29 21:26:48 +0000950 blk_t blk, int blockcnt);
Theodore Ts'oab13b5a2010-06-13 10:00:00 -0400951extern errcode_t ext2fs_add_dir_block2(ext2_dblist dblist, ext2_ino_t ino,
952 blk64_t blk, e2_blkcnt_t blockcnt);
Theodore Ts'oea1959f2002-08-31 02:32:41 -0400953extern void ext2fs_dblist_sort(ext2_dblist dblist,
954 EXT2_QSORT_TYPE (*sortfunc)(const void *,
955 const void *));
Theodore Ts'oab13b5a2010-06-13 10:00:00 -0400956extern void ext2fs_dblist_sort2(ext2_dblist dblist,
957 EXT2_QSORT_TYPE (*sortfunc)(const void *,
958 const void *));
Theodore Ts'oa29f4d31997-04-29 21:26:48 +0000959extern errcode_t ext2fs_dblist_iterate(ext2_dblist dblist,
960 int (*func)(ext2_filsys fs, struct ext2_db_entry *db_info,
Theodore Ts'ob5abe6f1998-01-19 14:47:53 +0000961 void *priv_data),
962 void *priv_data);
Theodore Ts'oab13b5a2010-06-13 10:00:00 -0400963extern errcode_t ext2fs_dblist_iterate2(ext2_dblist dblist,
964 int (*func)(ext2_filsys fs, struct ext2_db_entry2 *db_info,
965 void *priv_data),
966 void *priv_data);
Theodore Ts'o31dbecd2001-01-11 04:54:39 +0000967extern errcode_t ext2fs_set_dir_block(ext2_dblist dblist, ext2_ino_t ino,
Theodore Ts'oa29f4d31997-04-29 21:26:48 +0000968 blk_t blk, int blockcnt);
Theodore Ts'oab13b5a2010-06-13 10:00:00 -0400969extern errcode_t ext2fs_set_dir_block2(ext2_dblist dblist, ext2_ino_t ino,
970 blk64_t blk, e2_blkcnt_t blockcnt);
Theodore Ts'oa29f4d31997-04-29 21:26:48 +0000971extern errcode_t ext2fs_copy_dblist(ext2_dblist src,
972 ext2_dblist *dest);
Theodore Ts'o549860c1997-06-17 03:55:00 +0000973extern int ext2fs_dblist_count(ext2_dblist dblist);
Theodore Ts'oab13b5a2010-06-13 10:00:00 -0400974extern blk64_t ext2fs_dblist_count2(ext2_dblist dblist);
Theodore Ts'oefc6f622008-08-27 23:07:54 -0400975extern errcode_t ext2fs_dblist_get_last(ext2_dblist dblist,
Theodore Ts'o52b1dd52008-03-13 00:34:16 -0400976 struct ext2_db_entry **entry);
Theodore Ts'oab13b5a2010-06-13 10:00:00 -0400977extern errcode_t ext2fs_dblist_get_last2(ext2_dblist dblist,
978 struct ext2_db_entry2 **entry);
Theodore Ts'o52b1dd52008-03-13 00:34:16 -0400979extern errcode_t ext2fs_dblist_drop_last(ext2_dblist dblist);
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000980
981/* dblist_dir.c */
982extern errcode_t
983 ext2fs_dblist_dir_iterate(ext2_dblist dblist,
984 int flags,
985 char *block_buf,
Theodore Ts'o31dbecd2001-01-11 04:54:39 +0000986 int (*func)(ext2_ino_t dir,
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000987 int entry,
988 struct ext2_dir_entry *dirent,
989 int offset,
990 int blocksize,
991 char *buf,
Theodore Ts'ob5abe6f1998-01-19 14:47:53 +0000992 void *priv_data),
993 void *priv_data);
Theodore Ts'o50e1e101997-04-26 13:58:21 +0000994
995/* dirblock.c */
996extern errcode_t ext2fs_read_dir_block(ext2_filsys fs, blk_t block,
997 void *buf);
Theodore Ts'of9190c82002-03-12 01:05:06 -0500998extern errcode_t ext2fs_read_dir_block2(ext2_filsys fs, blk_t block,
999 void *buf, int flags);
Jose R. Santos57e24672009-06-01 16:15:40 -04001000extern errcode_t ext2fs_read_dir_block3(ext2_filsys fs, blk64_t block,
1001 void *buf, int flags);
Theodore Ts'o50e1e101997-04-26 13:58:21 +00001002extern errcode_t ext2fs_write_dir_block(ext2_filsys fs, blk_t block,
1003 void *buf);
Theodore Ts'of9190c82002-03-12 01:05:06 -05001004extern errcode_t ext2fs_write_dir_block2(ext2_filsys fs, blk_t block,
1005 void *buf, int flags);
Jose R. Santos57e24672009-06-01 16:15:40 -04001006extern errcode_t ext2fs_write_dir_block3(ext2_filsys fs, blk64_t block,
1007 void *buf, int flags);
Theodore Ts'o50e1e101997-04-26 13:58:21 +00001008
Theodore Ts'o52783e02002-03-11 15:04:45 -05001009/* dirhash.c */
1010extern errcode_t ext2fs_dirhash(int version, const char *name, int len,
Theodore Ts'ob33278c2002-08-17 10:52:51 -04001011 const __u32 *seed,
Theodore Ts'o503f9e72002-06-26 16:52:10 -04001012 ext2_dirhash_t *ret_hash,
1013 ext2_dirhash_t *ret_minor_hash);
Theodore Ts'o52783e02002-03-11 15:04:45 -05001014
1015
Theodore Ts'o19c78dc1997-04-29 16:17:09 +00001016/* dir_iterate.c */
Theodore Ts'o8a480352009-06-21 21:07:38 -04001017extern errcode_t ext2fs_get_rec_len(ext2_filsys fs,
1018 struct ext2_dir_entry *dirent,
1019 unsigned int *rec_len);
1020extern errcode_t ext2fs_set_rec_len(ext2_filsys fs,
1021 unsigned int len,
1022 struct ext2_dir_entry *dirent);
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001023extern errcode_t ext2fs_dir_iterate(ext2_filsys fs,
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001024 ext2_ino_t dir,
Theodore Ts'o19c78dc1997-04-29 16:17:09 +00001025 int flags,
1026 char *block_buf,
1027 int (*func)(struct ext2_dir_entry *dirent,
1028 int offset,
1029 int blocksize,
1030 char *buf,
Theodore Ts'ob5abe6f1998-01-19 14:47:53 +00001031 void *priv_data),
1032 void *priv_data);
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001033extern errcode_t ext2fs_dir_iterate2(ext2_filsys fs,
Theodore Ts'o8bd0c952002-01-03 03:29:19 -05001034 ext2_ino_t dir,
1035 int flags,
1036 char *block_buf,
1037 int (*func)(ext2_ino_t dir,
1038 int entry,
1039 struct ext2_dir_entry *dirent,
1040 int offset,
1041 int blocksize,
1042 char *buf,
1043 void *priv_data),
1044 void *priv_data);
Theodore Ts'o19c78dc1997-04-29 16:17:09 +00001045
Theodore Ts'oa29f4d31997-04-29 21:26:48 +00001046/* dupfs.c */
1047extern errcode_t ext2fs_dup_handle(ext2_filsys src, ext2_filsys *dest);
Theodore Ts'o19c78dc1997-04-29 16:17:09 +00001048
Theodore Ts'o3839e651997-04-26 13:21:57 +00001049/* expanddir.c */
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001050extern errcode_t ext2fs_expand_dir(ext2_filsys fs, ext2_ino_t dir);
Theodore Ts'o3839e651997-04-26 13:21:57 +00001051
Theodore Ts'o342d8472001-07-02 11:54:09 -04001052/* ext_attr.c */
Andreas Dilgerfefaef32008-02-02 01:16:32 -07001053extern __u32 ext2fs_ext_attr_hash_entry(struct ext2_ext_attr_entry *entry,
1054 void *data);
Theodore Ts'o342d8472001-07-02 11:54:09 -04001055extern errcode_t ext2fs_read_ext_attr(ext2_filsys fs, blk_t block, void *buf);
Jose R. Santosb91f14b2009-06-01 16:15:40 -04001056extern errcode_t ext2fs_read_ext_attr2(ext2_filsys fs, blk64_t block,
1057 void *buf);
Theodore Ts'o0684a4f2002-08-17 10:19:44 -04001058extern errcode_t ext2fs_write_ext_attr(ext2_filsys fs, blk_t block,
1059 void *buf);
Jose R. Santosb91f14b2009-06-01 16:15:40 -04001060extern errcode_t ext2fs_write_ext_attr2(ext2_filsys fs, blk64_t block,
1061 void *buf);
Theodore Ts'o0684a4f2002-08-17 10:19:44 -04001062extern errcode_t ext2fs_adjust_ea_refcount(ext2_filsys fs, blk_t blk,
1063 char *block_buf,
1064 int adjust, __u32 *newcount);
Jose R. Santosb91f14b2009-06-01 16:15:40 -04001065extern errcode_t ext2fs_adjust_ea_refcount2(ext2_filsys fs, blk64_t blk,
1066 char *block_buf,
1067 int adjust, __u32 *newcount);
Theodore Ts'o0684a4f2002-08-17 10:19:44 -04001068
Theodore Ts'o3eb07f62007-10-14 23:04:58 -04001069/* extent.c */
1070extern errcode_t ext2fs_extent_header_verify(void *ptr, int size);
1071extern errcode_t ext2fs_extent_open(ext2_filsys fs, ext2_ino_t ino,
1072 ext2_extent_handle_t *handle);
number965284b239a2009-05-19 13:34:12 -07001073extern errcode_t ext2fs_extent_open2(ext2_filsys fs, ext2_ino_t ino,
1074 struct ext2_inode *inode,
1075 ext2_extent_handle_t *ret_handle);
Theodore Ts'o2d328bb2008-03-17 23:17:13 -04001076extern void ext2fs_extent_free(ext2_extent_handle_t handle);
Theodore Ts'o3eb07f62007-10-14 23:04:58 -04001077extern errcode_t ext2fs_extent_get(ext2_extent_handle_t handle,
1078 int flags, struct ext2fs_extent *extent);
Theodore Ts'obee7b672012-12-22 18:50:33 -05001079extern errcode_t ext2fs_extent_node_split(ext2_extent_handle_t handle);
Theodore Ts'o3eb07f62007-10-14 23:04:58 -04001080extern errcode_t ext2fs_extent_replace(ext2_extent_handle_t handle, int flags,
1081 struct ext2fs_extent *extent);
1082extern errcode_t ext2fs_extent_insert(ext2_extent_handle_t handle, int flags,
1083 struct ext2fs_extent *extent);
Eric Sandeenf4e99632008-05-20 10:17:46 -05001084extern errcode_t ext2fs_extent_set_bmap(ext2_extent_handle_t handle,
1085 blk64_t logical, blk64_t physical,
1086 int flags);
Theodore Ts'o3eb07f62007-10-14 23:04:58 -04001087extern errcode_t ext2fs_extent_delete(ext2_extent_handle_t handle, int flags);
1088extern errcode_t ext2fs_extent_get_info(ext2_extent_handle_t handle,
1089 struct ext2_extent_info *info);
1090extern errcode_t ext2fs_extent_goto(ext2_extent_handle_t handle,
1091 blk64_t blk);
Theodore Ts'obee7b672012-12-22 18:50:33 -05001092extern errcode_t ext2fs_extent_goto2(ext2_extent_handle_t handle,
1093 int leaf_level, blk64_t blk);
Eric Sandeen789bd402012-12-20 14:05:01 -05001094extern errcode_t ext2fs_extent_fix_parents(ext2_extent_handle_t handle);
Theodore Ts'o3eb07f62007-10-14 23:04:58 -04001095
Theodore Ts'o30fab291997-10-25 22:37:42 +00001096/* fileio.c */
Theodore Ts'oa435ec32003-08-21 00:40:26 -04001097extern errcode_t ext2fs_file_open2(ext2_filsys fs, ext2_ino_t ino,
1098 struct ext2_inode *inode,
1099 int flags, ext2_file_t *ret);
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001100extern errcode_t ext2fs_file_open(ext2_filsys fs, ext2_ino_t ino,
Theodore Ts'o30fab291997-10-25 22:37:42 +00001101 int flags, ext2_file_t *ret);
Theodore Ts'o79a90bd1997-11-03 19:16:55 +00001102extern ext2_filsys ext2fs_file_get_fs(ext2_file_t file);
Renzo Davoli6dc058b2010-07-10 15:32:46 +02001103struct ext2_inode *ext2fs_file_get_inode(ext2_file_t file);
Darrick J. Wong3ae682b2012-02-17 09:56:33 -05001104extern ext2_ino_t ext2fs_file_get_inode_num(ext2_file_t file);
Theodore Ts'o30fab291997-10-25 22:37:42 +00001105extern errcode_t ext2fs_file_close(ext2_file_t file);
Theodore Ts'of12e2852002-02-20 01:06:25 -05001106extern errcode_t ext2fs_file_flush(ext2_file_t file);
Theodore Ts'o30fab291997-10-25 22:37:42 +00001107extern errcode_t ext2fs_file_read(ext2_file_t file, void *buf,
Theodore Ts'o79a90bd1997-11-03 19:16:55 +00001108 unsigned int wanted, unsigned int *got);
Theodore Ts'of12e2852002-02-20 01:06:25 -05001109extern errcode_t ext2fs_file_write(ext2_file_t file, const void *buf,
Theodore Ts'o79a90bd1997-11-03 19:16:55 +00001110 unsigned int nbytes, unsigned int *written);
Theodore Ts'o819157d2003-01-22 18:25:39 -05001111extern errcode_t ext2fs_file_llseek(ext2_file_t file, __u64 offset,
1112 int whence, __u64 *ret_pos);
Theodore Ts'o674a4ee1998-03-23 02:06:52 +00001113extern errcode_t ext2fs_file_lseek(ext2_file_t file, ext2_off_t offset,
1114 int whence, ext2_off_t *ret_pos);
Theodore Ts'o819157d2003-01-22 18:25:39 -05001115errcode_t ext2fs_file_get_lsize(ext2_file_t file, __u64 *ret_size);
Theodore Ts'o79a90bd1997-11-03 19:16:55 +00001116extern ext2_off_t ext2fs_file_get_size(ext2_file_t file);
1117extern errcode_t ext2fs_file_set_size(ext2_file_t file, ext2_off_t size);
Theodore Ts'o27a0e952010-07-22 09:51:23 -04001118extern errcode_t ext2fs_file_set_size2(ext2_file_t file, ext2_off64_t size);
Theodore Ts'o30fab291997-10-25 22:37:42 +00001119
Theodore Ts'ode23aa12000-08-19 17:00:47 +00001120/* finddev.c */
1121extern char *ext2fs_find_block_device(dev_t device);
1122
Theodore Ts'o4d0f3e12001-01-11 15:48:50 +00001123/* flushb.c */
1124extern errcode_t ext2fs_sync_device(int fd, int flushb);
1125
Theodore Ts'o3839e651997-04-26 13:21:57 +00001126/* freefs.c */
1127extern void ext2fs_free(ext2_filsys fs);
Theodore Ts'oa29f4d31997-04-29 21:26:48 +00001128extern void ext2fs_free_dblist(ext2_dblist dblist);
Theodore Ts'ob7a00562002-07-20 00:28:07 -04001129extern void ext2fs_badblocks_list_free(ext2_badblocks_list bb);
1130extern void ext2fs_u32_list_free(ext2_u32_list bb);
Theodore Ts'o50e1e101997-04-26 13:58:21 +00001131
Theodore Ts'oa0553c92007-07-22 22:59:50 -04001132/* gen_bitmap.c */
1133extern void ext2fs_free_generic_bitmap(ext2fs_inode_bitmap bitmap);
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001134extern errcode_t ext2fs_make_generic_bitmap(errcode_t magic, ext2_filsys fs,
1135 __u32 start, __u32 end,
Theodore Ts'oa0553c92007-07-22 22:59:50 -04001136 __u32 real_end,
1137 const char *descr, char *init_map,
1138 ext2fs_generic_bitmap *ret);
1139extern errcode_t ext2fs_allocate_generic_bitmap(__u32 start,
1140 __u32 end,
1141 __u32 real_end,
1142 const char *descr,
1143 ext2fs_generic_bitmap *ret);
1144extern errcode_t ext2fs_copy_generic_bitmap(ext2fs_generic_bitmap src,
1145 ext2fs_generic_bitmap *dest);
1146extern void ext2fs_clear_generic_bitmap(ext2fs_generic_bitmap bitmap);
1147extern errcode_t ext2fs_fudge_generic_bitmap_end(ext2fs_inode_bitmap bitmap,
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001148 errcode_t magic,
Theodore Ts'oa0553c92007-07-22 22:59:50 -04001149 errcode_t neq,
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001150 ext2_ino_t end,
Theodore Ts'oa0553c92007-07-22 22:59:50 -04001151 ext2_ino_t *oend);
1152extern void ext2fs_set_generic_bitmap_padding(ext2fs_generic_bitmap map);
Theodore Ts'o50448d32007-07-22 23:42:14 -04001153extern errcode_t ext2fs_resize_generic_bitmap(errcode_t magic,
1154 __u32 new_end,
1155 __u32 new_real_end,
1156 ext2fs_generic_bitmap bmap);
1157extern errcode_t ext2fs_compare_generic_bitmap(errcode_t magic, errcode_t neq,
1158 ext2fs_generic_bitmap bm1,
1159 ext2fs_generic_bitmap bm2);
Theodore Ts'of1f115a2007-07-23 04:32:48 -04001160extern errcode_t ext2fs_get_generic_bitmap_range(ext2fs_generic_bitmap bmap,
1161 errcode_t magic,
1162 __u32 start, __u32 num,
1163 void *out);
1164extern errcode_t ext2fs_set_generic_bitmap_range(ext2fs_generic_bitmap bmap,
1165 errcode_t magic,
1166 __u32 start, __u32 num,
1167 void *in);
Theodore Ts'o664c3322012-04-06 11:44:54 -07001168extern errcode_t ext2fs_find_first_zero_generic_bitmap(ext2fs_generic_bitmap bitmap,
1169 __u32 start, __u32 end,
1170 __u32 *out);
Theodore Ts'oa0553c92007-07-22 22:59:50 -04001171
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -04001172/* gen_bitmap64.c */
Lukas Czerner9288e3b2011-12-16 17:31:07 -05001173
1174/* Generate and print bitmap usage statistics */
1175#define BMAP_STATS
1176
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -04001177void ext2fs_free_generic_bmap(ext2fs_generic_bitmap bmap);
1178errcode_t ext2fs_alloc_generic_bmap(ext2_filsys fs, errcode_t magic,
1179 int type, __u64 start, __u64 end,
1180 __u64 real_end,
1181 const char *descr,
1182 ext2fs_generic_bitmap *ret);
1183errcode_t ext2fs_copy_generic_bmap(ext2fs_generic_bitmap src,
1184 ext2fs_generic_bitmap *dest);
1185void ext2fs_clear_generic_bmap(ext2fs_generic_bitmap bitmap);
1186errcode_t ext2fs_fudge_generic_bmap_end(ext2fs_generic_bitmap bitmap,
1187 errcode_t neq,
1188 __u64 end, __u64 *oend);
1189void ext2fs_set_generic_bmap_padding(ext2fs_generic_bitmap bmap);
1190errcode_t ext2fs_resize_generic_bmap(ext2fs_generic_bitmap bmap,
1191 __u64 new_end,
1192 __u64 new_real_end);
1193errcode_t ext2fs_compare_generic_bmap(errcode_t neq,
1194 ext2fs_generic_bitmap bm1,
1195 ext2fs_generic_bitmap bm2);
1196errcode_t ext2fs_get_generic_bmap_range(ext2fs_generic_bitmap bmap,
1197 __u64 start, unsigned int num,
1198 void *out);
1199errcode_t ext2fs_set_generic_bmap_range(ext2fs_generic_bitmap bmap,
1200 __u64 start, unsigned int num,
1201 void *in);
Theodore Ts'o94968e72011-06-10 17:55:09 -04001202errcode_t ext2fs_convert_subcluster_bitmap(ext2_filsys fs,
1203 ext2fs_block_bitmap *bitmap);
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -04001204
Theodore Ts'o50e1e101997-04-26 13:58:21 +00001205/* getsize.c */
1206extern errcode_t ext2fs_get_device_size(const char *file, int blocksize,
1207 blk_t *retblocks);
Jose R. Santosbeab8de2008-08-20 12:34:07 -05001208extern errcode_t ext2fs_get_device_size2(const char *file, int blocksize,
1209 blk64_t *retblocks);
Theodore Ts'o3839e651997-04-26 13:21:57 +00001210
Theodore Ts'o93d5c382003-05-21 17:28:29 -04001211/* getsectsize.c */
Theodore Ts'odd0a2672012-05-07 13:25:44 -04001212extern int ext2fs_get_dio_alignment(int fd);
Theodore Ts'o93d5c382003-05-21 17:28:29 -04001213errcode_t ext2fs_get_device_sectsize(const char *file, int *sectsize);
Theodore Ts'obb1158b2010-05-17 22:31:45 -04001214errcode_t ext2fs_get_device_phys_sectsize(const char *file, int *sectsize);
Theodore Ts'o93d5c382003-05-21 17:28:29 -04001215
Theodore Ts'o1ca10592008-04-09 11:39:11 -04001216/* i_block.c */
1217errcode_t ext2fs_iblk_add_blocks(ext2_filsys fs, struct ext2_inode *inode,
1218 blk64_t num_blocks);
1219errcode_t ext2fs_iblk_sub_blocks(ext2_filsys fs, struct ext2_inode *inode,
1220 blk64_t num_blocks);
1221errcode_t ext2fs_iblk_set(ext2_filsys fs, struct ext2_inode *inode, blk64_t b);
1222
Theodore Ts'o72ed1262000-11-12 19:32:20 +00001223/* imager.c */
1224extern errcode_t ext2fs_image_inode_write(ext2_filsys fs, int fd, int flags);
1225extern errcode_t ext2fs_image_inode_read(ext2_filsys fs, int fd, int flags);
1226extern errcode_t ext2fs_image_super_write(ext2_filsys fs, int fd, int flags);
1227extern errcode_t ext2fs_image_super_read(ext2_filsys fs, int fd, int flags);
1228extern errcode_t ext2fs_image_bitmap_write(ext2_filsys fs, int fd, int flags);
1229extern errcode_t ext2fs_image_bitmap_read(ext2_filsys fs, int fd, int flags);
1230
Theodore Ts'odc8ce342005-01-06 00:04:24 -05001231/* ind_block.c */
1232errcode_t ext2fs_read_ind_block(ext2_filsys fs, blk_t blk, void *buf);
1233errcode_t ext2fs_write_ind_block(ext2_filsys fs, blk_t blk, void *buf);
1234
Theodore Ts'o3839e651997-04-26 13:21:57 +00001235/* initialize.c */
1236extern errcode_t ext2fs_initialize(const char *name, int flags,
1237 struct ext2_super_block *param,
1238 io_manager manager, ext2_filsys *ret_fs);
1239
Theodore Ts'of12e2852002-02-20 01:06:25 -05001240/* icount.c */
1241extern void ext2fs_free_icount(ext2_icount_t icount);
Theodore Ts'o1b9d8cb2007-04-06 14:30:39 -04001242extern errcode_t ext2fs_create_icount_tdb(ext2_filsys fs, char *tdb_dir,
1243 int flags, ext2_icount_t *ret);
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001244extern errcode_t ext2fs_create_icount2(ext2_filsys fs, int flags,
Theodore Ts'o54434922003-12-07 01:28:50 -05001245 unsigned int size,
Theodore Ts'of12e2852002-02-20 01:06:25 -05001246 ext2_icount_t hint, ext2_icount_t *ret);
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001247extern errcode_t ext2fs_create_icount(ext2_filsys fs, int flags,
Theodore Ts'o54434922003-12-07 01:28:50 -05001248 unsigned int size,
Theodore Ts'of12e2852002-02-20 01:06:25 -05001249 ext2_icount_t *ret);
1250extern errcode_t ext2fs_icount_fetch(ext2_icount_t icount, ext2_ino_t ino,
1251 __u16 *ret);
1252extern errcode_t ext2fs_icount_increment(ext2_icount_t icount, ext2_ino_t ino,
1253 __u16 *ret);
1254extern errcode_t ext2fs_icount_decrement(ext2_icount_t icount, ext2_ino_t ino,
1255 __u16 *ret);
1256extern errcode_t ext2fs_icount_store(ext2_icount_t icount, ext2_ino_t ino,
1257 __u16 count);
1258extern ext2_ino_t ext2fs_get_icount_size(ext2_icount_t icount);
1259errcode_t ext2fs_icount_validate(ext2_icount_t icount, FILE *);
1260
Theodore Ts'oab3f5c52012-09-09 21:35:39 -04001261/* inline.c */
1262
1263extern errcode_t ext2fs_get_memalign(unsigned long size,
1264 unsigned long align, void *ptr);
1265
Theodore Ts'o3839e651997-04-26 13:21:57 +00001266/* inode.c */
Theodore Ts'o72ed1262000-11-12 19:32:20 +00001267extern errcode_t ext2fs_flush_icache(ext2_filsys fs);
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001268extern errcode_t ext2fs_get_next_inode_full(ext2_inode_scan scan,
Theodore Ts'o73311962005-01-25 23:42:56 -05001269 ext2_ino_t *ino,
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001270 struct ext2_inode *inode,
Theodore Ts'o73311962005-01-25 23:42:56 -05001271 int bufsize);
Theodore Ts'o3839e651997-04-26 13:21:57 +00001272extern errcode_t ext2fs_open_inode_scan(ext2_filsys fs, int buffer_blocks,
1273 ext2_inode_scan *ret_scan);
1274extern void ext2fs_close_inode_scan(ext2_inode_scan scan);
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001275extern errcode_t ext2fs_get_next_inode(ext2_inode_scan scan, ext2_ino_t *ino,
Theodore Ts'o3839e651997-04-26 13:21:57 +00001276 struct ext2_inode *inode);
Theodore Ts'o19c78dc1997-04-29 16:17:09 +00001277extern errcode_t ext2fs_inode_scan_goto_blockgroup(ext2_inode_scan scan,
1278 int group);
1279extern void ext2fs_set_inode_callback
1280 (ext2_inode_scan scan,
1281 errcode_t (*done_group)(ext2_filsys fs,
1282 ext2_inode_scan scan,
1283 dgrp_t group,
Theodore Ts'ob5abe6f1998-01-19 14:47:53 +00001284 void * priv_data),
Theodore Ts'o19c78dc1997-04-29 16:17:09 +00001285 void *done_group_data);
1286extern int ext2fs_inode_scan_flags(ext2_inode_scan scan, int set_flags,
1287 int clear_flags);
Theodore Ts'o73311962005-01-25 23:42:56 -05001288extern errcode_t ext2fs_read_inode_full(ext2_filsys fs, ext2_ino_t ino,
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001289 struct ext2_inode * inode,
Theodore Ts'o73311962005-01-25 23:42:56 -05001290 int bufsize);
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001291extern errcode_t ext2fs_read_inode (ext2_filsys fs, ext2_ino_t ino,
Theodore Ts'o3839e651997-04-26 13:21:57 +00001292 struct ext2_inode * inode);
Theodore Ts'o73311962005-01-25 23:42:56 -05001293extern errcode_t ext2fs_write_inode_full(ext2_filsys fs, ext2_ino_t ino,
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001294 struct ext2_inode * inode,
Theodore Ts'o73311962005-01-25 23:42:56 -05001295 int bufsize);
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001296extern errcode_t ext2fs_write_inode(ext2_filsys fs, ext2_ino_t ino,
Theodore Ts'o3839e651997-04-26 13:21:57 +00001297 struct ext2_inode * inode);
Theodore Ts'o030970e2005-03-20 20:05:22 -05001298extern errcode_t ext2fs_write_new_inode(ext2_filsys fs, ext2_ino_t ino,
1299 struct ext2_inode * inode);
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001300extern errcode_t ext2fs_get_blocks(ext2_filsys fs, ext2_ino_t ino, blk_t *blocks);
1301extern errcode_t ext2fs_check_directory(ext2_filsys fs, ext2_ino_t ino);
Theodore Ts'o3839e651997-04-26 13:21:57 +00001302
Theodore Ts'of12e2852002-02-20 01:06:25 -05001303/* inode_io.c */
1304extern io_manager inode_io_manager;
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001305extern errcode_t ext2fs_inode_io_intern(ext2_filsys fs, ext2_ino_t ino,
Theodore Ts'o546a1ff2002-03-07 23:52:56 -05001306 char **name);
Theodore Ts'oa435ec32003-08-21 00:40:26 -04001307extern errcode_t ext2fs_inode_io_intern2(ext2_filsys fs, ext2_ino_t ino,
1308 struct ext2_inode *inode,
1309 char **name);
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001310
Theodore Ts'o50e1e101997-04-26 13:58:21 +00001311/* ismounted.c */
1312extern errcode_t ext2fs_check_if_mounted(const char *file, int *mount_flags);
Theodore Ts'o43ec8732001-01-03 14:56:46 +00001313extern errcode_t ext2fs_check_mount_point(const char *device, int *mount_flags,
1314 char *mtpt, int mtlen);
Theodore Ts'o50e1e101997-04-26 13:58:21 +00001315
Theodore Ts'o3adb9372010-07-22 09:37:35 -04001316/* punch.c */
Darrick J. Wong4ee4ad82013-10-07 09:51:20 -04001317/*
1318 * NOTE: This function removes from an inode the blocks "start", "end", and
1319 * every block in between.
1320 */
Theodore Ts'o3adb9372010-07-22 09:37:35 -04001321extern errcode_t ext2fs_punch(ext2_filsys fs, ext2_ino_t ino,
1322 struct ext2_inode *inode,
1323 char *block_buf, blk64_t start,
1324 blk64_t end);
1325
Theodore Ts'o3839e651997-04-26 13:21:57 +00001326/* namei.c */
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001327extern errcode_t ext2fs_lookup(ext2_filsys fs, ext2_ino_t dir, const char *name,
1328 int namelen, char *buf, ext2_ino_t *inode);
1329extern errcode_t ext2fs_namei(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
1330 const char *name, ext2_ino_t *inode);
1331errcode_t ext2fs_namei_follow(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
1332 const char *name, ext2_ino_t *inode);
1333extern errcode_t ext2fs_follow_link(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
1334 ext2_ino_t inode, ext2_ino_t *res_inode);
Theodore Ts'o1e3472c1997-04-29 14:53:37 +00001335
1336/* native.c */
1337int ext2fs_native_flag(void);
Theodore Ts'o3839e651997-04-26 13:21:57 +00001338
1339/* newdir.c */
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001340extern errcode_t ext2fs_new_dir_block(ext2_filsys fs, ext2_ino_t dir_ino,
1341 ext2_ino_t parent_ino, char **block);
Theodore Ts'o3839e651997-04-26 13:21:57 +00001342
1343/* mkdir.c */
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001344extern errcode_t ext2fs_mkdir(ext2_filsys fs, ext2_ino_t parent, ext2_ino_t inum,
Theodore Ts'o3839e651997-04-26 13:21:57 +00001345 const char *name);
1346
Theodore Ts'od3cd93c2000-10-24 18:33:16 +00001347/* mkjournal.c */
Theodore Ts'oc8608502008-04-27 16:10:32 -04001348extern errcode_t ext2fs_zero_blocks(ext2_filsys fs, blk_t blk, int num,
1349 blk_t *ret_blk, int *ret_count);
Jose R. Santos73d0c4c2009-06-01 16:15:40 -04001350extern errcode_t ext2fs_zero_blocks2(ext2_filsys fs, blk64_t blk, int num,
Andreas Dilger931b58e2011-06-11 12:17:29 -04001351 blk64_t *ret_blk, int *ret_count);
Theodore Ts'oa1128472001-01-16 06:56:14 +00001352extern errcode_t ext2fs_create_journal_superblock(ext2_filsys fs,
Andreas Dilger931b58e2011-06-11 12:17:29 -04001353 __u32 num_blocks, int flags,
Theodore Ts'oa1128472001-01-16 06:56:14 +00001354 char **ret_jsb);
1355extern errcode_t ext2fs_add_journal_device(ext2_filsys fs,
1356 ext2_filsys journal_dev);
Andreas Dilger931b58e2011-06-11 12:17:29 -04001357extern errcode_t ext2fs_add_journal_inode(ext2_filsys fs, blk_t num_blocks,
Theodore Ts'o31a17b32001-01-03 13:04:12 +00001358 int flags);
Andreas Dilger931b58e2011-06-11 12:17:29 -04001359extern int ext2fs_default_journal_size(__u64 num_blocks);
Theodore Ts'od3cd93c2000-10-24 18:33:16 +00001360
Theodore Ts'o3839e651997-04-26 13:21:57 +00001361/* openfs.c */
1362extern errcode_t ext2fs_open(const char *name, int flags, int superblock,
Theodore Ts'o54434922003-12-07 01:28:50 -05001363 unsigned int block_size, io_manager manager,
Theodore Ts'o3839e651997-04-26 13:21:57 +00001364 ext2_filsys *ret_fs);
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001365extern errcode_t ext2fs_open2(const char *name, const char *io_options,
1366 int flags, int superblock,
Theodore Ts'o2e8ca9a2004-11-30 14:07:11 -05001367 unsigned int block_size, io_manager manager,
1368 ext2_filsys *ret_fs);
Jose R. Santos4f8d6ab2009-06-01 16:15:40 -04001369extern blk64_t ext2fs_descriptor_block_loc2(ext2_filsys fs,
1370 blk64_t group_block, dgrp_t i);
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001371extern blk_t ext2fs_descriptor_block_loc(ext2_filsys fs, blk_t group_block,
Theodore Ts'oc046ac72002-10-20 00:38:57 -04001372 dgrp_t i);
Theodore Ts'o1ad54a92004-07-28 21:11:48 -04001373errcode_t ext2fs_get_data_io(ext2_filsys fs, io_channel *old_io);
1374errcode_t ext2fs_set_data_io(ext2_filsys fs, io_channel new_io);
1375errcode_t ext2fs_rewrite_to_io(ext2_filsys fs, io_channel new_io);
Theodore Ts'o3839e651997-04-26 13:21:57 +00001376
1377/* get_pathname.c */
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001378extern errcode_t ext2fs_get_pathname(ext2_filsys fs, ext2_ino_t dir, ext2_ino_t ino,
Theodore Ts'o3839e651997-04-26 13:21:57 +00001379 char **name);
1380
1381/* link.c */
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001382errcode_t ext2fs_link(ext2_filsys fs, ext2_ino_t dir, const char *name,
1383 ext2_ino_t ino, int flags);
1384errcode_t ext2fs_unlink(ext2_filsys fs, ext2_ino_t dir, const char *name,
1385 ext2_ino_t ino, int flags);
Theodore Ts'o3839e651997-04-26 13:21:57 +00001386
Jan Kara50840882013-02-25 05:55:07 +00001387/* symlink.c */
1388errcode_t ext2fs_symlink(ext2_filsys fs, ext2_ino_t parent, ext2_ino_t ino,
1389 const char *name, char *target);
1390
Andreas Dilger0f5eba72011-09-24 13:48:55 -04001391/* mmp.c */
1392errcode_t ext2fs_mmp_read(ext2_filsys fs, blk64_t mmp_blk, void *buf);
1393errcode_t ext2fs_mmp_write(ext2_filsys fs, blk64_t mmp_blk, void *buf);
1394errcode_t ext2fs_mmp_clear(ext2_filsys fs);
1395errcode_t ext2fs_mmp_init(ext2_filsys fs);
1396errcode_t ext2fs_mmp_start(ext2_filsys fs);
1397errcode_t ext2fs_mmp_update(ext2_filsys fs);
1398errcode_t ext2fs_mmp_stop(ext2_filsys fs);
Theodore Ts'oedbfd752011-10-04 11:20:50 -04001399unsigned ext2fs_mmp_new_seq(void);
Andreas Dilger0f5eba72011-09-24 13:48:55 -04001400
Theodore Ts'o3839e651997-04-26 13:21:57 +00001401/* read_bb.c */
Theodore Ts'o19c78dc1997-04-29 16:17:09 +00001402extern errcode_t ext2fs_read_bb_inode(ext2_filsys fs,
1403 ext2_badblocks_list *bb_list);
Theodore Ts'o3839e651997-04-26 13:21:57 +00001404
1405/* read_bb_file.c */
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001406extern errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f,
Theodore Ts'o57dca852000-07-04 19:20:25 +00001407 ext2_badblocks_list *bb_list,
Theodore Ts'o50cd7e02002-07-14 16:00:50 -04001408 void *priv_data,
Theodore Ts'o57dca852000-07-04 19:20:25 +00001409 void (*invalid)(ext2_filsys fs,
1410 blk_t blk,
1411 char *badstr,
Theodore Ts'o50cd7e02002-07-14 16:00:50 -04001412 void *priv_data));
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001413extern errcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f,
Theodore Ts'o19c78dc1997-04-29 16:17:09 +00001414 ext2_badblocks_list *bb_list,
Theodore Ts'o3839e651997-04-26 13:21:57 +00001415 void (*invalid)(ext2_filsys fs,
1416 blk_t blk));
1417
Theodore Ts'od323f8f2004-12-15 14:39:16 -05001418/* res_gdt.c */
1419extern errcode_t ext2fs_create_resize_inode(ext2_filsys fs);
1420
Theodore Ts'o50e1e101997-04-26 13:58:21 +00001421/* swapfs.c */
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001422extern void ext2fs_swap_ext_attr(char *to, char *from, int bufsize,
Theodore Ts'o73311962005-01-25 23:42:56 -05001423 int has_header);
Andreas Dilgerfefaef32008-02-02 01:16:32 -07001424extern void ext2fs_swap_ext_attr_header(struct ext2_ext_attr_header *to_header,
1425 struct ext2_ext_attr_header *from_hdr);
1426extern void ext2fs_swap_ext_attr_entry(struct ext2_ext_attr_entry *to_entry,
1427 struct ext2_ext_attr_entry *from_entry);
Theodore Ts'o50e1e101997-04-26 13:58:21 +00001428extern void ext2fs_swap_super(struct ext2_super_block * super);
1429extern void ext2fs_swap_group_desc(struct ext2_group_desc *gdp);
Theodore Ts'ocf828f12009-10-25 21:46:01 -04001430extern void ext2fs_swap_group_desc2(ext2_filsys, struct ext2_group_desc *gdp);
Theodore Ts'o73311962005-01-25 23:42:56 -05001431extern void ext2fs_swap_inode_full(ext2_filsys fs, struct ext2_inode_large *t,
1432 struct ext2_inode_large *f, int hostorder,
1433 int bufsize);
Theodore Ts'o1e3472c1997-04-29 14:53:37 +00001434extern void ext2fs_swap_inode(ext2_filsys fs,struct ext2_inode *t,
1435 struct ext2_inode *f, int hostorder);
Andreas Dilger0f5eba72011-09-24 13:48:55 -04001436extern void ext2fs_swap_mmp(struct mmp_struct *mmp);
Theodore Ts'o1e3472c1997-04-29 14:53:37 +00001437
Theodore Ts'oab3f5c52012-09-09 21:35:39 -04001438/* unix_io.c */
1439extern int ext2fs_open_file(const char *pathname, int flags, mode_t mode);
1440extern int ext2fs_stat(const char *path, ext2fs_struct_stat *buf);
1441extern int ext2fs_fstat(int fd, ext2fs_struct_stat *buf);
1442
Theodore Ts'o19c78dc1997-04-29 16:17:09 +00001443/* valid_blk.c */
Theodore Ts'o521e3681997-04-29 17:48:10 +00001444extern int ext2fs_inode_has_valid_blocks(struct ext2_inode *inode);
Theodore Ts'o0c80c442011-10-16 20:29:00 -04001445extern int ext2fs_inode_has_valid_blocks2(ext2_filsys fs,
1446 struct ext2_inode *inode);
Theodore Ts'o521e3681997-04-29 17:48:10 +00001447
1448/* version.c */
1449extern int ext2fs_parse_version_string(const char *ver_string);
1450extern int ext2fs_get_library_version(const char **ver_string,
1451 const char **date_string);
Theodore Ts'o50e1e101997-04-26 13:58:21 +00001452
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001453/* write_bb_file.c */
1454extern errcode_t ext2fs_write_bb_FILE(ext2_badblocks_list bb_list,
1455 unsigned int flags,
1456 FILE *f);
1457
1458
Theodore Ts'o3839e651997-04-26 13:21:57 +00001459/* inline functions */
Theodore Ts'oab3f5c52012-09-09 21:35:39 -04001460#ifdef NO_INLINE_FUNCS
Theodore Ts'oc4e3d3f2003-08-01 09:41:07 -04001461extern errcode_t ext2fs_get_mem(unsigned long size, void *ptr);
Theodore Ts'od32c9152011-07-07 13:50:22 -04001462extern errcode_t ext2fs_get_memzero(unsigned long size, void *ptr);
1463extern errcode_t ext2fs_get_array(unsigned long count,
1464 unsigned long size, void *ptr);
1465extern errcode_t ext2fs_get_arrayzero(unsigned long count,
1466 unsigned long size, void *ptr);
Theodore Ts'oc4e3d3f2003-08-01 09:41:07 -04001467extern errcode_t ext2fs_free_mem(void *ptr);
Theodore Ts'o76f875d1998-04-27 01:41:13 +00001468extern errcode_t ext2fs_resize_mem(unsigned long old_size,
Theodore Ts'oc4e3d3f2003-08-01 09:41:07 -04001469 unsigned long size, void *ptr);
Theodore Ts'o3839e651997-04-26 13:21:57 +00001470extern void ext2fs_mark_super_dirty(ext2_filsys fs);
1471extern void ext2fs_mark_changed(ext2_filsys fs);
1472extern int ext2fs_test_changed(ext2_filsys fs);
1473extern void ext2fs_mark_valid(ext2_filsys fs);
1474extern void ext2fs_unmark_valid(ext2_filsys fs);
1475extern int ext2fs_test_valid(ext2_filsys fs);
1476extern void ext2fs_mark_ib_dirty(ext2_filsys fs);
1477extern void ext2fs_mark_bb_dirty(ext2_filsys fs);
1478extern int ext2fs_test_ib_dirty(ext2_filsys fs);
1479extern int ext2fs_test_bb_dirty(ext2_filsys fs);
1480extern int ext2fs_group_of_blk(ext2_filsys fs, blk_t blk);
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001481extern int ext2fs_group_of_ino(ext2_filsys fs, ext2_ino_t ino);
Eric Sandeenabf23432006-09-12 14:56:16 -04001482extern blk_t ext2fs_group_first_block(ext2_filsys fs, dgrp_t group);
1483extern blk_t ext2fs_group_last_block(ext2_filsys fs, dgrp_t group);
Theodore Ts'o0684a4f2002-08-17 10:19:44 -04001484extern blk_t ext2fs_inode_data_blocks(ext2_filsys fs,
1485 struct ext2_inode *inode);
Theodore Ts'o69022e02006-08-30 01:57:00 -04001486extern unsigned int ext2fs_div_ceil(unsigned int a, unsigned int b);
Jose R. Santos743011f2009-06-01 16:15:40 -04001487extern __u64 ext2fs_div64_ceil(__u64 a, __u64 b);
Theodore Ts'oab3f5c52012-09-09 21:35:39 -04001488#endif
Theodore Ts'o3839e651997-04-26 13:21:57 +00001489
1490/*
1491 * The actual inlined functions definitions themselves...
1492 *
1493 * If NO_INLINE_FUNCS is defined, then we won't try to do inline
1494 * functions at all!
1495 */
1496#if (defined(INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS))
1497#ifdef INCLUDE_INLINE_FUNCS
1498#define _INLINE_ extern
1499#else
Theodore Ts'oab3f5c52012-09-09 21:35:39 -04001500#if (__STDC_VERSION__ >= 199901L)
1501#define _INLINE_ inline
1502#else
Theodore Ts'o76f875d1998-04-27 01:41:13 +00001503#ifdef __GNUC__
Theodore Ts'o3839e651997-04-26 13:21:57 +00001504#define _INLINE_ extern __inline__
Theodore Ts'o76f875d1998-04-27 01:41:13 +00001505#else /* For Watcom C */
1506#define _INLINE_ extern inline
Theodore Ts'oab3f5c52012-09-09 21:35:39 -04001507#endif /* __GNUC__ */
1508#endif /* __STDC_VERSION__ >= 199901L */
Theodore Ts'o3839e651997-04-26 13:21:57 +00001509#endif
1510
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001511#ifndef EXT2_CUSTOM_MEMORY_ROUTINES
Matthias Andree68a7f952005-09-06 05:59:52 -04001512#include <string.h>
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001513/*
1514 * Allocate memory
1515 */
Theodore Ts'oc4e3d3f2003-08-01 09:41:07 -04001516_INLINE_ errcode_t ext2fs_get_mem(unsigned long size, void *ptr)
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001517{
Theodore Ts'o2694f312006-11-14 00:34:34 -05001518 void *pp;
Theodore Ts'oc4e3d3f2003-08-01 09:41:07 -04001519
Theodore Ts'o2694f312006-11-14 00:34:34 -05001520 pp = malloc(size);
1521 if (!pp)
Theodore Ts'o291c9041997-10-31 06:17:08 +00001522 return EXT2_ET_NO_MEMORY;
Theodore Ts'o2694f312006-11-14 00:34:34 -05001523 memcpy(ptr, &pp, sizeof (pp));
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001524 return 0;
1525}
Theodore Ts'oe5aace92007-12-27 10:08:13 -05001526
Lukas Czernerffec46f2011-05-18 14:19:52 +02001527_INLINE_ errcode_t ext2fs_get_memzero(unsigned long size, void *ptr)
1528{
1529 void *pp;
1530
1531 pp = malloc(size);
1532 if (!pp)
1533 return EXT2_ET_NO_MEMORY;
1534 memset(pp, 0, size);
1535 memcpy(ptr, &pp, sizeof(pp));
1536 return 0;
1537}
1538
Theodore Ts'oee010792007-11-09 19:01:06 -05001539_INLINE_ errcode_t ext2fs_get_array(unsigned long count, unsigned long size, void *ptr)
1540{
1541 if (count && (-1UL)/count<size)
Lukas Czernerffec46f2011-05-18 14:19:52 +02001542 return EXT2_ET_NO_MEMORY;
Theodore Ts'oee010792007-11-09 19:01:06 -05001543 return ext2fs_get_mem(count*size, ptr);
1544}
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001545
Lukas Czernerffec46f2011-05-18 14:19:52 +02001546_INLINE_ errcode_t ext2fs_get_arrayzero(unsigned long count,
1547 unsigned long size, void *ptr)
1548{
1549 void *pp;
1550
1551 if (count && (-1UL)/count<size)
1552 return EXT2_ET_NO_MEMORY;
1553 pp = calloc(count, size);
1554 if (!pp)
1555 return EXT2_ET_NO_MEMORY;
1556 memcpy(ptr, &pp, sizeof(pp));
1557 return 0;
1558}
1559
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001560/*
1561 * Free memory
1562 */
Theodore Ts'oc4e3d3f2003-08-01 09:41:07 -04001563_INLINE_ errcode_t ext2fs_free_mem(void *ptr)
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001564{
Theodore Ts'o2694f312006-11-14 00:34:34 -05001565 void *p;
Theodore Ts'oc4e3d3f2003-08-01 09:41:07 -04001566
Theodore Ts'o2694f312006-11-14 00:34:34 -05001567 memcpy(&p, ptr, sizeof(p));
1568 free(p);
1569 p = 0;
1570 memcpy(ptr, &p, sizeof(p));
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001571 return 0;
1572}
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001573
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001574/*
1575 * Resize memory
1576 */
Theodore Ts'oe47fd842004-02-21 21:04:30 -05001577_INLINE_ errcode_t ext2fs_resize_mem(unsigned long EXT2FS_ATTR((unused)) old_size,
Theodore Ts'oc4e3d3f2003-08-01 09:41:07 -04001578 unsigned long size, void *ptr)
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001579{
1580 void *p;
1581
Stephen Tweedie39c191f2005-06-27 11:47:21 -04001582 /* Use "memcpy" for pointer assignments here to avoid problems
1583 * with C99 strict type aliasing rules. */
Theodore Ts'o2694f312006-11-14 00:34:34 -05001584 memcpy(&p, ptr, sizeof(p));
Stephen Tweedie39c191f2005-06-27 11:47:21 -04001585 p = realloc(p, size);
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001586 if (!p)
Theodore Ts'o291c9041997-10-31 06:17:08 +00001587 return EXT2_ET_NO_MEMORY;
Theodore Ts'o2694f312006-11-14 00:34:34 -05001588 memcpy(ptr, &p, sizeof(p));
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001589 return 0;
1590}
1591#endif /* Custom memory routines */
1592
Theodore Ts'o3839e651997-04-26 13:21:57 +00001593/*
1594 * Mark a filesystem superblock as dirty
1595 */
1596_INLINE_ void ext2fs_mark_super_dirty(ext2_filsys fs)
1597{
1598 fs->flags |= EXT2_FLAG_DIRTY | EXT2_FLAG_CHANGED;
1599}
1600
1601/*
1602 * Mark a filesystem as changed
1603 */
1604_INLINE_ void ext2fs_mark_changed(ext2_filsys fs)
1605{
1606 fs->flags |= EXT2_FLAG_CHANGED;
1607}
1608
1609/*
1610 * Check to see if a filesystem has changed
1611 */
1612_INLINE_ int ext2fs_test_changed(ext2_filsys fs)
1613{
1614 return (fs->flags & EXT2_FLAG_CHANGED);
1615}
1616
1617/*
1618 * Mark a filesystem as valid
1619 */
1620_INLINE_ void ext2fs_mark_valid(ext2_filsys fs)
1621{
1622 fs->flags |= EXT2_FLAG_VALID;
1623}
1624
1625/*
1626 * Mark a filesystem as NOT valid
1627 */
1628_INLINE_ void ext2fs_unmark_valid(ext2_filsys fs)
1629{
1630 fs->flags &= ~EXT2_FLAG_VALID;
1631}
1632
1633/*
1634 * Check to see if a filesystem is valid
1635 */
1636_INLINE_ int ext2fs_test_valid(ext2_filsys fs)
1637{
1638 return (fs->flags & EXT2_FLAG_VALID);
1639}
1640
1641/*
1642 * Mark the inode bitmap as dirty
1643 */
1644_INLINE_ void ext2fs_mark_ib_dirty(ext2_filsys fs)
1645{
1646 fs->flags |= EXT2_FLAG_IB_DIRTY | EXT2_FLAG_CHANGED;
1647}
1648
1649/*
1650 * Mark the block bitmap as dirty
1651 */
1652_INLINE_ void ext2fs_mark_bb_dirty(ext2_filsys fs)
1653{
1654 fs->flags |= EXT2_FLAG_BB_DIRTY | EXT2_FLAG_CHANGED;
1655}
1656
1657/*
1658 * Check to see if a filesystem's inode bitmap is dirty
1659 */
1660_INLINE_ int ext2fs_test_ib_dirty(ext2_filsys fs)
1661{
1662 return (fs->flags & EXT2_FLAG_IB_DIRTY);
1663}
1664
1665/*
1666 * Check to see if a filesystem's block bitmap is dirty
1667 */
1668_INLINE_ int ext2fs_test_bb_dirty(ext2_filsys fs)
1669{
1670 return (fs->flags & EXT2_FLAG_BB_DIRTY);
1671}
1672
1673/*
1674 * Return the group # of a block
1675 */
1676_INLINE_ int ext2fs_group_of_blk(ext2_filsys fs, blk_t blk)
1677{
Jose R. Santose3854b32009-06-06 15:22:43 -04001678 return ext2fs_group_of_blk2(fs, blk);
Theodore Ts'o3839e651997-04-26 13:21:57 +00001679}
Theodore Ts'o3839e651997-04-26 13:21:57 +00001680/*
1681 * Return the group # of an inode number
1682 */
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001683_INLINE_ int ext2fs_group_of_ino(ext2_filsys fs, ext2_ino_t ino)
Theodore Ts'o3839e651997-04-26 13:21:57 +00001684{
1685 return (ino - 1) / fs->super->s_inodes_per_group;
1686}
Theodore Ts'o0684a4f2002-08-17 10:19:44 -04001687
Eric Sandeenabf23432006-09-12 14:56:16 -04001688/*
1689 * Return the first block (inclusive) in a group
1690 */
1691_INLINE_ blk_t ext2fs_group_first_block(ext2_filsys fs, dgrp_t group)
1692{
Jose R. Santose3854b32009-06-06 15:22:43 -04001693 return ext2fs_group_first_block2(fs, group);
Eric Sandeenabf23432006-09-12 14:56:16 -04001694}
1695
1696/*
1697 * Return the last block (inclusive) in a group
1698 */
1699_INLINE_ blk_t ext2fs_group_last_block(ext2_filsys fs, dgrp_t group)
1700{
Jose R. Santose3854b32009-06-06 15:22:43 -04001701 return ext2fs_group_last_block2(fs, group);
Eric Sandeenabf23432006-09-12 14:56:16 -04001702}
1703
Theodore Ts'o0684a4f2002-08-17 10:19:44 -04001704_INLINE_ blk_t ext2fs_inode_data_blocks(ext2_filsys fs,
1705 struct ext2_inode *inode)
1706{
Jose R. Santose3854b32009-06-06 15:22:43 -04001707 return ext2fs_inode_data_blocks2(fs, inode);
Theodore Ts'o0684a4f2002-08-17 10:19:44 -04001708}
Theodore Ts'o69022e02006-08-30 01:57:00 -04001709
1710/*
1711 * This is an efficient, overflow safe way of calculating ceil((1.0 * a) / b)
1712 */
1713_INLINE_ unsigned int ext2fs_div_ceil(unsigned int a, unsigned int b)
1714{
1715 if (!a)
1716 return 0;
1717 return ((a - 1) / b) + 1;
1718}
Jose R. Santos743011f2009-06-01 16:15:40 -04001719
1720_INLINE_ __u64 ext2fs_div64_ceil(__u64 a, __u64 b)
1721{
1722 if (!a)
1723 return 0;
1724 return ((a - 1) / b) + 1;
1725}
1726
Theodore Ts'o3839e651997-04-26 13:21:57 +00001727#undef _INLINE_
1728#endif
1729
Theodore Ts'ofa7ef712000-05-19 02:11:41 +00001730#ifdef __cplusplus
1731}
1732#endif
1733
Theodore Ts'o9abd2ce1998-02-16 22:00:37 +00001734#endif /* _EXT2FS_EXT2FS_H */