libext2fs: More random 64-bit fixes, lots of block_iterate3

Signed-off-by: Valerie Aurora Henson <vaurora@redhat.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
bitmap-optimize
Valerie Aurora Henson 2010-06-13 11:00:00 -04:00 committed by Theodore Ts'o
parent ab13b5a979
commit 6d8b37fa76
13 changed files with 50 additions and 44 deletions

View File

@ -36,14 +36,14 @@ struct process_block_struct {
int flags;
};
static int process_block(ext2_filsys fs, blk_t *block_nr,
e2_blkcnt_t blockcnt, blk_t ref_block,
static int process_block(ext2_filsys fs, blk64_t *block_nr,
e2_blkcnt_t blockcnt, blk64_t ref_block,
int ref_offset, void *priv_data)
{
struct process_block_struct *pb;
errcode_t retval;
int ret;
blk_t block, orig;
blk64_t block, orig;
pb = (struct process_block_struct *) priv_data;
block = orig = *block_nr;
@ -77,12 +77,14 @@ static int process_block(ext2_filsys fs, blk_t *block_nr,
ext2fs_mark_block_bitmap2(pb->alloc_map, block);
ret = BLOCK_CHANGED;
if (pb->flags & EXT2_BMOVE_DEBUG)
printf("ino=%ld, blockcnt=%lld, %u->%u\n", pb->ino,
blockcnt, orig, block);
printf("ino=%u, blockcnt=%lld, %llu->%llu\n",
(unsigned) pb->ino, blockcnt,
(unsigned long long) orig,
(unsigned long long) block);
}
if (pb->add_dir) {
retval = ext2fs_add_dir_block(fs->dblist, pb->ino,
block, (int) blockcnt);
retval = ext2fs_add_dir_block2(fs->dblist, pb->ino,
block, blockcnt);
if (retval) {
pb->error = retval;
ret |= BLOCK_ABORT;
@ -147,8 +149,8 @@ errcode_t ext2fs_move_blocks(ext2_filsys fs,
pb.add_dir = (LINUX_S_ISDIR(inode.i_mode) &&
flags & EXT2_BMOVE_GET_DBLIST);
retval = ext2fs_block_iterate2(fs, ino, 0, block_buf,
process_block, &pb);
retval = ext2fs_block_iterate3(fs, ino, 0, block_buf,
process_block, &pb);
if (retval)
return retval;
if (pb.error)

View File

@ -34,8 +34,8 @@ errcode_t ext2fs_check_desc(ext2_filsys fs)
ext2fs_block_bitmap bmap;
errcode_t retval;
dgrp_t i;
blk_t first_block = fs->super->s_first_data_block;
blk_t last_block = ext2fs_blocks_count(fs->super)-1;
blk64_t first_block = fs->super->s_first_data_block;
blk64_t last_block = ext2fs_blocks_count(fs->super)-1;
blk64_t blk, b;
int j;

View File

@ -25,15 +25,15 @@ struct expand_dir_struct {
};
static int expand_dir_proc(ext2_filsys fs,
blk_t *blocknr,
blk64_t *blocknr,
e2_blkcnt_t blockcnt,
blk_t ref_block EXT2FS_ATTR((unused)),
blk64_t ref_block EXT2FS_ATTR((unused)),
int ref_offset EXT2FS_ATTR((unused)),
void *priv_data)
{
struct expand_dir_struct *es = (struct expand_dir_struct *) priv_data;
blk_t new_blk;
static blk_t last_blk = 0;
blk64_t new_blk;
static blk64_t last_blk = 0;
char *block;
errcode_t retval;
@ -41,7 +41,7 @@ static int expand_dir_proc(ext2_filsys fs,
last_blk = *blocknr;
return 0;
}
retval = ext2fs_new_block(fs, last_blk, 0, &new_blk);
retval = ext2fs_new_block2(fs, last_blk, 0, &new_blk);
if (retval) {
es->err = retval;
return BLOCK_ABORT;
@ -100,7 +100,7 @@ errcode_t ext2fs_expand_dir(ext2_filsys fs, ext2_ino_t dir)
es.err = 0;
es.newblocks = 0;
retval = ext2fs_block_iterate2(fs, dir, BLOCK_FLAG_APPEND,
retval = ext2fs_block_iterate3(fs, dir, BLOCK_FLAG_APPEND,
0, expand_dir_proc, &es);
if (es.err)

View File

@ -210,6 +210,7 @@ struct struct_ext2_filsys {
int inode_blocks_per_group;
ext2fs_inode_bitmap inode_map;
ext2fs_block_bitmap block_map;
/* XXX FIXME-64: not 64-bit safe, but not used? */
errcode_t (*get_blocks)(ext2_filsys fs, ext2_ino_t ino, blk_t *blocks);
errcode_t (*check_directory)(ext2_filsys fs, ext2_ino_t ino);
errcode_t (*write_bitmaps)(ext2_filsys fs);

View File

@ -285,7 +285,7 @@ errcode_t ext2fs_extent_get(ext2_extent_handle_t handle,
struct ext3_extent_idx *ix = 0;
struct ext3_extent *ex;
errcode_t retval;
blk_t blk;
blk64_t blk;
blk64_t end_blk;
int orig_op, op;
@ -819,7 +819,7 @@ errcode_t ext2fs_extent_replace(ext2_extent_handle_t handle,
static errcode_t extent_node_split(ext2_extent_handle_t handle)
{
errcode_t retval = 0;
blk_t new_node_pblk;
blk64_t new_node_pblk;
blk64_t new_node_start;
blk64_t orig_lblk;
blk64_t goal_blk = 0;
@ -934,7 +934,7 @@ static errcode_t extent_node_split(ext2_extent_handle_t handle)
goal_blk = (group * handle->fs->super->s_blocks_per_group) +
handle->fs->super->s_first_data_block;
}
retval = ext2fs_alloc_block(handle->fs, (blk_t) goal_blk, block_buf,
retval = ext2fs_alloc_block2(handle->fs, goal_blk, block_buf,
&new_node_pblk);
if (retval)
goto done;

View File

@ -62,7 +62,7 @@ errcode_t ext2fs_image_inode_write(ext2_filsys fs, int fd, int flags)
{
unsigned int group, left, c, d;
char *buf, *cp;
blk_t blk;
blk64_t blk;
ssize_t actual;
errcode_t retval;
@ -136,7 +136,7 @@ errcode_t ext2fs_image_inode_read(ext2_filsys fs, int fd,
{
unsigned int group, c, left;
char *buf;
blk_t blk;
blk64_t blk;
ssize_t actual;
errcode_t retval;

View File

@ -37,7 +37,7 @@ errcode_t ext2fs_mkdir(ext2_filsys fs, ext2_ino_t parent, ext2_ino_t inum,
struct ext2_inode parent_inode, inode;
ext2_ino_t ino = inum;
ext2_ino_t scratch_ino;
blk_t blk;
blk64_t blk;
char *block = 0;
EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);
@ -55,7 +55,7 @@ errcode_t ext2fs_mkdir(ext2_filsys fs, ext2_ino_t parent, ext2_ino_t inum,
/*
* Allocate a data block for the directory
*/
retval = ext2fs_new_block(fs, 0, 0, &blk);
retval = ext2fs_new_block2(fs, 0, 0, &blk);
if (retval)
goto cleanup;
@ -83,6 +83,7 @@ errcode_t ext2fs_mkdir(ext2_filsys fs, ext2_ino_t parent, ext2_ino_t inum,
inode.i_mode = LINUX_S_IFDIR | (0777 & ~fs->umask);
inode.i_uid = inode.i_gid = 0;
ext2fs_iblk_set(fs, &inode, 1);
/* FIXME-64 */
inode.i_block[0] = blk;
inode.i_links_count = 2;
inode.i_size = fs->blocksize;

View File

@ -210,29 +210,29 @@ errcode_t ext2fs_zero_blocks(ext2_filsys fs, blk_t blk, int num,
struct mkjournal_struct {
int num_blocks;
int newblocks;
blk_t goal;
blk_t blk_to_zero;
blk64_t goal;
blk64_t blk_to_zero;
int zero_count;
char *buf;
errcode_t err;
};
static int mkjournal_proc(ext2_filsys fs,
blk_t *blocknr,
e2_blkcnt_t blockcnt,
blk_t ref_block EXT2FS_ATTR((unused)),
int ref_offset EXT2FS_ATTR((unused)),
void *priv_data)
blk64_t *blocknr,
e2_blkcnt_t blockcnt,
blk64_t ref_block EXT2FS_ATTR((unused)),
int ref_offset EXT2FS_ATTR((unused)),
void *priv_data)
{
struct mkjournal_struct *es = (struct mkjournal_struct *) priv_data;
blk_t new_blk;
blk64_t new_blk;
errcode_t retval;
if (*blocknr) {
es->goal = *blocknr;
return 0;
}
retval = ext2fs_new_block(fs, es->goal, 0, &new_blk);
retval = ext2fs_new_block2(fs, es->goal, 0, &new_blk);
if (retval) {
es->err = retval;
return BLOCK_ABORT;
@ -250,10 +250,10 @@ static int mkjournal_proc(ext2_filsys fs,
(es->zero_count < 1024))
es->zero_count++;
else {
retval = ext2fs_zero_blocks(fs,
es->blk_to_zero,
es->zero_count,
0, 0);
retval = ext2fs_zero_blocks2(fs,
es->blk_to_zero,
es->zero_count,
0, 0);
es->zero_count = 0;
}
}
@ -284,7 +284,7 @@ static int mkjournal_proc(ext2_filsys fs,
* This function creates a journal using direct I/O routines.
*/
static errcode_t write_journal_inode(ext2_filsys fs, ext2_ino_t journal_ino,
blk_t size, int flags)
blk64_t size, int flags)
{
char *buf;
dgrp_t group, start, end, i, log_flex;
@ -344,14 +344,14 @@ static errcode_t write_journal_inode(ext2_filsys fs, ext2_ino_t journal_ino,
es.goal = (fs->super->s_blocks_per_group * group) +
fs->super->s_first_data_block;
retval = ext2fs_block_iterate2(fs, journal_ino, BLOCK_FLAG_APPEND,
retval = ext2fs_block_iterate3(fs, journal_ino, BLOCK_FLAG_APPEND,
0, mkjournal_proc, &es);
if (es.err) {
retval = es.err;
goto errout;
}
if (es.zero_count) {
retval = ext2fs_zero_blocks(fs, es.blk_to_zero,
retval = ext2fs_zero_blocks2(fs, es.blk_to_zero,
es.zero_count, 0, 0);
if (retval)
goto errout;

View File

@ -47,6 +47,7 @@ static errcode_t follow_link(ext2_filsys fs, ext2_ino_t root, ext2_ino_t dir,
if (link_count++ > 5) {
return EXT2_ET_SYMLINK_LOOP;
}
/* FIXME-64: Actually, this is FIXME EXTENTS */
if (ext2fs_inode_data_blocks(fs,&ei)) {
retval = ext2fs_get_mem(fs->blocksize, &buffer);
if (retval)

View File

@ -93,7 +93,7 @@ errcode_t ext2fs_open2(const char *name, const char *io_options,
unsigned long i, first_meta_bg;
__u32 features;
int groups_per_block, blocks_per_group, io_flags;
blk_t group_block, blk;
blk64_t group_block, blk;
char *dest, *cp;
#ifdef WORDS_BIGENDIAN
struct ext2_group_desc *gdp;
@ -327,7 +327,7 @@ errcode_t ext2fs_open2(const char *name, const char *io_options,
dest += fs->blocksize*first_meta_bg;
}
for (i=first_meta_bg ; i < fs->desc_blocks; i++) {
blk = ext2fs_descriptor_block_loc(fs, group_block, i);
blk = ext2fs_descriptor_block_loc2(fs, group_block, i);
retval = io_channel_read_blk64(fs->io, blk, 1, dest);
if (retval)
goto cleanup;

View File

@ -49,7 +49,7 @@ static int mark_bad_block(ext2_filsys fs, blk_t *block_nr,
return 0;
if ((*block_nr < fs->super->s_first_data_block) ||
(*block_nr >= fs->super->s_blocks_count))
(*block_nr >= ext2fs_blocks_count(fs->super)))
return 0; /* Ignore illegal blocks */
rb->err = ext2fs_badblocks_list_add(rb->bb_list, *block_nr);

View File

@ -59,7 +59,7 @@ errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f,
continue;
if (fs &&
((blockno < fs->super->s_first_data_block) ||
(blockno >= fs->super->s_blocks_count))) {
(blockno >= ext2fs_blocks_count(fs->super)))) {
if (invalid)
(invalid)(fs, blockno, buf, priv_data);
continue;

View File

@ -65,6 +65,7 @@ errcode_t ext2fs_create_resize_inode(ext2_filsys fs)
struct ext2_inode inode;
__u32 *dindir_buf, *gdt_buf;
unsigned long long apb, inode_size;
/* FIXME-64 - can't deal with extents */
blk_t dindir_blk, rsv_off, gdt_off, gdt_blk;
int dindir_dirty = 0, inode_dirty = 0;