1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243
|
/*
ext2.h -- ext2 header
Copyright (C) 1998-2000, 2007, 2009-2010 Free Software Foundation,
Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _EXT2_H
#define _EXT2_H
#include <parted/parted.h>
#include <parted/debug.h>
#include <sys/types.h>
#include "tune.h"
#include <inttypes.h>
#if ENABLE_NLS
# include <libintl.h>
# define _(String) dgettext (PACKAGE, String)
#else
# define _(String) (String)
#endif /* ENABLE_NLS */
/* Ehrm.... sorry, pedanticists! :-) */
#ifndef offsetof
# define offsetof(type, field) ((size_t)(&(((type *)0)->field)))
#endif
#ifdef __BEOS__
typedef off_t loff_t;
#endif
typedef u_int32_t blk_t;
#ifdef HAVE_LINUX_EXT2_FS_H
#define _LINUX_TYPES_H
#define i_version i_generation
#include <linux/ext2_fs.h>
#else
#include "ext2_fs.h"
#endif
extern unsigned char _bitmap[8];
struct ext2_buffer_cache
{
struct ext2_buffer_head *cache;
struct ext2_buffer_head *heads;
struct ext2_buffer_head **hash;
struct ext2_fs *fs;
int size;
int numalloc;
unsigned char *buffermem;
};
struct ext2_buffer_head
{
struct ext2_buffer_head *next;
struct ext2_buffer_head *prev;
unsigned char *data;
blk_t block;
int usecount;
int dirty;
struct ext2_buffer_cache *bc;
int alloc;
};
struct ext2_dev_ops
{
int (*close)(void *cookie);
blk_t (*get_size)(void *cookie);
int (*read)(void *cookie, void *ptr, blk_t block, blk_t num);
int (*set_blocksize)(void *cookie, int logsize);
int (*sync)(void *cookie);
int (*write)(void *cookie, void *ptr, blk_t block, blk_t num);
};
struct ext2_dev_handle
{
struct ext2_dev_ops *ops;
void *cookie;
};
struct ext2_fs
{
struct ext2_dev_handle *devhandle;
struct ext2_super_block sb;
struct ext2_group_desc *gd;
struct ext2_buffer_cache *bc;
int metadirty; /* 0:all sb&gd copies clean
1:all sb&gd copies dirty
2:only first sb&gd copy clean */
int dynamic_version;
int sparse; /* sparse superblocks */
int has_journal; /* journal */
int has_internal_journal;
int blocksize;
int logsize;
blk_t adminblocks;
blk_t gdblocks;
blk_t itoffset;
blk_t inodeblocks;
int numgroups;
int r_frac; /* reserved % of blocks */
unsigned char *relocator_pool;
unsigned char *relocator_pool_end;
int opt_debug;
int opt_safe;
int opt_verbose;
void *journal;
};
#define EXT2_ACTION_ADD 1
#define EXT2_ACTION_DELETE 2
#define EXT2_ACTION_FIND 3
#define EXT2_META_CLEAN 0
#define EXT2_META_PRIMARY_SB 1
#define EXT2_META_BACKUP_SB 2
#define EXT2_META_PRIMARY_GD 4
#define EXT2_META_BACKUP_GD 8
#define EXT2_META_PRIMARY (EXT2_META_PRIMARY_SB | EXT2_META_PRIMARY_GD)
#define EXT2_META_BACKUP (EXT2_META_BACKUP_SB | EXT2_META_BACKUP_GD)
#define EXT2_META_SB (EXT2_META_PRIMARY_SB | EXT2_META_BACKUP_SB)
#define EXT2_META_GD (EXT2_META_PRIMARY_GD | EXT2_META_BACKUP_GD)
/* generic stuff */
int ext2_copy_block (struct ext2_fs *fs, blk_t from, blk_t to);
void ext2_close (struct ext2_fs *fs);
int ext2_commit_metadata (struct ext2_fs *fs, int copies);
off_t ext2_get_inode_offset (struct ext2_fs *fs, ino_t inode, blk_t *block);
blk_t ext2_find_free_block (struct ext2_fs *fs);
ino_t ext2_find_free_inode (struct ext2_fs *fs);
int ext2_get_inode_state (struct ext2_fs *fs, ino_t inode);
int ext2_is_group_sparse (struct ext2_fs *fs, int group);
int ext2_move_blocks (struct ext2_fs *fs, blk_t src, blk_t num, blk_t dest);
struct ext2_fs *ext2_open (struct ext2_dev_handle *handle, int state);
int ext2_read_blocks (struct ext2_fs *fs, void *ptr, blk_t block, blk_t numblocks);
int ext2_read_inode (struct ext2_fs *fs, ino_t inode, struct ext2_inode *inodep);
int ext2_set_inode_state (struct ext2_fs *fs, ino_t inode, int state, int updatemetadata);
int ext2_do_inode (struct ext2_fs *fs, struct ext2_inode *inode, blk_t block, int action);
int ext2_sync (struct ext2_fs *fs);
int ext2_write_blocks (struct ext2_fs *fs, void *ptr, blk_t block, blk_t numblocks);
int ext2_write_inode (struct ext2_fs *fs, ino_t inode, const struct ext2_inode *inodep);
int ext2_zero_blocks (struct ext2_fs *fs, blk_t block, blk_t num);
int ext2_zero_inode (struct ext2_fs *fs, ino_t inode);
/* block related */
void ext2_bgbitmap_cache_deinit (struct ext2_fs *fs);
int ext2_bgbitmap_cache_flush (struct ext2_fs *fs);
int ext2_bgbitmap_cache_init (struct ext2_fs *fs);
int ext2_get_block_state (struct ext2_fs *, blk_t block);
int ext2_set_block_state (struct ext2_fs *, blk_t block, int state, int updatemetadata);
/* block relocator */
int ext2_block_relocate (struct ext2_fs *fs, blk_t newsize);
/* buffer */
void ext2_bcache_deinit (struct ext2_fs *fs);
void ext2_bcache_dump (struct ext2_fs *fs);
int ext2_bcache_flush (struct ext2_fs *fs, blk_t block);
int ext2_bcache_flush_range (struct ext2_fs *fs, blk_t first, blk_t last);
int ext2_bcache_init (struct ext2_fs *fs);
int ext2_bcache_sync (struct ext2_fs *fs);
struct ext2_buffer_head *ext2_bcreate (struct ext2_fs *fs, blk_t block);
struct ext2_buffer_head *ext2_bread (struct ext2_fs *fs, blk_t block);
int ext2_brelse (struct ext2_buffer_head *bh, int forget);
/* inode relocator */
int ext2_inode_relocate (struct ext2_fs *fs, int newgroups);
/* journalling */
void ext2_journal_deinit (struct ext2_fs *fs);
int ext2_journal_init (struct ext2_fs *fs);
/* metadata mover */
int ext2_metadata_push (struct ext2_fs *fs, blk_t newsize);
/* fs creation */
struct ext2_fs *ext2_mkfs (struct ext2_dev_handle *handle, blk_t numblocks, int log_block_size, blk_t blocks_per_group, int inodes_per_group, int sparse_sb, int reserved_block_percentage, PedTimer* timer);
/* resize */
int ext2_resize_fs (struct ext2_fs *fs, blk_t newsize, PedTimer* timer);
/* unix I/O */
struct ext2_dev_handle *ext2_make_dev_handle_from_file(char *dev);
static __inline__ int ext2_is_data_block(struct ext2_fs *fs, blk_t block)
{
blk_t blk;
int group;
PED_ASSERT (block >= EXT2_SUPER_FIRST_DATA_BLOCK(fs->sb), return 0);
PED_ASSERT (block < EXT2_SUPER_BLOCKS_COUNT(fs->sb), return 0);
blk = block - EXT2_SUPER_FIRST_DATA_BLOCK(fs->sb);
group = blk / EXT2_SUPER_BLOCKS_PER_GROUP(fs->sb);
blk %= EXT2_SUPER_BLOCKS_PER_GROUP(fs->sb);
if (ext2_is_group_sparse(fs, group) && blk <= fs->gdblocks)
return 0;
if (block == EXT2_GROUP_BLOCK_BITMAP(fs->gd[group]) ||
block == EXT2_GROUP_INODE_BITMAP(fs->gd[group]))
return 0;
if (block >= EXT2_GROUP_INODE_TABLE(fs->gd[group]) &&
block < EXT2_GROUP_INODE_TABLE(fs->gd[group]) + fs->inodeblocks)
return 0;
return 1;
}
#endif
|