124b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o/*
224b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o * resize2fs.h --- ext2 resizer header file
324b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o *
40cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * Copyright (C) 1997, 1998 by Theodore Ts'o and
50cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * 	PowerQuest, Inc.
60cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o *
70cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * Copyright (C) 1999, 2000 by Theosore Ts'o
8efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o *
924b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o * %Begin-Header%
100cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * This file may be redistributed under the terms of the GNU Public
110cee8a5c423c2a1054c7366e74870592ec8db95eTheodore Ts'o * License.
1224b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o * %End-Header%
1324b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o */
1424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o
1524b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o#include <stdio.h>
1624b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o#include <string.h>
17169cb54646e2d6f9f6e554bba80dd4d262a3744eTheodore Ts'o#ifdef HAVE_UNISTD_H
1824b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o#include <unistd.h>
19169cb54646e2d6f9f6e554bba80dd4d262a3744eTheodore Ts'o#endif
2024b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o#include <stdlib.h>
21d40259fd552d942903f2fd0b426c75a5c2516017Theodore Ts'o#ifdef HAVE_SYS_TYPES_H
2224b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o#include <sys/types.h>
23d40259fd552d942903f2fd0b426c75a5c2516017Theodore Ts'o#endif
24d40259fd552d942903f2fd0b426c75a5c2516017Theodore Ts'o#ifdef HAVE_SYS_TIME_H
2524b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o#include <sys/time.h>
26d40259fd552d942903f2fd0b426c75a5c2516017Theodore Ts'o#endif
27bc75f2a1eb805538b2313185526a549d126c275dTheodore Ts'o#if HAVE_ERRNO_H
28bc75f2a1eb805538b2313185526a549d126c275dTheodore Ts'o#include <errno.h>
29bc75f2a1eb805538b2313185526a549d126c275dTheodore Ts'o#endif
3024b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o
31ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o#if EXT2_FLAT_INCLUDES
32ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o#include "ext2_fs.h"
33ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o#include "ext2fs.h"
34de8f3a76218255e443ba57dec5d74850180fa75dAndreas Dilger#include "e2p.h"
35ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o#else
3654c637d4d29af3e6365779f8b12976abe95a4753Theodore Ts'o#include "ext2fs/ext2_fs.h"
3724b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o#include "ext2fs/ext2fs.h"
38de8f3a76218255e443ba57dec5d74850180fa75dAndreas Dilger#include "e2p/e2p.h"
39ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o#endif
40ca8abba7e0970fd1702db53e3f89ceb68c70768cTheodore Ts'o
41a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o#ifdef ENABLE_NLS
42a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o#include <libintl.h>
43a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o#include <locale.h>
44a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o#define _(a) (gettext (a))
45a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o#ifdef gettext_noop
46a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o#define N_(a) gettext_noop (a)
47a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o#else
48a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o#define N_(a) (a)
49a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o#endif
50a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#ifndef NLS_CAT_NAME
51a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o#define NLS_CAT_NAME "e2fsprogs"
52a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif
53a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#ifndef LOCALEDIR
54a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o#define LOCALEDIR "/usr/share/locale"
55a04eba3f8868af1d9b7b504d3d430c55ed3dc777Theodore Ts'o#endif
56a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o#else
57a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o#define _(a) (a)
58a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o#define N_(a) a
59a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o#endif
60a13575f4d29a908add19ea27baa102bc6944ee30Theodore Ts'o
6124b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o
6224b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o/*
63c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o * For the extent map
64c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o */
65c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'otypedef struct _ext2_extent *ext2_extent;
66c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o
67c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o/*
68c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o * For the simple progress meter
69c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o */
70c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'otypedef struct ext2_sim_progress *ext2_sim_progmeter;
71c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o
72c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o/*
7305e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o * Flags for the resizer; most are debugging flags only
7405e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o */
7505e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o#define RESIZE_DEBUG_IO			0x0001
7605e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o#define RESIZE_DEBUG_BMOVE		0x0002
7705e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o#define RESIZE_DEBUG_INODEMAP		0x0004
7805e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o#define RESIZE_DEBUG_ITABLEMOVE		0x0008
79e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#define RESIZE_DEBUG_RTRACK		0x0010
80e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall#define RESIZE_DEBUG_MIN_CALC		0x0020
8105e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o
8205e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o#define RESIZE_PERCENT_COMPLETE		0x0100
83c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o#define RESIZE_VERBOSE			0x0200
8405e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o
8505e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o/*
86e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * This structure is used for keeping track of how much resources have
87e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall * been used for a particular resize2fs pass.
88e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall */
89e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallstruct resource_track {
90e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	const char *desc;
91e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	struct timeval time_start;
92e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	struct timeval user_start;
93e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	struct timeval system_start;
94e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	void	*brk_start;
95e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	unsigned long long bytes_read;
96e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	unsigned long long bytes_written;
97e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall};
98e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
99e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/*
10024b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o * The core state structure for the ext2 resizer
10124b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o */
10263b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'otypedef struct ext2_resize_struct *ext2_resize_t;
10324b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o
10424b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'ostruct ext2_resize_struct {
10524b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o	ext2_filsys	old_fs;
10624b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o	ext2_filsys	new_fs;
1071e1da29fbd4204a267ebd7c64d37e1f95a9dad08Theodore Ts'o	ext2fs_block_bitmap reserve_blocks;
108c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o	ext2fs_block_bitmap move_blocks;
109a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o	ext2_extent	bmap;
110a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o	ext2_extent	imap;
111e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	blk64_t		needed_blocks;
11205e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o	int		flags;
11305e112a11b6508c2b12d5d4ee0c322171db9b538Theodore Ts'o	char		*itable_buf;
114a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
115a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o	/*
116a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o	 * For the block allocator
117a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o	 */
118e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall	blk64_t		new_blk;
119a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o	int		alloc_state;
120a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o
121a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o	/*
122a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o	 * For the progress meter
123a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o	 */
1243b627e8d6735fd81906117d580ee70292b2cfaafTheodore Ts'o	errcode_t	(*progress)(ext2_resize_t rfs, int pass,
12563b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o				    unsigned long cur,
12663b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o				    unsigned long max);
12763b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o	void		*prog_data;
12824b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o};
12924b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o
13063b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o/*
13163b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o * Progress pass numbers...
13263b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o */
133a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#define E2_RSZ_EXTEND_ITABLE_PASS	1
13463b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o#define E2_RSZ_BLOCK_RELOC_PASS		2
135a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#define E2_RSZ_INODE_SCAN_PASS		3
136a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#define E2_RSZ_INODE_REF_UPD_PASS	4
137a8519a2dbec429846d89fee581a2ecb829904cd2Theodore Ts'o#define E2_RSZ_MOVE_ITABLE_PASS		5
13863b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o
13924b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o
14024b2c7a7a14cec8480a75af7d535cf267e6abe1fTheodore Ts'o/* prototypes */
141e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallextern errcode_t resize_fs(ext2_filsys fs, blk64_t *new_size, int flags,
1423b627e8d6735fd81906117d580ee70292b2cfaafTheodore Ts'o			   errcode_t	(*progress)(ext2_resize_t rfs,
1433b627e8d6735fd81906117d580ee70292b2cfaafTheodore Ts'o					    int pass, unsigned long cur,
14463b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o					    unsigned long max));
14563b44fbe303ea00118cbe24cbbcde351a9bc0aacTheodore Ts'o
146efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'oextern errcode_t adjust_fs_info(ext2_filsys fs, ext2_filsys old_fs,
147c09043f1abb99c73d681e630ee0a4b142e4abf6bTheodore Ts'o				ext2fs_block_bitmap reserve_blocks,
148e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall				blk64_t new_size);
149e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallextern blk64_t calculate_minimum_resize_size(ext2_filsys fs, int flags);
150bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o
151bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o
152c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o/* extent.c */
153c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'oextern errcode_t ext2fs_create_extent_table(ext2_extent *ret_extent,
154e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall					    __u64 size);
155c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'oextern void ext2fs_free_extent_table(ext2_extent extent);
156c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'oextern errcode_t ext2fs_add_extent_entry(ext2_extent extent,
157e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall					 __u64 old_loc, __u64 new_loc);
158e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallextern __u64 ext2fs_extent_translate(ext2_extent extent, __u64 old_loc);
159c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'oextern void ext2fs_extent_dump(ext2_extent extent, FILE *out);
160e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallextern errcode_t ext2fs_iterate_extent(ext2_extent extent, __u64 *old_loc,
161e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall				       __u64 *new_loc, __u64 *size);
162e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
163e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* main.c */
164e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallextern char *program_name;
165f404167dda29a59d2be2882328aeb074b9899669Theodore Ts'o
166bf69235ad0073c80386b70caba0e1b58e5f85697Theodore Ts'o/* online.c */
167efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'oextern errcode_t online_resize_fs(ext2_filsys fs, const char *mtpt,
168e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall				  blk64_t *new_size, int flags);
169e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall
170e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall/* resource_track.c */
171e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallextern void init_resource_track(struct resource_track *track, const char *desc,
172e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall				io_channel channel);
173e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrallextern void print_resource_track(ext2_resize_t rfs,
174e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall				 struct resource_track *track,
175e0ed7404719a9ddd2ba427a80db5365c8bad18c0JP Abgrall				 io_channel channel);
1761eb31c4885156b595e6ceb4516cb1e1fb2d251fdTheodore Ts'o
177c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o/* sim_progress.c */
178c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'oextern errcode_t ext2fs_progress_init(ext2_sim_progmeter *ret_prog,
179c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o				      const char *label,
180c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o				      int labelwidth, int barwidth,
181c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o				      __u32 maxdone, int flags);
182c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'oextern void ext2fs_progress_update(ext2_sim_progmeter prog,
183c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o					__u32 current);
184c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'oextern void ext2fs_progress_close(ext2_sim_progmeter prog);
185c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o
186c762c8e63216a301c9de7d24c6136d8370378a08Theodore Ts'o
187