Fri Oct  3 13:35:59 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* llseek.c (ext2fs_llseek): Fix type error for ext2fs_llseek()

	* icount.c (ext2fs_icount_validate): 
	* bmove.c (process_block): Fix lint error in type for fprintf().

Mon Sep 15 11:45:09 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* inode.c (ext2fs_check_directory): Add support for the callback
		to return the error code EXT2_ET_CALLBACK_NOTHANDLED.

Thu Sep  4 12:28:22 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* bitmaps.c (ext2fs_set_bitmap_padding): New function which sets the
		padding of the bitmap to be all one's.

Wed Sep  3 14:27:30 1997  Theodore Y. Ts'o  <tytso@edt.mit.edu>

	* llseek.c: Added missing semicolon to glibc fixup declaration of
 	llseek().

	* bmove.c: Add #include of errno.h

Sat Aug 23 22:47:46 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* Makefile.in (ELF_SO_VERSION): Bump version to be 2.4 since we've
		added a new field to the io_channel (app_data).

	* io.h: Add a new element to the io_channel structure, app_data.

	* initialize.c, openfs.c: Set io->app_data to point at the
	 	filesystem handle.

Thu Aug 14 08:14:17 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* io.h: Change the prototype of ext2fs_llseek() to use int's
		instead of unsigned int's.

	* llseek.c: Change to allow PIC and !HAVE_LLSEEK.  Add a prototype
		to make life easer for GNU Libc 2.

	* rw_bitmaps.c: On the PowerPC, the big-endian variant of the ext2
 		filesystem has its bitmaps stored as 32-bit words with bit
 		0 as the LSB of each word.  Thus a bitmap with only bit 0
 		set would be, as a string of bytes, 00 00 00 01 00 ...  To
 		cope with this, we byte-reverse each word of a bitmap if
 		we have a big-endian filesystem, that is, if we are *not*
 		byte-swapping other word-sized numbers.

Mon Aug 11 03:30:48 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* dosio.c: New file to do DOS/BIOS disk accesses.

	* namei.c (open_namei): Make pathlen be of type size_t.

	* llseek.c: Always #include stdlib.h since it's need to define
		size_t.  

	* io.h: Use errcode_t for magic numbers.

	* icount.c (get_icount_el): Use size_t where appropriate
	
	* dupfs.c (ext2fs_dup_handle): 
	* dblist.c (dir_block_cmp): Use size_t where appropriate.

	* read_bb.c (ext2fs_read_bb_inode): 
	* cmp_bitmaps.c (ext2fs_compare_inode_bitmap): Use blk_t, ino_t
		and size_t where appropriate.

	* closefs.c (ext2fs_flush): Use dgrp_t instead of int where
		appropriate.

	* openfs.c (ext2fs_open): 
	* check_desc.c (ext2fs_check_desc): Use blk_t instead of int where
		appropriate.

	* rw_bitmaps.c (read_bitmaps): 
	* irel_ma.c: 
	* inode.c (ext2fs_write_inode): 
	* initialize.c (ext2fs_initialize):
	* brel_ma.c: Fix to make be 16-bit safe.

	* link.c (ext2fs_link): 
	* unlink.c (ext2fs_unlink):
	* lookup.c (lookup_proc): 
	* ismounted.c (ext2fs_check_if_mounted): 
	* block.c (xlate_func): Add #pragma argsused for Turbo C.

Sun Aug 10 10:05:22 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* block.c (ext2fs_block_iterate2): Use retval which is a errcode_t
		type.

	* bitmaps.c (make_bitmap): Use size_t instead of int where
		appropriate.

	* bb_inode.c (set_bad_block_proc): Add #pragma argsused for Turbo C.

	* alloc.c (ext2fs_new_inode): Use ino_t instead of int for the
		group number.

	* get_pathname.c: Use ino_t instead of int where appropriate.

	* ext2fs.h: Make the magic structure element be errcode_t instead
		of int.

	* alloc.c alloc_tables.c badblocks.c bb_compat.c bb_inode.c
 	 	bitmaps.c block.c bmove.c brel_ma.c check_desc.c closefs.c
 	 	cmp_bitmaps.c dblist.c dblist_dir.c dir_iterate.c
 	 	dirblock.c dupfs.c expanddir.c freefs.c get_pathname.c
 	 	icount.c initialize.c inline.c inode.c irel_ma.c link.c
 	 	llseek.c lookup.c mkdir.c namei.c newdir.c read_bb.c
 	 	read_bb_file.c rs_bitmap.c rw_bitmaps.c swapfs.c 
 	 	test_io.c tst_badblocks.c tst_iscan.c unix_io.c unlink.c
 	 	valid_blk.c version.c: Add an #ifdef for HAVE_UNISTD_H

Tue Jun 17 01:33:20 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* unix_io.c (unix_read_blk): If ext2fs_llseek() fails, but errno
		is zero, then return EXT2_IO_LLSEEK_FAILED.

	* ext2_err.et.in: Add a new error code, EXT2_IO_LLSEEK_FAILED.

	* Release of E2fsprogs 1.11

Mon Jun 16 23:53:06 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* dblist.c (ext2fs_dblist_count): Added new function which returns
		the number of directory blocks in dblist.

Sat Jun 14 01:39:13 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* unix_io.c (unix_flush): Make the io_channel flush function do a
		fsync to flush the kernel buffers to disk.

