Many files:
  Checked in e2fsprogs 0.5c

diff --git a/lib/ext2fs/inode.c b/lib/ext2fs/inode.c
index 6a9c178..ae69bc2 100644
--- a/lib/ext2fs/inode.c
+++ b/lib/ext2fs/inode.c
@@ -11,11 +11,16 @@
 #include <stdlib.h>
 #include <sys/stat.h>
 #include <sys/types.h>
+#if HAVE_ERRNO_H
+#include <errno.h>
+#endif
 
 #include <linux/ext2_fs.h>
 
 #include "ext2fs.h"
 
+static void inocpy_with_swap(struct ext2_inode *t, struct ext2_inode *f);
+
 errcode_t ext2fs_open_inode_scan(ext2_filsys fs, int buffer_blocks,
 				 ext2_inode_scan *ret_scan)
 {
@@ -77,9 +82,6 @@
 	
 	EXT2_CHECK_MAGIC(scan, EXT2_ET_MAGIC_INODE_SCAN);
 
-	if (!scan->inode_buffer)
-		return EINVAL;
-	
 	if (scan->inodes_left <= 0) {
 		if (scan->blocks_left <= 0) {
 			if (scan->done_group) {
@@ -120,7 +122,11 @@
 			return EXT2_ET_NEXT_INODE_READ;
 		scan->inode_scan_ptr = (struct ext2_inode *) scan->inode_buffer;
 	}
-	*inode = *scan->inode_scan_ptr++;
+	if (scan->fs->flags & EXT2_SWAP_BYTES)
+		inocpy_with_swap(inode, scan->inode_scan_ptr++);
+	else
+		*inode = *scan->inode_scan_ptr++;
+
 	scan->inodes_left--;
 	scan->current_inode++;
 	*ino = scan->current_inode;
@@ -171,8 +177,12 @@
 			return retval;
 		inode_buffer_block = block_nr;
 	}
-	memcpy (inode, (struct ext2_inode *) inode_buffer + i,
-		sizeof (struct ext2_inode));
+	if (fs->flags & EXT2_SWAP_BYTES)
+		inocpy_with_swap(inode,
+				 (struct ext2_inode *) inode_buffer + i);
+	else
+		memcpy (inode, (struct ext2_inode *) inode_buffer + i,
+			sizeof (struct ext2_inode));
 	return 0;
 }
 
@@ -217,8 +227,12 @@
 			return retval;
 		inode_buffer_block = block_nr;
 	}
-	memcpy ((struct ext2_inode *) inode_buffer + i, inode,
-		sizeof (struct ext2_inode));
+	if (fs->flags & EXT2_SWAP_BYTES)
+		inocpy_with_swap((struct ext2_inode *) inode_buffer + i,
+				 inode);
+	else
+		memcpy ((struct ext2_inode *) inode_buffer + i, inode,
+			sizeof (struct ext2_inode));
 	retval = io_channel_write_blk(fs->io, block_nr, 1, inode_buffer);
 	if (retval)
 		return retval;
@@ -264,10 +278,33 @@
 	retval = ext2fs_read_inode(fs, ino, &inode);
 	if (retval)
 		return retval;
-	if (!S_ISDIR(inode.i_mode))
+	if (!LINUX_S_ISDIR(inode.i_mode))
 		return ENOTDIR;
 	return 0;
 }
 
+static void inocpy_with_swap(struct ext2_inode *t, struct ext2_inode *f)
+{
+	unsigned i;
 	
-
+	t->i_mode = ext2fs_swab16(f->i_mode);
+	t->i_uid = ext2fs_swab16(f->i_uid);
+	t->i_size = ext2fs_swab32(f->i_size);
+	t->i_atime = ext2fs_swab32(f->i_atime);
+	t->i_ctime = ext2fs_swab32(f->i_ctime);
+	t->i_mtime = ext2fs_swab32(f->i_mtime);
+	t->i_dtime = ext2fs_swab32(f->i_dtime);
+	t->i_gid = ext2fs_swab16(f->i_gid);
+	t->i_links_count = ext2fs_swab16(f->i_links_count);
+	t->i_blocks = ext2fs_swab32(f->i_blocks);
+	t->i_flags = ext2fs_swab32(f->i_flags);
+	for (i = 0; i < EXT2_N_BLOCKS; i++)
+		t->i_block[i] = ext2fs_swab32(f->i_block[i]);
+	t->i_version = ext2fs_swab32(f->i_version);
+	t->i_file_acl = ext2fs_swab32(f->i_file_acl);
+	t->i_dir_acl = ext2fs_swab32(f->i_dir_acl);
+	t->i_faddr = ext2fs_swab32(f->i_faddr);
+	t->osd2.linux2.l_i_frag = f->osd2.linux2.l_i_frag;
+	t->osd2.linux2.l_i_fsize = f->osd2.linux2.l_i_fsize;
+	t->osd2.linux2.i_pad1 = ext2fs_swab16(f->osd2.linux2.i_pad1);
+}