struct expand_dir_struct {
int done;
int newblocks;
+ blk64_t goal;
errcode_t err;
};
{
struct expand_dir_struct *es = (struct expand_dir_struct *) priv_data;
blk64_t new_blk;
- static blk64_t last_blk = 0;
char *block;
errcode_t retval;
if (*blocknr) {
- last_blk = *blocknr;
+ if (blockcnt >= 0)
+ es->goal = *blocknr;
return 0;
}
- retval = ext2fs_new_block2(fs, last_blk, 0, &new_blk);
- if (retval) {
- es->err = retval;
- return BLOCK_ABORT;
+ if (blockcnt &&
+ (EXT2FS_B2C(fs, es->goal) == EXT2FS_B2C(fs, es->goal+1)))
+ new_blk = es->goal+1;
+ else {
+ es->goal &= ~EXT2FS_CLUSTER_MASK(fs);
+ retval = ext2fs_new_block2(fs, es->goal, 0, &new_blk);
+ if (retval) {
+ es->err = retval;
+ return BLOCK_ABORT;
+ }
}
if (blockcnt > 0) {
retval = ext2fs_new_dir_block(fs, 0, 0, &block);
memset(block, 0, fs->blocksize);
retval = io_channel_write_blk64(fs->io, new_blk, 1, block);
}
+ if (blockcnt >= 0)
+ es->goal = new_blk;
if (retval) {
es->err = retval;
return BLOCK_ABORT;
es.done = 0;
es.err = 0;
+ es.goal = 0;
es.newblocks = 0;
retval = ext2fs_block_iterate3(fs, dir, BLOCK_FLAG_APPEND,
es->goal = *blocknr;
return 0;
}
- retval = ext2fs_new_block2(fs, es->goal, 0, &new_blk);
- if (retval) {
- es->err = retval;
- return BLOCK_ABORT;
+ if (blockcnt &&
+ (EXT2FS_B2C(fs, es->goal) == EXT2FS_B2C(fs, es->goal+1)))
+ new_blk = es->goal+1;
+ else {
+ es->goal &= ~EXT2FS_CLUSTER_MASK(fs);
+ retval = ext2fs_new_block2(fs, es->goal, 0, &new_blk);
+ if (retval) {
+ es->err = retval;
+ return BLOCK_ABORT;
+ }
}
if (blockcnt >= 0)
es->num_blocks--;