Wed Jun 11 18:25:31 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* inode.c (ext2fs_inode_scan_goto_blockgroup): Fix bug; the
		current inode number wasn't being set by the
		goto_blockgroup function.

Mon Jun  9 10:45:48 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* bmove.c (ext2fs_move_blocks): New function which takes a bitmap
		of blocks which need to be moved, and moves those blocks
		to another location in the filesystem.

	* rs_bitmap.c (ext2fs_resize_generic_bitmap): When expanding a
		bitmap, make sure all of the new parts of the bitmap are
		zero. 

Sun Jun  8 16:24:39 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* bitmaps.c (ext2fs_copy_bitmap): Fix bug; the destination bitmap
		wasn't being returned to the caller.

	* alloc_tables.c (ext2fs_allocate_group_table): Add new function
		ext2fs_allocate_group_table() which sets the group tables
		for a particular block group.  The relevant code was
		factored out of ext2fs_allocate_tables().

	* dblist.c (make_dblist): Adjust the initial size of the directory
 		block list to be a bit more realistic (ten plus twice the
 		number of directories in the filesystem).

Thu May  8 22:19:09 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* badblocks.c (ext2fs_badblocks_list_test): Fix bug where
 		ext2fs_badblocks_list_test would test the list (and exceed
 		array boundaries) if there were no bad blocks on the bad
 		blocks list.  (Showed up when user tried: mke2fs -c -b 4096).

Thu Apr 24 12:16:42 1997  Theodre Ts'o  <tytso@localhost.mit.edu>

	* Release of E2fsprogs version 1.10

Thu Apr 24 10:13:42 1997  Theodre Ts'o  <tytso@localhost.mit.edu>

	* alloc_tables.c (ext2fs_allocate_tables): Correctly place the
		inode and block bitmaps based on the RAID 0 stride
		parameter (which is passed by mke2fs).

	* ext2fs.h: Add "stride" parameter to ext2_filsys, to be used by
 		mke2fs to communicate the stride length to
 		ext2fs_allocate_tables()

Wed Apr 23 21:50:42 1997  Theodre Ts'o  <tytso@localhost.mit.edu>

	* initialize.c (ext2fs_initialize): Fix to compile under Linux 1.2
		systems.  (We can't assume that the new filesystem types
		are supported.)

Wed Apr 23 18:40:53 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* alloc_tables.c (ext2fs_allocate_tables): Make sure that we
		allocate the inode and block bitmaps inside block group at
		all times.

Mon Apr 21 00:06:28 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* alloc.c (ext2fs_new_block): Fix bug where if goal==0 and the
		filesystem has no free blocks, ext2fs_new_block would loop
		forever.

	* dupfs.c (ext2fs_dup_handle): Duplicate an ext2 filesystem handle

	* freefs.c (ext2fs_free_inode_cache): Decrement refcount and only
		free if refcount goes to zero.

	* inode.c (create_icache): Initialize refcount to 1.

	* ext2fsP.h: Added refcount to ext2_inode_cache

	* dblist.c (ext2fs_copy_dblist): New function to copy a directory
		block list.

	* badblocks.c (ext2fs_badblocks_copy): New function to copy a
		badblocks structure.

Sun Apr 20 23:19:51 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* bitmaps.c (ext2fs_copy_bitmap): New function to copy a bitmap.

	* unix_io.c, test_io.c (unix_open, test_open): Initialize the
 	 	refcount to 1.
		(unix_close, test_close): Decrement the refcount and only
 		close the io_channel if the refcount goes to 0.

	* io.h: Add refcount to the io_channel structure.  Add new macro
		interface io_channel_bumpcount() to bump the refcount.

Thu Apr 17 20:25:03 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* inode.c (ext2fs_read_inode, ext2fs_write_inode): Use the inode
		cache in the filesystem handle, instead of the inode cache
		in a static variable.

	* freefs.c: Added static function to free the inode cache (called by
		ext2fs_free). 

	* ext2fsP.h: Added definition of the ext2_inode_cache structures.

	* ext2fs.h: Added pointer to the inode_cache structure.

	* block.c (block_iterate_ind, block_iterate_dind, 
		block_iterate_tind): If there are holes in the indirect,
		doubly indirect, or triply indirect blocks, increment the
		block count field automatically.

Thu Apr 17 12:23:38 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* Release of E2fsprogs version 1.09

Mon Apr 14 20:38:56 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* version.c (ext2fs_parse_version_string): Check the passed in
		version string (instead of the hard-coded one).

	* alloc_tables.c (ext2fs_allocate_tables): If the last block is
		greater filesystem size, clamp it to prevent allocating a
		block or inode bitmap beyond the filesystem.

	* initialize.c (ext2fs_initialize): Fix bug where the metatdata
	 	overhead calculation was accidentally removed.

Fri Apr 11 18:56:26 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* Release of E2fsprogs version 1.08

Thu Apr 10 13:15:15 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* dblist.c (ext2fs_set_dir_block): New function which sets the
 		block of a dblist entry, given the directory inode and
 		blockcnt.

