From 6d8b37fa7661484ca50a4951cffbf531ab1bccbb Mon Sep 17 00:00:00 2001 From: Valerie Aurora Henson Date: Sun, 13 Jun 2010 11:00:00 -0400 Subject: [PATCH] libext2fs: More random 64-bit fixes, lots of block_iterate3 Signed-off-by: Valerie Aurora Henson Signed-off-by: "Theodore Ts'o" --- lib/ext2fs/bmove.c | 20 +++++++++++--------- lib/ext2fs/check_desc.c | 4 ++-- lib/ext2fs/expanddir.c | 12 ++++++------ lib/ext2fs/ext2fs.h | 1 + lib/ext2fs/extent.c | 6 +++--- lib/ext2fs/imager.c | 4 ++-- lib/ext2fs/mkdir.c | 5 +++-- lib/ext2fs/mkjournal.c | 32 ++++++++++++++++---------------- lib/ext2fs/namei.c | 1 + lib/ext2fs/openfs.c | 4 ++-- lib/ext2fs/read_bb.c | 2 +- lib/ext2fs/read_bb_file.c | 2 +- lib/ext2fs/res_gdt.c | 1 + 13 files changed, 50 insertions(+), 44 deletions(-) diff --git a/lib/ext2fs/bmove.c b/lib/ext2fs/bmove.c index f85baca0..deabf38c 100644 --- a/lib/ext2fs/bmove.c +++ b/lib/ext2fs/bmove.c @@ -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) diff --git a/lib/ext2fs/check_desc.c b/lib/ext2fs/check_desc.c index f42b6fe7..7929cd95 100644 --- a/lib/ext2fs/check_desc.c +++ b/lib/ext2fs/check_desc.c @@ -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; diff --git a/lib/ext2fs/expanddir.c b/lib/ext2fs/expanddir.c index d41d95ef..7673a3bd 100644 --- a/lib/ext2fs/expanddir.c +++ b/lib/ext2fs/expanddir.c @@ -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) diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h index d1c2110a..38693b73 100644 --- a/lib/ext2fs/ext2fs.h +++ b/lib/ext2fs/ext2fs.h @@ -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); diff --git a/lib/ext2fs/extent.c b/lib/ext2fs/extent.c index 590afce2..030d73a6 100644 --- a/lib/ext2fs/extent.c +++ b/lib/ext2fs/extent.c @@ -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; diff --git a/lib/ext2fs/imager.c b/lib/ext2fs/imager.c index 053917f9..5a6d0b95 100644 --- a/lib/ext2fs/imager.c +++ b/lib/ext2fs/imager.c @@ -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; diff --git a/lib/ext2fs/mkdir.c b/lib/ext2fs/mkdir.c index a15b7bc4..86c65da9 100644 --- a/lib/ext2fs/mkdir.c +++ b/lib/ext2fs/mkdir.c @@ -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; diff --git a/lib/ext2fs/mkjournal.c b/lib/ext2fs/mkjournal.c index df51db1f..9466e783 100644 --- a/lib/ext2fs/mkjournal.c +++ b/lib/ext2fs/mkjournal.c @@ -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; diff --git a/lib/ext2fs/namei.c b/lib/ext2fs/namei.c index 22d2d2d2..bc0ae61d 100644 --- a/lib/ext2fs/namei.c +++ b/lib/ext2fs/namei.c @@ -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) diff --git a/lib/ext2fs/openfs.c b/lib/ext2fs/openfs.c index 87643522..50aa207e 100644 --- a/lib/ext2fs/openfs.c +++ b/lib/ext2fs/openfs.c @@ -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; diff --git a/lib/ext2fs/read_bb.c b/lib/ext2fs/read_bb.c index 33167840..e5d63227 100644 --- a/lib/ext2fs/read_bb.c +++ b/lib/ext2fs/read_bb.c @@ -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); diff --git a/lib/ext2fs/read_bb_file.c b/lib/ext2fs/read_bb_file.c index 0ca76045..25454a87 100644 --- a/lib/ext2fs/read_bb_file.c +++ b/lib/ext2fs/read_bb_file.c @@ -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; diff --git a/lib/ext2fs/res_gdt.c b/lib/ext2fs/res_gdt.c index 424d8671..bf109959 100644 --- a/lib/ext2fs/res_gdt.c +++ b/lib/ext2fs/res_gdt.c @@ -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;