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/ChangeLog b/debugfs/ChangeLog
index 81a6fec..edbccd1 100644
--- a/debugfs/ChangeLog
+++ b/debugfs/ChangeLog
@@ -1,3 +1,8 @@
+Sat Oct 25 18:35:30 1997 Theodore Ts'o <tytso@rsts-11.mit.edu>
+
+ * debugfs.c (copy_file), dump.c (dump_file): Change to use the new
+ fileio primitives in libext2.
+
Fri Oct 24 23:47:43 1997 Theodore Ts'o <tytso@rsts-11.mit.edu>
* debugfs.c (main, do_open_filesys):
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) {
diff --git a/debugfs/dump.c b/debugfs/dump.c
index f56b2b1..6fcb140 100644
--- a/debugfs/dump.c
+++ b/debugfs/dump.c
@@ -61,67 +61,16 @@
return mode;
}
-struct dump_block_struct {
- int fd;
- char *buf;
- int left;
- errcode_t errcode;
-};
-
-static int dump_block(ext2_filsys fs, blk_t *blocknr, int blockcnt,
- void *private)
-{
- int nbytes, left;
- off_t ret_off;
-
- struct dump_block_struct *rec = (struct dump_block_struct *) private;
-
- if (blockcnt < 0)
- return 0;
-
- if (*blocknr) {
- rec->errcode = io_channel_read_blk(fs->io, *blocknr,
- 1, rec->buf);
- if (rec->errcode)
- return BLOCK_ABORT;
- } else {
- /*
- * OK, the file has a hole. Let's try to seek past
- * the hole in the destination file, so that the
- * destination file has a hole too.
- */
- ret_off = lseek(rec->fd, fs->blocksize, SEEK_CUR);
- if (ret_off >= 0)
- return 0;
- memset(rec->buf, 0, fs->blocksize);
- }
-
- left = (rec->left > fs->blocksize) ? fs->blocksize : rec->left;
- rec->left -= left;
-
- while (left > 0) {
- nbytes = write(rec->fd, rec->buf, left);
- if (nbytes == -1) {
- if (errno == EINTR)
- continue;
- rec->errcode = errno;
- return BLOCK_ABORT;
- }
- left -= nbytes;
- }
- if (rec->left <= 0)
- return BLOCK_ABORT;
- return 0;
-}
-
static void dump_file(char *cmdname, ino_t ino, int fd, int preserve,
char *outname)
{
errcode_t retval;
- struct dump_block_struct rec;
struct ext2_inode inode;
struct utimbuf ut;
-
+ char buf[8192];
+ ext2_file_t e2_file;
+ int nbytes, got;
+
retval = ext2fs_read_inode(current_fs, ino, &inode);
if (retval) {
com_err(cmdname, retval,
@@ -129,32 +78,27 @@
return;
}
- rec.fd = fd;
- rec.errcode = 0;
- rec.buf = malloc(current_fs->blocksize);
- rec.left = inode.i_size;
-
- if (rec.buf == 0) {
- com_err(cmdname, ENOMEM,
- "while allocating block buffer for dump_inode");
+ retval = ext2fs_file_open(current_fs, ino, 0, &e2_file);
+ if (retval) {
+ com_err(cmdname, retval, "while opening ext2 file");
return;
}
-
- retval = ext2fs_block_iterate(current_fs, ino,
- BLOCK_FLAG_HOLE|BLOCK_FLAG_DATA_ONLY,
- NULL, dump_block, &rec);
+ while (1) {
+ retval = ext2fs_file_read(e2_file, buf, sizeof(buf), &got);
+ if (retval)
+ com_err(cmdname, retval, "while reading ext2 file");
+ if (got == 0)
+ break;
+ nbytes = write(fd, buf, got);
+ if (nbytes != got)
+ com_err(cmdname, errno, "while writing file");
+ }
+ retval = ext2fs_file_close(e2_file);
if (retval) {
- com_err(cmdname, retval, "while iterating over blocks in %s",
- outname);
- goto cleanup;
+ com_err(cmdname, retval, "while closing ext2 file");
+ return;
}
- if (rec.errcode) {
- com_err(cmdname, retval, "in dump_block while dumping %s",
- outname);
- goto cleanup;
- }
-
-cleanup:
+
if (preserve) {
#ifdef HAVE_FCHOWN
if (fchown(fd, inode.i_uid, inode.i_gid) < 0)
@@ -178,7 +122,6 @@
} else if (fd != 1)
close(fd);
- free(rec.buf);
return;
}