blob: 7f3b7926ccb4b210e7500a8a91fbf18fcc16dafd [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
JP Abgralle0ed7402014-03-19 19:08:39 -070040#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
JP Abgralle0ed7402014-03-19 19:08:39 -070067#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 */
JP Abgralle0ed7402014-03-19 19:08:39 -0700135struct 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
JP Abgralle0ed7402014-03-19 19:08:39 -0700190#define EXT2_FLAG_64BITS 0x20000
191#define EXT2_FLAG_PRINT_PROGRESS 0x40000
Theodore Ts'o73fbe232010-09-24 22:22:09 -0400192#define EXT2_FLAG_DIRECT_IO 0x80000
JP Abgralle0ed7402014-03-19 19:08:39 -0700193#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 */
JP Abgralle0ed7402014-03-19 19:08:39 -0700204#define EXT2_MKJOURNAL_V1_SUPER 0x0000001 /* create V1 superblock (deprecated) */
205#define EXT2_MKJOURNAL_LAZYINIT 0x0000002 /* don't zero journal inode before use*/
206#define EXT2_MKJOURNAL_NO_MNT_CHECK 0x0000004 /* don't check mount status */
207
208struct opaque_ext2_group_desc;
Eric Sandeenefe0b402010-06-13 21:00:00 -0400209
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;
JP Abgralle0ed7402014-03-19 19:08:39 -0700220 struct opaque_ext2_group_desc * group_desc;
221 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;
JP Abgralle0ed7402014-03-19 19:08:39 -0700224 /* 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;
JP Abgralle0ed7402014-03-19 19:08:39 -0700239 int cluster_ratio_bits;
240 __u16 default_bitmap_type;
241 __u16 pad;
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000242 /*
243 * Reserved for future expansion
244 */
JP Abgralle0ed7402014-03-19 19:08:39 -0700245 __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);
JP Abgralle0ed7402014-03-19 19:08:39 -0700264
265 /*
266 * 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/*
JP Abgralle0ed7402014-03-19 19:08:39 -0700285 * 64-bit bitmap backend types
286 */
287#define EXT2FS_BMAP64_BITARRAY 1
288#define EXT2FS_BMAP64_RBTREE 2
289#define EXT2FS_BMAP64_AUTODIR 3
290
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
Theodore Ts'o638c15d2015-10-25 22:19:04 -0400539#define EXT2FS_SHA256_LENGTH 32
540#define EXT2FS_DIGEST_SIZE EXT2FS_SHA256_LENGTH
541
Theodore Ts'o1e3472c1997-04-29 14:53:37 +0000542/*
Theodore Ts'oe5b38a52001-01-01 16:17:12 +0000543 * For ext2 compression support
Theodore Ts'o1e3472c1997-04-29 14:53:37 +0000544 */
Valerie Clement5d38ef12007-08-30 17:33:40 +0200545#define EXT2FS_COMPRESSED_BLKADDR ((blk_t) -1)
Theodore Ts'o5a63dd22000-02-11 15:44:08 +0000546#define HOLE_BLKADDR(_b) ((_b) == 0 || (_b) == EXT2FS_COMPRESSED_BLKADDR)
547
Theodore Ts'o521e3681997-04-29 17:48:10 +0000548/*
Theodore Ts'o426d7342001-01-13 01:29:05 +0000549 * Features supported by this version of the library
Theodore Ts'o521e3681997-04-29 17:48:10 +0000550 */
Theodore Ts'o3a5f8ea1999-09-14 20:21:26 +0000551#define EXT2_LIB_FEATURE_COMPAT_SUPP (EXT2_FEATURE_COMPAT_DIR_PREALLOC|\
552 EXT2_FEATURE_COMPAT_IMAGIC_INODES|\
Theodore Ts'o342d8472001-07-02 11:54:09 -0400553 EXT3_FEATURE_COMPAT_HAS_JOURNAL|\
Theodore Ts'od323f8f2004-12-15 14:39:16 -0500554 EXT2_FEATURE_COMPAT_RESIZE_INODE|\
Theodore Ts'o52783e02002-03-11 15:04:45 -0500555 EXT2_FEATURE_COMPAT_DIR_INDEX|\
Theodore Ts'o342d8472001-07-02 11:54:09 -0400556 EXT2_FEATURE_COMPAT_EXT_ATTR)
Theodore Ts'o2fe1efe2000-12-31 13:39:17 +0000557
Theodore Ts'o5a63dd22000-02-11 15:44:08 +0000558/* This #ifdef is temporary until compression is fully supported */
559#ifdef ENABLE_COMPRESSION
Theodore Ts'oe589f672000-04-03 13:45:40 +0000560#ifndef I_KNOW_THAT_COMPRESSION_IS_EXPERIMENTAL
561/* If the below warning bugs you, then have
562 `CPPFLAGS=-DI_KNOW_THAT_COMPRESSION_IS_EXPERIMENTAL' in your
563 environment at configure time. */
Theodore Ts'ocdaf1fa2001-01-05 22:23:22 +0000564 #warning "Compression support is experimental"
Theodore Ts'oe589f672000-04-03 13:45:40 +0000565#endif
Theodore Ts'o5a63dd22000-02-11 15:44:08 +0000566#define EXT2_LIB_FEATURE_INCOMPAT_SUPP (EXT2_FEATURE_INCOMPAT_FILETYPE|\
Theodore Ts'oab146762000-07-07 04:37:35 +0000567 EXT2_FEATURE_INCOMPAT_COMPRESSION|\
Theodore Ts'oa1128472001-01-16 06:56:14 +0000568 EXT3_FEATURE_INCOMPAT_JOURNAL_DEV|\
Theodore Ts'oc046ac72002-10-20 00:38:57 -0400569 EXT2_FEATURE_INCOMPAT_META_BG|\
Jose R. Santosc2d43002007-08-13 23:32:57 -0500570 EXT3_FEATURE_INCOMPAT_RECOVER|\
Theodore Ts'o15d482b2007-08-20 21:31:11 -0400571 EXT3_FEATURE_INCOMPAT_EXTENTS|\
JP Abgralle0ed7402014-03-19 19:08:39 -0700572 EXT4_FEATURE_INCOMPAT_FLEX_BG|\
573 EXT4_FEATURE_INCOMPAT_MMP|\
Theodore Ts'o890a2f92015-07-14 22:50:51 -0400574 EXT4_FEATURE_INCOMPAT_64BIT|\
575 EXT4_FEATURE_INCOMPAT_ENCRYPT)
Theodore Ts'o5a63dd22000-02-11 15:44:08 +0000576#else
Theodore Ts'oab146762000-07-07 04:37:35 +0000577#define EXT2_LIB_FEATURE_INCOMPAT_SUPP (EXT2_FEATURE_INCOMPAT_FILETYPE|\
Theodore Ts'oa1128472001-01-16 06:56:14 +0000578 EXT3_FEATURE_INCOMPAT_JOURNAL_DEV|\
Theodore Ts'oc046ac72002-10-20 00:38:57 -0400579 EXT2_FEATURE_INCOMPAT_META_BG|\
Jose R. Santosc2d43002007-08-13 23:32:57 -0500580 EXT3_FEATURE_INCOMPAT_RECOVER|\
Theodore Ts'o15d482b2007-08-20 21:31:11 -0400581 EXT3_FEATURE_INCOMPAT_EXTENTS|\
JP Abgralle0ed7402014-03-19 19:08:39 -0700582 EXT4_FEATURE_INCOMPAT_FLEX_BG|\
583 EXT4_FEATURE_INCOMPAT_MMP|\
Theodore Ts'o890a2f92015-07-14 22:50:51 -0400584 EXT4_FEATURE_INCOMPAT_64BIT|\
585 EXT4_FEATURE_INCOMPAT_ENCRYPT)
Theodore Ts'o5a63dd22000-02-11 15:44:08 +0000586#endif
JP Abgralle0ed7402014-03-19 19:08:39 -0700587#ifdef CONFIG_QUOTA
Theodore Ts'o674a4ee1998-03-23 02:06:52 +0000588#define EXT2_LIB_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER|\
Theodore Ts'o1ca10592008-04-09 11:39:11 -0400589 EXT4_FEATURE_RO_COMPAT_HUGE_FILE|\
Andreas Dilgera7c9cb72008-02-02 01:25:03 -0700590 EXT2_FEATURE_RO_COMPAT_LARGE_FILE|\
Jose R. Santosd4f34d42007-10-21 21:03:25 -0500591 EXT4_FEATURE_RO_COMPAT_DIR_NLINK|\
Theodore Ts'o2be8fe42008-07-10 10:49:59 -0400592 EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE|\
JP Abgralle0ed7402014-03-19 19:08:39 -0700593 EXT4_FEATURE_RO_COMPAT_GDT_CSUM|\
594 EXT4_FEATURE_RO_COMPAT_BIGALLOC|\
595 EXT4_FEATURE_RO_COMPAT_QUOTA)
596#else
597#define EXT2_LIB_FEATURE_RO_COMPAT_SUPP (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER|\
598 EXT4_FEATURE_RO_COMPAT_HUGE_FILE|\
599 EXT2_FEATURE_RO_COMPAT_LARGE_FILE|\
600 EXT4_FEATURE_RO_COMPAT_DIR_NLINK|\
601 EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE|\
602 EXT4_FEATURE_RO_COMPAT_GDT_CSUM|\
603 EXT4_FEATURE_RO_COMPAT_BIGALLOC)
604#endif
Theodore Ts'ocf8272e2006-11-12 23:26:46 -0500605
606/*
607 * These features are only allowed if EXT2_FLAG_SOFTSUPP_FEATURES is passed
608 * to ext2fs_openfs()
609 */
Theodore Ts'o1ca10592008-04-09 11:39:11 -0400610#define EXT2_LIB_SOFTSUPP_INCOMPAT (0)
JP Abgralle0ed7402014-03-19 19:08:39 -0700611#define EXT2_LIB_SOFTSUPP_RO_COMPAT (EXT4_FEATURE_RO_COMPAT_REPLICA)
612
613
614/* Translate a block number to a cluster number */
615#define EXT2FS_CLUSTER_RATIO(fs) (1 << (fs)->cluster_ratio_bits)
616#define EXT2FS_CLUSTER_MASK(fs) (EXT2FS_CLUSTER_RATIO(fs) - 1)
617#define EXT2FS_B2C(fs, blk) ((blk) >> (fs)->cluster_ratio_bits)
618/* Translate a cluster number to a block number */
619#define EXT2FS_C2B(fs, cluster) ((cluster) << (fs)->cluster_ratio_bits)
620/* Translate # of blks to # of clusters */
621#define EXT2FS_NUM_B2C(fs, blks) (((blks) + EXT2FS_CLUSTER_MASK(fs)) >> \
622 (fs)->cluster_ratio_bits)
623
624#if defined(HAVE_FSTAT64) && !defined(__OSX_AVAILABLE_BUT_DEPRECATED)
625typedef struct stat64 ext2fs_struct_stat;
626#else
627typedef struct stat ext2fs_struct_stat;
628#endif
629
630/*
631 * For ext2fs_close2() and ext2fs_flush2(), this flag allows you to
632 * avoid the fsync call.
633 */
634#define EXT2_FLAG_FLUSH_NO_SYNC 1
Richard W.M. Jones9d9a53e2011-09-24 10:50:42 -0400635
636/*
Theodore Ts'o3839e651997-04-26 13:21:57 +0000637 * function prototypes
638 */
639
JP Abgralle0ed7402014-03-19 19:08:39 -0700640/* The LARGE_FILE feature should be set if we have stored files 2GB+ in size */
641static inline int ext2fs_needs_large_file_feature(unsigned long long file_size)
642{
643 return file_size >= 0x80000000ULL;
644}
645
Theodore Ts'o3839e651997-04-26 13:21:57 +0000646/* alloc.c */
Theodore Ts'o31dbecd2001-01-11 04:54:39 +0000647extern errcode_t ext2fs_new_inode(ext2_filsys fs, ext2_ino_t dir, int mode,
648 ext2fs_inode_bitmap map, ext2_ino_t *ret);
Theodore Ts'o3839e651997-04-26 13:21:57 +0000649extern errcode_t ext2fs_new_block(ext2_filsys fs, blk_t goal,
Theodore Ts'of3db3561997-04-26 13:34:30 +0000650 ext2fs_block_bitmap map, blk_t *ret);
JP Abgralle0ed7402014-03-19 19:08:39 -0700651extern errcode_t ext2fs_new_block2(ext2_filsys fs, blk64_t goal,
652 ext2fs_block_bitmap map, blk64_t *ret);
Theodore Ts'o3839e651997-04-26 13:21:57 +0000653extern errcode_t ext2fs_get_free_blocks(ext2_filsys fs, blk_t start,
Theodore Ts'of3db3561997-04-26 13:34:30 +0000654 blk_t finish, int num,
655 ext2fs_block_bitmap map,
Theodore Ts'o3839e651997-04-26 13:21:57 +0000656 blk_t *ret);
JP Abgralle0ed7402014-03-19 19:08:39 -0700657extern errcode_t ext2fs_get_free_blocks2(ext2_filsys fs, blk64_t start,
658 blk64_t finish, int num,
659 ext2fs_block_bitmap map,
660 blk64_t *ret);
Theodore Ts'o30fab291997-10-25 22:37:42 +0000661extern errcode_t ext2fs_alloc_block(ext2_filsys fs, blk_t goal,
662 char *block_buf, blk_t *ret);
JP Abgralle0ed7402014-03-19 19:08:39 -0700663extern errcode_t ext2fs_alloc_block2(ext2_filsys fs, blk64_t goal,
664 char *block_buf, blk64_t *ret);
Theodore Ts'oefc6f622008-08-27 23:07:54 -0400665extern void ext2fs_set_alloc_block_callback(ext2_filsys fs,
Theodore Ts'of5c562e2008-06-02 17:21:37 -0400666 errcode_t (*func)(ext2_filsys fs,
667 blk64_t goal,
668 blk64_t *ret),
669 errcode_t (**old)(ext2_filsys fs,
670 blk64_t goal,
671 blk64_t *ret));
Theodore Ts'o3839e651997-04-26 13:21:57 +0000672
Theodore Ts'oef344e12003-11-21 09:02:21 -0500673/* alloc_sb.c */
Theodore Ts'oefc6f622008-08-27 23:07:54 -0400674extern int ext2fs_reserve_super_and_bgd(ext2_filsys fs,
Theodore Ts'oef344e12003-11-21 09:02:21 -0500675 dgrp_t group,
676 ext2fs_block_bitmap bmap);
Theodore Ts'oefc6f622008-08-27 23:07:54 -0400677extern void ext2fs_set_block_alloc_stats_callback(ext2_filsys fs,
Theodore Ts'of5c562e2008-06-02 17:21:37 -0400678 void (*func)(ext2_filsys fs,
679 blk64_t blk,
680 int inuse),
681 void (**old)(ext2_filsys fs,
682 blk64_t blk,
683 int inuse));
Theodore Ts'oef344e12003-11-21 09:02:21 -0500684
Theodore Ts'o8bd0c952002-01-03 03:29:19 -0500685/* alloc_stats.c */
686void ext2fs_inode_alloc_stats(ext2_filsys fs, ext2_ino_t ino, int inuse);
Theodore Ts'o7f961d42002-02-03 01:28:52 -0500687void ext2fs_inode_alloc_stats2(ext2_filsys fs, ext2_ino_t ino,
688 int inuse, int isdir);
Theodore Ts'o8bd0c952002-01-03 03:29:19 -0500689void ext2fs_block_alloc_stats(ext2_filsys fs, blk_t blk, int inuse);
JP Abgralle0ed7402014-03-19 19:08:39 -0700690void ext2fs_block_alloc_stats2(ext2_filsys fs, blk64_t blk, int inuse);
Theodore Ts'o8bd0c952002-01-03 03:29:19 -0500691
Theodore Ts'o1e1da291997-06-09 14:51:29 +0000692/* alloc_tables.c */
693extern errcode_t ext2fs_allocate_tables(ext2_filsys fs);
Theodore Ts'o2eb374c1998-09-03 01:22:57 +0000694extern errcode_t ext2fs_allocate_group_table(ext2_filsys fs, dgrp_t group,
Theodore Ts'o1e1da291997-06-09 14:51:29 +0000695 ext2fs_block_bitmap bmap);
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000696
Theodore Ts'o3839e651997-04-26 13:21:57 +0000697/* badblocks.c */
Theodore Ts'ob7a00562002-07-20 00:28:07 -0400698extern errcode_t ext2fs_u32_list_create(ext2_u32_list *ret, int size);
699extern errcode_t ext2fs_u32_list_add(ext2_u32_list bb, __u32 blk);
Theodore Ts'o54434922003-12-07 01:28:50 -0500700extern int ext2fs_u32_list_find(ext2_u32_list bb, __u32 blk);
Theodore Ts'ob7a00562002-07-20 00:28:07 -0400701extern int ext2fs_u32_list_test(ext2_u32_list bb, blk_t blk);
702extern errcode_t ext2fs_u32_list_iterate_begin(ext2_u32_list bb,
703 ext2_u32_iterate *ret);
704extern int ext2fs_u32_list_iterate(ext2_u32_iterate iter, blk_t *blk);
705extern void ext2fs_u32_list_iterate_end(ext2_u32_iterate iter);
706extern errcode_t ext2fs_u32_copy(ext2_u32_list src, ext2_u32_list *dest);
707extern int ext2fs_u32_list_equal(ext2_u32_list bb1, ext2_u32_list bb2);
708
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000709extern errcode_t ext2fs_badblocks_list_create(ext2_badblocks_list *ret,
710 int size);
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000711extern errcode_t ext2fs_badblocks_list_add(ext2_badblocks_list bb,
712 blk_t blk);
713extern int ext2fs_badblocks_list_test(ext2_badblocks_list bb,
714 blk_t blk);
Theodore Ts'o7d7bdd52003-06-24 17:34:02 -0400715extern int ext2fs_u32_list_del(ext2_u32_list bb, __u32 blk);
716extern void ext2fs_badblocks_list_del(ext2_u32_list bb, __u32 blk);
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000717extern errcode_t
718 ext2fs_badblocks_list_iterate_begin(ext2_badblocks_list bb,
719 ext2_badblocks_iterate *ret);
720extern int ext2fs_badblocks_list_iterate(ext2_badblocks_iterate iter,
721 blk_t *blk);
722extern void ext2fs_badblocks_list_iterate_end(ext2_badblocks_iterate iter);
Theodore Ts'oa29f4d31997-04-29 21:26:48 +0000723extern errcode_t ext2fs_badblocks_copy(ext2_badblocks_list src,
724 ext2_badblocks_list *dest);
Theodore Ts'o57dca852000-07-04 19:20:25 +0000725extern int ext2fs_badblocks_equal(ext2_badblocks_list bb1,
726 ext2_badblocks_list bb2);
Theodore Ts'o220c0042003-03-14 00:59:42 -0500727extern int ext2fs_u32_list_count(ext2_u32_list bb);
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000728
729/* bb_compat */
Theodore Ts'o3839e651997-04-26 13:21:57 +0000730extern errcode_t badblocks_list_create(badblocks_list *ret, int size);
Theodore Ts'o3839e651997-04-26 13:21:57 +0000731extern errcode_t badblocks_list_add(badblocks_list bb, blk_t blk);
732extern int badblocks_list_test(badblocks_list bb, blk_t blk);
733extern errcode_t badblocks_list_iterate_begin(badblocks_list bb,
734 badblocks_iterate *ret);
735extern int badblocks_list_iterate(badblocks_iterate iter, blk_t *blk);
736extern void badblocks_list_iterate_end(badblocks_iterate iter);
Theodore Ts'oa29f4d31997-04-29 21:26:48 +0000737extern void badblocks_list_free(badblocks_list bb);
Theodore Ts'o3839e651997-04-26 13:21:57 +0000738
739/* bb_inode.c */
740extern errcode_t ext2fs_update_bb_inode(ext2_filsys fs,
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000741 ext2_badblocks_list bb_list);
Theodore Ts'o3839e651997-04-26 13:21:57 +0000742
743/* bitmaps.c */
Theodore Ts'oa0553c92007-07-22 22:59:50 -0400744extern void ext2fs_free_block_bitmap(ext2fs_block_bitmap bitmap);
745extern void ext2fs_free_inode_bitmap(ext2fs_inode_bitmap bitmap);
Theodore Ts'of1f115a2007-07-23 04:32:48 -0400746extern errcode_t ext2fs_copy_bitmap(ext2fs_generic_bitmap src,
747 ext2fs_generic_bitmap *dest);
Theodore Ts'o3839e651997-04-26 13:21:57 +0000748extern errcode_t ext2fs_write_inode_bitmap(ext2_filsys fs);
749extern errcode_t ext2fs_write_block_bitmap (ext2_filsys fs);
750extern errcode_t ext2fs_read_inode_bitmap (ext2_filsys fs);
751extern errcode_t ext2fs_read_block_bitmap(ext2_filsys fs);
Theodore Ts'o50e1e101997-04-26 13:58:21 +0000752extern errcode_t ext2fs_allocate_block_bitmap(ext2_filsys fs,
753 const char *descr,
754 ext2fs_block_bitmap *ret);
JP Abgralle0ed7402014-03-19 19:08:39 -0700755extern errcode_t ext2fs_allocate_subcluster_bitmap(ext2_filsys fs,
756 const char *descr,
757 ext2fs_block_bitmap *ret);
758extern int ext2fs_get_bitmap_granularity(ext2fs_block_bitmap bitmap);
Theodore Ts'o50e1e101997-04-26 13:58:21 +0000759extern errcode_t ext2fs_allocate_inode_bitmap(ext2_filsys fs,
760 const char *descr,
761 ext2fs_inode_bitmap *ret);
762extern errcode_t ext2fs_fudge_inode_bitmap_end(ext2fs_inode_bitmap bitmap,
Theodore Ts'o31dbecd2001-01-11 04:54:39 +0000763 ext2_ino_t end, ext2_ino_t *oend);
Theodore Ts'o50e1e101997-04-26 13:58:21 +0000764extern errcode_t ext2fs_fudge_block_bitmap_end(ext2fs_block_bitmap bitmap,
765 blk_t end, blk_t *oend);
JP Abgralle0ed7402014-03-19 19:08:39 -0700766extern errcode_t ext2fs_fudge_block_bitmap_end2(ext2fs_block_bitmap bitmap,
767 blk64_t end, blk64_t *oend);
Theodore Ts'o50e1e101997-04-26 13:58:21 +0000768extern void ext2fs_clear_inode_bitmap(ext2fs_inode_bitmap bitmap);
769extern void ext2fs_clear_block_bitmap(ext2fs_block_bitmap bitmap);
Theodore Ts'o3839e651997-04-26 13:21:57 +0000770extern errcode_t ext2fs_read_bitmaps(ext2_filsys fs);
771extern errcode_t ext2fs_write_bitmaps(ext2_filsys fs);
Theodore Ts'o50448d32007-07-22 23:42:14 -0400772extern errcode_t ext2fs_resize_inode_bitmap(__u32 new_end, __u32 new_real_end,
773 ext2fs_inode_bitmap bmap);
JP Abgralle0ed7402014-03-19 19:08:39 -0700774extern errcode_t ext2fs_resize_inode_bitmap2(__u64 new_end,
775 __u64 new_real_end,
776 ext2fs_inode_bitmap bmap);
Theodore Ts'o50448d32007-07-22 23:42:14 -0400777extern errcode_t ext2fs_resize_block_bitmap(__u32 new_end, __u32 new_real_end,
778 ext2fs_block_bitmap bmap);
JP Abgralle0ed7402014-03-19 19:08:39 -0700779extern errcode_t ext2fs_resize_block_bitmap2(__u64 new_end,
780 __u64 new_real_end,
781 ext2fs_block_bitmap bmap);
Theodore Ts'o50448d32007-07-22 23:42:14 -0400782extern errcode_t ext2fs_compare_block_bitmap(ext2fs_block_bitmap bm1,
783 ext2fs_block_bitmap bm2);
784extern errcode_t ext2fs_compare_inode_bitmap(ext2fs_inode_bitmap bm1,
785 ext2fs_inode_bitmap bm2);
Theodore Ts'of1f115a2007-07-23 04:32:48 -0400786extern errcode_t ext2fs_set_inode_bitmap_range(ext2fs_inode_bitmap bmap,
787 ext2_ino_t start, unsigned int num,
788 void *in);
JP Abgralle0ed7402014-03-19 19:08:39 -0700789extern errcode_t ext2fs_set_inode_bitmap_range2(ext2fs_inode_bitmap bmap,
790 __u64 start, size_t num,
791 void *in);
Theodore Ts'of1f115a2007-07-23 04:32:48 -0400792extern errcode_t ext2fs_get_inode_bitmap_range(ext2fs_inode_bitmap bmap,
793 ext2_ino_t start, unsigned int num,
794 void *out);
JP Abgralle0ed7402014-03-19 19:08:39 -0700795extern errcode_t ext2fs_get_inode_bitmap_range2(ext2fs_inode_bitmap bmap,
796 __u64 start, size_t num,
797 void *out);
Theodore Ts'of1f115a2007-07-23 04:32:48 -0400798extern errcode_t ext2fs_set_block_bitmap_range(ext2fs_block_bitmap bmap,
799 blk_t start, unsigned int num,
800 void *in);
JP Abgralle0ed7402014-03-19 19:08:39 -0700801extern errcode_t ext2fs_set_block_bitmap_range2(ext2fs_block_bitmap bmap,
802 blk64_t start, size_t num,
803 void *in);
Theodore Ts'of1f115a2007-07-23 04:32:48 -0400804extern errcode_t ext2fs_get_block_bitmap_range(ext2fs_block_bitmap bmap,
805 blk_t start, unsigned int num,
806 void *out);
JP Abgralle0ed7402014-03-19 19:08:39 -0700807extern errcode_t ext2fs_get_block_bitmap_range2(ext2fs_block_bitmap bmap,
808 blk64_t start, size_t num,
809 void *out);
Theodore Ts'o50448d32007-07-22 23:42:14 -0400810
JP Abgralle0ed7402014-03-19 19:08:39 -0700811/* blknum.c */
812extern dgrp_t ext2fs_group_of_blk2(ext2_filsys fs, blk64_t);
813extern blk64_t ext2fs_group_first_block2(ext2_filsys fs, dgrp_t group);
814extern blk64_t ext2fs_group_last_block2(ext2_filsys fs, dgrp_t group);
815extern int ext2fs_group_blocks_count(ext2_filsys fs, dgrp_t group);
816extern blk64_t ext2fs_inode_data_blocks2(ext2_filsys fs,
817 struct ext2_inode *inode);
818extern blk64_t ext2fs_inode_i_blocks(ext2_filsys fs,
819 struct ext2_inode *inode);
820extern blk64_t ext2fs_blocks_count(struct ext2_super_block *super);
821extern void ext2fs_blocks_count_set(struct ext2_super_block *super,
822 blk64_t blk);
823extern void ext2fs_blocks_count_add(struct ext2_super_block *super,
824 blk64_t blk);
825extern blk64_t ext2fs_r_blocks_count(struct ext2_super_block *super);
826extern void ext2fs_r_blocks_count_set(struct ext2_super_block *super,
827 blk64_t blk);
828extern void ext2fs_r_blocks_count_add(struct ext2_super_block *super,
829 blk64_t blk);
830extern blk64_t ext2fs_free_blocks_count(struct ext2_super_block *super);
831extern void ext2fs_free_blocks_count_set(struct ext2_super_block *super,
832 blk64_t blk);
833extern void ext2fs_free_blocks_count_add(struct ext2_super_block *super,
834 blk64_t blk);
835/* Block group descriptor accessor functions */
836extern struct ext2_group_desc *ext2fs_group_desc(ext2_filsys fs,
837 struct opaque_ext2_group_desc *gdp,
838 dgrp_t group);
839extern blk64_t ext2fs_block_bitmap_loc(ext2_filsys fs, dgrp_t group);
840extern void ext2fs_block_bitmap_loc_set(ext2_filsys fs, dgrp_t group,
841 blk64_t blk);
842extern blk64_t ext2fs_inode_bitmap_loc(ext2_filsys fs, dgrp_t group);
843extern void ext2fs_inode_bitmap_loc_set(ext2_filsys fs, dgrp_t group,
844 blk64_t blk);
845extern blk64_t ext2fs_inode_table_loc(ext2_filsys fs, dgrp_t group);
846extern void ext2fs_inode_table_loc_set(ext2_filsys fs, dgrp_t group,
847 blk64_t blk);
848extern __u32 ext2fs_bg_free_blocks_count(ext2_filsys fs, dgrp_t group);
849extern void ext2fs_bg_free_blocks_count_set(ext2_filsys fs, dgrp_t group,
850 __u32 n);
851extern __u32 ext2fs_bg_free_inodes_count(ext2_filsys fs, dgrp_t group);
852extern void ext2fs_bg_free_inodes_count_set(ext2_filsys fs, dgrp_t group,
853 __u32 n);
854extern __u32 ext2fs_bg_used_dirs_count(ext2_filsys fs, dgrp_t group);
855extern void ext2fs_bg_used_dirs_count_set(ext2_filsys fs, dgrp_t group,
856 __u32 n);
857extern __u32 ext2fs_bg_itable_unused(ext2_filsys fs, dgrp_t group);
858extern void ext2fs_bg_itable_unused_set(ext2_filsys fs, dgrp_t group,
859 __u32 n);
860extern __u16 ext2fs_bg_flags(ext2_filsys fs, dgrp_t group);
861extern void ext2fs_bg_flags_zap(ext2_filsys fs, dgrp_t group);
862extern int ext2fs_bg_flags_test(ext2_filsys fs, dgrp_t group, __u16 bg_flag);
863extern void ext2fs_bg_flags_set(ext2_filsys fs, dgrp_t group, __u16 bg_flags);
864extern void ext2fs_bg_flags_clear(ext2_filsys fs, dgrp_t group, __u16 bg_flags);
865extern __u16 ext2fs_bg_checksum(ext2_filsys fs, dgrp_t group);
866extern void ext2fs_bg_checksum_set(ext2_filsys fs, dgrp_t group, __u16 checksum);
867extern blk64_t ext2fs_file_acl_block(ext2_filsys fs,
868 const struct ext2_inode *inode);
869extern void ext2fs_file_acl_block_set(ext2_filsys fs,
870 struct ext2_inode *inode, blk64_t blk);
Theodore Ts'o3839e651997-04-26 13:21:57 +0000871
872/* block.c */
873extern errcode_t ext2fs_block_iterate(ext2_filsys fs,
Theodore Ts'o31dbecd2001-01-11 04:54:39 +0000874 ext2_ino_t ino,
Theodore Ts'o3839e651997-04-26 13:21:57 +0000875 int flags,
876 char *block_buf,
877 int (*func)(ext2_filsys fs,
878 blk_t *blocknr,
879 int blockcnt,
Theodore Ts'ob5abe6f1998-01-19 14:47:53 +0000880 void *priv_data),
881 void *priv_data);
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000882errcode_t ext2fs_block_iterate2(ext2_filsys fs,
Theodore Ts'o31dbecd2001-01-11 04:54:39 +0000883 ext2_ino_t ino,
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000884 int flags,
885 char *block_buf,
886 int (*func)(ext2_filsys fs,
887 blk_t *blocknr,
Theodore Ts'o03673db1998-06-10 20:39:43 +0000888 e2_blkcnt_t blockcnt,
Theodore Ts'o674a4ee1998-03-23 02:06:52 +0000889 blk_t ref_blk,
890 int ref_offset,
891 void *priv_data),
892 void *priv_data);
JP Abgralle0ed7402014-03-19 19:08:39 -0700893errcode_t ext2fs_block_iterate3(ext2_filsys fs,
894 ext2_ino_t ino,
895 int flags,
896 char *block_buf,
897 int (*func)(ext2_filsys fs,
898 blk64_t *blocknr,
899 e2_blkcnt_t blockcnt,
900 blk64_t ref_blk,
901 int ref_offset,
902 void *priv_data),
903 void *priv_data);
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000904
Theodore Ts'o30fab291997-10-25 22:37:42 +0000905/* bmap.c */
Theodore Ts'o31dbecd2001-01-11 04:54:39 +0000906extern errcode_t ext2fs_bmap(ext2_filsys fs, ext2_ino_t ino,
Theodore Ts'oefc6f622008-08-27 23:07:54 -0400907 struct ext2_inode *inode,
Theodore Ts'o30fab291997-10-25 22:37:42 +0000908 char *block_buf, int bmap_flags,
909 blk_t block, blk_t *phys_blk);
Theodore Ts'oefc6f622008-08-27 23:07:54 -0400910extern errcode_t ext2fs_bmap2(ext2_filsys fs, ext2_ino_t ino,
Theodore Ts'occ9bf5d2008-02-18 14:59:45 -0500911 struct ext2_inode *inode,
912 char *block_buf, int bmap_flags, blk64_t block,
913 int *ret_flags, blk64_t *phys_blk);
JP Abgralle0ed7402014-03-19 19:08:39 -0700914errcode_t ext2fs_map_cluster_block(ext2_filsys fs, ext2_ino_t ino,
915 struct ext2_inode *inode, blk64_t lblk,
916 blk64_t *pblk);
Theodore Ts'o30fab291997-10-25 22:37:42 +0000917
Theodore Ts'o4a31c481998-03-30 01:27:25 +0000918#if 0
Theodore Ts'o1e1da291997-06-09 14:51:29 +0000919/* bmove.c */
920extern errcode_t ext2fs_move_blocks(ext2_filsys fs,
921 ext2fs_block_bitmap reserve,
Theodore Ts'o9941fb71997-06-11 22:27:41 +0000922 ext2fs_block_bitmap alloc_map,
Theodore Ts'o1e1da291997-06-09 14:51:29 +0000923 int flags);
Theodore Ts'o4a31c481998-03-30 01:27:25 +0000924#endif
Theodore Ts'o1e1da291997-06-09 14:51:29 +0000925
Theodore Ts'of3db3561997-04-26 13:34:30 +0000926/* check_desc.c */
927extern errcode_t ext2fs_check_desc(ext2_filsys fs);
928
Theodore Ts'o3839e651997-04-26 13:21:57 +0000929/* closefs.c */
930extern errcode_t ext2fs_close(ext2_filsys fs);
JP Abgralle0ed7402014-03-19 19:08:39 -0700931extern errcode_t ext2fs_close2(ext2_filsys fs, int flags);
Theodore Ts'o3839e651997-04-26 13:21:57 +0000932extern errcode_t ext2fs_flush(ext2_filsys fs);
JP Abgralle0ed7402014-03-19 19:08:39 -0700933extern errcode_t ext2fs_flush2(ext2_filsys fs, int flags);
934extern int ext2fs_bg_has_super(ext2_filsys fs, dgrp_t group_block);
935extern errcode_t ext2fs_super_and_bgd_loc2(ext2_filsys fs,
936 dgrp_t group,
937 blk64_t *ret_super_blk,
938 blk64_t *ret_old_desc_blk,
939 blk64_t *ret_new_desc_blk,
940 blk_t *ret_used_blks);
Theodore Ts'oefc6f622008-08-27 23:07:54 -0400941extern int ext2fs_super_and_bgd_loc(ext2_filsys fs,
Theodore Ts'oef344e12003-11-21 09:02:21 -0500942 dgrp_t group,
943 blk_t *ret_super_blk,
944 blk_t *ret_old_desc_blk,
945 blk_t *ret_new_desc_blk,
946 int *ret_meta_bg);
Theodore Ts'o1b4cd9c2004-12-15 18:06:52 -0500947extern void ext2fs_update_dynamic_rev(ext2_filsys fs);
Theodore Ts'o3839e651997-04-26 13:21:57 +0000948
JP Abgralle0ed7402014-03-19 19:08:39 -0700949/* crc32c.c */
950extern __u32 ext2fs_crc32c_be(__u32 crc, unsigned char const *p, size_t len);
951extern __u32 ext2fs_crc32c_le(__u32 crc, unsigned char const *p, size_t len);
952
Jose R. Santosca2634a2007-10-21 21:03:19 -0500953/* csum.c */
954extern void ext2fs_group_desc_csum_set(ext2_filsys fs, dgrp_t group);
955extern int ext2fs_group_desc_csum_verify(ext2_filsys fs, dgrp_t group);
Andreas Dilgerf628ace2008-03-31 10:50:19 -0400956extern errcode_t ext2fs_set_gdt_csum(ext2_filsys fs);
JP Abgralle0ed7402014-03-19 19:08:39 -0700957extern __u16 ext2fs_group_desc_csum(ext2_filsys fs, dgrp_t group);
Jose R. Santosca2634a2007-10-21 21:03:19 -0500958
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000959/* dblist.c */
960
Theodore Ts'o31dbecd2001-01-11 04:54:39 +0000961extern errcode_t ext2fs_get_num_dirs(ext2_filsys fs, ext2_ino_t *ret_num_dirs);
Theodore Ts'oa29f4d31997-04-29 21:26:48 +0000962extern errcode_t ext2fs_init_dblist(ext2_filsys fs, ext2_dblist *ret_dblist);
Theodore Ts'o31dbecd2001-01-11 04:54:39 +0000963extern errcode_t ext2fs_add_dir_block(ext2_dblist dblist, ext2_ino_t ino,
Theodore Ts'oa29f4d31997-04-29 21:26:48 +0000964 blk_t blk, int blockcnt);
JP Abgralle0ed7402014-03-19 19:08:39 -0700965extern errcode_t ext2fs_add_dir_block2(ext2_dblist dblist, ext2_ino_t ino,
966 blk64_t blk, e2_blkcnt_t blockcnt);
Theodore Ts'oea1959f2002-08-31 02:32:41 -0400967extern void ext2fs_dblist_sort(ext2_dblist dblist,
968 EXT2_QSORT_TYPE (*sortfunc)(const void *,
969 const void *));
JP Abgralle0ed7402014-03-19 19:08:39 -0700970extern void ext2fs_dblist_sort2(ext2_dblist dblist,
971 EXT2_QSORT_TYPE (*sortfunc)(const void *,
972 const void *));
Theodore Ts'oa29f4d31997-04-29 21:26:48 +0000973extern errcode_t ext2fs_dblist_iterate(ext2_dblist dblist,
974 int (*func)(ext2_filsys fs, struct ext2_db_entry *db_info,
Theodore Ts'ob5abe6f1998-01-19 14:47:53 +0000975 void *priv_data),
976 void *priv_data);
JP Abgralle0ed7402014-03-19 19:08:39 -0700977extern errcode_t ext2fs_dblist_iterate2(ext2_dblist dblist,
978 int (*func)(ext2_filsys fs, struct ext2_db_entry2 *db_info,
979 void *priv_data),
980 void *priv_data);
Theodore Ts'o31dbecd2001-01-11 04:54:39 +0000981extern errcode_t ext2fs_set_dir_block(ext2_dblist dblist, ext2_ino_t ino,
Theodore Ts'oa29f4d31997-04-29 21:26:48 +0000982 blk_t blk, int blockcnt);
JP Abgralle0ed7402014-03-19 19:08:39 -0700983extern errcode_t ext2fs_set_dir_block2(ext2_dblist dblist, ext2_ino_t ino,
984 blk64_t blk, e2_blkcnt_t blockcnt);
Theodore Ts'oa29f4d31997-04-29 21:26:48 +0000985extern errcode_t ext2fs_copy_dblist(ext2_dblist src,
986 ext2_dblist *dest);
Theodore Ts'o549860c1997-06-17 03:55:00 +0000987extern int ext2fs_dblist_count(ext2_dblist dblist);
JP Abgralle0ed7402014-03-19 19:08:39 -0700988extern blk64_t ext2fs_dblist_count2(ext2_dblist dblist);
Theodore Ts'oefc6f622008-08-27 23:07:54 -0400989extern errcode_t ext2fs_dblist_get_last(ext2_dblist dblist,
Theodore Ts'o52b1dd52008-03-13 00:34:16 -0400990 struct ext2_db_entry **entry);
JP Abgralle0ed7402014-03-19 19:08:39 -0700991extern errcode_t ext2fs_dblist_get_last2(ext2_dblist dblist,
992 struct ext2_db_entry2 **entry);
Theodore Ts'o52b1dd52008-03-13 00:34:16 -0400993extern errcode_t ext2fs_dblist_drop_last(ext2_dblist dblist);
Theodore Ts'o19c78dc1997-04-29 16:17:09 +0000994
995/* dblist_dir.c */
996extern errcode_t
997 ext2fs_dblist_dir_iterate(ext2_dblist dblist,
998 int flags,
999 char *block_buf,
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001000 int (*func)(ext2_ino_t dir,
Theodore Ts'o19c78dc1997-04-29 16:17:09 +00001001 int entry,
1002 struct ext2_dir_entry *dirent,
1003 int offset,
1004 int blocksize,
1005 char *buf,
Theodore Ts'ob5abe6f1998-01-19 14:47:53 +00001006 void *priv_data),
1007 void *priv_data);
Theodore Ts'o50e1e101997-04-26 13:58:21 +00001008
1009/* dirblock.c */
1010extern errcode_t ext2fs_read_dir_block(ext2_filsys fs, blk_t block,
1011 void *buf);
Theodore Ts'of9190c82002-03-12 01:05:06 -05001012extern errcode_t ext2fs_read_dir_block2(ext2_filsys fs, blk_t block,
1013 void *buf, int flags);
JP Abgralle0ed7402014-03-19 19:08:39 -07001014extern errcode_t ext2fs_read_dir_block3(ext2_filsys fs, blk64_t block,
1015 void *buf, int flags);
Theodore Ts'o50e1e101997-04-26 13:58:21 +00001016extern errcode_t ext2fs_write_dir_block(ext2_filsys fs, blk_t block,
1017 void *buf);
Theodore Ts'of9190c82002-03-12 01:05:06 -05001018extern errcode_t ext2fs_write_dir_block2(ext2_filsys fs, blk_t block,
1019 void *buf, int flags);
JP Abgralle0ed7402014-03-19 19:08:39 -07001020extern errcode_t ext2fs_write_dir_block3(ext2_filsys fs, blk64_t block,
1021 void *buf, int flags);
Theodore Ts'o50e1e101997-04-26 13:58:21 +00001022
Theodore Ts'o52783e02002-03-11 15:04:45 -05001023/* dirhash.c */
1024extern errcode_t ext2fs_dirhash(int version, const char *name, int len,
Theodore Ts'ob33278c2002-08-17 10:52:51 -04001025 const __u32 *seed,
Theodore Ts'o503f9e72002-06-26 16:52:10 -04001026 ext2_dirhash_t *ret_hash,
1027 ext2_dirhash_t *ret_minor_hash);
Theodore Ts'o52783e02002-03-11 15:04:45 -05001028
1029
Theodore Ts'o19c78dc1997-04-29 16:17:09 +00001030/* dir_iterate.c */
Theodore Ts'o8a480352009-06-21 21:07:38 -04001031extern errcode_t ext2fs_get_rec_len(ext2_filsys fs,
1032 struct ext2_dir_entry *dirent,
1033 unsigned int *rec_len);
1034extern errcode_t ext2fs_set_rec_len(ext2_filsys fs,
1035 unsigned int len,
1036 struct ext2_dir_entry *dirent);
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001037extern errcode_t ext2fs_dir_iterate(ext2_filsys fs,
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001038 ext2_ino_t dir,
Theodore Ts'o19c78dc1997-04-29 16:17:09 +00001039 int flags,
1040 char *block_buf,
1041 int (*func)(struct ext2_dir_entry *dirent,
1042 int offset,
1043 int blocksize,
1044 char *buf,
Theodore Ts'ob5abe6f1998-01-19 14:47:53 +00001045 void *priv_data),
1046 void *priv_data);
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001047extern errcode_t ext2fs_dir_iterate2(ext2_filsys fs,
Theodore Ts'o8bd0c952002-01-03 03:29:19 -05001048 ext2_ino_t dir,
1049 int flags,
1050 char *block_buf,
1051 int (*func)(ext2_ino_t dir,
1052 int entry,
1053 struct ext2_dir_entry *dirent,
1054 int offset,
1055 int blocksize,
1056 char *buf,
1057 void *priv_data),
1058 void *priv_data);
Theodore Ts'o19c78dc1997-04-29 16:17:09 +00001059
Theodore Ts'oa29f4d31997-04-29 21:26:48 +00001060/* dupfs.c */
1061extern errcode_t ext2fs_dup_handle(ext2_filsys src, ext2_filsys *dest);
Theodore Ts'o19c78dc1997-04-29 16:17:09 +00001062
Theodore Ts'o3839e651997-04-26 13:21:57 +00001063/* expanddir.c */
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001064extern errcode_t ext2fs_expand_dir(ext2_filsys fs, ext2_ino_t dir);
Theodore Ts'o3839e651997-04-26 13:21:57 +00001065
Theodore Ts'o342d8472001-07-02 11:54:09 -04001066/* ext_attr.c */
Andreas Dilgerfefaef32008-02-02 01:16:32 -07001067extern __u32 ext2fs_ext_attr_hash_entry(struct ext2_ext_attr_entry *entry,
1068 void *data);
Theodore Ts'o342d8472001-07-02 11:54:09 -04001069extern errcode_t ext2fs_read_ext_attr(ext2_filsys fs, blk_t block, void *buf);
JP Abgralle0ed7402014-03-19 19:08:39 -07001070extern errcode_t ext2fs_read_ext_attr2(ext2_filsys fs, blk64_t block,
1071 void *buf);
Theodore Ts'o0684a4f2002-08-17 10:19:44 -04001072extern errcode_t ext2fs_write_ext_attr(ext2_filsys fs, blk_t block,
1073 void *buf);
JP Abgralle0ed7402014-03-19 19:08:39 -07001074extern errcode_t ext2fs_write_ext_attr2(ext2_filsys fs, blk64_t block,
1075 void *buf);
Theodore Ts'o0684a4f2002-08-17 10:19:44 -04001076extern errcode_t ext2fs_adjust_ea_refcount(ext2_filsys fs, blk_t blk,
1077 char *block_buf,
1078 int adjust, __u32 *newcount);
JP Abgralle0ed7402014-03-19 19:08:39 -07001079extern errcode_t ext2fs_adjust_ea_refcount2(ext2_filsys fs, blk64_t blk,
1080 char *block_buf,
1081 int adjust, __u32 *newcount);
Theodore Ts'o0684a4f2002-08-17 10:19:44 -04001082
Theodore Ts'o3eb07f62007-10-14 23:04:58 -04001083/* extent.c */
1084extern errcode_t ext2fs_extent_header_verify(void *ptr, int size);
1085extern errcode_t ext2fs_extent_open(ext2_filsys fs, ext2_ino_t ino,
1086 ext2_extent_handle_t *handle);
number965284b239a2009-05-19 13:34:12 -07001087extern errcode_t ext2fs_extent_open2(ext2_filsys fs, ext2_ino_t ino,
1088 struct ext2_inode *inode,
1089 ext2_extent_handle_t *ret_handle);
Theodore Ts'o2d328bb2008-03-17 23:17:13 -04001090extern void ext2fs_extent_free(ext2_extent_handle_t handle);
Theodore Ts'o3eb07f62007-10-14 23:04:58 -04001091extern errcode_t ext2fs_extent_get(ext2_extent_handle_t handle,
1092 int flags, struct ext2fs_extent *extent);
JP Abgralle0ed7402014-03-19 19:08:39 -07001093extern errcode_t ext2fs_extent_node_split(ext2_extent_handle_t handle);
Theodore Ts'o3eb07f62007-10-14 23:04:58 -04001094extern errcode_t ext2fs_extent_replace(ext2_extent_handle_t handle, int flags,
1095 struct ext2fs_extent *extent);
1096extern errcode_t ext2fs_extent_insert(ext2_extent_handle_t handle, int flags,
1097 struct ext2fs_extent *extent);
Eric Sandeenf4e99632008-05-20 10:17:46 -05001098extern errcode_t ext2fs_extent_set_bmap(ext2_extent_handle_t handle,
1099 blk64_t logical, blk64_t physical,
1100 int flags);
Theodore Ts'o3eb07f62007-10-14 23:04:58 -04001101extern errcode_t ext2fs_extent_delete(ext2_extent_handle_t handle, int flags);
1102extern errcode_t ext2fs_extent_get_info(ext2_extent_handle_t handle,
1103 struct ext2_extent_info *info);
1104extern errcode_t ext2fs_extent_goto(ext2_extent_handle_t handle,
1105 blk64_t blk);
JP Abgralle0ed7402014-03-19 19:08:39 -07001106extern errcode_t ext2fs_extent_goto2(ext2_extent_handle_t handle,
1107 int leaf_level, blk64_t blk);
1108extern errcode_t ext2fs_extent_fix_parents(ext2_extent_handle_t handle);
Theodore Ts'o3eb07f62007-10-14 23:04:58 -04001109
Theodore Ts'o30fab291997-10-25 22:37:42 +00001110/* fileio.c */
Theodore Ts'oa435ec32003-08-21 00:40:26 -04001111extern errcode_t ext2fs_file_open2(ext2_filsys fs, ext2_ino_t ino,
1112 struct ext2_inode *inode,
1113 int flags, ext2_file_t *ret);
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001114extern errcode_t ext2fs_file_open(ext2_filsys fs, ext2_ino_t ino,
Theodore Ts'o30fab291997-10-25 22:37:42 +00001115 int flags, ext2_file_t *ret);
Theodore Ts'o79a90bd1997-11-03 19:16:55 +00001116extern ext2_filsys ext2fs_file_get_fs(ext2_file_t file);
JP Abgralle0ed7402014-03-19 19:08:39 -07001117struct ext2_inode *ext2fs_file_get_inode(ext2_file_t file);
1118extern ext2_ino_t ext2fs_file_get_inode_num(ext2_file_t file);
Theodore Ts'o30fab291997-10-25 22:37:42 +00001119extern errcode_t ext2fs_file_close(ext2_file_t file);
Theodore Ts'of12e2852002-02-20 01:06:25 -05001120extern errcode_t ext2fs_file_flush(ext2_file_t file);
Theodore Ts'o30fab291997-10-25 22:37:42 +00001121extern errcode_t ext2fs_file_read(ext2_file_t file, void *buf,
Theodore Ts'o79a90bd1997-11-03 19:16:55 +00001122 unsigned int wanted, unsigned int *got);
Theodore Ts'of12e2852002-02-20 01:06:25 -05001123extern errcode_t ext2fs_file_write(ext2_file_t file, const void *buf,
Theodore Ts'o79a90bd1997-11-03 19:16:55 +00001124 unsigned int nbytes, unsigned int *written);
Theodore Ts'o819157d2003-01-22 18:25:39 -05001125extern errcode_t ext2fs_file_llseek(ext2_file_t file, __u64 offset,
1126 int whence, __u64 *ret_pos);
Theodore Ts'o674a4ee1998-03-23 02:06:52 +00001127extern errcode_t ext2fs_file_lseek(ext2_file_t file, ext2_off_t offset,
1128 int whence, ext2_off_t *ret_pos);
Theodore Ts'o819157d2003-01-22 18:25:39 -05001129errcode_t ext2fs_file_get_lsize(ext2_file_t file, __u64 *ret_size);
Theodore Ts'o79a90bd1997-11-03 19:16:55 +00001130extern ext2_off_t ext2fs_file_get_size(ext2_file_t file);
1131extern errcode_t ext2fs_file_set_size(ext2_file_t file, ext2_off_t size);
JP Abgralle0ed7402014-03-19 19:08:39 -07001132extern errcode_t ext2fs_file_set_size2(ext2_file_t file, ext2_off64_t size);
Theodore Ts'o30fab291997-10-25 22:37:42 +00001133
Theodore Ts'ode23aa12000-08-19 17:00:47 +00001134/* finddev.c */
1135extern char *ext2fs_find_block_device(dev_t device);
1136
Theodore Ts'o4d0f3e12001-01-11 15:48:50 +00001137/* flushb.c */
1138extern errcode_t ext2fs_sync_device(int fd, int flushb);
1139
Theodore Ts'o3839e651997-04-26 13:21:57 +00001140/* freefs.c */
1141extern void ext2fs_free(ext2_filsys fs);
Theodore Ts'oa29f4d31997-04-29 21:26:48 +00001142extern void ext2fs_free_dblist(ext2_dblist dblist);
Theodore Ts'ob7a00562002-07-20 00:28:07 -04001143extern void ext2fs_badblocks_list_free(ext2_badblocks_list bb);
1144extern void ext2fs_u32_list_free(ext2_u32_list bb);
Theodore Ts'o50e1e101997-04-26 13:58:21 +00001145
Theodore Ts'oa0553c92007-07-22 22:59:50 -04001146/* gen_bitmap.c */
1147extern void ext2fs_free_generic_bitmap(ext2fs_inode_bitmap bitmap);
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001148extern errcode_t ext2fs_make_generic_bitmap(errcode_t magic, ext2_filsys fs,
1149 __u32 start, __u32 end,
Theodore Ts'oa0553c92007-07-22 22:59:50 -04001150 __u32 real_end,
1151 const char *descr, char *init_map,
1152 ext2fs_generic_bitmap *ret);
1153extern errcode_t ext2fs_allocate_generic_bitmap(__u32 start,
1154 __u32 end,
1155 __u32 real_end,
1156 const char *descr,
1157 ext2fs_generic_bitmap *ret);
1158extern errcode_t ext2fs_copy_generic_bitmap(ext2fs_generic_bitmap src,
1159 ext2fs_generic_bitmap *dest);
1160extern void ext2fs_clear_generic_bitmap(ext2fs_generic_bitmap bitmap);
1161extern errcode_t ext2fs_fudge_generic_bitmap_end(ext2fs_inode_bitmap bitmap,
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001162 errcode_t magic,
Theodore Ts'oa0553c92007-07-22 22:59:50 -04001163 errcode_t neq,
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001164 ext2_ino_t end,
Theodore Ts'oa0553c92007-07-22 22:59:50 -04001165 ext2_ino_t *oend);
1166extern void ext2fs_set_generic_bitmap_padding(ext2fs_generic_bitmap map);
Theodore Ts'o50448d32007-07-22 23:42:14 -04001167extern errcode_t ext2fs_resize_generic_bitmap(errcode_t magic,
1168 __u32 new_end,
1169 __u32 new_real_end,
1170 ext2fs_generic_bitmap bmap);
1171extern errcode_t ext2fs_compare_generic_bitmap(errcode_t magic, errcode_t neq,
1172 ext2fs_generic_bitmap bm1,
1173 ext2fs_generic_bitmap bm2);
Theodore Ts'of1f115a2007-07-23 04:32:48 -04001174extern errcode_t ext2fs_get_generic_bitmap_range(ext2fs_generic_bitmap bmap,
1175 errcode_t magic,
1176 __u32 start, __u32 num,
1177 void *out);
1178extern errcode_t ext2fs_set_generic_bitmap_range(ext2fs_generic_bitmap bmap,
1179 errcode_t magic,
1180 __u32 start, __u32 num,
1181 void *in);
JP Abgralle0ed7402014-03-19 19:08:39 -07001182extern errcode_t ext2fs_find_first_zero_generic_bitmap(ext2fs_generic_bitmap bitmap,
1183 __u32 start, __u32 end,
1184 __u32 *out);
1185
1186/* gen_bitmap64.c */
1187
1188/* Generate and print bitmap usage statistics */
1189#define BMAP_STATS
1190
1191void ext2fs_free_generic_bmap(ext2fs_generic_bitmap bmap);
1192errcode_t ext2fs_alloc_generic_bmap(ext2_filsys fs, errcode_t magic,
1193 int type, __u64 start, __u64 end,
1194 __u64 real_end,
1195 const char *descr,
1196 ext2fs_generic_bitmap *ret);
1197errcode_t ext2fs_copy_generic_bmap(ext2fs_generic_bitmap src,
1198 ext2fs_generic_bitmap *dest);
1199void ext2fs_clear_generic_bmap(ext2fs_generic_bitmap bitmap);
1200errcode_t ext2fs_fudge_generic_bmap_end(ext2fs_generic_bitmap bitmap,
1201 errcode_t neq,
1202 __u64 end, __u64 *oend);
1203void ext2fs_set_generic_bmap_padding(ext2fs_generic_bitmap bmap);
1204errcode_t ext2fs_resize_generic_bmap(ext2fs_generic_bitmap bmap,
1205 __u64 new_end,
1206 __u64 new_real_end);
1207errcode_t ext2fs_compare_generic_bmap(errcode_t neq,
1208 ext2fs_generic_bitmap bm1,
1209 ext2fs_generic_bitmap bm2);
1210errcode_t ext2fs_get_generic_bmap_range(ext2fs_generic_bitmap bmap,
1211 __u64 start, unsigned int num,
1212 void *out);
1213errcode_t ext2fs_set_generic_bmap_range(ext2fs_generic_bitmap bmap,
1214 __u64 start, unsigned int num,
1215 void *in);
1216errcode_t ext2fs_convert_subcluster_bitmap(ext2_filsys fs,
1217 ext2fs_block_bitmap *bitmap);
Valerie Aurora Henson8f82ef92009-08-05 00:27:10 -04001218
Theodore Ts'o50e1e101997-04-26 13:58:21 +00001219/* getsize.c */
1220extern errcode_t ext2fs_get_device_size(const char *file, int blocksize,
1221 blk_t *retblocks);
Jose R. Santosbeab8de2008-08-20 12:34:07 -05001222extern errcode_t ext2fs_get_device_size2(const char *file, int blocksize,
1223 blk64_t *retblocks);
Theodore Ts'o3839e651997-04-26 13:21:57 +00001224
Theodore Ts'o93d5c382003-05-21 17:28:29 -04001225/* getsectsize.c */
JP Abgralle0ed7402014-03-19 19:08:39 -07001226extern int ext2fs_get_dio_alignment(int fd);
Theodore Ts'o93d5c382003-05-21 17:28:29 -04001227errcode_t ext2fs_get_device_sectsize(const char *file, int *sectsize);
Theodore Ts'obb1158b2010-05-17 22:31:45 -04001228errcode_t ext2fs_get_device_phys_sectsize(const char *file, int *sectsize);
Theodore Ts'o93d5c382003-05-21 17:28:29 -04001229
Theodore Ts'o1ca10592008-04-09 11:39:11 -04001230/* i_block.c */
1231errcode_t ext2fs_iblk_add_blocks(ext2_filsys fs, struct ext2_inode *inode,
1232 blk64_t num_blocks);
1233errcode_t ext2fs_iblk_sub_blocks(ext2_filsys fs, struct ext2_inode *inode,
1234 blk64_t num_blocks);
1235errcode_t ext2fs_iblk_set(ext2_filsys fs, struct ext2_inode *inode, blk64_t b);
1236
Theodore Ts'o72ed1262000-11-12 19:32:20 +00001237/* imager.c */
1238extern errcode_t ext2fs_image_inode_write(ext2_filsys fs, int fd, int flags);
1239extern errcode_t ext2fs_image_inode_read(ext2_filsys fs, int fd, int flags);
1240extern errcode_t ext2fs_image_super_write(ext2_filsys fs, int fd, int flags);
1241extern errcode_t ext2fs_image_super_read(ext2_filsys fs, int fd, int flags);
1242extern errcode_t ext2fs_image_bitmap_write(ext2_filsys fs, int fd, int flags);
1243extern errcode_t ext2fs_image_bitmap_read(ext2_filsys fs, int fd, int flags);
1244
Theodore Ts'odc8ce342005-01-06 00:04:24 -05001245/* ind_block.c */
1246errcode_t ext2fs_read_ind_block(ext2_filsys fs, blk_t blk, void *buf);
1247errcode_t ext2fs_write_ind_block(ext2_filsys fs, blk_t blk, void *buf);
1248
Theodore Ts'o3839e651997-04-26 13:21:57 +00001249/* initialize.c */
1250extern errcode_t ext2fs_initialize(const char *name, int flags,
1251 struct ext2_super_block *param,
1252 io_manager manager, ext2_filsys *ret_fs);
1253
Theodore Ts'of12e2852002-02-20 01:06:25 -05001254/* icount.c */
1255extern void ext2fs_free_icount(ext2_icount_t icount);
Theodore Ts'o1b9d8cb2007-04-06 14:30:39 -04001256extern errcode_t ext2fs_create_icount_tdb(ext2_filsys fs, char *tdb_dir,
1257 int flags, ext2_icount_t *ret);
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001258extern errcode_t ext2fs_create_icount2(ext2_filsys fs, int flags,
Theodore Ts'o54434922003-12-07 01:28:50 -05001259 unsigned int size,
Theodore Ts'of12e2852002-02-20 01:06:25 -05001260 ext2_icount_t hint, ext2_icount_t *ret);
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001261extern errcode_t ext2fs_create_icount(ext2_filsys fs, int flags,
Theodore Ts'o54434922003-12-07 01:28:50 -05001262 unsigned int size,
Theodore Ts'of12e2852002-02-20 01:06:25 -05001263 ext2_icount_t *ret);
1264extern errcode_t ext2fs_icount_fetch(ext2_icount_t icount, ext2_ino_t ino,
1265 __u16 *ret);
1266extern errcode_t ext2fs_icount_increment(ext2_icount_t icount, ext2_ino_t ino,
1267 __u16 *ret);
1268extern errcode_t ext2fs_icount_decrement(ext2_icount_t icount, ext2_ino_t ino,
1269 __u16 *ret);
1270extern errcode_t ext2fs_icount_store(ext2_icount_t icount, ext2_ino_t ino,
1271 __u16 count);
1272extern ext2_ino_t ext2fs_get_icount_size(ext2_icount_t icount);
1273errcode_t ext2fs_icount_validate(ext2_icount_t icount, FILE *);
1274
JP Abgralle0ed7402014-03-19 19:08:39 -07001275/* inline.c */
1276
1277extern errcode_t ext2fs_get_memalign(unsigned long size,
1278 unsigned long align, void *ptr);
1279
Theodore Ts'o3839e651997-04-26 13:21:57 +00001280/* inode.c */
Theodore Ts'o72ed1262000-11-12 19:32:20 +00001281extern errcode_t ext2fs_flush_icache(ext2_filsys fs);
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001282extern errcode_t ext2fs_get_next_inode_full(ext2_inode_scan scan,
Theodore Ts'o73311962005-01-25 23:42:56 -05001283 ext2_ino_t *ino,
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001284 struct ext2_inode *inode,
Theodore Ts'o73311962005-01-25 23:42:56 -05001285 int bufsize);
Theodore Ts'o3839e651997-04-26 13:21:57 +00001286extern errcode_t ext2fs_open_inode_scan(ext2_filsys fs, int buffer_blocks,
1287 ext2_inode_scan *ret_scan);
1288extern void ext2fs_close_inode_scan(ext2_inode_scan scan);
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001289extern errcode_t ext2fs_get_next_inode(ext2_inode_scan scan, ext2_ino_t *ino,
Theodore Ts'o3839e651997-04-26 13:21:57 +00001290 struct ext2_inode *inode);
Theodore Ts'o19c78dc1997-04-29 16:17:09 +00001291extern errcode_t ext2fs_inode_scan_goto_blockgroup(ext2_inode_scan scan,
1292 int group);
1293extern void ext2fs_set_inode_callback
1294 (ext2_inode_scan scan,
1295 errcode_t (*done_group)(ext2_filsys fs,
1296 ext2_inode_scan scan,
1297 dgrp_t group,
Theodore Ts'ob5abe6f1998-01-19 14:47:53 +00001298 void * priv_data),
Theodore Ts'o19c78dc1997-04-29 16:17:09 +00001299 void *done_group_data);
1300extern int ext2fs_inode_scan_flags(ext2_inode_scan scan, int set_flags,
1301 int clear_flags);
Theodore Ts'o73311962005-01-25 23:42:56 -05001302extern errcode_t ext2fs_read_inode_full(ext2_filsys fs, ext2_ino_t ino,
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001303 struct ext2_inode * inode,
Theodore Ts'o73311962005-01-25 23:42:56 -05001304 int bufsize);
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001305extern errcode_t ext2fs_read_inode (ext2_filsys fs, ext2_ino_t ino,
Theodore Ts'o3839e651997-04-26 13:21:57 +00001306 struct ext2_inode * inode);
Theodore Ts'o73311962005-01-25 23:42:56 -05001307extern errcode_t ext2fs_write_inode_full(ext2_filsys fs, ext2_ino_t ino,
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001308 struct ext2_inode * inode,
Theodore Ts'o73311962005-01-25 23:42:56 -05001309 int bufsize);
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001310extern errcode_t ext2fs_write_inode(ext2_filsys fs, ext2_ino_t ino,
Theodore Ts'o3839e651997-04-26 13:21:57 +00001311 struct ext2_inode * inode);
Theodore Ts'o030970e2005-03-20 20:05:22 -05001312extern errcode_t ext2fs_write_new_inode(ext2_filsys fs, ext2_ino_t ino,
1313 struct ext2_inode * inode);
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001314extern errcode_t ext2fs_get_blocks(ext2_filsys fs, ext2_ino_t ino, blk_t *blocks);
1315extern errcode_t ext2fs_check_directory(ext2_filsys fs, ext2_ino_t ino);
Theodore Ts'o3839e651997-04-26 13:21:57 +00001316
Theodore Ts'of12e2852002-02-20 01:06:25 -05001317/* inode_io.c */
1318extern io_manager inode_io_manager;
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001319extern errcode_t ext2fs_inode_io_intern(ext2_filsys fs, ext2_ino_t ino,
Theodore Ts'o546a1ff2002-03-07 23:52:56 -05001320 char **name);
Theodore Ts'oa435ec32003-08-21 00:40:26 -04001321extern errcode_t ext2fs_inode_io_intern2(ext2_filsys fs, ext2_ino_t ino,
1322 struct ext2_inode *inode,
1323 char **name);
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001324
Theodore Ts'o50e1e101997-04-26 13:58:21 +00001325/* ismounted.c */
1326extern errcode_t ext2fs_check_if_mounted(const char *file, int *mount_flags);
Theodore Ts'o43ec8732001-01-03 14:56:46 +00001327extern errcode_t ext2fs_check_mount_point(const char *device, int *mount_flags,
1328 char *mtpt, int mtlen);
Theodore Ts'o50e1e101997-04-26 13:58:21 +00001329
JP Abgralle0ed7402014-03-19 19:08:39 -07001330/* punch.c */
1331/*
1332 * NOTE: This function removes from an inode the blocks "start", "end", and
1333 * every block in between.
1334 */
1335extern errcode_t ext2fs_punch(ext2_filsys fs, ext2_ino_t ino,
1336 struct ext2_inode *inode,
1337 char *block_buf, blk64_t start,
1338 blk64_t end);
1339
Theodore Ts'o3839e651997-04-26 13:21:57 +00001340/* namei.c */
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001341extern errcode_t ext2fs_lookup(ext2_filsys fs, ext2_ino_t dir, const char *name,
1342 int namelen, char *buf, ext2_ino_t *inode);
1343extern errcode_t ext2fs_namei(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
1344 const char *name, ext2_ino_t *inode);
1345errcode_t ext2fs_namei_follow(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
1346 const char *name, ext2_ino_t *inode);
1347extern errcode_t ext2fs_follow_link(ext2_filsys fs, ext2_ino_t root, ext2_ino_t cwd,
1348 ext2_ino_t inode, ext2_ino_t *res_inode);
Theodore Ts'o1e3472c1997-04-29 14:53:37 +00001349
1350/* native.c */
1351int ext2fs_native_flag(void);
Theodore Ts'o3839e651997-04-26 13:21:57 +00001352
1353/* newdir.c */
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001354extern errcode_t ext2fs_new_dir_block(ext2_filsys fs, ext2_ino_t dir_ino,
1355 ext2_ino_t parent_ino, char **block);
Theodore Ts'o3839e651997-04-26 13:21:57 +00001356
1357/* mkdir.c */
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001358extern errcode_t ext2fs_mkdir(ext2_filsys fs, ext2_ino_t parent, ext2_ino_t inum,
Theodore Ts'o3839e651997-04-26 13:21:57 +00001359 const char *name);
1360
Theodore Ts'od3cd93c2000-10-24 18:33:16 +00001361/* mkjournal.c */
Theodore Ts'oc8608502008-04-27 16:10:32 -04001362extern errcode_t ext2fs_zero_blocks(ext2_filsys fs, blk_t blk, int num,
1363 blk_t *ret_blk, int *ret_count);
JP Abgralle0ed7402014-03-19 19:08:39 -07001364extern errcode_t ext2fs_zero_blocks2(ext2_filsys fs, blk64_t blk, int num,
1365 blk64_t *ret_blk, int *ret_count);
Theodore Ts'oa1128472001-01-16 06:56:14 +00001366extern errcode_t ext2fs_create_journal_superblock(ext2_filsys fs,
JP Abgralle0ed7402014-03-19 19:08:39 -07001367 __u32 num_blocks, int flags,
Theodore Ts'oa1128472001-01-16 06:56:14 +00001368 char **ret_jsb);
1369extern errcode_t ext2fs_add_journal_device(ext2_filsys fs,
1370 ext2_filsys journal_dev);
JP Abgralle0ed7402014-03-19 19:08:39 -07001371extern errcode_t ext2fs_add_journal_inode(ext2_filsys fs, blk_t num_blocks,
Theodore Ts'o31a17b32001-01-03 13:04:12 +00001372 int flags);
JP Abgralle0ed7402014-03-19 19:08:39 -07001373extern int ext2fs_default_journal_size(__u64 num_blocks);
Theodore Ts'od3cd93c2000-10-24 18:33:16 +00001374
Theodore Ts'o3839e651997-04-26 13:21:57 +00001375/* openfs.c */
1376extern errcode_t ext2fs_open(const char *name, int flags, int superblock,
Theodore Ts'o54434922003-12-07 01:28:50 -05001377 unsigned int block_size, io_manager manager,
Theodore Ts'o3839e651997-04-26 13:21:57 +00001378 ext2_filsys *ret_fs);
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001379extern errcode_t ext2fs_open2(const char *name, const char *io_options,
1380 int flags, int superblock,
Theodore Ts'o2e8ca9a2004-11-30 14:07:11 -05001381 unsigned int block_size, io_manager manager,
1382 ext2_filsys *ret_fs);
JP Abgralle0ed7402014-03-19 19:08:39 -07001383extern blk64_t ext2fs_descriptor_block_loc2(ext2_filsys fs,
1384 blk64_t group_block, dgrp_t i);
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001385extern blk_t ext2fs_descriptor_block_loc(ext2_filsys fs, blk_t group_block,
Theodore Ts'oc046ac72002-10-20 00:38:57 -04001386 dgrp_t i);
Theodore Ts'o1ad54a92004-07-28 21:11:48 -04001387errcode_t ext2fs_get_data_io(ext2_filsys fs, io_channel *old_io);
1388errcode_t ext2fs_set_data_io(ext2_filsys fs, io_channel new_io);
1389errcode_t ext2fs_rewrite_to_io(ext2_filsys fs, io_channel new_io);
Theodore Ts'o3839e651997-04-26 13:21:57 +00001390
1391/* get_pathname.c */
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001392extern errcode_t ext2fs_get_pathname(ext2_filsys fs, ext2_ino_t dir, ext2_ino_t ino,
Theodore Ts'o3839e651997-04-26 13:21:57 +00001393 char **name);
1394
1395/* link.c */
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001396errcode_t ext2fs_link(ext2_filsys fs, ext2_ino_t dir, const char *name,
1397 ext2_ino_t ino, int flags);
1398errcode_t ext2fs_unlink(ext2_filsys fs, ext2_ino_t dir, const char *name,
1399 ext2_ino_t ino, int flags);
Theodore Ts'o3839e651997-04-26 13:21:57 +00001400
JP Abgralle0ed7402014-03-19 19:08:39 -07001401/* symlink.c */
1402errcode_t ext2fs_symlink(ext2_filsys fs, ext2_ino_t parent, ext2_ino_t ino,
1403 const char *name, char *target);
1404
1405/* mmp.c */
1406errcode_t ext2fs_mmp_read(ext2_filsys fs, blk64_t mmp_blk, void *buf);
1407errcode_t ext2fs_mmp_write(ext2_filsys fs, blk64_t mmp_blk, void *buf);
1408errcode_t ext2fs_mmp_clear(ext2_filsys fs);
1409errcode_t ext2fs_mmp_init(ext2_filsys fs);
1410errcode_t ext2fs_mmp_start(ext2_filsys fs);
1411errcode_t ext2fs_mmp_update(ext2_filsys fs);
1412errcode_t ext2fs_mmp_stop(ext2_filsys fs);
1413unsigned ext2fs_mmp_new_seq(void);
1414
Theodore Ts'o3839e651997-04-26 13:21:57 +00001415/* read_bb.c */
Theodore Ts'o19c78dc1997-04-29 16:17:09 +00001416extern errcode_t ext2fs_read_bb_inode(ext2_filsys fs,
1417 ext2_badblocks_list *bb_list);
Theodore Ts'o3839e651997-04-26 13:21:57 +00001418
1419/* read_bb_file.c */
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001420extern errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f,
Theodore Ts'o57dca852000-07-04 19:20:25 +00001421 ext2_badblocks_list *bb_list,
Theodore Ts'o50cd7e02002-07-14 16:00:50 -04001422 void *priv_data,
Theodore Ts'o57dca852000-07-04 19:20:25 +00001423 void (*invalid)(ext2_filsys fs,
1424 blk_t blk,
1425 char *badstr,
Theodore Ts'o50cd7e02002-07-14 16:00:50 -04001426 void *priv_data));
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001427extern errcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f,
Theodore Ts'o19c78dc1997-04-29 16:17:09 +00001428 ext2_badblocks_list *bb_list,
Theodore Ts'o3839e651997-04-26 13:21:57 +00001429 void (*invalid)(ext2_filsys fs,
1430 blk_t blk));
1431
Theodore Ts'od323f8f2004-12-15 14:39:16 -05001432/* res_gdt.c */
1433extern errcode_t ext2fs_create_resize_inode(ext2_filsys fs);
1434
Theodore Ts'o50e1e101997-04-26 13:58:21 +00001435/* swapfs.c */
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001436extern void ext2fs_swap_ext_attr(char *to, char *from, int bufsize,
Theodore Ts'o73311962005-01-25 23:42:56 -05001437 int has_header);
Andreas Dilgerfefaef32008-02-02 01:16:32 -07001438extern void ext2fs_swap_ext_attr_header(struct ext2_ext_attr_header *to_header,
1439 struct ext2_ext_attr_header *from_hdr);
1440extern void ext2fs_swap_ext_attr_entry(struct ext2_ext_attr_entry *to_entry,
1441 struct ext2_ext_attr_entry *from_entry);
Theodore Ts'o50e1e101997-04-26 13:58:21 +00001442extern void ext2fs_swap_super(struct ext2_super_block * super);
1443extern void ext2fs_swap_group_desc(struct ext2_group_desc *gdp);
JP Abgralle0ed7402014-03-19 19:08:39 -07001444extern void ext2fs_swap_group_desc2(ext2_filsys, struct ext2_group_desc *gdp);
Theodore Ts'o73311962005-01-25 23:42:56 -05001445extern void ext2fs_swap_inode_full(ext2_filsys fs, struct ext2_inode_large *t,
1446 struct ext2_inode_large *f, int hostorder,
1447 int bufsize);
Theodore Ts'o1e3472c1997-04-29 14:53:37 +00001448extern void ext2fs_swap_inode(ext2_filsys fs,struct ext2_inode *t,
1449 struct ext2_inode *f, int hostorder);
JP Abgralle0ed7402014-03-19 19:08:39 -07001450extern void ext2fs_swap_mmp(struct mmp_struct *mmp);
1451
1452/* unix_io.c */
1453extern int ext2fs_open_file(const char *pathname, int flags, mode_t mode);
1454extern int ext2fs_stat(const char *path, ext2fs_struct_stat *buf);
1455extern int ext2fs_fstat(int fd, ext2fs_struct_stat *buf);
Theodore Ts'oab3f5c52012-09-09 21:35:39 -04001456
Theodore Ts'o19c78dc1997-04-29 16:17:09 +00001457/* valid_blk.c */
Theodore Ts'o521e3681997-04-29 17:48:10 +00001458extern int ext2fs_inode_has_valid_blocks(struct ext2_inode *inode);
JP Abgralle0ed7402014-03-19 19:08:39 -07001459extern int ext2fs_inode_has_valid_blocks2(ext2_filsys fs,
1460 struct ext2_inode *inode);
Theodore Ts'o521e3681997-04-29 17:48:10 +00001461
1462/* version.c */
1463extern int ext2fs_parse_version_string(const char *ver_string);
1464extern int ext2fs_get_library_version(const char **ver_string,
1465 const char **date_string);
Theodore Ts'o50e1e101997-04-26 13:58:21 +00001466
Theodore Ts'o31dbecd2001-01-11 04:54:39 +00001467/* write_bb_file.c */
1468extern errcode_t ext2fs_write_bb_FILE(ext2_badblocks_list bb_list,
1469 unsigned int flags,
1470 FILE *f);
1471
1472
Theodore Ts'o3839e651997-04-26 13:21:57 +00001473/* inline functions */
JP Abgralle0ed7402014-03-19 19:08:39 -07001474#ifdef NO_INLINE_FUNCS
Theodore Ts'oc4e3d3f2003-08-01 09:41:07 -04001475extern errcode_t ext2fs_get_mem(unsigned long size, void *ptr);
JP Abgralle0ed7402014-03-19 19:08:39 -07001476extern errcode_t ext2fs_get_memzero(unsigned long size, void *ptr);
1477extern errcode_t ext2fs_get_array(unsigned long count,
1478 unsigned long size, void *ptr);
1479extern errcode_t ext2fs_get_arrayzero(unsigned long count,
1480 unsigned long size, void *ptr);
Theodore Ts'oc4e3d3f2003-08-01 09:41:07 -04001481extern errcode_t ext2fs_free_mem(void *ptr);
Theodore Ts'o76f875d1998-04-27 01:41:13 +00001482extern errcode_t ext2fs_resize_mem(unsigned long old_size,
Theodore Ts'oc4e3d3f2003-08-01 09:41:07 -04001483 unsigned long size, void *ptr);
Theodore Ts'o3839e651997-04-26 13:21:57 +00001484extern void ext2fs_mark_super_dirty(ext2_filsys fs);
1485extern void ext2fs_mark_changed(ext2_filsys fs);
1486extern int ext2fs_test_changed(ext2_filsys fs);
1487extern void ext2fs_mark_valid(ext2_filsys fs);
1488extern void ext2fs_unmark_valid(ext2_filsys fs);
1489extern int ext2fs_test_valid(ext2_filsys fs);
1490extern void ext2fs_mark_ib_dirty(ext2_filsys fs);
1491extern void ext2fs_mark_bb_dirty(ext2_filsys fs);
1492extern int ext2fs_test_ib_dirty(ext2_filsys fs);
1493extern int ext2fs_test_bb_dirty(ext2_filsys fs);
JP Abgralle0ed7402014-03-19 19:08:39 -07001494extern dgrp_t ext2fs_group_of_blk(ext2_filsys fs, blk_t blk);
1495extern dgrp_t ext2fs_group_of_ino(ext2_filsys fs, ext2_ino_t ino);
Eric Sandeenabf23432006-09-12 14:56:16 -04001496extern blk_t ext2fs_group_first_block(ext2_filsys fs, dgrp_t group);
1497extern blk_t ext2fs_group_last_block(ext2_filsys fs, dgrp_t group);
Theodore Ts'o0684a4f2002-08-17 10:19:44 -04001498extern blk_t ext2fs_inode_data_blocks(ext2_filsys fs,
1499 struct ext2_inode *inode);
Theodore Ts'o69022e02006-08-30 01:57:00 -04001500extern unsigned int ext2fs_div_ceil(unsigned int a, unsigned int b);
JP Abgralle0ed7402014-03-19 19:08:39 -07001501extern __u64 ext2fs_div64_ceil(__u64 a, __u64 b);
1502#endif
Theodore Ts'o3839e651997-04-26 13:21:57 +00001503
1504/*
1505 * The actual inlined functions definitions themselves...
1506 *
1507 * If NO_INLINE_FUNCS is defined, then we won't try to do inline
1508 * functions at all!
1509 */
1510#if (defined(INCLUDE_INLINE_FUNCS) || !defined(NO_INLINE_FUNCS))
1511#ifdef INCLUDE_INLINE_FUNCS
1512#define _INLINE_ extern
1513#else
JP Abgralle0ed7402014-03-19 19:08:39 -07001514#if (__STDC_VERSION__ >= 199901L)
1515#define _INLINE_ inline
1516#else
Theodore Ts'o76f875d1998-04-27 01:41:13 +00001517#ifdef __GNUC__
Theodore Ts'o3839e651997-04-26 13:21:57 +00001518#define _INLINE_ extern __inline__
Theodore Ts'o76f875d1998-04-27 01:41:13 +00001519#else /* For Watcom C */
1520#define _INLINE_ extern inline
JP Abgralle0ed7402014-03-19 19:08:39 -07001521#endif /* __GNUC__ */
1522#endif /* __STDC_VERSION__ >= 199901L */
Theodore Ts'o3839e651997-04-26 13:21:57 +00001523#endif
1524
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001525#ifndef EXT2_CUSTOM_MEMORY_ROUTINES
Matthias Andree68a7f952005-09-06 05:59:52 -04001526#include <string.h>
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001527/*
JP Abgralle0ed7402014-03-19 19:08:39 -07001528 * Allocate memory. The 'ptr' arg must point to a pointer.
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001529 */
Theodore Ts'oc4e3d3f2003-08-01 09:41:07 -04001530_INLINE_ errcode_t ext2fs_get_mem(unsigned long size, void *ptr)
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001531{
Theodore Ts'o2694f312006-11-14 00:34:34 -05001532 void *pp;
Theodore Ts'oc4e3d3f2003-08-01 09:41:07 -04001533
Theodore Ts'o2694f312006-11-14 00:34:34 -05001534 pp = malloc(size);
1535 if (!pp)
Theodore Ts'o291c9041997-10-31 06:17:08 +00001536 return EXT2_ET_NO_MEMORY;
Theodore Ts'o2694f312006-11-14 00:34:34 -05001537 memcpy(ptr, &pp, sizeof (pp));
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001538 return 0;
1539}
Theodore Ts'oe5aace92007-12-27 10:08:13 -05001540
JP Abgralle0ed7402014-03-19 19:08:39 -07001541_INLINE_ errcode_t ext2fs_get_memzero(unsigned long size, void *ptr)
Lukas Czernerffec46f2011-05-18 14:19:52 +02001542{
JP Abgralle0ed7402014-03-19 19:08:39 -07001543 void *pp;
Lukas Czernerffec46f2011-05-18 14:19:52 +02001544
JP Abgralle0ed7402014-03-19 19:08:39 -07001545 pp = malloc(size);
1546 if (!pp)
Lukas Czernerffec46f2011-05-18 14:19:52 +02001547 return EXT2_ET_NO_MEMORY;
JP Abgralle0ed7402014-03-19 19:08:39 -07001548 memset(pp, 0, size);
1549 memcpy(ptr, &pp, sizeof(pp));
Lukas Czernerffec46f2011-05-18 14:19:52 +02001550 return 0;
1551}
1552
Theodore Ts'oee010792007-11-09 19:01:06 -05001553_INLINE_ errcode_t ext2fs_get_array(unsigned long count, unsigned long size, void *ptr)
1554{
1555 if (count && (-1UL)/count<size)
JP Abgralle0ed7402014-03-19 19:08:39 -07001556 return EXT2_ET_NO_MEMORY;
Theodore Ts'oee010792007-11-09 19:01:06 -05001557 return ext2fs_get_mem(count*size, ptr);
1558}
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001559
JP Abgralle0ed7402014-03-19 19:08:39 -07001560_INLINE_ errcode_t ext2fs_get_arrayzero(unsigned long count,
1561 unsigned long size, void *ptr)
1562{
1563 void *pp;
1564
1565 if (count && (-1UL)/count<size)
1566 return EXT2_ET_NO_MEMORY;
1567 pp = calloc(count, size);
1568 if (!pp)
1569 return EXT2_ET_NO_MEMORY;
1570 memcpy(ptr, &pp, sizeof(pp));
1571 return 0;
1572}
1573
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001574/*
JP Abgralle0ed7402014-03-19 19:08:39 -07001575 * Free memory. The 'ptr' arg must point to a pointer.
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001576 */
Theodore Ts'oc4e3d3f2003-08-01 09:41:07 -04001577_INLINE_ errcode_t ext2fs_free_mem(void *ptr)
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001578{
Theodore Ts'o2694f312006-11-14 00:34:34 -05001579 void *p;
Theodore Ts'oc4e3d3f2003-08-01 09:41:07 -04001580
Theodore Ts'o2694f312006-11-14 00:34:34 -05001581 memcpy(&p, ptr, sizeof(p));
1582 free(p);
1583 p = 0;
1584 memcpy(ptr, &p, sizeof(p));
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001585 return 0;
1586}
Theodore Ts'oefc6f622008-08-27 23:07:54 -04001587
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001588/*
JP Abgralle0ed7402014-03-19 19:08:39 -07001589 * Resize memory. The 'ptr' arg must point to a pointer.
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001590 */
Theodore Ts'oe47fd842004-02-21 21:04:30 -05001591_INLINE_ errcode_t ext2fs_resize_mem(unsigned long EXT2FS_ATTR((unused)) old_size,
Theodore Ts'oc4e3d3f2003-08-01 09:41:07 -04001592 unsigned long size, void *ptr)
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001593{
1594 void *p;
1595
Stephen Tweedie39c191f2005-06-27 11:47:21 -04001596 /* Use "memcpy" for pointer assignments here to avoid problems
1597 * with C99 strict type aliasing rules. */
Theodore Ts'o2694f312006-11-14 00:34:34 -05001598 memcpy(&p, ptr, sizeof(p));
Stephen Tweedie39c191f2005-06-27 11:47:21 -04001599 p = realloc(p, size);
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001600 if (!p)
Theodore Ts'o291c9041997-10-31 06:17:08 +00001601 return EXT2_ET_NO_MEMORY;
Theodore Ts'o2694f312006-11-14 00:34:34 -05001602 memcpy(ptr, &p, sizeof(p));
Theodore Ts'o7b4e4531997-10-26 03:41:24 +00001603 return 0;
1604}
1605#endif /* Custom memory routines */
1606
Theodore Ts'o3839e651997-04-26 13:21:57 +00001607/*
1608 * Mark a filesystem superblock as dirty
1609 */
1610_INLINE_ void ext2fs_mark_super_dirty(ext2_filsys fs)
1611{
1612 fs->flags |= EXT2_FLAG_DIRTY | EXT2_FLAG_CHANGED;
1613}
1614
1615/*
1616 * Mark a filesystem as changed
1617 */
1618_INLINE_ void ext2fs_mark_changed(ext2_filsys fs)
1619{
1620 fs->flags |= EXT2_FLAG_CHANGED;
1621}
1622
1623/*
1624 * Check to see if a filesystem has changed
1625 */
1626_INLINE_ int ext2fs_test_changed(ext2_filsys fs)
1627{
1628 return (fs->flags & EXT2_FLAG_CHANGED);
1629}
1630
1631/*
1632 * Mark a filesystem as valid
1633 */
1634_INLINE_ void ext2fs_mark_valid(ext2_filsys fs)
1635{
1636 fs->flags |= EXT2_FLAG_VALID;
1637}
1638
1639/*
1640 * Mark a filesystem as NOT valid
1641 */
1642_INLINE_ void ext2fs_unmark_valid(ext2_filsys fs)
1643{
1644 fs->flags &= ~EXT2_FLAG_VALID;
1645}
1646
1647/*
1648 * Check to see if a filesystem is valid
1649 */
1650_INLINE_ int ext2fs_test_valid(ext2_filsys fs)
1651{
1652 return (fs->flags & EXT2_FLAG_VALID);
1653}
1654
1655/*
1656 * Mark the inode bitmap as dirty
1657 */
1658_INLINE_ void ext2fs_mark_ib_dirty(ext2_filsys fs)
1659{
1660 fs->flags |= EXT2_FLAG_IB_DIRTY | EXT2_FLAG_CHANGED;
1661}
1662
1663/*
1664 * Mark the block bitmap as dirty
1665 */
1666_INLINE_ void ext2fs_mark_bb_dirty(ext2_filsys fs)
1667{
1668 fs->flags |= EXT2_FLAG_BB_DIRTY | EXT2_FLAG_CHANGED;
1669}
1670
1671/*
1672 * Check to see if a filesystem's inode bitmap is dirty
1673 */
1674_INLINE_ int ext2fs_test_ib_dirty(ext2_filsys fs)
1675{
1676 return (fs->flags & EXT2_FLAG_IB_DIRTY);
1677}
1678
1679/*
1680 * Check to see if a filesystem's block bitmap is dirty
1681 */
1682_INLINE_ int ext2fs_test_bb_dirty(ext2_filsys fs)
1683{
1684 return (fs->flags & EXT2_FLAG_BB_DIRTY);
1685}
1686
1687/*
1688 * Return the group # of a block
1689 */
JP Abgralle0ed7402014-03-19 19:08:39 -07001690_INLINE_ dgrp_t ext2fs_group_of_blk(ext2_filsys fs, blk_t blk)
Theodore Ts'o3839e651997-04-26 13:21:57 +00001691{
JP Abgralle0ed7402014-03-19 19:08:39 -07001692 return ext2fs_group_of_blk2(fs, blk);
Theodore Ts'o3839e651997-04-26 13:21:57 +00001693}
Theodore Ts'o3839e651997-04-26 13:21:57 +00001694/*
1695 * Return the group # of an inode number
1696 */
JP Abgralle0ed7402014-03-19 19:08:39 -07001697_INLINE_ dgrp_t ext2fs_group_of_ino(ext2_filsys fs, ext2_ino_t ino)
Theodore Ts'o3839e651997-04-26 13:21:57 +00001698{
1699 return (ino - 1) / fs->super->s_inodes_per_group;
1700}
Theodore Ts'o0684a4f2002-08-17 10:19:44 -04001701
Eric Sandeenabf23432006-09-12 14:56:16 -04001702/*
1703 * Return the first block (inclusive) in a group
1704 */
1705_INLINE_ blk_t ext2fs_group_first_block(ext2_filsys fs, dgrp_t group)
1706{
JP Abgralle0ed7402014-03-19 19:08:39 -07001707 return (blk_t) ext2fs_group_first_block2(fs, group);
Eric Sandeenabf23432006-09-12 14:56:16 -04001708}
1709
1710/*
1711 * Return the last block (inclusive) in a group
1712 */
1713_INLINE_ blk_t ext2fs_group_last_block(ext2_filsys fs, dgrp_t group)
1714{
JP Abgralle0ed7402014-03-19 19:08:39 -07001715 return (blk_t) ext2fs_group_last_block2(fs, group);
Eric Sandeenabf23432006-09-12 14:56:16 -04001716}
1717
Theodore Ts'o0684a4f2002-08-17 10:19:44 -04001718_INLINE_ blk_t ext2fs_inode_data_blocks(ext2_filsys fs,
1719 struct ext2_inode *inode)
1720{
JP Abgralle0ed7402014-03-19 19:08:39 -07001721 return (blk_t) ext2fs_inode_data_blocks2(fs, inode);
Theodore Ts'o0684a4f2002-08-17 10:19:44 -04001722}
Theodore Ts'o69022e02006-08-30 01:57:00 -04001723
1724/*
1725 * This is an efficient, overflow safe way of calculating ceil((1.0 * a) / b)
1726 */
1727_INLINE_ unsigned int ext2fs_div_ceil(unsigned int a, unsigned int b)
1728{
1729 if (!a)
1730 return 0;
1731 return ((a - 1) / b) + 1;
1732}
JP Abgralle0ed7402014-03-19 19:08:39 -07001733
1734_INLINE_ __u64 ext2fs_div64_ceil(__u64 a, __u64 b)
1735{
1736 if (!a)
1737 return 0;
1738 return ((a - 1) / b) + 1;
1739}
1740
Theodore Ts'o3839e651997-04-26 13:21:57 +00001741#undef _INLINE_
1742#endif
1743
Theodore Ts'ofa7ef712000-05-19 02:11:41 +00001744#ifdef __cplusplus
1745}
1746#endif
1747
Theodore Ts'o9abd2ce1998-02-16 22:00:37 +00001748#endif /* _EXT2FS_EXT2FS_H */