+Mon Oct 7 08:22:31 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
+
+ * Makefile.in (all): Don't run "make check" by default. User
+ should manually run "make check" if they wish to test
+ things out.
+
+Thu Sep 12 15:23:07 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
+
+ * Release of E2fsprogs version 1.05
+
Sat Aug 31 10:55:45 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
* configure.in (AC_CHECK_FUNCS): Add fchown to list of functions
make
-5) Install the programs
+5) Check to make sure the installation built correctly:
+
+ make check
+
+6) Install the programs
Run `make install'
-6) Install the include files and libraries
+7) Install the include files and libraries
You can run `make install-libs' to install the include files and
libraries. Please note that this installation is not needed for the
programs using the libraries or if you want to compile other program
using these libraries (like the 4.4BSD dump and restore port).
-7) Remove any pre-formatted man pages.
+8) Remove any pre-formatted man pages.
Some distributions will have pre-formatted manual pages which
will always be displayed in preference to newer man pages in /usr/man.
see the correct manual pages. The shell script in
install-utils/remove_preformat_manpages may be helpful in doing so.
-8) Make sure your /etc/fstab file is correct.
+9) Make sure your /etc/fstab file is correct.
Some distributions install an /etc/fstab which is missing the
fifth and sixth field of filesystem entry, which are the dump
SUBS= include/linux/types.h
-all:: $(SUBS) libs progs check
+all:: $(SUBS) libs progs
progs: $(SUBS) all-progs-recursive
libs: $(SUBS) all-libs-recursive
+
+E2fsprogs 1.06 (October 7, 1996)
+================================
+
+Fixed serious bug in e2fsck: if the block descriptors are bad, don't
+smash the backup copies in ext2fs_close(). (The problem was that when
+e2fsck -p discovered the problem, while it was closing the filesystem
+and exiting, it was also blowing away the backup superblocks on the
+disk, which was less than friendly.) We now make it the case that we
+only write out the backup superblock and the back block descriptors if
+the filesystem is completely free from problems.
+
+Fixed a bug in block_interate in the lib/ext2fs library which caused
+e2fsck to fail on GNU Hurd-created filesystems.
+
+Add support for Linux/FT's bootloader, which actually uses
+EXT2_BOOT_LOADER, and sets its mode bits which caused e2fsck to want
+to clear the inode.
+
+Add support for the "A" (no atime update) attribute. (Note: this
+attribute is not yet in production kernels.)
+
+The test suite is not automatically run when doing a "make all" from
+the top level directory. Users should manually run "make check" if
+they wish to run the test suite.
+
+Upon a preenhalt(), make the printed message more explicit that
+running e2fsck "MANAULLY" means without the -p or -a options.
+
+In e2fsck, if a disconnected inode is zero-length, offer to clear it
+instead of offering to connect it to lost+found.
+
+In e2fsck, if a filesystem was just unmounted uncleanly, and needs
+e2fsck to be run over it, change e2fsck to explicitly display this
+fact.
+
+For dumpe2fs and e2fsck, cause the -V option to print out which
+version of the ext2fs library is actually getting used. (This will
+help detect mismatches of using a 1.06 utility with a 1.05 library,
+etc.)
+
+Programmers' notes:
+-------------------
+
+EXT2_SWAP_BYTES was changed to EXT2_FLAG_SWAP_BYTES, which better fits
+the naming convention.
+
+In ext2fs_initialize(), make sure the description for the inode bitmap
+is correctly initialize.
+
+Fixed minor type typo in ext2fs_allocate_generic_bitmap();
+
E2fsprogs 1.05 (September 7, 1996)
==================================
+Thu Sep 12 15:23:07 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
+
+ * Release of E2fsprogs version 1.05
+
Mon Sep 9 23:05:11 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
* debugfs.c (unlink_file_by_name): If unlinking a file with a
+Mon Oct 7 00:45:30 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
+
+ * e2fsck.c (main): Print out the version number of the shared
+ library when using the -V option.
+
+ * swapfs.c (swap_filesys): Change EXT2_SWAP to EXT2_FLAG_SWAP for
+ consistency's sake.
+
+ * e2fsck.c (main): By setting EXT2_FLAG_MASTER_SB_ONLY, only write
+ out the backup superblocks when we know we have a valid
+ filesystem.
+
+Tue Oct 1 22:00:29 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
+
+ * util.c (preenhalt): Make it explicit on preenhalt that running
+ e2fsck manually means without the -a or -p flag.
+
+Fri Sep 27 14:41:08 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
+
+ * pass1.c (pass1): Add support for the EXT2_BOOT_LOADER inode.
+ (Linux/FT actually sets the mode bits, so we have to
+ handle it specially.)
+
+ * e2fsck.c (check_if_skip): Print a message if the filesystem is
+ just dirty, so that the user knows that it's about to be
+ checked (since this will take a while).
+
+Mon Sep 16 17:00:01 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
+
+ * pass4.c: If a disconnected inode is zero-length, prompt to
+ delete it instead of connecting it to lost+found.
+
+Thu Sep 12 15:23:07 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
+
+ * Release of E2fsprogs version 1.05
+
Fri Aug 30 20:24:30 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
* pass4.c (pass4): If the user refuses to connect an unattached
.br
\ 128\ \-\ Shared library error
.br
-.SH BUGS
+.SH REPORTING BUGS
Almost any piece of software will have bugs. If you manage to find a
filesystem which causes
.B e2fsck
time(0) >= (fs->super->s_lastcheck +
fs->super->s_checkinterval))
reason = "has gone too long without being checked";
+ else if ((fs->super->s_state & EXT2_VALID_FS) == 0)
+ reason = "was not cleanly unmounted";
if (reason) {
printf("%s %s, check forced.\n", device_name, reason);
return;
}
- if (fs->super->s_state & EXT2_VALID_FS) {
- printf("%s: clean, %d/%d files, %d/%d blocks\n", device_name,
- fs->super->s_inodes_count - fs->super->s_free_inodes_count,
- fs->super->s_inodes_count,
- fs->super->s_blocks_count - fs->super->s_free_blocks_count,
- fs->super->s_blocks_count);
- ext2fs_close(fs);
- exit(FSCK_OK);
- }
+ printf("%s: clean, %d/%d files, %d/%d blocks\n", device_name,
+ fs->super->s_inodes_count - fs->super->s_free_inodes_count,
+ fs->super->s_inodes_count,
+ fs->super->s_blocks_count - fs->super->s_free_blocks_count,
+ fs->super->s_blocks_count);
+ ext2fs_close(fs);
+ exit(FSCK_OK);
}
#define PATH_SET "PATH=/sbin"
E2FSPROGS_VERSION, E2FSPROGS_DATE,
EXT2FS_VERSION, EXT2FS_DATE);
- if (show_version_only)
+ if (show_version_only) {
+ fprintf(stderr, "\tUsing %s\n",
+ error_message(EXT2_ET_BASE));
exit(0);
+ }
check_mount();
if (superblock && rwflag)
ext2fs_mark_super_dirty(fs);
+ /*
+ * Don't overwrite the backup superblock and block
+ * descriptors, until we're sure the filesystem is OK....
+ */
+ fs->flags |= EXT2_FLAG_MASTER_SB_ONLY;
+
ehandler_init(fs->io);
invalid_inode_bitmap = allocate_memory(sizeof(int) *
test_disk(fs);
if (normalize_swapfs) {
- if ((fs->flags & EXT2_SWAP_BYTES) == ext2fs_native_flag()) {
+ if ((fs->flags & EXT2_FLAG_SWAP_BYTES) ==
+ ext2fs_native_flag()) {
fprintf(stderr, "%s: Filesystem byte order "
"already normalized.\n", device_name);
fatal_error(0);
exit_value = FSCK_REBOOT;
}
}
- if (!ext2fs_test_valid(fs))
+ if (ext2fs_test_valid(fs))
+ fs->flags &= ~EXT2_FLAG_MASTER_SB_ONLY;
+ else
exit_value = FSCK_UNCORRECTED;
if (rwflag) {
if (ext2fs_test_valid(fs)) {
ext2fs_unmark_valid(fs);
}
}
+ if (ino == EXT2_BOOT_LOADER_INO) {
+ ext2fs_mark_inode_bitmap(inode_used_map, ino);
+ check_blocks(fs, ino, &inode, block_buf);
+ goto next;
+ }
if ((ino != EXT2_ROOT_INO) &&
(ino < EXT2_FIRST_INODE(fs->super))) {
ext2fs_mark_inode_bitmap(inode_used_map, ino);
* get called with BLOCK_FLAG_HOLE
*/
printf("process_block() called with blk == 0, "
- "inode %lu???", p->ino);
+ "blockcnt=%d, inode %lu???\n",
+ blockcnt, p->ino);
return 0;
}
if (blockcnt < 0)
#include "e2fsck.h"
+/*
+ * This routine is called when an inode is not connected to the
+ * directory tree.
+ *
+ * This subroutine returns 1 then the caller shouldn't bother with the
+ * rest of the pass 4 tests.
+ */
+int disconnect_inode(ext2_filsys fs, ino_t i)
+{
+ struct ext2_inode inode;
+
+ e2fsck_read_inode(fs, i, &inode, "pass4: disconnect_inode");
+ if (!inode.i_blocks && (LINUX_S_ISREG(inode.i_mode) ||
+ LINUX_S_ISDIR(inode.i_mode))) {
+ /*
+ * This is a zero-length file; prompt to delete it...
+ */
+ printf("Unattached zero-length inode %lu\n", i);
+ if (ask("Clear", 1)) {
+ inode_link_info[i] = 0;
+ inode.i_links_count = 0;
+ inode.i_dtime = time(0);
+ e2fsck_write_inode(fs, i, &inode,
+ "disconnect_inode");
+ /*
+ * Fix up the bitmaps...
+ */
+ read_bitmaps(fs);
+ ext2fs_unmark_inode_bitmap(inode_used_map, i);
+ ext2fs_unmark_inode_bitmap(inode_dir_map, i);
+ ext2fs_unmark_inode_bitmap(fs->inode_map, i);
+ ext2fs_mark_ib_dirty(fs);
+ return 0;
+ }
+ }
+
+ /*
+ * Prompt to reconnect.
+ */
+ printf("Unattached inode %lu\n", i);
+ preenhalt(fs);
+ if (ask("Connect to /lost+found", 1)) {
+ if (reconnect_file(fs, i))
+ ext2fs_unmark_valid(fs);
+ } else {
+ /*
+ * If we don't attach the inode, then skip the
+ * i_links_test since there's no point in trying to
+ * force i_links_count to zero.
+ */
+ ext2fs_unmark_valid(fs);
+ return 1;
+ }
+ return 0;
+}
+
+
void pass4(ext2_filsys fs)
{
ino_t i;
if (!(ext2fs_test_inode_bitmap(inode_used_map, i)))
continue;
if (inode_count[i] == 0) {
- /*
- * Inode isn't attached to the filesystem;
- * prompt to reconnect.
- */
- printf("Unattached inode %lu\n", i);
- preenhalt(fs);
- if (ask("Connect to /lost+found", 1)) {
- if (reconnect_file(fs, i))
- ext2fs_unmark_valid(fs);
- } else {
- /*
- * If we don't attach the inode, then
- * skip the i_links_test since there's
- * no point in trying to force
- * i_links_count to zero.
- */
- ext2fs_unmark_valid(fs);
+ if (disconnect_inode(fs, i))
continue;
- }
}
if (inode_count[i] != inode_link_info[i]) {
e2fsck_read_inode(fs, i, &inode, "pass4");
}
inode = (struct ext2_inode *) buf;
for (i=0; i < fs->super->s_inodes_per_group; i++, ino++) {
- if (fs->flags & EXT2_SWAP_BYTES_READ)
+ if (fs->flags & EXT2_FLAG_SWAP_BYTES_READ)
ext2fs_swap_inode(fs, inode, inode, 0);
stashed_ino = ino;
stashed_inode = inode;
LINUX_S_ISDIR(inode->i_mode))
swap_inode_blocks(fs, ino, block_buf, inode);
- if (fs->flags & EXT2_SWAP_BYTES_WRITE)
+ if (fs->flags & EXT2_FLAG_SWAP_BYTES_WRITE)
ext2fs_swap_inode(fs, inode, inode, 1);
inode++;
}
"byte-swap it.\n", device_name);
fatal_error(0);
}
- if (fs->flags & EXT2_SWAP_BYTES) {
- fs->flags &= ~(EXT2_SWAP_BYTES|EXT2_SWAP_BYTES_WRITE);
- fs->flags |= EXT2_SWAP_BYTES_READ;
+ if (fs->flags & EXT2_FLAG_SWAP_BYTES) {
+ fs->flags &= ~(EXT2_FLAG_SWAP_BYTES|
+ EXT2_FLAG_SWAP_BYTES_WRITE);
+ fs->flags |= EXT2_FLAG_SWAP_BYTES_READ;
} else {
- fs->flags &= ~EXT2_SWAP_BYTES_READ;
- fs->flags |= EXT2_SWAP_BYTES_WRITE;
+ fs->flags &= ~EXT2_FLAG_SWAP_BYTES_READ;
+ fs->flags |= EXT2_FLAG_SWAP_BYTES_WRITE;
}
swap_inodes(fs);
- if (fs->flags & EXT2_SWAP_BYTES_WRITE)
- fs->flags |= EXT2_SWAP_BYTES;
- fs->flags &= ~(EXT2_SWAP_BYTES_READ|EXT2_SWAP_BYTES_WRITE);
+ if (fs->flags & EXT2_FLAG_SWAP_BYTES_WRITE)
+ fs->flags |= EXT2_FLAG_SWAP_BYTES;
+ fs->flags &= ~(EXT2_FLAG_SWAP_BYTES_READ|
+ EXT2_FLAG_SWAP_BYTES_WRITE);
ext2fs_flush(fs);
if (tflag > 1) {
{
if (!preen)
return;
- fprintf(stderr, "\n\n%s: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.\n",
+ fprintf(stderr, "\n\n%s: UNEXPECTED INCONSISTENCY; "
+ "RUN fsck MANUALLY.\n\t(i.e., without -a or -p options)\n",
device_name);
if (fs != NULL) {
fs->super->s_state |= EXT2_ERROR_FS;
Description: Tools for the second extended (ext2) filesystem
Name: e2fsprogs
-Version: 1.05
+Version: 1.06
Release: 0
Copyright: GPL
Group: Utilities/System
-Source: tsx-11.mit.edu:/pub/linux/packages/ext2fs/e2fsprogs-1.05.tar.gz
+Source: tsx-11.mit.edu:/pub/linux/packages/ext2fs/e2fsprogs-1.06.tar.gz
%package devel
Description: e2fs static libs and headers
+Thu Sep 12 15:23:07 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
+
+ * Release of E2fsprogs version 1.05
+
Thu May 16 11:12:30 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
* Release of E2fsprogs version 1.04
+Thu Sep 12 15:23:07 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
+
+ * Release of E2fsprogs version 1.05
+
Thu May 16 11:12:30 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
* Release of E2fsprogs version 1.04
+Thu Sep 12 15:23:07 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
+
+ * Release of E2fsprogs version 1.05
Wed Aug 28 15:20:26 1996 Miles Bader <miles@gnu.ai.mit.edu>
* Makefile.elf-lib (installdirs-elf-lib): Renamed from installdirs
+Sun Sep 22 16:20:12 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
+
+ * pf.c: Add support for the 'A' (no atime) flag.
+
+Thu Sep 12 15:23:07 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
+
+ * Release of E2fsprogs version 1.05
+
Sat Sep 7 14:48:35 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
* ls.c (interval_string): Pretty print the check interval.
#ifdef EXT2_NODUMP_FL
EXT2_NODUMP_FL,
#endif
+#ifdef EXT2_NOATIME_FL
+ EXT2_NOATIME_FL,
+#endif
0};
static const char * short_flags[] = {
#ifdef EXT2_NODUMP_FL
"d",
#endif
+#ifdef EXT2_NOATIME_FL
+ "A",
+#endif
NULL};
static const char * long_flags[] = {
#ifdef EXT2_NODUMP_FL
"No_Dump, ",
#endif
+#ifdef EXT2_NOATIME_FL
+ "No_Atime, ",
+#endif
NULL};
void print_flags (FILE * f, unsigned long flags, int long_format)
+Thu Sep 12 15:23:07 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
+
+ * Release of E2fsprogs version 1.05
+
Thu May 16 11:12:30 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
* Release of E2fsprogs version 1.04
+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
const char *descr,
ext2fs_generic_bitmap *ret)
{
- ext2fs_inode_bitmap bitmap;
+ ext2fs_generic_bitmap bitmap;
int size;
bitmap = malloc(sizeof(struct ext2fs_struct_generic_bitmap));
return ret;
}
limit = ctx->fs->blocksize >> 2;
- if ((ctx->fs->flags & EXT2_SWAP_BYTES) ||
- (ctx->fs->flags & EXT2_SWAP_BYTES_READ)) {
+ if ((ctx->fs->flags & EXT2_FLAG_SWAP_BYTES) ||
+ (ctx->fs->flags & EXT2_FLAG_SWAP_BYTES_READ)) {
block_nr = (blk_t *) ctx->ind_buf;
for (i = 0; i < limit; i++, block_nr++)
*block_nr = ext2fs_swab32(*block_nr);
}
}
if (changed & BLOCK_CHANGED) {
- if ((ctx->fs->flags & EXT2_SWAP_BYTES) ||
- (ctx->fs->flags & EXT2_SWAP_BYTES_WRITE)) {
+ if ((ctx->fs->flags & EXT2_FLAG_SWAP_BYTES) ||
+ (ctx->fs->flags & EXT2_FLAG_SWAP_BYTES_WRITE)) {
block_nr = (blk_t *) ctx->ind_buf;
for (i = 0; i < limit; i++, block_nr++)
*block_nr = ext2fs_swab32(*block_nr);
return ret;
}
limit = ctx->fs->blocksize >> 2;
- if ((ctx->fs->flags & EXT2_SWAP_BYTES) ||
- (ctx->fs->flags & EXT2_SWAP_BYTES_READ)) {
+ if ((ctx->fs->flags & EXT2_FLAG_SWAP_BYTES) ||
+ (ctx->fs->flags & EXT2_FLAG_SWAP_BYTES_READ)) {
block_nr = (blk_t *) ctx->dind_buf;
for (i = 0; i < limit; i++, block_nr++)
*block_nr = ext2fs_swab32(*block_nr);
}
}
if (changed & BLOCK_CHANGED) {
- if ((ctx->fs->flags & EXT2_SWAP_BYTES) ||
- (ctx->fs->flags & EXT2_SWAP_BYTES_WRITE)) {
+ if ((ctx->fs->flags & EXT2_FLAG_SWAP_BYTES) ||
+ (ctx->fs->flags & EXT2_FLAG_SWAP_BYTES_WRITE)) {
block_nr = (blk_t *) ctx->dind_buf;
for (i = 0; i < limit; i++, block_nr++)
*block_nr = ext2fs_swab32(*block_nr);
return ret;
}
limit = ctx->fs->blocksize >> 2;
- if ((ctx->fs->flags & EXT2_SWAP_BYTES) ||
- (ctx->fs->flags & EXT2_SWAP_BYTES_READ)) {
+ if ((ctx->fs->flags & EXT2_FLAG_SWAP_BYTES) ||
+ (ctx->fs->flags & EXT2_FLAG_SWAP_BYTES_READ)) {
block_nr = (blk_t *) ctx->tind_buf;
for (i = 0; i < limit; i++, block_nr++)
*block_nr = ext2fs_swab32(*block_nr);
}
}
if (changed & BLOCK_CHANGED) {
- if ((ctx->fs->flags & EXT2_SWAP_BYTES) ||
- (ctx->fs->flags & EXT2_SWAP_BYTES_WRITE)) {
+ if ((ctx->fs->flags & EXT2_FLAG_SWAP_BYTES) ||
+ (ctx->fs->flags & EXT2_FLAG_SWAP_BYTES_WRITE)) {
block_nr = (blk_t *) ctx->tind_buf;
for (i = 0; i < limit; i++, block_nr++)
*block_nr = ext2fs_swab32(*block_nr);
* Iterate over the HURD translator block (if present)
*/
if ((fs->super->s_creator_os == EXT2_OS_HURD) &&
- !(flags & BLOCK_FLAG_DATA_ONLY) &&
- inode.osd1.hurd1.h_i_translator) {
+ !(flags & BLOCK_FLAG_DATA_ONLY)) {
ctx.errcode = ext2fs_read_inode(fs, ino, &inode);
if (ctx.errcode)
goto abort;
got_inode = 1;
- ret |= (*func)(fs, &inode.osd1.hurd1.h_i_translator,
- BLOCK_COUNT_TRANSLATOR, private);
- if (ret & BLOCK_ABORT)
- goto abort;
+ if (inode.osd1.hurd1.h_i_translator) {
+ ret |= (*func)(fs, &inode.osd1.hurd1.h_i_translator,
+ BLOCK_COUNT_TRANSLATOR, private);
+ if (ret & BLOCK_ABORT)
+ goto abort;
+ }
}
/*
errcode_t ext2fs_flush(ext2_filsys fs)
{
- int i,j;
+ int i,j,maxgroup;
int group_block;
errcode_t retval;
char *group_ptr;
fs_state = fs->super->s_state;
fs->super->s_wtime = time(NULL);
- if (fs->flags & EXT2_SWAP_BYTES) {
+ if (fs->flags & EXT2_FLAG_SWAP_BYTES) {
retval = ENOMEM;
if (!(super_shadow = malloc(SUPERBLOCK_SIZE)))
goto errout;
* we exit.)
*/
fs->super->s_state &= ~EXT2_VALID_FS;
- if (fs->flags & EXT2_SWAP_BYTES) {
+ if (fs->flags & EXT2_FLAG_SWAP_BYTES) {
*super_shadow = *fs->super;
ext2fs_swap_super(super_shadow);
}
* superblocks and group descriptors.
*/
group_block = fs->super->s_first_data_block;
- for (i = 0; i < fs->group_desc_count; i++) {
+ maxgroup = (fs->flags & EXT2_FLAG_MASTER_SB_ONLY) ? 1 :
+ fs->group_desc_count;
+ for (i = 0; i < maxgroup; i++) {
if (i !=0 ) {
retval = io_channel_write_blk(fs->io, group_block,
-SUPERBLOCK_SIZE,
retval = 0;
errout:
fs->super->s_state = fs_state;
- if (fs->flags & EXT2_SWAP_BYTES) {
+ if (fs->flags & EXT2_FLAG_SWAP_BYTES) {
if (super_shadow)
free(super_shadow);
if (group_shadow)
retval = io_channel_read_blk(fs->io, block, 1, buf);
if (retval)
return retval;
- if ((fs->flags & (EXT2_SWAP_BYTES|EXT2_SWAP_BYTES_READ)) == 0)
+ if ((fs->flags & (EXT2_FLAG_SWAP_BYTES|
+ EXT2_FLAG_SWAP_BYTES_READ)) == 0)
return 0;
p = buf;
end = (char *) buf + fs->blocksize;
char *buf = 0;
struct ext2_dir_entry *dirent;
- if ((fs->flags & EXT2_SWAP_BYTES) ||
- (fs->flags & EXT2_SWAP_BYTES_WRITE)) {
+ if ((fs->flags & EXT2_FLAG_SWAP_BYTES) ||
+ (fs->flags & EXT2_FLAG_SWAP_BYTES_WRITE)) {
write_buf = buf = malloc(fs->blocksize);
if (!buf)
return ENOMEM;
#define EXT2_FLAG_VALID 0x08
#define EXT2_FLAG_IB_DIRTY 0x10
#define EXT2_FLAG_BB_DIRTY 0x20
-#define EXT2_SWAP_BYTES 0x40
-#define EXT2_SWAP_BYTES_READ 0x80
-#define EXT2_SWAP_BYTES_WRITE 0x100
+#define EXT2_FLAG_SWAP_BYTES 0x40
+#define EXT2_FLAG_SWAP_BYTES_READ 0x80
+#define EXT2_FLAG_SWAP_BYTES_WRITE 0x100
+#define EXT2_FLAG_MASTER_SB_ONLY 0x200
/*
* Special flag in the ext2 inode i_flag field that means that this is
goto cleanup;
sprintf(buf, "inode bitmap for %s", fs->device_name);
- retval = ext2fs_allocate_inode_bitmap(fs, 0, &fs->inode_map);
+ retval = ext2fs_allocate_inode_bitmap(fs, buf, &fs->inode_map);
if (retval)
goto cleanup;
scan->ptr += scan->inode_size - extra_bytes;
scan->bytes_left -= scan->inode_size - extra_bytes;
- if ((scan->fs->flags & EXT2_SWAP_BYTES) ||
- (scan->fs->flags & EXT2_SWAP_BYTES_READ))
+ if ((scan->fs->flags & EXT2_FLAG_SWAP_BYTES) ||
+ (scan->fs->flags & EXT2_FLAG_SWAP_BYTES_READ))
ext2fs_swap_inode(scan->fs, inode,
(struct ext2_inode *) scan->temp_buffer, 0);
else
*inode = *((struct ext2_inode *) scan->temp_buffer);
} else {
- if ((scan->fs->flags & EXT2_SWAP_BYTES) ||
- (scan->fs->flags & EXT2_SWAP_BYTES_READ))
+ if ((scan->fs->flags & EXT2_FLAG_SWAP_BYTES) ||
+ (scan->fs->flags & EXT2_FLAG_SWAP_BYTES_READ))
ext2fs_swap_inode(scan->fs, inode,
(struct ext2_inode *) scan->ptr, 0);
else
} else
memcpy((char *) inode, ptr, length);
- if ((fs->flags & EXT2_SWAP_BYTES) ||
- (fs->flags & EXT2_SWAP_BYTES_READ))
+ if ((fs->flags & EXT2_FLAG_SWAP_BYTES) ||
+ (fs->flags & EXT2_FLAG_SWAP_BYTES_READ))
ext2fs_swap_inode(fs, inode, inode, 0);
/* Update the inode cache */
inode_buffer_size = fs->blocksize;
inode_buffer_block = 0;
}
- if ((fs->flags & EXT2_SWAP_BYTES) ||
- (fs->flags & EXT2_SWAP_BYTES_WRITE))
+ if ((fs->flags & EXT2_FLAG_SWAP_BYTES) ||
+ (fs->flags & EXT2_FLAG_SWAP_BYTES_WRITE))
ext2fs_swap_inode(fs, &temp_inode, inode, 1);
else
memcpy(&temp_inode, inode, sizeof(struct ext2_inode));
{
if (i386_byteorder())
return 0;
- return EXT2_SWAP_BYTES;
+ return EXT2_FLAG_SWAP_BYTES;
}
goto cleanup;
if ((fs->super->s_magic == ext2fs_swab16(EXT2_SUPER_MAGIC)) ||
- (fs->flags & EXT2_SWAP_BYTES)) {
- fs->flags |= EXT2_SWAP_BYTES;
+ (fs->flags & EXT2_FLAG_SWAP_BYTES)) {
+ fs->flags |= EXT2_FLAG_SWAP_BYTES;
ext2fs_swap_super(fs->super);
}
if (retval)
goto cleanup;
group_block++;
- if (fs->flags & EXT2_SWAP_BYTES) {
+ if (fs->flags & EXT2_FLAG_SWAP_BYTES) {
gdp = (struct ext2_group_desc *) dest;
groups_per_block = fs->blocksize /
sizeof(struct ext2_group_desc);
+Thu Sep 12 15:23:07 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
+
+ * Release of E2fsprogs version 1.05
+
Fri Aug 30 22:36:48 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
* invocation.c (ss_create_invocation): Change function prototype
* $Locker$
*
* $Log$
- * Revision 1.8 1997/04/29 14:52:31 tytso
- * Checked in e2fsprogs 1.05
+ * Revision 1.9 1997/04/29 15:29:28 tytso
+ * Checked in e2fsprogs 1.06
*
* Revision 1.1 1993/06/03 12:31:25 tytso
* Initial revision
+Thu Sep 12 15:23:07 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
+
+ * Release of E2fsprogs version 1.05
+
Tue Aug 27 16:50:43 1996 Miles Bader <miles@gnu.ai.mit.edu>
* uuid/gen_uuid.c [HAVE_NET_IF_H] <net/if.h>: Include guarded.
+Mon Oct 7 00:56:24 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
+
+ * chattr.1.in: Documented the 'A' (noatime) attribute.
+
+ * dumpe2fs.c (main): Change EXT2_SWAP to EXT2_FLAG_SWAP for
+ consistency's sake.
+
+Sun Sep 22 16:18:47 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
+
+ * chattr.c (decode_arg): Add support for the 'A' (noatime) flag.
+
+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:34:11 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
* tune2fs.c (main): Add support for new option -C, which sets the
When a file with the `u' attribute set is deleted, its contents is saved.
This allows the user to ask for its undeletion.
+
+When a file with the 'A' attribute set is modified, its atime record is
+not modified. This avoid a certain amount of disk I/O for laptop
+systems.
.SH AUTHOR
.B chattr
has been written by Remy Card <card@masi.ibp.fr>, the developer and maintainer
of the ext2 fs.
.SH BUGS AND LIMITATIONS
As of ext2 fs 0.5a, the `c' and `u' attribute are not honoured by the kernel
-code.
+code. As of the Linux 2.0 kernel, the 'A' attribute is not yet supported by
+the kernel code. (The noatime code is still in testing.)
.PP
These attributes will be implemented in a future ext2 fs version.
.SH AVAILABILITY
rem = 1;
break;
#endif
+#ifdef EXT2_NOATIME_FL
+ case 'A':
+ rf |= EXT2_NOATIME_FL;
+ rem = 1;
+ break;
+#endif
case 'c':
rf |= EXT2_COMPR_FL;
rem = 1;
af |= EXT2_APPEND_FL;
break;
#endif
+#ifdef EXT2_NOATIME_FL
+ case 'A':
+ af |= EXT2_NOATIME_FL;
+ break;
+#endif
case 'c':
af |= EXT2_COMPR_FL;
break;
sf |= EXT2_APPEND_FL;
break;
#endif
+#ifdef EXT2_NOATIME_FL
+ case 'A':
+ sf |= EXT2_NOATIME_FL;
+ break;
+#endif
case 'c':
sf |= EXT2_COMPR_FL;
break;
dumpe2fs \- dump filesystem information
.SH SYNOPSIS
.B dumpe2fs
+[
+.B -b
+]
+[
+.B -V
+]
device
.SH DESCRIPTION
.BI dumpe2fs
is similar to Berkeley's
.BI dumpfs
program for the BSD Fast File System.
+.SH OPTIONS
+.TP
+.I -b
+print the blocks which are reserved as bad in the filesystem.
+.TP
+.I -V
+print the version number of dumpe2fs and exit.
.SH BUGS
You need to know the physical filesystem structure to understand the
output.
static volatile void usage (void)
{
- fprintf (stderr, "usage: %s device\n", program_name);
+ fprintf (stderr, "usage: %s [-bV] device\n", program_name);
exit (1);
}
int big_endian;
char c;
+ initialize_ext2_error_table();
fprintf (stderr, "dumpe2fs %s, %s for EXT2 FS %s, %s\n",
E2FSPROGS_VERSION, E2FSPROGS_DATE,
EXT2FS_VERSION, EXT2FS_DATE);
if (argc && *argv)
program_name = *argv;
- while ((c = getopt (argc, argv, "b")) != EOF) {
+ while ((c = getopt (argc, argv, "bV")) != EOF) {
switch (c) {
case 'b':
print_badblocks++;
break;
+ case 'V':
+ /* Print version number and exit */
+ fprintf(stderr, "\tUsing %s\n",
+ error_message(EXT2_ET_BASE));
+ exit(0);
default:
usage ();
}
if (optind > argc - 1)
usage ();
device_name = argv[optind++];
- initialize_ext2_error_table();
retval = ext2fs_open (device_name, 0, 0, 0, unix_io_manager, &fs);
if (retval) {
com_err (program_name, retval, "while trying to open %s",
ext2fs_close (fs);
exit (1);
}
- big_endian = ((fs->flags & EXT2_SWAP_BYTES) != 0);
+ big_endian = ((fs->flags & EXT2_FLAG_SWAP_BYTES) != 0);
if (!i386_byteorder())
big_endian = !big_endian;
if (big_endian)
+Mon Oct 7 07:52:41 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
+
+ * f_preen: New test case which makes sure that e2fsck -p won't
+ bash the backup superblock in case of a corrupted master
+ superblock.
+
+ * test_script.in: Let the environment variable TEST_CONFIG to
+ override the location of the test_config file. Move
+ definition of TMP_DIR to test_config.
+
+ * test_config: Add new defnitions for mke2fs, dumpe2fs, tune2fs,
+ lsattr, and chattr.
+
+Thu Sep 12 15:23:07 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
+
+ * Release of E2fsprogs version 1.05
+
Mon Sep 9 23:09:47 1996 Theodore Ts'o <tytso@rsts-11.mit.edu>
* Makefile.in (check): Add explicit ./ to test_script invokation,
-Filesystem did not have a UUID; generating one.
-
Pass 1: Checking inodes, blocks, and sizes
-Deleted inode 2 has zero dtime.
-Set dtime? yes
+Root inode is not a directory. Clear? yes
Pass 2: Checking directory structure
-Entry '..' in /lost+found (11) has deleted/unused inode 2.
+Entry '..' in ??? (11) has deleted/unused inode 2.
Clear? yes
Pass 3: Checking directory connectivity
Inode 100 has ref count 2, expecting 1.
Set i_nlinks to count? yes
+Unattached inode 101
+Connect to /lost+found? yes
+
+Inode 101 has ref count 2, expecting 1.
+Set i_nlinks to count? yes
+
Unattached inode 102
Connect to /lost+found? yes
Inode 104 has ref count 2, expecting 1.
Set i_nlinks to count? yes
+Unattached inode 105
+Connect to /lost+found? yes
+
+Inode 105 has ref count 2, expecting 1.
+Set i_nlinks to count? yes
+
+Unattached inode 106
+Connect to /lost+found? yes
+
+Inode 106 has ref count 2, expecting 1.
+Set i_nlinks to count? yes
+
+Unattached inode 107
+Connect to /lost+found? yes
+
+Inode 107 has ref count 2, expecting 1.
+Set i_nlinks to count? yes
+
+Unattached inode 108
+Connect to /lost+found? yes
+
+Inode 108 has ref count 2, expecting 1.
+Set i_nlinks to count? yes
+
+Unattached inode 109
+Connect to /lost+found? yes
+
+Inode 109 has ref count 2, expecting 1.
+Set i_nlinks to count? yes
+
+Unattached inode 110
+Connect to /lost+found? yes
+
+Inode 110 has ref count 2, expecting 1.
+Set i_nlinks to count? yes
+
+Unattached inode 111
+Connect to /lost+found? yes
+
+Inode 111 has ref count 2, expecting 1.
+Set i_nlinks to count? yes
+
Pass 5: Checking group summary information
Fix summary information? yes
-Block bitmap differences: -33. FIXED
-Free blocks count wrong for group 0 (68, counted=67). FIXED
-Free blocks count wrong (68, counted=67). FIXED
-Free inodes count wrong for group #0 (1, counted=0). FIXED
+Free blocks count wrong for group 0 (56, counted=55). FIXED
+Free blocks count wrong (56, counted=55). FIXED
+Free inodes count wrong for group #0 (89, counted=88). FIXED
Directories count wrong for group #0 (2, counted=3). FIXED
-Free inodes count wrong (1, counted=0). FIXED
+Free inodes count wrong (89, counted=88). FIXED
test_filesys: ***** FILE SYSTEM WAS MODIFIED *****
-test_filesys: 104/104 files (0.0% non-contiguous), 33/100 blocks
+test_filesys: 112/200 files (0.0% non-contiguous), 145/200 blocks
Exit status is 1
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
-test_filesys: 104/104 files (0.0% non-contiguous), 33/100 blocks
+test_filesys: 112/200 files (0.9% non-contiguous), 145/200 blocks
Exit status is 0
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
-Unattached inode 15
-Connect to /lost+found? yes
-
-Inode 15 has ref count 2, expecting 1.
-Set i_nlinks to count? yes
+Unattached zero-length inode 15
+Clear? yes
Pass 5: Checking group summary information
-Fix summary information? yes
-
-Inode bitmap differences: +15. FIXED
-Free inodes count wrong for group #0 (17, counted=16). FIXED
-Free inodes count wrong (17, counted=16). FIXED
test_filesys: ***** FILE SYSTEM WAS MODIFIED *****
-test_filesys: 16/32 files (0.0% non-contiguous), 25/100 blocks
+test_filesys: 15/32 files (0.0% non-contiguous), 25/100 blocks
Exit status is 1
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
-test_filesys: 16/32 files (0.0% non-contiguous), 25/100 blocks
+test_filesys: 15/32 files (0.0% non-contiguous), 25/100 blocks
Exit status is 0
Inode 12 has ref count 4, expecting 3.
Set i_nlinks to count? yes
-Unattached inode 15
-Connect to /lost+found? yes
-
-Inode 15 has ref count 2, expecting 1.
-Set i_nlinks to count? yes
+Unattached zero-length inode 15
+Clear? yes
Pass 5: Checking group summary information
Fix summary information? yes
Free blocks count wrong for group 0 (75, counted=74). FIXED
Free blocks count wrong (75, counted=74). FIXED
-Inode bitmap differences: +15. FIXED
-Free inodes count wrong for group #0 (17, counted=15). FIXED
+Free inodes count wrong for group #0 (17, counted=16). FIXED
Directories count wrong for group #0 (4, counted=5). FIXED
-Free inodes count wrong (17, counted=15). FIXED
+Free inodes count wrong (17, counted=16). FIXED
test_filesys: ***** FILE SYSTEM WAS MODIFIED *****
-test_filesys: 17/32 files (0.0% non-contiguous), 26/100 blocks
+test_filesys: 16/32 files (0.0% non-contiguous), 26/100 blocks
Exit status is 1
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
-test_filesys: 17/32 files (0.0% non-contiguous), 26/100 blocks
+test_filesys: 16/32 files (0.0% non-contiguous), 26/100 blocks
Exit status is 0
--- /dev/null
+which require relocation, or one part of the inode table
+which must be moved, you may wish to try running e2fsck
+the '-b 8193' option first. The problem may lie only with
+the primary block group descriptor, and the backup block
+group descriptor may be OK.
+
+Block bitmap for group 0 is not in group. (block 0)
+
+
+test_filesys: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY.
+ (i.e., without -a or -p options)
+Exit status is 4
--- /dev/null
+Pass 1: Checking inodes, blocks, and sizes
+Pass 2: Checking directory structure
+Pass 3: Checking directory connectivity
+Pass 4: Checking reference counts
+Pass 5: Checking group summary information
+Fix summary information? yes
+
+Free blocks count wrong for group 0 (8042, counted=7614). FIXED
+Free blocks count wrong for group 1 (170, counted=169). FIXED
+Free blocks count wrong (8212, counted=7783). FIXED
+Free inodes count wrong for group #0 (1053, counted=1052). FIXED
+Free inodes count wrong for group #1 (1064, counted=1063). FIXED
+Directories count wrong for group #1 (0, counted=1). FIXED
+Free inodes count wrong (2117, counted=2115). FIXED
+
+test_filesys: ***** FILE SYSTEM WAS MODIFIED *****
+test_filesys: 13/2128 files (0.0% non-contiguous), 717/8500 blocks
+Exit status is 1
--- /dev/null
+preen should't destroy backup superblocks
--- /dev/null
+FSCK_OPT=-pf
+SECOND_FSCK_OPT=-yfb8193
+
+. $cmd_dir/run_e2fsck
#
FSCK=../e2fsck/e2fsck
+MKE2FS=../misc/mke2fs
+DUMPE2FS=../misc/dumpe2fs
+TUNE2FS=../misc/tune2fs
+CHATTR=../misc/chattr
+LSATTR=../misc/lsattr
DEBUGFS=../debugfs/debugfs
LD_LIBRARY_PATH=../lib:../lib/ext2fs:../lib/e2p:../lib/et:../lib/ss
+TMPFILE=./test.img
export LD_LIBRARY_PATH
TZ=GMT
export TZ
fi
cmd_dir=$SRCDIR
-TMPFILE=./test.img
-. $SRCDIR/test_config
+if test "$TEST_CONFIG"x = x; then
+ TEST_CONFIG=$SRCDIR/test_config
+fi
+
+. $TEST_CONFIG
for test_dir in $TESTS
do
* under the GNU Public License.
*/
-#define E2FSPROGS_VERSION "1.05"
-#define E2FSPROGS_DATE "9-Sep-96"
+#define E2FSPROGS_VERSION "1.06"
+#define E2FSPROGS_DATE "7-Oct-96"