blob: fa488d3757ce0d5eb7ae825f5fb27cbb210ee817 [file] [log] [blame]
Theodore Ts'o24b2c7a1997-06-07 20:42:58 +00001/*
2 * resize2fs.h --- ext2 resizer header file
3 *
Theodore Ts'o0cee8a52000-04-06 21:38:34 +00004 * Copyright (C) 1997, 1998 by Theodore Ts'o and
5 * PowerQuest, Inc.
6 *
7 * Copyright (C) 1999, 2000 by Theosore Ts'o
Theodore Ts'o24b2c7a1997-06-07 20:42:58 +00008 *
9 * %Begin-Header%
Theodore Ts'o0cee8a52000-04-06 21:38:34 +000010 * This file may be redistributed under the terms of the GNU Public
11 * License.
Theodore Ts'o24b2c7a1997-06-07 20:42:58 +000012 * %End-Header%
13 */
14
15#include <stdio.h>
16#include <string.h>
Theodore Ts'o169cb541998-08-01 04:33:31 +000017#ifdef HAVE_UNISTD_H
Theodore Ts'o24b2c7a1997-06-07 20:42:58 +000018#include <unistd.h>
Theodore Ts'o169cb541998-08-01 04:33:31 +000019#endif
Theodore Ts'o24b2c7a1997-06-07 20:42:58 +000020#include <stdlib.h>
Theodore Ts'od40259f1997-10-20 00:44:26 +000021#ifdef HAVE_SYS_TYPES_H
Theodore Ts'o24b2c7a1997-06-07 20:42:58 +000022#include <sys/types.h>
Theodore Ts'od40259f1997-10-20 00:44:26 +000023#endif
24#ifdef HAVE_SYS_TIME_H
Theodore Ts'o24b2c7a1997-06-07 20:42:58 +000025#include <sys/time.h>
Theodore Ts'od40259f1997-10-20 00:44:26 +000026#endif
Theodore Ts'obc75f2a1997-09-04 00:43:10 +000027#if HAVE_ERRNO_H
28#include <errno.h>
29#endif
Theodore Ts'o24b2c7a1997-06-07 20:42:58 +000030
Theodore Ts'oca8abba1998-01-19 14:55:24 +000031#if EXT2_FLAT_INCLUDES
32#include "ext2_fs.h"
33#include "ext2fs.h"
34#else
35#include <linux/ext2_fs.h>
Theodore Ts'o24b2c7a1997-06-07 20:42:58 +000036#include "ext2fs/ext2fs.h"
Theodore Ts'oca8abba1998-01-19 14:55:24 +000037#endif
38
Theodore Ts'o24b2c7a1997-06-07 20:42:58 +000039
Theodore Ts'o24b2c7a1997-06-07 20:42:58 +000040/*
Theodore Ts'oc762c8e1997-06-17 03:52:12 +000041 * For the extent map
42 */
43typedef struct _ext2_extent *ext2_extent;
44
45/*
46 * For the simple progress meter
47 */
48typedef struct ext2_sim_progress *ext2_sim_progmeter;
49
50/*
Theodore Ts'o05e112a1997-06-14 07:28:44 +000051 * Flags for the resizer; most are debugging flags only
52 */
53#define RESIZE_DEBUG_IO 0x0001
54#define RESIZE_DEBUG_BMOVE 0x0002
55#define RESIZE_DEBUG_INODEMAP 0x0004
56#define RESIZE_DEBUG_ITABLEMOVE 0x0008
57
58#define RESIZE_PERCENT_COMPLETE 0x0100
Theodore Ts'oc762c8e1997-06-17 03:52:12 +000059#define RESIZE_VERBOSE 0x0200
Theodore Ts'o05e112a1997-06-14 07:28:44 +000060
61/*
Theodore Ts'o24b2c7a1997-06-07 20:42:58 +000062 * The core state structure for the ext2 resizer
63 */
Theodore Ts'o63b44fb1998-02-13 22:58:18 +000064typedef struct ext2_resize_struct *ext2_resize_t;
Theodore Ts'o24b2c7a1997-06-07 20:42:58 +000065
66struct ext2_resize_struct {
67 ext2_filsys old_fs;
68 ext2_filsys new_fs;
Theodore Ts'o1e1da291997-06-09 14:51:29 +000069 ext2fs_block_bitmap reserve_blocks;
Theodore Ts'oc762c8e1997-06-17 03:52:12 +000070 ext2fs_block_bitmap move_blocks;
Theodore Ts'oa8519a21998-02-16 22:16:20 +000071 ext2_extent bmap;
72 ext2_extent imap;
Theodore Ts'o1e1da291997-06-09 14:51:29 +000073 int needed_blocks;
Theodore Ts'o05e112a1997-06-14 07:28:44 +000074 int flags;
75 char *itable_buf;
Theodore Ts'oa8519a21998-02-16 22:16:20 +000076
77 /*
78 * For the block allocator
79 */
80 blk_t new_blk;
81 int alloc_state;
82
83 /*
84 * For the progress meter
85 */
Theodore Ts'o3b627e81998-02-24 20:24:49 +000086 errcode_t (*progress)(ext2_resize_t rfs, int pass,
Theodore Ts'o63b44fb1998-02-13 22:58:18 +000087 unsigned long cur,
88 unsigned long max);
89 void *prog_data;
Theodore Ts'o24b2c7a1997-06-07 20:42:58 +000090};
91
Theodore Ts'o63b44fb1998-02-13 22:58:18 +000092/*
93 * Progress pass numbers...
94 */
Theodore Ts'oa8519a21998-02-16 22:16:20 +000095#define E2_RSZ_EXTEND_ITABLE_PASS 1
Theodore Ts'o63b44fb1998-02-13 22:58:18 +000096#define E2_RSZ_BLOCK_RELOC_PASS 2
Theodore Ts'oa8519a21998-02-16 22:16:20 +000097#define E2_RSZ_INODE_SCAN_PASS 3
98#define E2_RSZ_INODE_REF_UPD_PASS 4
99#define E2_RSZ_MOVE_ITABLE_PASS 5
Theodore Ts'o63b44fb1998-02-13 22:58:18 +0000100
Theodore Ts'o24b2c7a1997-06-07 20:42:58 +0000101
102/* prototypes */
Theodore Ts'o63b44fb1998-02-13 22:58:18 +0000103extern errcode_t resize_fs(ext2_filsys fs, blk_t new_size, int flags,
Theodore Ts'o3b627e81998-02-24 20:24:49 +0000104 errcode_t (*progress)(ext2_resize_t rfs,
105 int pass, unsigned long cur,
Theodore Ts'o63b44fb1998-02-13 22:58:18 +0000106 unsigned long max));
107
Theodore Ts'oc762c8e1997-06-17 03:52:12 +0000108/* extent.c */
109extern errcode_t ext2fs_create_extent_table(ext2_extent *ret_extent,
110 int size);
111extern void ext2fs_free_extent_table(ext2_extent extent);
112extern errcode_t ext2fs_add_extent_entry(ext2_extent extent,
Theodore Ts'oca8abba1998-01-19 14:55:24 +0000113 __u32 old_loc, __u32 new_loc);
114extern __u32 ext2fs_extent_translate(ext2_extent extent, __u32 old_loc);
Theodore Ts'oc762c8e1997-06-17 03:52:12 +0000115extern void ext2fs_extent_dump(ext2_extent extent, FILE *out);
Theodore Ts'oca8abba1998-01-19 14:55:24 +0000116extern errcode_t ext2fs_iterate_extent(ext2_extent extent, __u32 *old_loc,
117 __u32 *new_loc, int *size);
Theodore Ts'oc762c8e1997-06-17 03:52:12 +0000118
119/* sim_progress.c */
120extern errcode_t ext2fs_progress_init(ext2_sim_progmeter *ret_prog,
121 const char *label,
122 int labelwidth, int barwidth,
123 __u32 maxdone, int flags);
124extern void ext2fs_progress_update(ext2_sim_progmeter prog,
125 __u32 current);
126extern void ext2fs_progress_close(ext2_sim_progmeter prog);
127
128