ChangeLog, debugfs.c, dump.c:
  debugfs.c (copy_file), dump.c (dump_file): Change to use the new
  	fileio primitives in libext2.

diff --git a/debugfs/debugfs.c b/debugfs/debugfs.c
index 32dc601..85d14b0 100644
--- a/debugfs/debugfs.c
+++ b/debugfs/debugfs.c
@@ -946,119 +946,48 @@
 		printf("Free inode found: %ld\n", free_inode);
 }
 
-struct copy_file_struct {
-	unsigned long size;
-	int	done, fd, blocks;
-	errcode_t err;
-};
-
-static int copy_file_proc(ext2_filsys to_fs,
-			   blk_t	*blocknr,
-			   int	blockcnt,
-			   void	*private)
-{
-	struct copy_file_struct *cs = (struct copy_file_struct *) private;
-	blk_t	new_blk;
-	static blk_t	last_blk = 0;
-	char		*block;
-	errcode_t	retval;
-	int		group;
-	int		nr;
-	
-	if (*blocknr) {
-		new_blk = *blocknr;
-	} else {
-		retval = ext2fs_new_block(to_fs, last_blk, 0, &new_blk);
-		if (retval) {
-			cs->err = retval;
-			return BLOCK_ABORT;
-		}
-	}
-	last_blk = new_blk;
-	block = malloc(to_fs->blocksize);
-	if (!block) {
-		cs->err = ENOMEM;
-		return BLOCK_ABORT;
-	}
-	if (blockcnt >= 0) {
-		nr = read(cs->fd, block, to_fs->blocksize);
-	} else {
-		nr = to_fs->blocksize;
-		memset(block, 0, nr);
-	}
-	if (nr == 0) {
-		cs->done = 1;
-		return BLOCK_ABORT;
-	}
-	if (nr < 0) {
-		cs->err = nr;
-		return BLOCK_ABORT;
-	}
-	retval = io_channel_write_blk(to_fs->io, new_blk, 1, block);
-	if (retval) {
-		cs->err = retval;
-		return BLOCK_ABORT;
-	}
-	free(block);
-	if (blockcnt >= 0)
-		cs->size += nr;
-	cs->blocks += to_fs->blocksize / 512;
-	printf("%ld(%d) ", cs->size, blockcnt);
-	fflush(stdout);
-	if (nr < to_fs->blocksize) {
-		cs->done = 1;
-		printf("\n");
-	}
-	*blocknr = new_blk;
-	ext2fs_mark_block_bitmap(to_fs->block_map, new_blk);
-	ext2fs_mark_bb_dirty(to_fs);
-	group = ext2fs_group_of_blk(to_fs, new_blk);
-	to_fs->group_desc[group].bg_free_blocks_count--;
-	to_fs->super->s_free_blocks_count--;
-	ext2fs_mark_super_dirty(to_fs);
-	if (cs->done)
-		return (BLOCK_CHANGED | BLOCK_ABORT);
-	else
-		return BLOCK_CHANGED;
-}
-
 static errcode_t copy_file(int fd, ino_t newfile)
 {
+	ext2_file_t	e2_file;
 	errcode_t	retval;
-	struct	copy_file_struct cs;
-	struct ext2_inode	inode;
+	int		got, written;
+	char		buf[8192];
+	char		*ptr;
 
-	cs.fd = fd;
-	cs.done = 0;
-	cs.err = 0;
-	cs.size = 0;
-	cs.blocks = 0;
-	
-	retval = ext2fs_block_iterate(current_fs, newfile,
-				      BLOCK_FLAG_APPEND,
-				      0, copy_file_proc, &cs);
-
-	if (cs.err)
-		return cs.err;
-	if (!cs.done)
-		return EXT2_ET_EXPAND_DIR_ERR;
-
-	/*
-	 * Update the size and block count fields in the inode.
-	 */
-	retval = ext2fs_read_inode(current_fs, newfile, &inode);
-	if (retval)
-		return retval;
-	
-	inode.i_blocks += cs.blocks;
-
-	retval = ext2fs_write_inode(current_fs, newfile, &inode);
+	retval = ext2fs_file_open(current_fs, newfile,
+				  EXT2_FILE_WRITE, &e2_file);
 	if (retval)
 		return retval;
 
-	return 0;
+	while (1) {
+		got = read(fd, buf, sizeof(buf));
+		if (got == 0)
+			break;
+		if (got < 0) {
+			retval = errno;
+			goto fail;
+		}
+		ptr = buf;
+		while (got > 0) {
+			retval = ext2fs_file_write(e2_file, ptr,
+						   got, &written);
+			if (retval)
+				goto fail;
+
+			got -= written;
+			ptr += written;
+		}
+	}
+	retval = ext2fs_file_close(e2_file);
+
+	return retval;
+
+fail:
+	(void) ext2fs_file_close(e2_file);
+	return retval;
 }
 
+
 void do_write(int argc, char *argv[])
 {
 	int	fd;
@@ -1066,6 +995,7 @@
 	ino_t	newfile;
 	errcode_t retval;
 	struct ext2_inode inode;
+	dgrp_t group;
 
 	if (check_fs_open(argv[0]))
 		return;
@@ -1092,6 +1022,10 @@
 		close(fd);
 		return;
 	}
+	group = ext2fs_group_of_ino(current_fs, newfile);
+	current_fs->group_desc[group].bg_free_inodes_count--;
+	current_fs->super->s_free_inodes_count--;
+	ext2fs_mark_super_dirty(current_fs);
 	printf("Allocated inode: %ld\n", newfile);
 	retval = ext2fs_link(current_fs, cwd, argv[2], newfile, 0);
 	if (retval) {