EXT2_CHECK_MAGIC(fs, EXT2_ET_MAGIC_EXT2FS_FILSYS);
sb = fs->super;
- if (!sb->s_reserved_gdt_blocks)
- return 0;
- retval = ext2fs_get_mem(2 * fs->blocksize, (void **)&dindir_buf);
+ retval = ext2fs_get_array(2, fs->blocksize, &dindir_buf);
if (retval)
goto out_free;
gdt_buf = (__u32 *)((char *)dindir_buf + fs->blocksize);
apb = EXT2_ADDR_PER_BLOCK(sb);
rsv_add = fs->blocksize / 512;
if ((dindir_blk = inode.i_block[EXT2_DIND_BLOCK])) {
+#ifdef RES_GDT_DEBUG
printf("reading GDT dindir %u\n", dindir_blk);
- retval = io_channel_read_blk(fs->io, dindir_blk, 1, dindir_buf);
+#endif
+ retval = ext2fs_read_ind_block(fs, dindir_blk, dindir_buf);
if (retval)
goto out_inode;
} else {
- blk_t goal = 3 + sb->s_reserved_gdt_blocks +
- fs->desc_blocks + fs->inode_blocks_per_group;
+ blk_t goal = sb->s_first_data_block + fs->desc_blocks +
+ sb->s_reserved_gdt_blocks + 2 +
+ fs->inode_blocks_per_group;
retval = ext2fs_alloc_block(fs, goal, 0, &dindir_blk);
if (retval)
sb->s_feature_ro_compat |=
EXT2_FEATURE_RO_COMPAT_LARGE_FILE;
}
- inode.i_ctime = time(0);
+ inode.i_ctime = fs->now ? fs->now : time(0);
}
for (rsv_off = 0, gdt_off = fs->desc_blocks,
- gdt_blk = sb->s_first_data_block + 1 + gdt_off;
+ gdt_blk = sb->s_first_data_block + 1 + fs->desc_blocks;
rsv_off < sb->s_reserved_gdt_blocks;
rsv_off++, gdt_off++, gdt_blk++) {
unsigned int three = 1, five = 5, seven = 7;
gdt_blk, dindir_blk, gdt_off);
#endif
} else if (dindir_buf[gdt_off] == gdt_blk) {
+#ifdef RES_GDT_DEBUG
printf("reading primary GDT block %u\n", gdt_blk);
- retval = io_channel_read_blk(fs->io,gdt_blk,1,gdt_buf);
+#endif
+ retval = ext2fs_read_ind_block(fs, gdt_blk, gdt_buf);
if (retval)
goto out_dindir;
} else {
+#ifdef RES_GDT_DEBUG
printf("bad primary GDT %u != %u at %u[%u]\n",
dindir_buf[gdt_off], gdt_blk,dindir_blk,gdt_off);
- retval = -1; // XXX
+#endif
+ retval = EXT2_ET_RESIZE_INODE_CORRUPT;
goto out_dindir;
}
inode.i_blocks += rsv_add;
gdt_dirty = inode_dirty = 1;
} else if (gdt_buf[last] != expect) {
+#ifdef RES_GDT_DEBUG
printf("bad backup GDT %u != %u at %u[%u]\n",
gdt_buf[last], expect, gdt_blk, last);
- retval = -1; // XXX
+#endif
+ retval = EXT2_ET_RESIZE_INODE_CORRUPT;
goto out_dindir;
}
last++;
#ifdef RES_GDT_DEBUG
printf("writing primary GDT block %u\n", gdt_blk);
#endif
- retval = io_channel_write_blk(fs->io,gdt_blk,1,gdt_buf);
+ retval = ext2fs_write_ind_block(fs, gdt_blk, gdt_buf);
if (retval)
goto out_dindir;
}
out_dindir:
if (dindir_dirty) {
- retval2 = io_channel_write_blk(fs->io, dindir_blk,1,dindir_buf);
+ retval2 = ext2fs_write_ind_block(fs, dindir_blk, dindir_buf);
if (!retval)
retval = retval2;
}
out_inode:
+#ifdef RES_GDT_DEBUG
printf("inode.i_blocks = %u, i_size = %u\n", inode.i_blocks,
inode.i_size);
+#endif
if (inode_dirty) {
- inode.i_atime = inode.i_mtime = time(0);
+ inode.i_atime = inode.i_mtime = fs->now ? fs->now : time(0);
retval2 = ext2fs_write_inode(fs, EXT2_RESIZE_INO, &inode);
if (!retval)
retval = retval2;
}
out_free:
- ext2fs_free_mem((void **)&dindir_buf);
+ ext2fs_free_mem(&dindir_buf);
return retval;
}