#include <stdio.h>
#include <string.h>
+#if HAVE_UNISTD_H
#include <unistd.h>
-#include <stdlib.h>
+#endif
+#if HAVE_SYS_TYPES_H
#include <sys/types.h>
+#endif
+#if HAVE_SYS_TIME_H
#include <sys/time.h>
+#endif
+#if EXT2_FLAT_INCLUDES
+#include "ext2_fs.h"
+#else
#include <linux/ext2_fs.h>
-#include "ext2fs/ext2fs.h"
+#endif
+
+#include "ext2fsP.h"
struct process_block_struct {
ino_t ino;
errcode_t error;
char *buf;
int add_dir;
+ int flags;
};
static int process_block(ext2_filsys fs, blk_t *block_nr,
- int blockcnt, blk_t ref_block,
- int ref_offset, void *private)
+ e2_blkcnt_t blockcnt, blk_t ref_block,
+ int ref_offset, void *priv_data)
{
- struct process_block_struct *pb = private;
+ struct process_block_struct *pb;
errcode_t retval;
int ret;
blk_t block, orig;
+ pb = (struct process_block_struct *) priv_data;
block = orig = *block_nr;
ret = 0;
if (++block >= fs->super->s_blocks_count)
block = fs->super->s_first_data_block;
if (block == orig) {
- pb->error = ENOSPC;
+ pb->error = EXT2_ET_BLOCK_ALLOC_FAIL;
return BLOCK_ABORT;
}
} while (ext2fs_test_block_bitmap(pb->reserve, block) ||
*block_nr = block;
ext2fs_mark_block_bitmap(pb->alloc_map, block);
ret = BLOCK_CHANGED;
- printf("ino=%ld, blockcnt=%d, %ld->%ld\n", pb->ino,
- blockcnt, orig, block);
+ if (pb->flags & EXT2_BMOVE_DEBUG)
+ printf("ino=%ld, blockcnt=%lld, %d->%d\n", pb->ino,
+ blockcnt, orig, block);
}
if (pb->add_dir) {
retval = ext2fs_add_dir_block(fs->dblist, pb->ino,
- block, blockcnt);
+ block, (int) blockcnt);
if (retval) {
pb->error = retval;
ret |= BLOCK_ABORT;
pb.reserve = reserve;
pb.error = 0;
pb.alloc_map = alloc_map ? alloc_map : fs->block_map;
+ pb.flags = flags;
- block_buf = malloc(fs->blocksize * 4);
- if (!block_buf)
- return ENOMEM;
+ retval = ext2fs_get_mem(fs->blocksize * 4, (void **) &block_buf);
+ if (retval)
+ return retval;
pb.buf = block_buf + fs->blocksize * 3;
/*