Sat Apr  5 12:42:42 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* alloc_tables.c (ext2fs_allocate_tables): Allocate the bitmap and
		inode bitmaps at staggered locations across the block
		groups, to avoid concentrating the bitmaps on a small
		number of disks when using striped RAID arrays.

	* initialize.c (ext2fs_initialize): By default, choose the maximum
		possible number of blocks per group (based on the size of
		the bitmaps in the blocksize).

Fri Apr  4 11:28:16 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* initialize.c (ext2fs_initialize): Add support for
		EXT2_COMPAT_SPARSE_SUPER feature.

	* closefs.c (ext2fs_bg_has_super): New function to determine
		whether or a particular block group should have a
		superblock and block group descriptor.  Used for the
		EXT2_COMPAT_SPARSE_SUPER feature is turned on.
		(ext2fs_flush):  Check ext2fs_bg_has_super to see whether
		or not the superblock should be written out for the block
		group. 

	* ext2fs.h (EXT2_COMPAT_SPARSE_SUPER): Define compatibility flag
		for sparse duplicate superblocks.

	* version.c (ext2fs_get_library_version): New function which
		returns the library version.

	* version.c (ext2fs_parse_version_string): New function which
		parses a version string and returns a version number,
		so application programs can compare version numbers as
		integers.

Wed Mar 26 00:43:52 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* icount.c (ext2fs_create_icount): Change function so that it also
		takes a new argument which contains a "hint" icount
		structure.  This "hint" icount allows the create function
		to set up the sorted list in advance.  This reduces
		significantly the amount of data moving needed to insert
		these inodes into the list later.
	
	* icount.c (ext2fs_icount_validate): New function which validates
		that the icount structure's rep invariant.

	* icount.c (get_icount_el): Completely revamped implementation
		to subsume put_icount_el().  Put_icount_el() used to
		use an O(N) implementation to insert in the middle
		of the icount list.  It now uses a O(ln N) to search
		for where the icount should be inserted, and then uses
		a memcpy to move the list down (instead of a for loop).
	
	* icount.c (ext2fs_icount_fetch, ext2fs_icount_store,
 		ext2fs_icount_increment, ext2fs_icount_decrement): Check
 		to see if the inode is within bounds; if it isn't, return
 		EINVAL.

	* bitops.h (ext2fs_test_generic_bitmap): Fix error message given
 		when a bad inode number is passed to test_generic_bitmap
 		to be EXT2FS_TEST_ERROR instead of the wrong
 		EXT2FS_UNMARK_ERROR.

Wed Mar 12 13:32:05 1997  Theodore Y. Ts'o  <tytso@mit.edu>

	* Release of E2fsprogs version 1.07

Sun Mar  2 16:46:18 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* Makefile.in (ELF_VERSION): Change version to be 2.2

Tue Feb 11 14:54:02 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* alloc.c (ext2fs_get_free_blocks): Change routine to use
	 	ext2fs_fast_test_block_bitmap_range().

	* bitops.h (ext2fs_fast_test_block_bitmap_range,
 		ext2fs_test_block_bitmap_range: New inline functions which
 		test to see whether a contiguous range of blocks is
 		available.

Thu Feb  6 10:00:13 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* badblocks.c (ext2fs_badblocks_list_create): Rename sybmols to use
 		use ext2fs_badblocks_* instead of badblocks_*

	* bb_compat.c: New file which translates between old badblocks_*()
		names to ext2fs_badblocks_*()

	* unlink.c (ext2fs_unlink): New file, moved ext2fs_unlink() from
	 	link.c (since e2fsck doesn't use ext2fs_unlink()).

	* rs_bitmap.c (ext2fs_resize_generic_bitmap): New file, contains
 		bitmap resizing routine moved from bitmaps.c, since e2fsck
 		doesn't need to use this function.

	* lookup.c (ext2fs_lookup): Moved ext2fs_lookup to its own file,
		since e2fsck only needs ext2fs_lookup.

Mon Feb  3 10:11:40 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* inode.c (ext2fs_open_inode_scan): Set fs->badblocks if it is not
		already set; this is needed so that programs like dump
		which use the inode scan functions will deal with
		filesystems that have bad blocks in the inode table.

Sun Feb  2 00:17:36 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* ext2fs.h (struct_badblocks_list, struct_badblocks_iterate): 
		Moved to ext2fsP.h, since it doesn't need to be part of
		the public interface.

	* dir_iterate.c: Move ext2_dir_iterate out of namei.c.

Sat Feb  1 10:14:55 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* dblist.c (ext2fs_get_num_dirs): New file, which implements a
 		directory block list abstraction.  (Code moved from
 		e2fsck).

	* ext2fs.h, inode.c: Moved definition of ext2_struct_inode_scan to
		to inode.c (since no one else should be peeking inside it!)

	* valid_blk.c (ext2_inode_has_valid_blocks): New function.

	* openfs.c (ext2fs_open): Check the feature set in the ext2
		superblock, and refuse to open filesystems if they contain
		incompatible features.  (Can be overriden with the
		EXT2_FLAG_FORCE 

Sun Jan 12 11:31:46 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* block.c (ext2fs_block_iterate2): Added new function
	 	ext2fs_block_iterate2 which changes the function
	 	signature of the callback function to include the
	 	referencing block and offset.

	* inode.c (ext2fs_inode_scan_goto_blockgroup): Added new function
	 	ext2fs_inode_scan_goto_blockgroup which allows an
	 	application to jump to a particular block group while
	 	doing an inode scan.

Wed Jan  1 23:50:12 1997  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* dirblock.c: Include string.h, since we use memcpy().

Tue Dec  3 12:27:29 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* getsize.c (ext2fs_get_device_size): The ioctl BLKGETSIZE returns
		a long not an int; this doesn't matter on i386 machines,
		but it does on Alpha's.
	
Fri Nov 29 20:57:37 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* inode.c (ext2fs_write_inode, ext2fs_read_inode): If the inode
 		table pointer is NULL, then return an error indicating
 		that the inode table is missing.
		(get_next_blockgroup, get_next_blocks,
 		ext2fs_get_next_inode): Don't treat a missing inode table
 		as permanent error.  Return MISSING_INODE_TABLE, but as an
 		advisory error code, much like BAD_BLOCK_IN_INODE_TABLE.

	* rw_bitmaps.c (ext2fs_write_block_bitmap,
 	 	ext2fs_write_inode_bitmap): If the inode or block bitmap
 	 	block is zero, then don't write out the inode or block
 	 	bitmap.  The idea here is to avoid stomping on the
 	 	superblock.
		(read_bitmaps): If the inode or block bitmap block is
	 	zero, then fill in that portion of the inode or block
	 	bitmap with all zeros.

	* inode.c (ext2fs_get_next_inode): Fix bug in handling of bad
 		blocks in inode table when the inode table size is
 		non-standard (and can therefore span blocks).

Tue Oct 29 20:13:14 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* alloc.c (ext2fs_new_block): Fix fencepost error in
		ext2fs_new_block; make sure we don't try to allocate the
		first block beyond the end of the filesystem.

Mon Oct 14 11:00:48 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* inode.c (check_for_inode_bad_blocks): New function called by
		get_next_blocks() to avoid reading in bad blocks marked in
		fs->badblocks.  Inodes located in bad blocks are returned
		by ext2fs_get_next_inode() returns the error code 
		EXT2_ET_BAD_BLOCK_IN_INODE_TABLE.
	
	* alloc_tables.c (ext2fs_allocate_tables): New function which
		performs the part of mke2fs's job of allocating the 
		filesystem tables.

	* test_io.c (test_close): IO manager which is used for testing
	 	purposes.

Sun Oct 13 04:31:57 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* inode.c (ext2fs_get_next_inode): Separate out the function of
 		setting up for a new block group to get_next_blockgroup().
		Separate out the function of reading in blocks of the
		inode table to get_next_blocks().

	* ext2fs.h: Add the badblocks list to the ext2_filsys entry

	* badblocks.c (badblocks_list_add, badblocks_list_test): Add
 		blocks to the badblock list in sorted order.  This allows
 		badblocks_list_test to be coded using a binary search for
 		speed.

Tue Oct  8 02:02:03 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* Release of E2fsprogs version 1.06

Mon Oct  7 00:44:17 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* ext2fs.h, block.c, closefs.c, dirblock.c, inode.c, native.c,
	 	open.c: Change EXT2_SWAP to EXT2_FLAG_SWAP for
	 	consistency's sake.
	
	* closefs.c (ext2fs_flush): If the flag EXT2_MASTER_SB_ONLY is
		set, then only write out the master superblock.

Sun Oct  6 21:45:26 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* block.c (ext2fs_block_iterate): Fixed bug which caused
 		block_iterate to fail to handle HURD created filesystems;
 		it tested the inode translator field before the inode was
 		loaded.

Tue Sep 17 14:08:24 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* initialize.c (ext2fs_initialize): Make sure the description for
		the inode bitmap is set correctly.

	* bitmaps.c (ext2fs_allocate_generic_bitmap): Fix minor type typo.

Thu Sep 12 15:23:07 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* Release of E2fsprogs version 1.05

Sat Sep  7 07:36:03 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* initialize.c: Override the kernel's idea of default
		checkinterval from 0 (never) to 180 days.

Wed Aug 28 03:20:03 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* namei.c (ext2fs_namei_follow): New function which follows
		symbolic link (if any) at the target.

Tue Aug 27 01:48:43 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* inode.c (ext2fs_read_inode, ext2fs_write_inode): Add support
		for shortcut function fs->read_inode() and fs->write_inode().
		Added inode_cache to reduce CPU time spent in doing
		byte swapping.

	* swapfs.c (ext2fs_swap_super): Swap the new fields in a V2
	 	superblock.

	* namei.c (ext2fs_follow_link): New function.
		(ext2fs_namei): Extended to have support for chasing
 		symbolic links.  ext2fs_namei() still returns an inode
 		which is a symbolic link.  Symbolic links are only chased
 		while resolving the containing directory.  To chase
 		symbolic links of the final result, use
 		ext2fs_follow_link().

Mon Aug 26 23:46:07 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* ext2_err.et.in: Added new error code EXT2_ET_SYMLINK_LOOP.

	* bitops.h (ext2fs_set_bit, ext2fs_celar_bit): Use asm inlines
		provided by Pete A. Zaitcev (zaitcev@lab.sun.mcst.ru).

Thu Aug 22 00:40:18 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* initialize.c (ext2fs_initialize): On systems where the byte
		order is not i386 compatible, set the swap_byte flag.

	* inode.c (inocpy_with_swap): Check to see if inode contains a
		fast symlink before swapping the inode block fields.  This
		required adding a new argument to inocpy_with_swap to
		determine whether the mode field is in host order or not.

Wed Aug 21 00:45:42 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* bitops.h (ext2fs_set_bit, ext2fs_clear_bit, ext2fs_test_bit): On
		the sparc, if EXT2_STD_BITOPS set, use the standard
		i386-compatible bitmask operations, instead on the
		non-standard native bitmask operators.

Fri Aug  9 11:11:35 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* block.c (ext2fs_block_iterate): Cause block iterator to return
		the HURD translator block (along with everything else).
		If the flag BLOCK_FLAG_DATA_ONLY is passed to the block
		iterator, then don't return any meta data blocks
		(including the HURD translator).

Wed Jul 17 17:13:34 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* gen_uuid.c: New file, which generates DCE-compatible UUIDs.

	* uuid.c: New file, containing UUID utility functions.

Tue Jul 16 10:19:16 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* ext2fs.h: Add a definition of the "real" ext2 superblock.

Fri May 24 14:54:55 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* ext2fs.h: Fix erroneous ino_t type used in block_bitmap type.

Sun May 19 15:39:03 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* openfs.c (ext2fs_open): If the blocksize in the superblock is
		zero, return the error EXT2_ET_CORRUPT_SUPERBLOCK, since
		that's a basic value that must be correct for the rest of
		the library to work.

	* ext2_err.et.in (EXT2_ET_CORRUPT_SUPERBLOCK): Added new error
	 	code.

Thu May 16 11:12:30 1996  Theodore Ts'o  <tytso@rsts-11.mit.edu>

	* Release of E2fsprogs version 1.04

Wed Mar 27 00:33:40 1996    <tytso@rsts-11.mit.edu>

	* Release of E2fsprogs version 1.03

Tue Mar 26 12:06:32 1996    <tytso@rsts-11.mit.edu>

	* bitops.h (ext2fs_set_bit, ext2fs_clear_bit, ext2fs_test_bit):
		Change the m68k bit numbering for bitmasks to match with
		the bit numbering used by all other ext2 implementations.

Thu Mar  7 03:37:00 1996    <tytso@rsts-11.mit.edu>

	* inode.c (ext2fs_get_next_inode, ext2fs_close_inode_scan, 
	ext2fs_open_inode_scan): Support dynamically-sized inodes.

Wed Mar  6 12:26:29 1996    <tytso@rsts-11.mit.edu>

	* inode.c (ext2fs_read_inode, ext2fs_write_inode): Support
		dynamically-sized inodes.

	* openfs.c (ext2fs_open): Allow dynamic revision filesystem to be
	        loaded.

Tue Mar  5 03:49:37 1996    <tytso@rsts-11.mit.edu>

	* initialize.c (ext2fs_initialize): Catch an error condition where
		the passed in size is *really* too small.

	* alloc.c (ext2fs_new_inode): 
	* ext2fs.h (EXT2_FIRST_INODE): Add support for dynamic revision to
		get first inode.

Wed Feb 21 15:56:17 1996    <tytso@rsts-11.mit.edu>

	* getsize.c (ext2fs_get_device_size): Open the device read-only
		when trying to determine its size.

Wed Jan 31 11:06:08 1996    <tytso@rsts-11.mit.edu>

	* Release of E2fsprogs version 1.02

Sat Dec  9 09:57:50 1995    <tytso@rsts-11.mit.edu>

	* rw_bitops.c (ext2fs_write_block_bitmap):
	* bitops.c (ext2fs_test_bit, ext2fs_clear_bit, ext2fs_set_bit):
	* bitops.h (ext2fs_test_bit, ext2fs_clear_bit, ext2fs_set_bit):
		Rename {test,set,clear}_bit to ext2fs_{test,set,clear}_bit, 
		to avoid conflicts with with kernel include files.  Also
		rename ADDR and CONST_ADDR to EXT2FS_ADDR and
		EXT2FS_CONST_ADDR. 

Thu Oct 26 12:09:16 1995    <tytso@rsts-11.mit.edu>

	* ext2_err.et: Updated message in EXT2_ET_BASE to say version 0.5c

	* swapfs.c (ext2fs_swap_super): Put an #ifdef check around
		s_def_resuid and s_def_resgid for backwards compatibility.

Fri Oct 20 23:33:31 1995    <tytso@rsts-11.mit.edu>

	* bitops.h: Added #ifdef's for Sparc.

Wed Sep  6 22:14:46 1995    <tytso@rsts-11.mit.edu>

	* getsize.c: #include <sys/ioctl.h> under Linux to pick up ioctl()
	        declaration

	* closefs.c: #include <string.h> to pick up memset() declaration

Mon Sep  4 21:45:29 1995  Remy Card  <card@bbj>

	* Makefile.in: Added support for BSD shared libraries.

	* initialize.c (ext2fs_initialize): Correctly set the s_creator_os
		flag.

Mon Sep  4 09:55:30 1995    <tytso@rsts-11.mit.edu>

	* unix_io.c (unix_open): Add a double check; if the passed in name
		is NULL, return EXT2_ET_BAD_DEVICE_NAME.

	* ext2_err.et (EXT2_ET_BAD_DEVICE_NAME): Added new error code

Wed Aug 16 15:44:10 1995    <tytso@rsts-11.mit.edu>

	* inode.c (ext2fs_check_directory): Use LINUX_S_ISDIR instead of
		S_ISDIR.

Tue Aug 15 13:08:36 1995    <tytso@rsts-11.mit.edu>

	* getsize.c (ext2fs_get_device_size): Add support for reading the
		partition size from a BSD disk label.

Thu Aug 10 09:33:26 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>

	* getsize.c (ext2fs_get_device_size): New function that determins
		the size of a device.  Used by mke2fs and e2fsck.

Sat Aug 12 03:09:54 1995  Remy Card  <card@bbj>

	* Makefile.in (install): Install static libraries in $(ulibdir)
		(/usr/lib on Linux) instead of $(libdir) (/lib on Linux).

Wed Aug  9 17:04:23 1995  Theodore Y. Ts'o  <tytso@dcl>

	* bitmaps.c (ext2fs_free_inode_bitmap, ext2fs_free_block_bitmap):
		Move these functions to freefs.c.

	* closefs.c (ext2fs_flush): If swapping blocks, clear the group
		descriptors shadow memory to keep purify quiet.  (This
		also has the nice benefit that the unused portion of the
		shadow descriptors are zeroed out.)

	* dirblock.c (ext2fs_write_dir_block): We need to use
		dirent->rec_len *before* it's byteswapped to find the
		location of the next directory structure!

	* alloc.c (ext2fs_new_inode): Fix bug which could potentially
		cause ext2fs_new_inode to loop infinitely if we're trying
		to allocate an inode in group #0 and there are no free
		inodes at all in the system.

	* closefs.c: #include <errno.h> if it exists.

Sun Aug  6 13:27:50 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>

	* ext2fs.h (BLOCK_FLAG_HOLE): Added new definition for
		BLOCK_FLAG_APPEND.  Added documentation for the block
		interator flags.

Sat Aug  5 11:44:05 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>

	* Makefile.in (DLL_INSTALL_DIR, ELF_INSTALL_DIR): Set the
		installation directories correctly.

Tue Jul 18 09:27:38 1995    <tytso@rsx-11.mit.edu>

	* namei.c (process_dir_block): 
	* mkdir.c (ext2fs_mkdir): 
	* expanddir.c (expand_dir_proc): Use ext2fs_{read,write}_dir_block
		to read/write the directory block.

	* dirblock.c (ext2fs_read_dir_block), ext2fs_write_dir_block): New
		file containing functions for reading and writing
		directory blocks (byte swapping if necesssary)

	* block.c (block_iterate_ind, block_iterate_dind, 
		block_iterate_tind): Byte swap the block addresses if
		EXT2_SWAP_BYTES is set (and swap them back before writing
		them out.)

	* inode.c (inocpy_with_swap): New function.
	(ext2fs_get_next_inode, ext2fs_read_inode, ext2fs_write_inode):
		Call inocpy_with_swap if EXT2_SWAP_BYTES if set.

	* closefs.c (ext2fs_flush): If EXT2_SWAP_BYTES is set, then swap
		the superblock and group descriptors before writing it out.

	* openfs.c (ext2fs_open): If the magic number is byte-swapped,
		then set the EXT2_SWAP_BYTES and byte-swap the superblock
		and group descriptors.

	* swapfs.c (ext2fs_swap_super, ext2fs_swap_group_desc): New functions
		to desp ext2 filesystem structures.

	* bitops.c (set_bit, clear_bit, test_bit): Use modifications
		supplied by Pete A. Zaitcev so that the C language
		versions of these functions are more portable.  They will
		now work on both little and big endian systems, and the
		assumption that 32-bit integers are used is gone.

	* bitops.h (ext2_swab16, ext2_swab32): Added new functions for
		doing byte swapping.

	* ext2fs.h (EXT2_SWAP_BYTES): Add new flag which indicates that
		byte swapping should take place.

Sun Jul 16 06:21:43 1995    <tytso@rsx-11.mit.edu>

	* Makefile.in, cmp_bitmaps.c (ext2fs_compare_block_bitmap_end,
	        ext2fs_compare_inode_bitmap_end): Added new file
		containing routines to compare bitmaps.

	* ext2_err.et (EXT2_ET_NEQ_BLOCK_BITMAP, EXT2_ET_NEQ_INODE_BITMAP): 
		Added new error codes.

Sat Jul 15 04:23:37 1995    <tytso@rsx-11.mit.edu>

	* inode.c (ext2fs_get_next_inode): Don't check scan->inode_buffer;
		if the magic number is correct, it will be allocated.

Fri Jul 14 19:02:59 1995    <tytso@rsx-11.mit.edu>

	* block.c (block_iterate_ind, block_iterate_dind, 
		block_iterate_tind): Don't recompute block_nr each loop;
		just increment it!  Factor check of BLOCK_FLAG_APPEND out
		of the loop.  Factor mask of BLOCK_CHANGED into changed
		variable out of the loop.  (block_iterate_ind, in
		particular, gets called a lot, so every little
		optimization helps.)

Thu Jul 13 08:02:45 1995    <tytso@rsx-11.mit.edu>

	* block.c (block_iterate_ind, block_iterate_dind, 
		block_iterate_tind): Precompute limit of loop to speed up
		block_iterate_ind and company.

	* bitops.h (ext2fs_fast_mark_block_bitmap, 
		ext2fs_fast_unmark_block_bitmap, ext2fs_fast_test_block_bitmap,
		ext2fs_fast_mark_inode_bitmap, ext2fs_fast_unmark_inode_bitmap,
		ext2fs_fast_test_inode_bitmap): Add fast version of these
		functions, which don't do range checking.

	* bitops.h (ext2fs_get_block_bitmap_start, 
		ext2fs_get_inode_bitmap_start, ext2fs_get_block_bitmap_end,
		ext2fs_get_inode_bitmap_end): Add new accessor functions
		which return the start and end points of the bitmaps.

Tue Jul 11 18:59:41 1995    <tytso@rsx-11.mit.edu>

	* llseek.c (ext2_llseek): If the offset is small enough, use lseek
		instead of llseek.  The errno if the offset is too large
		and lseek is not supported should be EINVAL, not -EINVAL.

Thu Jun 15 23:43:02 1995  Remy Card  <card@bbj>

	* Makefile.in: Added support for ELF shared libraries.
		Fixed typos in the compilation rules.
		(distclean): Added Makefile.

	* llseek.c (llseek): New function, if llseek() does not exist in the
	C library.
	(ext2_llseek): Changed to call llseek().

Mon Jun 12 08:29:07 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>

	* ext2fs.h: Use __u32 to define blk_t, instead of unsigned long.

Sun Jun 11 15:02:54 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>

	* mkdir.c (ext2fs_mkdir): Use LINUX_S_IFDIR instead of S_IFDIR.

	* ext2fs.h (LINUX_S_IFDIR): Define a linux specific versions of
		the S_*, which are normally defined in <sys/stat.h>.  This
		allows us to compile e2fsprogs on a non-Linux system,
		which may have a different value for S_IFDIR.

Sat Jun 10 23:47:05 1995  Theodore Y. Ts'o  <tytso@lurch.mit.edu>

	* bitops.c (clear_bit, set_bit): Remove calls to cli() and sti();
		this is a user-mode application!

Thu Jun  8 13:13:22 1995  Miles Bader  <miles@churchy.gnu.ai.mit.edu>

	* llseek.c: Put the include of <linux/unistd.h> inside the #ifdef
	__linux__ so that non-linux systems won't see it.

	* alloc.c: Include <errno.h> if possible.
	* badblocks.c: Ditto.
	* bb_inode.c: Ditto.
	* bitmaps.c: Ditto.
	* block.c: Ditto.
	* expanddir.c: Ditto.
	* get_pathname.c: Ditto.
	* initialize.c: Ditto.
	* inode.c: Ditto.
	* llseek.c: Ditto.
	* mkdir.c: Ditto.
	* namei.c: Ditto.
	* newdir.c: Ditto.
	* openfs.c: Ditto.
	* rw_bitmaps.c: Ditto.
	* unix_io.c: Ditto.

	* Makefile.in: Rewritten to conform to GNU coding standards and
	support separate compilation directories.

Thu May 11 04:13:12 1995    <tytso@rsx-11.mit.edu>

	* initialize.c (ext2fs_initialize): Don't allow more than one
		bitmaps's worth of inodes in a group.

Sat Mar 11 14:07:11 1995  Theodore Y. Ts'o  <tytso@localhost>

	* llseek.c (ext2_llseek): Added error checking to the llseek()
		compat code to protect against overflow.  This only
		applies to 1.0 and early 1.1 kernels, which don't support
		the llseek() system call.

Thu Nov 24 16:29:00 1994  Theodore Y. Ts'o  (tytso@rt-11)

	* unix_io.c (unix_open): Initialize the read_error and write_error
		io_channel pointers to be null.

	* bb_inode.c (clear_bad_block_proc): If an illegal block number is
		found, clear it but don't try to update the filesystem
		accounting information, since that's hopeless anyway.

	* block.c (bloblock_iterate_ind, bloblock_iterate_dind,
	bloblock_iterate_tind): Check to see if the indirect blocks are
		valid before trying to read them.

	* ext2_err.et (EXT2_ET_BAD_IND_BLOCK, EX2_ET_BAD_DIND_BLOCK,
	EXT2_ET_BAD_TIND_BLOCK): Add new error codes.

	* bitops.h (ext2fs_mark_block_bitmap, ext2fs_unmark_block_bitmap,
	ext2fs_test_block_bitmap, ext2fs_mark_inode_bitmap,
	ext2fs_unmark_inode_bitmap, ext2fs_test_inode_bitmap):  If an
		illegal block or inode number is passed in, return instead
		of trying to test, set, or clear the bit.

Mon Nov  7 21:32:33 1994  Remy Card  <card@bbj>

	* Makefile: Added a dummy install target in case shared libraries
		are not built.

Mon Oct 24 14:11:44 1994    (tytso@rsx-11)

	* bitmaps.c (ext2fs_allocate_block_bitmap): Fix calculation of how
		the real last block of the bitmap should be calculated.

Wed Sep  7 10:05:36 1994    (tytso@rsx-11)

	* bitmaps.c (ext2fs_fudge_inode_bitmap_end, 
		ext2fs_fudge_block_bitmap_end, ext2fs_clear_inode_bitmap,
		ext2fs_clear_block_bitmap, ext2fs_free_inode_bitmap,
		ext2fs_free_block_bitmap): Add magic number checking for
		the inode and block bitmaps.

	* bitmaps.c (ext2fs_allocate_block_bitmap): Fix to set the correct
		magic number for a block bitmap instead of an inode bitmap.

	* inode.c (ext2fs_close_inode_scan, ext2fs_get_next_inode):  Add
		magic number checking for the inode_scan structure.

	* badblocks.c (badblocks_list_free, badblocks_list_add, 
		badblocks_list_test, badblocks_list_iterate_begin,
		badblocks_list_iterate, badblocks_list_iterate_end): Add
		magic number checking for the badblocks_list and
		badblocks_iterate structures.

	* ext2_err.et (EXT2_ET_MAGIC_UNIX_IO_CHANNEL): 
	* unix_io.c (unix_open, unix_close, unix_set_blksize, unix_read_blk,
		unix_write_blk, unix_flush): Add magic number checking
		both for io_channel structure and unix_private_data
		structure.

	* openfs.c (ext2fs_open): Add check for io_manager structure's
		magic number.

	* rw_bitmaps.c (ext2fs_write_inode_bitmap, ext2fs_write_block_bitmap,
		ext2fs_read_inode_bitmap, ext2fs_read_block_bitmap,
		ext2fs_read_bitmaps, ext2fs_write_bitmaps): 
	* read_bb.c (ext2fs_read_bb_inode): 
	* read_bb_file.c (ext2fs_read_bb_FILE): 
	* newdir.c (ext2fs_new_dir_block): 
	* namei.c (ext2fs_dir_iterate, ext2fs_lookup, ext2fs_namei): 
	* link.c (ext2fs_link, ext2fs_unlink): 
	* inode.c (ext2fs_open_inode_scan, ext2fs_read_inode,
		ext2fs_write_inode, ext2fs_get_blocks, 
		ext2fs_check_directory): 
	* get_pathname.c (ext2fs_get_pathname): 
	* expanddir.c (ext2fs_expand_dir): 
	* block.c (ext2fs_block_iterate): 
	* bitmaps.c (ext2fs_allocate_inode_bitmap, 
		ext2fs_allocate_block_bitmap): 
	* bb_inode.c (ext2fs_update_bb_inode): 
	* alloc.c (ext2fs_new_inode,ext2fs_new_block,ext2fs_get_free_blocks): 
	* check_desc.c (ext2fs_check_desc): 
	* closefs.c (ext2fs_close, ext2fs_flush): 
	* freefs.c (ext2fs_free): Add check for ext2_filsys magic number.

	* Makefile:
	* ext2fs.h:
	* openfs.c:
	* check_desc.c (ext2fs_check_desc): Move ext2fs_check_desc from
	openfs.c into its own file.

	* ext2fs.h (EXT2_CHECK_MAGIC): Added macro for checking for
	structure magic numbers.

	* closefs.c (ext2fs_flush): Folded in Remy Card's changes to clear
	the EXT2_VALID_FS flag in the backup superblock blocks, so that if
	someone uses the -b option to specify the use of the backup
	superblock --- this usually means that the main superblock is
	toast.  :-)

	* ext2fs.h: 
	* ext2_err.et (EXT2_ET_REV_TOO_HIGH): 
	* openfs.c (ext2fs_open): Folded in Remy Card's changes to add a
	revision level to the superblock.

Sun Aug 21 00:50:08 1994  Theodore Y. Ts'o  (tytso@rt-11)

	* ext2fs.h:
	* bitmaps.c:
	* bitops.c
	* bitops.h:
	* openfs.c:
	* initialize.c: Completely revamped the inode and block bitmap
	structures, so that they can be better chance of being extensible
	in a shared library.  They are now their own type, instead of
	being a char *.  Also, the function signatures of
	ext2fs_test_block_bitmap, ext2fs_mark_block_bitmap,
	ext2fs_unmark_block_bitmap, ext2fs_test_inode_bitmap,
	ext2fs_mark_inode_bitmap, and ext2fs_unmark_inode_bitmap were
	changed to eliminate the ext2_filsys argument, since it is no
	longer necessary.

Wed Aug 17 21:46:44 1994  Remy Card  (card@bbj)

	* unix_io.c (unix_read_blk and unix_write_blk): use the llseek
	system call if available.

	* llseek.c: new file.  This is the stub calling the llseek system
	call which allows supports for 2GB+ file systems.

	* initialize.c (ext2fs_initialize): Ext2fs_initialize now stores
	the creator operating system.

Wed Aug 17 10:03:24 1994  Theodore Y. Ts'o  (tytso@rt-11)

	* initialize.c (ext2fs_initialize): Ext2fs_initialize now sets up
	the group descriptor statistics in addition to everything else.
	This relieves mke2fs of the responsibility of doing it.

	* bitops.c, bitops.h: Add assembly inline functions for the 68000.
	Added a new #define, _EXT2_HAVE_ASM_BITOPS_ to control whether or
	not the generic C function equivalents should be included or not.

	* openfs.c (ext2fs_open): If a superblock is specified, then use
	the backup group descriptors that go along with this superblock,
	instead of using the primary group descriptors.  This allows
	e2fsck to recover filesystems where the primary group descriptors
	have been trashed.


