Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
/*
|
|
|
|
* e2fsck.c - superblock checks
|
2008-08-28 07:07:54 +04:00
|
|
|
*
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
* Copyright (C) 1993, 1994, 1995, 1996, 1997 Theodore Ts'o.
|
|
|
|
*
|
|
|
|
* %Begin-Header%
|
|
|
|
* This file may be redistributed under the terms of the GNU Public
|
|
|
|
* License.
|
|
|
|
* %End-Header%
|
|
|
|
*/
|
|
|
|
|
2011-09-19 01:34:37 +04:00
|
|
|
#include "config.h"
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
#ifdef HAVE_ERRNO_H
|
|
|
|
#include <errno.h>
|
|
|
|
#endif
|
|
|
|
|
1998-02-01 15:58:48 +03:00
|
|
|
#ifndef EXT2_SKIP_UUID
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
#include "uuid/uuid.h"
|
1998-02-01 15:58:48 +03:00
|
|
|
#endif
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
#include "e2fsck.h"
|
|
|
|
#include "problem.h"
|
|
|
|
|
|
|
|
#define MIN_CHECK 1
|
|
|
|
#define MAX_CHECK 2
|
2013-12-24 01:03:41 +04:00
|
|
|
#define LOG2_CHECK 4
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
|
|
|
|
static void check_super_value(e2fsck_t ctx, const char *descr,
|
|
|
|
unsigned long value, int flags,
|
1998-09-03 05:26:03 +04:00
|
|
|
unsigned long min_val, unsigned long max_val)
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
{
|
|
|
|
struct problem_context pctx;
|
|
|
|
|
2014-02-18 21:12:32 +04:00
|
|
|
if ((flags & MIN_CHECK && value < min_val) ||
|
|
|
|
(flags & MAX_CHECK && value > max_val) ||
|
|
|
|
(flags & LOG2_CHECK && (value & (value - 1)) != 0)) {
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
clear_problem_context(&pctx);
|
|
|
|
pctx.num = value;
|
|
|
|
pctx.str = descr;
|
|
|
|
fix_problem(ctx, PR_0_MISC_CORRUPT_SUPER, &pctx);
|
1997-11-03 22:42:40 +03:00
|
|
|
ctx->flags |= E2F_FLAG_ABORT; /* never get here! */
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
/*
|
|
|
|
* helper function to release an inode
|
|
|
|
*/
|
|
|
|
struct process_block_struct {
|
2000-10-25 05:38:50 +04:00
|
|
|
e2fsck_t ctx;
|
|
|
|
char *buf;
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
struct problem_context *pctx;
|
2000-10-25 05:38:50 +04:00
|
|
|
int truncating;
|
|
|
|
int truncate_offset;
|
2003-12-07 09:28:50 +03:00
|
|
|
e2_blkcnt_t truncate_block;
|
2000-10-25 05:38:50 +04:00
|
|
|
int truncated_blocks;
|
|
|
|
int abort;
|
|
|
|
errcode_t errcode;
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
static int release_inode_block(ext2_filsys fs,
|
2010-06-14 01:00:00 +04:00
|
|
|
blk64_t *block_nr,
|
2003-12-07 09:28:50 +03:00
|
|
|
e2_blkcnt_t blockcnt,
|
2010-06-14 01:00:00 +04:00
|
|
|
blk64_t ref_blk EXT2FS_ATTR((unused)),
|
2003-12-07 09:28:50 +03:00
|
|
|
int ref_offset EXT2FS_ATTR((unused)),
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
void *priv_data)
|
|
|
|
{
|
|
|
|
struct process_block_struct *pb;
|
2000-10-25 05:38:50 +04:00
|
|
|
e2fsck_t ctx;
|
|
|
|
struct problem_context *pctx;
|
2010-06-14 01:00:00 +04:00
|
|
|
blk64_t blk = *block_nr;
|
2000-10-25 05:38:50 +04:00
|
|
|
int retval = 0;
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
|
|
|
|
pb = (struct process_block_struct *) priv_data;
|
|
|
|
ctx = pb->ctx;
|
|
|
|
pctx = pb->pctx;
|
|
|
|
|
|
|
|
pctx->blk = blk;
|
|
|
|
pctx->blkcount = blockcnt;
|
|
|
|
|
2015-04-12 15:22:07 +03:00
|
|
|
if (blk == 0)
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
return 0;
|
|
|
|
|
|
|
|
if ((blk < fs->super->s_first_data_block) ||
|
2009-09-08 04:46:34 +04:00
|
|
|
(blk >= ext2fs_blocks_count(fs->super))) {
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
fix_problem(ctx, PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, pctx);
|
2001-01-06 08:55:58 +03:00
|
|
|
return_abort:
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
pb->abort = 1;
|
|
|
|
return BLOCK_ABORT;
|
|
|
|
}
|
|
|
|
|
2009-08-23 06:29:02 +04:00
|
|
|
if (!ext2fs_test_block_bitmap2(fs->block_map, blk)) {
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
fix_problem(ctx, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK, pctx);
|
2001-01-06 08:55:58 +03:00
|
|
|
goto return_abort;
|
2000-10-25 05:38:50 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* If we are deleting an orphan, then we leave the fields alone.
|
|
|
|
* If we are truncating an orphan, then update the inode fields
|
|
|
|
* and clean up any partial block data.
|
|
|
|
*/
|
|
|
|
if (pb->truncating) {
|
|
|
|
/*
|
|
|
|
* We only remove indirect blocks if they are
|
|
|
|
* completely empty.
|
|
|
|
*/
|
|
|
|
if (blockcnt < 0) {
|
|
|
|
int i, limit;
|
2001-01-06 08:55:58 +03:00
|
|
|
blk_t *bp;
|
2008-08-28 07:07:54 +04:00
|
|
|
|
2009-09-08 05:14:24 +04:00
|
|
|
pb->errcode = io_channel_read_blk64(fs->io, blk, 1,
|
2000-10-25 05:38:50 +04:00
|
|
|
pb->buf);
|
|
|
|
if (pb->errcode)
|
2001-01-06 08:55:58 +03:00
|
|
|
goto return_abort;
|
2000-10-25 05:38:50 +04:00
|
|
|
|
|
|
|
limit = fs->blocksize >> 2;
|
2001-01-06 08:55:58 +03:00
|
|
|
for (i = 0, bp = (blk_t *) pb->buf;
|
|
|
|
i < limit; i++, bp++)
|
|
|
|
if (*bp)
|
2000-10-25 05:38:50 +04:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
/*
|
|
|
|
* We don't remove direct blocks until we've reached
|
|
|
|
* the truncation block.
|
|
|
|
*/
|
|
|
|
if (blockcnt >= 0 && blockcnt < pb->truncate_block)
|
|
|
|
return 0;
|
|
|
|
/*
|
|
|
|
* If part of the last block needs truncating, we do
|
|
|
|
* it here.
|
|
|
|
*/
|
|
|
|
if ((blockcnt == pb->truncate_block) && pb->truncate_offset) {
|
2009-09-08 05:14:24 +04:00
|
|
|
pb->errcode = io_channel_read_blk64(fs->io, blk, 1,
|
2000-10-25 05:38:50 +04:00
|
|
|
pb->buf);
|
|
|
|
if (pb->errcode)
|
2001-01-06 08:55:58 +03:00
|
|
|
goto return_abort;
|
2000-10-25 05:38:50 +04:00
|
|
|
memset(pb->buf + pb->truncate_offset, 0,
|
|
|
|
fs->blocksize - pb->truncate_offset);
|
2009-09-08 05:14:24 +04:00
|
|
|
pb->errcode = io_channel_write_blk64(fs->io, blk, 1,
|
2000-10-25 05:38:50 +04:00
|
|
|
pb->buf);
|
|
|
|
if (pb->errcode)
|
2001-01-06 08:55:58 +03:00
|
|
|
goto return_abort;
|
2000-10-25 05:38:50 +04:00
|
|
|
}
|
|
|
|
pb->truncated_blocks++;
|
|
|
|
*block_nr = 0;
|
|
|
|
retval |= BLOCK_CHANGED;
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
}
|
2008-08-28 07:07:54 +04:00
|
|
|
|
2009-10-26 04:46:58 +03:00
|
|
|
ext2fs_block_alloc_stats2(fs, blk, -1);
|
2012-06-12 06:18:25 +04:00
|
|
|
ctx->free_blocks++;
|
2000-10-25 05:38:50 +04:00
|
|
|
return retval;
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
}
|
2008-08-28 07:07:54 +04:00
|
|
|
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
/*
|
|
|
|
* This function releases an inode. Returns 1 if an inconsistency was
|
2000-10-25 05:38:50 +04:00
|
|
|
* found. If the inode has a link count, then it is being truncated and
|
|
|
|
* not deleted.
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
*/
|
Many files:
dirinfo.c, e2fsck.h, emptydir.c, iscan.c, jfs_user.h, journal.c,
message.c, pass1.c, pass1b.c, pass2.c, pass3.c, pass4.c, pass5.c,
problem.h, scantest.c, super.c, swapfs.c: Change ino_t to ext2_ino_t.
2001-01-11 18:12:14 +03:00
|
|
|
static int release_inode_blocks(e2fsck_t ctx, ext2_ino_t ino,
|
2001-01-13 00:05:57 +03:00
|
|
|
struct ext2_inode *inode, char *block_buf,
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
struct problem_context *pctx)
|
|
|
|
{
|
2002-08-17 18:19:44 +04:00
|
|
|
struct process_block_struct pb;
|
2000-10-25 05:38:50 +04:00
|
|
|
ext2_filsys fs = ctx->fs;
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
errcode_t retval;
|
2002-08-17 18:19:44 +04:00
|
|
|
__u32 count;
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
|
2011-10-17 04:29:00 +04:00
|
|
|
if (!ext2fs_inode_has_valid_blocks2(fs, inode))
|
2001-06-23 04:35:38 +04:00
|
|
|
return 0;
|
|
|
|
|
2000-10-25 05:38:50 +04:00
|
|
|
pb.buf = block_buf + 3 * ctx->fs->blocksize;
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
pb.ctx = ctx;
|
|
|
|
pb.abort = 0;
|
2000-10-25 05:38:50 +04:00
|
|
|
pb.errcode = 0;
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
pb.pctx = pctx;
|
2000-10-25 05:38:50 +04:00
|
|
|
if (inode->i_links_count) {
|
|
|
|
pb.truncating = 1;
|
2003-12-07 09:28:50 +03:00
|
|
|
pb.truncate_block = (e2_blkcnt_t)
|
2011-07-09 03:54:57 +04:00
|
|
|
((EXT2_I_SIZE(inode) + fs->blocksize - 1) /
|
2000-10-25 05:38:50 +04:00
|
|
|
fs->blocksize);
|
|
|
|
pb.truncate_offset = inode->i_size % fs->blocksize;
|
|
|
|
} else {
|
|
|
|
pb.truncating = 0;
|
|
|
|
pb.truncate_block = 0;
|
|
|
|
pb.truncate_offset = 0;
|
|
|
|
}
|
|
|
|
pb.truncated_blocks = 0;
|
2010-06-14 01:00:00 +04:00
|
|
|
retval = ext2fs_block_iterate3(fs, ino, BLOCK_FLAG_DEPTH_TRAVERSE,
|
2000-10-25 05:38:50 +04:00
|
|
|
block_buf, release_inode_block, &pb);
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
if (retval) {
|
2000-10-25 05:38:50 +04:00
|
|
|
com_err("release_inode_blocks", retval,
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
_("while calling ext2fs_block_iterate for inode %d"),
|
|
|
|
ino);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if (pb.abort)
|
|
|
|
return 1;
|
|
|
|
|
2000-10-25 05:38:50 +04:00
|
|
|
/* Refresh the inode since ext2fs_block_iterate may have changed it */
|
|
|
|
e2fsck_read_inode(ctx, ino, inode, "release_inode_blocks");
|
|
|
|
|
|
|
|
if (pb.truncated_blocks)
|
2008-04-09 19:39:11 +04:00
|
|
|
ext2fs_iblk_sub_blocks(fs, inode, pb.truncated_blocks);
|
2000-10-25 05:38:50 +04:00
|
|
|
|
2011-10-17 04:29:00 +04:00
|
|
|
if (ext2fs_file_acl_block(fs, inode)) {
|
2012-08-03 04:47:44 +04:00
|
|
|
retval = ext2fs_adjust_ea_refcount3(fs,
|
|
|
|
ext2fs_file_acl_block(fs, inode),
|
|
|
|
block_buf, -1, &count, ino);
|
2002-08-17 18:19:44 +04:00
|
|
|
if (retval == EXT2_ET_BAD_EA_BLOCK_NUM) {
|
|
|
|
retval = 0;
|
|
|
|
count = 1;
|
|
|
|
}
|
|
|
|
if (retval) {
|
|
|
|
com_err("release_inode_blocks", retval,
|
2010-06-14 01:00:00 +04:00
|
|
|
_("while calling ext2fs_adjust_ea_refcount2 for inode %d"),
|
2002-08-17 18:19:44 +04:00
|
|
|
ino);
|
|
|
|
return 1;
|
|
|
|
}
|
2012-06-12 06:18:25 +04:00
|
|
|
if (count == 0) {
|
2009-10-26 04:46:58 +03:00
|
|
|
ext2fs_block_alloc_stats2(fs,
|
2011-10-17 04:29:00 +04:00
|
|
|
ext2fs_file_acl_block(fs, inode), -1);
|
2012-06-12 06:18:25 +04:00
|
|
|
ctx->free_blocks++;
|
|
|
|
}
|
2011-10-17 04:29:00 +04:00
|
|
|
ext2fs_file_acl_block_set(fs, inode, 0);
|
2002-08-17 18:19:44 +04:00
|
|
|
}
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* This function releases all of the orphan inodes. It returns 1 if
|
|
|
|
* it hit some error, and 0 on success.
|
|
|
|
*/
|
|
|
|
static int release_orphan_inodes(e2fsck_t ctx)
|
|
|
|
{
|
|
|
|
ext2_filsys fs = ctx->fs;
|
Many files:
dirinfo.c, e2fsck.h, emptydir.c, iscan.c, jfs_user.h, journal.c,
message.c, pass1.c, pass1b.c, pass2.c, pass3.c, pass4.c, pass5.c,
problem.h, scantest.c, super.c, swapfs.c: Change ino_t to ext2_ino_t.
2001-01-11 18:12:14 +03:00
|
|
|
ext2_ino_t ino, next_ino;
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
struct ext2_inode inode;
|
|
|
|
struct problem_context pctx;
|
|
|
|
char *block_buf;
|
|
|
|
|
|
|
|
if ((ino = fs->super->s_last_orphan) == 0)
|
|
|
|
return 0;
|
|
|
|
|
2000-08-18 19:31:37 +04:00
|
|
|
/*
|
|
|
|
* Win or lose, we won't be using the head of the orphan inode
|
|
|
|
* list again.
|
|
|
|
*/
|
|
|
|
fs->super->s_last_orphan = 0;
|
|
|
|
ext2fs_mark_super_dirty(fs);
|
2001-08-13 18:58:41 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* If the filesystem contains errors, don't run the orphan
|
|
|
|
* list, since the orphan list can't be trusted; and we're
|
|
|
|
* going to be running a full e2fsck run anyway...
|
|
|
|
*/
|
|
|
|
if (fs->super->s_state & EXT2_ERROR_FS)
|
|
|
|
return 0;
|
2008-08-28 07:07:54 +04:00
|
|
|
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
if ((ino < EXT2_FIRST_INODE(fs->super)) ||
|
|
|
|
(ino > fs->super->s_inodes_count)) {
|
|
|
|
clear_problem_context(&pctx);
|
2001-01-06 08:55:58 +03:00
|
|
|
pctx.ino = ino;
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
fix_problem(ctx, PR_0_ORPHAN_ILLEGAL_HEAD_INODE, &pctx);
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2000-10-25 05:38:50 +04:00
|
|
|
block_buf = (char *) e2fsck_allocate_memory(ctx, fs->blocksize * 4,
|
2000-12-13 21:50:22 +03:00
|
|
|
"block iterate buffer");
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
e2fsck_read_bitmaps(ctx);
|
2008-08-28 07:07:54 +04:00
|
|
|
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
while (ino) {
|
2000-10-25 05:38:50 +04:00
|
|
|
e2fsck_read_inode(ctx, ino, &inode, "release_orphan_inodes");
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
clear_problem_context(&pctx);
|
ChangeLog, journal.c, message.c, problem.c, problem.h, super.c:
journal.c (e2fsck_journal_load): Fix **nasty** bug which caused
e2fsck_check_ext3_journal to smash the journal because
journal->j_transaction_sequence wasn't getting initialized.
journal.c: (recover_ext3_journal, e2fsck_run_ext3_journal): Move call
to e2fsck_clear_recover from recover_ext3_journal to after the
filesystem has been closed and reopened. Otherwise, the superblock in
the filesystem handle will probably be stale, and will overwrite the
newer version of the superblock written by the log recovery.
message.c (expand_inode_expression): Add support for %Iu and %Ig
problem.h (PR_0_CLEAR_ORPHAN_INODE): Add new problem code.
super.c (release_orphan_inodes, release_inode_block,
release_inode_blocks): Update the block group descriptor counts when
freeing the orphan inode. Use PR_0_CLEAR_ORPHAN_INODE to report when
we clear an orphan.
journal.c (e2fsck_run_ext3_journal): Fix a bug where we attempted to
reopen the filesystem using the device name instead of the filesystem
name.
2000-08-21 02:06:31 +04:00
|
|
|
pctx.ino = ino;
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
pctx.inode = &inode;
|
2001-05-09 10:03:58 +04:00
|
|
|
pctx.str = inode.i_links_count ? _("Truncating") :
|
|
|
|
_("Clearing");
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
|
2000-10-25 05:38:50 +04:00
|
|
|
fix_problem(ctx, PR_0_ORPHAN_CLEAR_INODE, &pctx);
|
ChangeLog, journal.c, message.c, problem.c, problem.h, super.c:
journal.c (e2fsck_journal_load): Fix **nasty** bug which caused
e2fsck_check_ext3_journal to smash the journal because
journal->j_transaction_sequence wasn't getting initialized.
journal.c: (recover_ext3_journal, e2fsck_run_ext3_journal): Move call
to e2fsck_clear_recover from recover_ext3_journal to after the
filesystem has been closed and reopened. Otherwise, the superblock in
the filesystem handle will probably be stale, and will overwrite the
newer version of the superblock written by the log recovery.
message.c (expand_inode_expression): Add support for %Iu and %Ig
problem.h (PR_0_CLEAR_ORPHAN_INODE): Add new problem code.
super.c (release_orphan_inodes, release_inode_block,
release_inode_blocks): Update the block group descriptor counts when
freeing the orphan inode. Use PR_0_CLEAR_ORPHAN_INODE to report when
we clear an orphan.
journal.c (e2fsck_run_ext3_journal): Fix a bug where we attempted to
reopen the filesystem using the device name instead of the filesystem
name.
2000-08-21 02:06:31 +04:00
|
|
|
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
next_ino = inode.i_dtime;
|
|
|
|
if (next_ino &&
|
2000-08-23 01:41:52 +04:00
|
|
|
((next_ino < EXT2_FIRST_INODE(fs->super)) ||
|
|
|
|
(next_ino > fs->super->s_inodes_count))) {
|
|
|
|
pctx.ino = next_ino;
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
fix_problem(ctx, PR_0_ORPHAN_ILLEGAL_INODE, &pctx);
|
2001-01-06 08:55:58 +03:00
|
|
|
goto return_abort;
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
}
|
|
|
|
|
2000-10-25 05:38:50 +04:00
|
|
|
if (release_inode_blocks(ctx, ino, &inode, block_buf, &pctx))
|
2001-01-06 08:55:58 +03:00
|
|
|
goto return_abort;
|
ChangeLog, journal.c, message.c, problem.c, problem.h, super.c:
journal.c (e2fsck_journal_load): Fix **nasty** bug which caused
e2fsck_check_ext3_journal to smash the journal because
journal->j_transaction_sequence wasn't getting initialized.
journal.c: (recover_ext3_journal, e2fsck_run_ext3_journal): Move call
to e2fsck_clear_recover from recover_ext3_journal to after the
filesystem has been closed and reopened. Otherwise, the superblock in
the filesystem handle will probably be stale, and will overwrite the
newer version of the superblock written by the log recovery.
message.c (expand_inode_expression): Add support for %Iu and %Ig
problem.h (PR_0_CLEAR_ORPHAN_INODE): Add new problem code.
super.c (release_orphan_inodes, release_inode_block,
release_inode_blocks): Update the block group descriptor counts when
freeing the orphan inode. Use PR_0_CLEAR_ORPHAN_INODE to report when
we clear an orphan.
journal.c (e2fsck_run_ext3_journal): Fix a bug where we attempted to
reopen the filesystem using the device name instead of the filesystem
name.
2000-08-21 02:06:31 +04:00
|
|
|
|
2000-10-25 05:38:50 +04:00
|
|
|
if (!inode.i_links_count) {
|
2002-08-17 18:19:44 +04:00
|
|
|
ext2fs_inode_alloc_stats2(fs, ino, -1,
|
|
|
|
LINUX_S_ISDIR(inode.i_mode));
|
2012-06-12 06:18:25 +04:00
|
|
|
ctx->free_inodes++;
|
2005-04-14 22:07:53 +04:00
|
|
|
inode.i_dtime = ctx->now;
|
2002-08-14 14:00:44 +04:00
|
|
|
} else {
|
|
|
|
inode.i_dtime = 0;
|
2000-10-25 05:38:50 +04:00
|
|
|
}
|
|
|
|
e2fsck_write_inode(ctx, ino, &inode, "delete_file");
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
ino = next_ino;
|
|
|
|
}
|
2003-08-01 17:41:07 +04:00
|
|
|
ext2fs_free_mem(&block_buf);
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
return 0;
|
2001-01-06 08:55:58 +03:00
|
|
|
return_abort:
|
2003-08-01 17:41:07 +04:00
|
|
|
ext2fs_free_mem(&block_buf);
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2004-12-24 09:42:22 +03:00
|
|
|
/*
|
|
|
|
* Check the resize inode to make sure it is sane. We check both for
|
|
|
|
* the case where on-line resizing is not enabled (in which case the
|
|
|
|
* resize inode should be cleared) as well as the case where on-line
|
|
|
|
* resizing is enabled.
|
|
|
|
*/
|
2009-04-23 08:39:06 +04:00
|
|
|
void check_resize_inode(e2fsck_t ctx)
|
2004-12-24 09:42:22 +03:00
|
|
|
{
|
|
|
|
ext2_filsys fs = ctx->fs;
|
|
|
|
struct ext2_inode inode;
|
|
|
|
struct problem_context pctx;
|
2006-11-15 07:38:17 +03:00
|
|
|
int i, gdt_off, ind_off;
|
|
|
|
dgrp_t j;
|
2013-12-03 06:49:24 +04:00
|
|
|
blk_t blk, pblk;
|
2013-01-03 22:42:38 +04:00
|
|
|
blk_t expect; /* for resize inode, which is 32-bit only */
|
2004-12-24 09:42:22 +03:00
|
|
|
__u32 *dind_buf = 0, *ind_buf;
|
|
|
|
errcode_t retval;
|
|
|
|
|
|
|
|
clear_problem_context(&pctx);
|
|
|
|
|
2008-08-28 07:07:54 +04:00
|
|
|
/*
|
|
|
|
* If the resize inode feature isn't set, then
|
2005-01-28 19:45:28 +03:00
|
|
|
* s_reserved_gdt_blocks must be zero.
|
2004-12-24 09:42:22 +03:00
|
|
|
*/
|
2015-10-24 07:43:19 +03:00
|
|
|
if (!ext2fs_has_feature_resize_inode(fs->super)) {
|
2004-12-24 09:42:22 +03:00
|
|
|
if (fs->super->s_reserved_gdt_blocks) {
|
|
|
|
pctx.num = fs->super->s_reserved_gdt_blocks;
|
|
|
|
if (fix_problem(ctx, PR_0_NONZERO_RESERVED_GDT_BLOCKS,
|
|
|
|
&pctx)) {
|
|
|
|
fs->super->s_reserved_gdt_blocks = 0;
|
|
|
|
ext2fs_mark_super_dirty(fs);
|
|
|
|
}
|
|
|
|
}
|
2005-01-28 19:45:28 +03:00
|
|
|
}
|
|
|
|
|
2005-04-14 22:07:53 +04:00
|
|
|
/* Read the resize inode */
|
2005-01-28 19:45:28 +03:00
|
|
|
pctx.ino = EXT2_RESIZE_INO;
|
|
|
|
retval = ext2fs_read_inode(fs, EXT2_RESIZE_INO, &inode);
|
|
|
|
if (retval) {
|
2015-10-24 07:43:19 +03:00
|
|
|
if (ext2fs_has_feature_resize_inode(fs->super))
|
2005-01-28 19:45:28 +03:00
|
|
|
ctx->flags |= E2F_FLAG_RESIZE_INODE;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2008-08-28 07:07:54 +04:00
|
|
|
/*
|
|
|
|
* If the resize inode feature isn't set, check to make sure
|
2005-01-28 19:45:28 +03:00
|
|
|
* the resize inode is cleared; then we're done.
|
|
|
|
*/
|
2015-10-24 07:43:19 +03:00
|
|
|
if (!ext2fs_has_feature_resize_inode(fs->super)) {
|
2004-12-24 09:42:22 +03:00
|
|
|
for (i=0; i < EXT2_N_BLOCKS; i++) {
|
|
|
|
if (inode.i_block[i])
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if ((i < EXT2_N_BLOCKS) &&
|
|
|
|
fix_problem(ctx, PR_0_CLEAR_RESIZE_INODE, &pctx)) {
|
|
|
|
memset(&inode, 0, sizeof(inode));
|
|
|
|
e2fsck_write_inode(ctx, EXT2_RESIZE_INO, &inode,
|
|
|
|
"clear_resize");
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
2005-01-28 19:45:28 +03:00
|
|
|
|
2008-08-28 07:07:54 +04:00
|
|
|
/*
|
2004-12-24 09:42:22 +03:00
|
|
|
* The resize inode feature is enabled; check to make sure the
|
|
|
|
* only block in use is the double indirect block
|
|
|
|
*/
|
|
|
|
blk = inode.i_block[EXT2_DIND_BLOCK];
|
|
|
|
for (i=0; i < EXT2_N_BLOCKS; i++) {
|
|
|
|
if (i != EXT2_DIND_BLOCK && inode.i_block[i])
|
|
|
|
break;
|
|
|
|
}
|
2005-01-28 02:47:51 +03:00
|
|
|
if ((i < EXT2_N_BLOCKS) || !blk || !inode.i_links_count ||
|
|
|
|
!(inode.i_mode & LINUX_S_IFREG) ||
|
2004-12-24 09:42:22 +03:00
|
|
|
(blk < fs->super->s_first_data_block ||
|
2009-09-08 04:46:34 +04:00
|
|
|
blk >= ext2fs_blocks_count(fs->super))) {
|
2004-12-24 09:42:22 +03:00
|
|
|
resize_inode_invalid:
|
|
|
|
if (fix_problem(ctx, PR_0_RESIZE_INODE_INVALID, &pctx)) {
|
|
|
|
memset(&inode, 0, sizeof(inode));
|
|
|
|
e2fsck_write_inode(ctx, EXT2_RESIZE_INO, &inode,
|
|
|
|
"clear_resize");
|
|
|
|
ctx->flags |= E2F_FLAG_RESIZE_INODE;
|
|
|
|
}
|
|
|
|
if (!(ctx->options & E2F_OPT_READONLY)) {
|
|
|
|
fs->super->s_state &= ~EXT2_VALID_FS;
|
|
|
|
ext2fs_mark_super_dirty(fs);
|
|
|
|
}
|
|
|
|
goto cleanup;
|
|
|
|
}
|
|
|
|
dind_buf = (__u32 *) e2fsck_allocate_memory(ctx, fs->blocksize * 2,
|
|
|
|
"resize dind buffer");
|
|
|
|
ind_buf = (__u32 *) ((char *) dind_buf + fs->blocksize);
|
|
|
|
|
2005-01-06 08:04:24 +03:00
|
|
|
retval = ext2fs_read_ind_block(fs, blk, dind_buf);
|
2004-12-24 09:42:22 +03:00
|
|
|
if (retval)
|
|
|
|
goto resize_inode_invalid;
|
|
|
|
|
|
|
|
gdt_off = fs->desc_blocks;
|
|
|
|
pblk = fs->super->s_first_data_block + 1 + fs->desc_blocks;
|
2011-07-05 21:42:07 +04:00
|
|
|
if (fs->blocksize == 1024 && fs->super->s_first_data_block == 0)
|
|
|
|
pblk++; /* Deal with 1024 blocksize bigalloc fs */
|
2008-08-28 07:07:54 +04:00
|
|
|
for (i = 0; i < fs->super->s_reserved_gdt_blocks / 4;
|
2004-12-24 09:42:22 +03:00
|
|
|
i++, gdt_off++, pblk++) {
|
|
|
|
gdt_off %= fs->blocksize/4;
|
|
|
|
if (dind_buf[gdt_off] != pblk)
|
|
|
|
goto resize_inode_invalid;
|
2005-01-06 08:04:24 +03:00
|
|
|
retval = ext2fs_read_ind_block(fs, pblk, ind_buf);
|
2008-08-28 07:07:54 +04:00
|
|
|
if (retval)
|
2004-12-24 09:42:22 +03:00
|
|
|
goto resize_inode_invalid;
|
|
|
|
ind_off = 0;
|
|
|
|
for (j = 1; j < fs->group_desc_count; j++) {
|
|
|
|
if (!ext2fs_bg_has_super(fs, j))
|
|
|
|
continue;
|
2014-07-26 15:40:36 +04:00
|
|
|
expect = pblk + EXT2_GROUPS_TO_BLOCKS(fs->super, j);
|
2004-12-24 09:42:22 +03:00
|
|
|
if (ind_buf[ind_off] != expect)
|
|
|
|
goto resize_inode_invalid;
|
|
|
|
ind_off++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
cleanup:
|
|
|
|
if (dind_buf)
|
|
|
|
ext2fs_free_mem(&dind_buf);
|
|
|
|
|
|
|
|
}
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
|
2006-11-12 06:32:35 +03:00
|
|
|
/*
|
|
|
|
* This function checks the dirhash signed/unsigned hint if necessary.
|
|
|
|
*/
|
2006-11-15 07:38:17 +03:00
|
|
|
static void e2fsck_fix_dirhash_hint(e2fsck_t ctx)
|
2006-11-12 06:32:35 +03:00
|
|
|
{
|
|
|
|
struct ext2_super_block *sb = ctx->fs->super;
|
|
|
|
struct problem_context pctx;
|
|
|
|
char c;
|
|
|
|
|
|
|
|
if ((ctx->options & E2F_OPT_READONLY) ||
|
2015-10-24 07:43:19 +03:00
|
|
|
!ext2fs_has_feature_dir_index(sb) ||
|
2006-11-12 06:32:35 +03:00
|
|
|
(sb->s_flags & (EXT2_FLAGS_SIGNED_HASH|EXT2_FLAGS_UNSIGNED_HASH)))
|
|
|
|
return;
|
|
|
|
|
|
|
|
c = (char) 255;
|
|
|
|
|
|
|
|
clear_problem_context(&pctx);
|
|
|
|
if (fix_problem(ctx, PR_0_DIRHASH_HINT, &pctx)) {
|
|
|
|
if (((int) c) == -1) {
|
|
|
|
sb->s_flags |= EXT2_FLAGS_SIGNED_HASH;
|
|
|
|
} else {
|
|
|
|
sb->s_flags |= EXT2_FLAGS_UNSIGNED_HASH;
|
|
|
|
}
|
|
|
|
ext2fs_mark_super_dirty(ctx->fs);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
void check_super_block(e2fsck_t ctx)
|
|
|
|
{
|
|
|
|
ext2_filsys fs = ctx->fs;
|
2010-06-14 01:00:00 +04:00
|
|
|
blk64_t first_block, last_block;
|
2001-01-01 18:51:50 +03:00
|
|
|
struct ext2_super_block *sb = fs->super;
|
2013-05-20 05:13:33 +04:00
|
|
|
unsigned int ipg_max;
|
2009-07-17 07:44:50 +04:00
|
|
|
problem_t problem;
|
2010-06-14 01:00:00 +04:00
|
|
|
blk64_t blocks_per_group = fs->super->s_blocks_per_group;
|
2011-06-11 02:58:16 +04:00
|
|
|
__u32 bpg_max, cpg_max;
|
1999-10-20 22:29:18 +04:00
|
|
|
int inodes_per_block;
|
2005-03-21 06:47:54 +03:00
|
|
|
int inode_size;
|
2009-10-17 04:46:45 +04:00
|
|
|
int accept_time_fudge;
|
2010-05-14 01:36:36 +04:00
|
|
|
int broken_system_clock;
|
1998-09-03 05:26:03 +04:00
|
|
|
dgrp_t i;
|
2010-06-14 01:00:00 +04:00
|
|
|
blk64_t should_be;
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
struct problem_context pctx;
|
2010-06-14 01:00:00 +04:00
|
|
|
blk64_t free_blocks = 0;
|
2007-08-30 19:33:40 +04:00
|
|
|
ino_t free_inodes = 0;
|
2008-10-13 07:09:26 +04:00
|
|
|
int csum_flag, clear_test_fs_flag;
|
2002-06-10 21:05:56 +04:00
|
|
|
|
|
|
|
inodes_per_block = EXT2_INODES_PER_BLOCK(fs->super);
|
|
|
|
ipg_max = inodes_per_block * (blocks_per_group - 4);
|
|
|
|
if (ipg_max > EXT2_MAX_INODES_PER_GROUP(sb))
|
|
|
|
ipg_max = EXT2_MAX_INODES_PER_GROUP(sb);
|
2011-06-11 02:58:16 +04:00
|
|
|
cpg_max = 8 * EXT2_BLOCK_SIZE(sb);
|
|
|
|
if (cpg_max > EXT2_MAX_CLUSTERS_PER_GROUP(sb))
|
|
|
|
cpg_max = EXT2_MAX_CLUSTERS_PER_GROUP(sb);
|
|
|
|
bpg_max = 8 * EXT2_BLOCK_SIZE(sb) * EXT2FS_CLUSTER_RATIO(fs);
|
2002-06-10 21:05:56 +04:00
|
|
|
if (bpg_max > EXT2_MAX_BLOCKS_PER_GROUP(sb))
|
|
|
|
bpg_max = EXT2_MAX_BLOCKS_PER_GROUP(sb);
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
|
Many files:
e2fsck.h: If EXT2_FLAT_INCLUDES is defined, then assume all of
the ext2-specific header files are in a flat directory.
dirinfo.c, ehandler.c, pass1.c, pass1b.c, pass2.c, pass5.c,
super.c, swapfs.c, unix.c: Explicitly cast all assignments
from void * to be compatible with C++.
unix.c (sync_disk): Remove sync_disk and calls to that function,
since ext2fs_close() now takes care of this.
pass1.c, pass1b.c, pass2.c, pass3.c, swapfs, badblocks.c,
ehandler.c, unix.c: Change use of private to be priv_data, to
avoid C++ reserved name clash.
1998-01-19 17:50:49 +03:00
|
|
|
ctx->invalid_inode_bitmap_flag = (int *) e2fsck_allocate_memory(ctx,
|
Many files:
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c: Add calls to the progress
indicator function.
pass1.c (scan_callback): Add call to the progress feedback function
(if it exists).
super.c (check_super_block): Skip the device size check if the
get_device_size returns EXT2_EXT_UNIMPLEMENTED.
iscan.c (main): Don't use fatal_error() anymore.
pass1b.c, swapfs.c, badblocks.c: Set E2F_FLAG_ABORT instead of calling
fatal_error(0).
problem.c, pass3.c (PR_3_ROOT_NOT_DIR_ABORT,
PR_3_NO_ROOT_INODE_ABORT): New problem codes.
problem.c, pass2.c (PR_2_SPLIT_DOT): New problem code.
problem.c, pass1.c (PR_1_SUPPRESS_MESSAGES): New problem code.
problemP.h: New file which separates out the private fix_problem data
structures.
util.c, dirinfo.c, pass1.c, pass1b.c, pass2.c, pass5.c, super.c,
swapfs.c util.c: allocate_memory() now takes a e2fsck context as its
first argument, and rename it to be e2fsck_allocate_memory().
problemP.h:
New file which contains the private problem abstraction definitions.
Makefile.pq:
Remove include of MAKEFILE.STD, which doesn't exist at this point.
1997-11-14 08:23:04 +03:00
|
|
|
sizeof(int) * fs->group_desc_count, "invalid_inode_bitmap");
|
Many files:
e2fsck.h: If EXT2_FLAT_INCLUDES is defined, then assume all of
the ext2-specific header files are in a flat directory.
dirinfo.c, ehandler.c, pass1.c, pass1b.c, pass2.c, pass5.c,
super.c, swapfs.c, unix.c: Explicitly cast all assignments
from void * to be compatible with C++.
unix.c (sync_disk): Remove sync_disk and calls to that function,
since ext2fs_close() now takes care of this.
pass1.c, pass1b.c, pass2.c, pass3.c, swapfs, badblocks.c,
ehandler.c, unix.c: Change use of private to be priv_data, to
avoid C++ reserved name clash.
1998-01-19 17:50:49 +03:00
|
|
|
ctx->invalid_block_bitmap_flag = (int *) e2fsck_allocate_memory(ctx,
|
Many files:
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c: Add calls to the progress
indicator function.
pass1.c (scan_callback): Add call to the progress feedback function
(if it exists).
super.c (check_super_block): Skip the device size check if the
get_device_size returns EXT2_EXT_UNIMPLEMENTED.
iscan.c (main): Don't use fatal_error() anymore.
pass1b.c, swapfs.c, badblocks.c: Set E2F_FLAG_ABORT instead of calling
fatal_error(0).
problem.c, pass3.c (PR_3_ROOT_NOT_DIR_ABORT,
PR_3_NO_ROOT_INODE_ABORT): New problem codes.
problem.c, pass2.c (PR_2_SPLIT_DOT): New problem code.
problem.c, pass1.c (PR_1_SUPPRESS_MESSAGES): New problem code.
problemP.h: New file which separates out the private fix_problem data
structures.
util.c, dirinfo.c, pass1.c, pass1b.c, pass2.c, pass5.c, super.c,
swapfs.c util.c: allocate_memory() now takes a e2fsck context as its
first argument, and rename it to be e2fsck_allocate_memory().
problemP.h:
New file which contains the private problem abstraction definitions.
Makefile.pq:
Remove include of MAKEFILE.STD, which doesn't exist at this point.
1997-11-14 08:23:04 +03:00
|
|
|
sizeof(int) * fs->group_desc_count, "invalid_block_bitmap");
|
Many files:
e2fsck.h: If EXT2_FLAT_INCLUDES is defined, then assume all of
the ext2-specific header files are in a flat directory.
dirinfo.c, ehandler.c, pass1.c, pass1b.c, pass2.c, pass5.c,
super.c, swapfs.c, unix.c: Explicitly cast all assignments
from void * to be compatible with C++.
unix.c (sync_disk): Remove sync_disk and calls to that function,
since ext2fs_close() now takes care of this.
pass1.c, pass1b.c, pass2.c, pass3.c, swapfs, badblocks.c,
ehandler.c, unix.c: Change use of private to be priv_data, to
avoid C++ reserved name clash.
1998-01-19 17:50:49 +03:00
|
|
|
ctx->invalid_inode_table_flag = (int *) e2fsck_allocate_memory(ctx,
|
Many files:
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c: Add calls to the progress
indicator function.
pass1.c (scan_callback): Add call to the progress feedback function
(if it exists).
super.c (check_super_block): Skip the device size check if the
get_device_size returns EXT2_EXT_UNIMPLEMENTED.
iscan.c (main): Don't use fatal_error() anymore.
pass1b.c, swapfs.c, badblocks.c: Set E2F_FLAG_ABORT instead of calling
fatal_error(0).
problem.c, pass3.c (PR_3_ROOT_NOT_DIR_ABORT,
PR_3_NO_ROOT_INODE_ABORT): New problem codes.
problem.c, pass2.c (PR_2_SPLIT_DOT): New problem code.
problem.c, pass1.c (PR_1_SUPPRESS_MESSAGES): New problem code.
problemP.h: New file which separates out the private fix_problem data
structures.
util.c, dirinfo.c, pass1.c, pass1b.c, pass2.c, pass5.c, super.c,
swapfs.c util.c: allocate_memory() now takes a e2fsck context as its
first argument, and rename it to be e2fsck_allocate_memory().
problemP.h:
New file which contains the private problem abstraction definitions.
Makefile.pq:
Remove include of MAKEFILE.STD, which doesn't exist at this point.
1997-11-14 08:23:04 +03:00
|
|
|
sizeof(int) * fs->group_desc_count, "invalid_inode_table");
|
2002-06-10 21:05:56 +04:00
|
|
|
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
clear_problem_context(&pctx);
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Verify the super block constants...
|
|
|
|
*/
|
2001-01-01 18:51:50 +03:00
|
|
|
check_super_value(ctx, "inodes_count", sb->s_inodes_count,
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
MIN_CHECK, 1, 0);
|
2009-09-08 04:46:34 +04:00
|
|
|
check_super_value(ctx, "blocks_count", ext2fs_blocks_count(sb),
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
MIN_CHECK, 1, 0);
|
2001-01-01 18:51:50 +03:00
|
|
|
check_super_value(ctx, "first_data_block", sb->s_first_data_block,
|
2009-09-08 04:46:34 +04:00
|
|
|
MAX_CHECK, 0, ext2fs_blocks_count(sb));
|
2001-01-01 18:51:50 +03:00
|
|
|
check_super_value(ctx, "log_block_size", sb->s_log_block_size,
|
2002-05-17 18:53:07 +04:00
|
|
|
MIN_CHECK | MAX_CHECK, 0,
|
|
|
|
EXT2_MAX_BLOCK_LOG_SIZE - EXT2_MIN_BLOCK_LOG_SIZE);
|
2011-02-26 05:43:54 +03:00
|
|
|
check_super_value(ctx, "log_cluster_size",
|
|
|
|
sb->s_log_cluster_size,
|
|
|
|
MIN_CHECK | MAX_CHECK, sb->s_log_block_size,
|
|
|
|
(EXT2_MAX_CLUSTER_LOG_SIZE -
|
|
|
|
EXT2_MIN_CLUSTER_LOG_SIZE));
|
|
|
|
check_super_value(ctx, "clusters_per_group", sb->s_clusters_per_group,
|
2011-06-11 02:58:16 +04:00
|
|
|
MIN_CHECK | MAX_CHECK, 8, cpg_max);
|
2001-01-01 18:51:50 +03:00
|
|
|
check_super_value(ctx, "blocks_per_group", sb->s_blocks_per_group,
|
2002-06-10 21:05:56 +04:00
|
|
|
MIN_CHECK | MAX_CHECK, 8, bpg_max);
|
2001-01-01 18:51:50 +03:00
|
|
|
check_super_value(ctx, "inodes_per_group", sb->s_inodes_per_group,
|
2002-06-10 21:05:56 +04:00
|
|
|
MIN_CHECK | MAX_CHECK, inodes_per_block, ipg_max);
|
2009-09-08 04:46:34 +04:00
|
|
|
check_super_value(ctx, "r_blocks_count", ext2fs_r_blocks_count(sb),
|
|
|
|
MAX_CHECK, 0, ext2fs_blocks_count(sb) / 2);
|
2008-08-28 07:07:54 +04:00
|
|
|
check_super_value(ctx, "reserved_gdt_blocks",
|
2004-12-24 09:42:22 +03:00
|
|
|
sb->s_reserved_gdt_blocks, MAX_CHECK, 0,
|
2013-12-24 01:03:41 +04:00
|
|
|
fs->blocksize / sizeof(__u32));
|
|
|
|
check_super_value(ctx, "desc_size",
|
|
|
|
sb->s_desc_size, MAX_CHECK | LOG2_CHECK, 0,
|
|
|
|
EXT2_MAX_DESC_SIZE);
|
2009-01-22 23:52:50 +03:00
|
|
|
if (sb->s_rev_level > EXT2_GOOD_OLD_REV)
|
|
|
|
check_super_value(ctx, "first_ino", sb->s_first_ino,
|
|
|
|
MIN_CHECK | MAX_CHECK,
|
|
|
|
EXT2_GOOD_OLD_FIRST_INO, sb->s_inodes_count);
|
2005-03-21 06:47:54 +03:00
|
|
|
inode_size = EXT2_INODE_SIZE(sb);
|
|
|
|
check_super_value(ctx, "inode_size",
|
2013-12-24 01:03:41 +04:00
|
|
|
inode_size, MIN_CHECK | MAX_CHECK | LOG2_CHECK,
|
2005-03-21 06:47:54 +03:00
|
|
|
EXT2_GOOD_OLD_INODE_SIZE, fs->blocksize);
|
2011-06-11 02:58:16 +04:00
|
|
|
if (sb->s_blocks_per_group != (sb->s_clusters_per_group *
|
|
|
|
EXT2FS_CLUSTER_RATIO(fs))) {
|
|
|
|
pctx.num = sb->s_clusters_per_group * EXT2FS_CLUSTER_RATIO(fs);
|
|
|
|
pctx.str = "block_size";
|
|
|
|
fix_problem(ctx, PR_0_MISC_CORRUPT_SUPER, &pctx);
|
|
|
|
ctx->flags |= E2F_FLAG_ABORT; /* never get here! */
|
|
|
|
return;
|
|
|
|
}
|
2008-08-28 07:07:54 +04:00
|
|
|
|
2007-06-04 09:14:52 +04:00
|
|
|
if ((ctx->flags & E2F_FLAG_GOT_DEVSIZE) &&
|
2009-09-08 04:46:34 +04:00
|
|
|
(ctx->num_blocks < ext2fs_blocks_count(sb))) {
|
|
|
|
pctx.blk = ext2fs_blocks_count(sb);
|
2007-06-04 09:14:52 +04:00
|
|
|
pctx.blk2 = ctx->num_blocks;
|
|
|
|
if (fix_problem(ctx, PR_0_FS_SIZE_WRONG, &pctx)) {
|
1997-11-03 22:42:40 +03:00
|
|
|
ctx->flags |= E2F_FLAG_ABORT;
|
|
|
|
return;
|
|
|
|
}
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
}
|
|
|
|
|
2011-07-05 21:42:07 +04:00
|
|
|
should_be = (sb->s_log_block_size == 0 &&
|
|
|
|
EXT2FS_CLUSTER_RATIO(fs) == 1) ? 1 : 0;
|
2001-01-01 18:51:50 +03:00
|
|
|
if (sb->s_first_data_block != should_be) {
|
|
|
|
pctx.blk = sb->s_first_data_block;
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
pctx.blk2 = should_be;
|
|
|
|
fix_problem(ctx, PR_0_FIRST_DATA_BLOCK, &pctx);
|
1997-11-03 22:42:40 +03:00
|
|
|
ctx->flags |= E2F_FLAG_ABORT;
|
|
|
|
return;
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
}
|
|
|
|
|
2014-05-27 21:02:12 +04:00
|
|
|
should_be = (blk64_t)sb->s_inodes_per_group * fs->group_desc_count;
|
|
|
|
if (should_be > UINT_MAX)
|
|
|
|
should_be = UINT_MAX;
|
2001-01-01 18:51:50 +03:00
|
|
|
if (sb->s_inodes_count != should_be) {
|
|
|
|
pctx.ino = sb->s_inodes_count;
|
1999-06-18 05:09:29 +04:00
|
|
|
pctx.ino2 = should_be;
|
|
|
|
if (fix_problem(ctx, PR_0_INODE_COUNT_WRONG, &pctx)) {
|
2001-01-01 18:51:50 +03:00
|
|
|
sb->s_inodes_count = should_be;
|
1999-06-18 05:09:29 +04:00
|
|
|
ext2fs_mark_super_dirty(fs);
|
|
|
|
}
|
|
|
|
}
|
2016-09-05 00:31:07 +03:00
|
|
|
if (EXT2_INODE_SIZE(sb) > EXT2_GOOD_OLD_INODE_SIZE) {
|
|
|
|
unsigned min =
|
|
|
|
sizeof(((struct ext2_inode_large *) 0)->i_extra_isize) +
|
|
|
|
sizeof(((struct ext2_inode_large *) 0)->i_checksum_hi);
|
|
|
|
unsigned max = EXT2_INODE_SIZE(sb) - EXT2_GOOD_OLD_INODE_SIZE;
|
|
|
|
pctx.num = sb->s_min_extra_isize;
|
|
|
|
if (sb->s_min_extra_isize &&
|
|
|
|
(sb->s_min_extra_isize < min ||
|
|
|
|
sb->s_min_extra_isize > max ||
|
|
|
|
sb->s_min_extra_isize & 3) &&
|
|
|
|
fix_problem(ctx, PR_0_BAD_MIN_EXTRA_ISIZE, &pctx)) {
|
|
|
|
sb->s_min_extra_isize =
|
|
|
|
(sizeof(struct ext2_inode_large) -
|
|
|
|
EXT2_GOOD_OLD_INODE_SIZE);
|
|
|
|
ext2fs_mark_super_dirty(fs);
|
|
|
|
}
|
|
|
|
pctx.num = sb->s_want_extra_isize;
|
|
|
|
if (sb->s_want_extra_isize &&
|
|
|
|
(sb->s_want_extra_isize < min ||
|
|
|
|
sb->s_want_extra_isize > max ||
|
|
|
|
sb->s_want_extra_isize & 3) &&
|
|
|
|
fix_problem(ctx, PR_0_BAD_WANT_EXTRA_ISIZE, &pctx)) {
|
|
|
|
sb->s_want_extra_isize =
|
|
|
|
(sizeof(struct ext2_inode_large) -
|
|
|
|
EXT2_GOOD_OLD_INODE_SIZE);
|
|
|
|
ext2fs_mark_super_dirty(fs);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-08-03 04:47:45 +04:00
|
|
|
/* Are metadata_csum and uninit_bg both set? */
|
2015-10-24 07:43:19 +03:00
|
|
|
if (ext2fs_has_feature_metadata_csum(fs->super) &&
|
|
|
|
ext2fs_has_feature_gdt_csum(fs->super) &&
|
2012-08-03 04:47:45 +04:00
|
|
|
fix_problem(ctx, PR_0_META_AND_GDT_CSUM_SET, &pctx)) {
|
2015-10-24 07:43:19 +03:00
|
|
|
ext2fs_clear_feature_gdt_csum(fs->super);
|
2012-08-03 04:47:45 +04:00
|
|
|
ext2fs_mark_super_dirty(fs);
|
|
|
|
for (i = 0; i < fs->group_desc_count; i++)
|
|
|
|
ext2fs_group_desc_csum_set(fs, i);
|
|
|
|
}
|
|
|
|
|
2016-03-05 20:52:55 +03:00
|
|
|
/* We can't have ^metadata_csum,metadata_csum_seed */
|
|
|
|
if (!ext2fs_has_feature_metadata_csum(fs->super) &&
|
|
|
|
ext2fs_has_feature_csum_seed(fs->super) &&
|
|
|
|
fix_problem(ctx, PR_0_CSUM_SEED_WITHOUT_META_CSUM, &pctx)) {
|
|
|
|
ext2fs_clear_feature_csum_seed(fs->super);
|
|
|
|
fs->super->s_checksum_seed = 0;
|
|
|
|
ext2fs_mark_super_dirty(fs);
|
|
|
|
}
|
|
|
|
|
2013-10-12 05:20:36 +04:00
|
|
|
/* Is 64bit set and extents unset? */
|
2015-10-24 07:43:19 +03:00
|
|
|
if (ext2fs_has_feature_64bit(fs->super) &&
|
|
|
|
!ext2fs_has_feature_extents(fs->super) &&
|
2013-10-12 05:20:36 +04:00
|
|
|
fix_problem(ctx, PR_0_64BIT_WITHOUT_EXTENTS, &pctx)) {
|
2015-10-24 07:43:19 +03:00
|
|
|
ext2fs_set_feature_extents(fs->super);
|
2013-10-12 05:20:36 +04:00
|
|
|
ext2fs_mark_super_dirty(fs);
|
|
|
|
}
|
|
|
|
|
2015-04-02 05:34:40 +03:00
|
|
|
/* Did user ask us to convert files to extents? */
|
|
|
|
if (ctx->options & E2F_OPT_CONVERT_BMAP) {
|
2015-10-24 07:43:19 +03:00
|
|
|
ext2fs_set_feature_extents(fs->super);
|
2015-04-02 05:34:40 +03:00
|
|
|
ext2fs_mark_super_dirty(fs);
|
|
|
|
}
|
|
|
|
|
2015-10-24 07:43:19 +03:00
|
|
|
if (ext2fs_has_feature_meta_bg(fs->super) &&
|
2014-08-09 20:31:04 +04:00
|
|
|
(fs->super->s_first_meta_bg > fs->desc_blocks)) {
|
|
|
|
pctx.group = fs->desc_blocks;
|
|
|
|
pctx.num = fs->super->s_first_meta_bg;
|
|
|
|
if (fix_problem(ctx, PR_0_FIRST_META_BG_TOO_BIG, &pctx)) {
|
2015-10-24 07:43:19 +03:00
|
|
|
ext2fs_clear_feature_meta_bg(fs->super);
|
2014-08-09 20:31:04 +04:00
|
|
|
fs->super->s_first_meta_bg = 0;
|
|
|
|
ext2fs_mark_super_dirty(fs);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
/*
|
|
|
|
* Verify the group descriptors....
|
|
|
|
*/
|
2007-08-14 08:33:03 +04:00
|
|
|
first_block = sb->s_first_data_block;
|
2009-09-08 04:46:34 +04:00
|
|
|
last_block = ext2fs_blocks_count(sb)-1;
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
|
2012-08-03 04:47:45 +04:00
|
|
|
csum_flag = ext2fs_has_group_desc_csum(fs);
|
Convert to use block group accessor functions
Convert direct accesses to use the following block group accessor
functions: ext2fs_block_bitmap_loc(), ext2fs_inode_bitmap_loc(),
ext2fs_inode_table_loc(), ext2fs_bg_itable_unused(),
ext2fs_block_bitmap_loc_set(), ext2fs_inode_bitmap_loc_set(),
ext2fs_inode_table_loc_set(), ext2fs_bg_free_inodes_count(),
ext2fs_ext2fs_bg_used_dirs_count(), ext2fs_bg_free_inodes_count_set(),
ext2fs_bg_free_blocks_count_set(), ext2fs_bg_used_dirs_count_set()
Signed-off-by: Valerie Aurora Henson <vaurora@redhat.com>
Signed-off-by: Nick Dokos <nicholas.dokos@hp.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2009-10-26 04:43:47 +03:00
|
|
|
for (i = 0; i < fs->group_desc_count; i++) {
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
pctx.group = i;
|
2006-09-12 22:56:16 +04:00
|
|
|
|
2015-10-24 07:43:19 +03:00
|
|
|
if (!ext2fs_has_feature_flex_bg(fs->super)) {
|
2009-10-26 04:24:06 +03:00
|
|
|
first_block = ext2fs_group_first_block2(fs, i);
|
|
|
|
last_block = ext2fs_group_last_block2(fs, i);
|
2007-08-14 08:33:03 +04:00
|
|
|
}
|
2006-09-12 22:55:22 +04:00
|
|
|
|
Convert to use block group accessor functions
Convert direct accesses to use the following block group accessor
functions: ext2fs_block_bitmap_loc(), ext2fs_inode_bitmap_loc(),
ext2fs_inode_table_loc(), ext2fs_bg_itable_unused(),
ext2fs_block_bitmap_loc_set(), ext2fs_inode_bitmap_loc_set(),
ext2fs_inode_table_loc_set(), ext2fs_bg_free_inodes_count(),
ext2fs_ext2fs_bg_used_dirs_count(), ext2fs_bg_free_inodes_count_set(),
ext2fs_bg_free_blocks_count_set(), ext2fs_bg_used_dirs_count_set()
Signed-off-by: Valerie Aurora Henson <vaurora@redhat.com>
Signed-off-by: Nick Dokos <nicholas.dokos@hp.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2009-10-26 04:43:47 +03:00
|
|
|
if ((ext2fs_block_bitmap_loc(fs, i) < first_block) ||
|
|
|
|
(ext2fs_block_bitmap_loc(fs, i) > last_block)) {
|
|
|
|
pctx.blk = ext2fs_block_bitmap_loc(fs, i);
|
2001-11-26 23:51:14 +03:00
|
|
|
if (fix_problem(ctx, PR_0_BB_NOT_GROUP, &pctx))
|
Convert to use block group accessor functions
Convert direct accesses to use the following block group accessor
functions: ext2fs_block_bitmap_loc(), ext2fs_inode_bitmap_loc(),
ext2fs_inode_table_loc(), ext2fs_bg_itable_unused(),
ext2fs_block_bitmap_loc_set(), ext2fs_inode_bitmap_loc_set(),
ext2fs_inode_table_loc_set(), ext2fs_bg_free_inodes_count(),
ext2fs_ext2fs_bg_used_dirs_count(), ext2fs_bg_free_inodes_count_set(),
ext2fs_bg_free_blocks_count_set(), ext2fs_bg_used_dirs_count_set()
Signed-off-by: Valerie Aurora Henson <vaurora@redhat.com>
Signed-off-by: Nick Dokos <nicholas.dokos@hp.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2009-10-26 04:43:47 +03:00
|
|
|
ext2fs_block_bitmap_loc_set(fs, i, 0);
|
2001-11-26 23:51:14 +03:00
|
|
|
}
|
Convert to use block group accessor functions
Convert direct accesses to use the following block group accessor
functions: ext2fs_block_bitmap_loc(), ext2fs_inode_bitmap_loc(),
ext2fs_inode_table_loc(), ext2fs_bg_itable_unused(),
ext2fs_block_bitmap_loc_set(), ext2fs_inode_bitmap_loc_set(),
ext2fs_inode_table_loc_set(), ext2fs_bg_free_inodes_count(),
ext2fs_ext2fs_bg_used_dirs_count(), ext2fs_bg_free_inodes_count_set(),
ext2fs_bg_free_blocks_count_set(), ext2fs_bg_used_dirs_count_set()
Signed-off-by: Valerie Aurora Henson <vaurora@redhat.com>
Signed-off-by: Nick Dokos <nicholas.dokos@hp.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2009-10-26 04:43:47 +03:00
|
|
|
if (ext2fs_block_bitmap_loc(fs, i) == 0) {
|
2001-11-26 23:51:14 +03:00
|
|
|
ctx->invalid_block_bitmap_flag[i]++;
|
|
|
|
ctx->invalid_bitmaps++;
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
}
|
Convert to use block group accessor functions
Convert direct accesses to use the following block group accessor
functions: ext2fs_block_bitmap_loc(), ext2fs_inode_bitmap_loc(),
ext2fs_inode_table_loc(), ext2fs_bg_itable_unused(),
ext2fs_block_bitmap_loc_set(), ext2fs_inode_bitmap_loc_set(),
ext2fs_inode_table_loc_set(), ext2fs_bg_free_inodes_count(),
ext2fs_ext2fs_bg_used_dirs_count(), ext2fs_bg_free_inodes_count_set(),
ext2fs_bg_free_blocks_count_set(), ext2fs_bg_used_dirs_count_set()
Signed-off-by: Valerie Aurora Henson <vaurora@redhat.com>
Signed-off-by: Nick Dokos <nicholas.dokos@hp.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2009-10-26 04:43:47 +03:00
|
|
|
if ((ext2fs_inode_bitmap_loc(fs, i) < first_block) ||
|
|
|
|
(ext2fs_inode_bitmap_loc(fs, i) > last_block)) {
|
|
|
|
pctx.blk = ext2fs_inode_bitmap_loc(fs, i);
|
2001-11-26 23:51:14 +03:00
|
|
|
if (fix_problem(ctx, PR_0_IB_NOT_GROUP, &pctx))
|
Convert to use block group accessor functions
Convert direct accesses to use the following block group accessor
functions: ext2fs_block_bitmap_loc(), ext2fs_inode_bitmap_loc(),
ext2fs_inode_table_loc(), ext2fs_bg_itable_unused(),
ext2fs_block_bitmap_loc_set(), ext2fs_inode_bitmap_loc_set(),
ext2fs_inode_table_loc_set(), ext2fs_bg_free_inodes_count(),
ext2fs_ext2fs_bg_used_dirs_count(), ext2fs_bg_free_inodes_count_set(),
ext2fs_bg_free_blocks_count_set(), ext2fs_bg_used_dirs_count_set()
Signed-off-by: Valerie Aurora Henson <vaurora@redhat.com>
Signed-off-by: Nick Dokos <nicholas.dokos@hp.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2009-10-26 04:43:47 +03:00
|
|
|
ext2fs_inode_bitmap_loc_set(fs, i, 0);
|
2001-11-26 23:51:14 +03:00
|
|
|
}
|
Convert to use block group accessor functions
Convert direct accesses to use the following block group accessor
functions: ext2fs_block_bitmap_loc(), ext2fs_inode_bitmap_loc(),
ext2fs_inode_table_loc(), ext2fs_bg_itable_unused(),
ext2fs_block_bitmap_loc_set(), ext2fs_inode_bitmap_loc_set(),
ext2fs_inode_table_loc_set(), ext2fs_bg_free_inodes_count(),
ext2fs_ext2fs_bg_used_dirs_count(), ext2fs_bg_free_inodes_count_set(),
ext2fs_bg_free_blocks_count_set(), ext2fs_bg_used_dirs_count_set()
Signed-off-by: Valerie Aurora Henson <vaurora@redhat.com>
Signed-off-by: Nick Dokos <nicholas.dokos@hp.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2009-10-26 04:43:47 +03:00
|
|
|
if (ext2fs_inode_bitmap_loc(fs, i) == 0) {
|
2001-11-26 23:51:14 +03:00
|
|
|
ctx->invalid_inode_bitmap_flag[i]++;
|
|
|
|
ctx->invalid_bitmaps++;
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
}
|
Convert to use block group accessor functions
Convert direct accesses to use the following block group accessor
functions: ext2fs_block_bitmap_loc(), ext2fs_inode_bitmap_loc(),
ext2fs_inode_table_loc(), ext2fs_bg_itable_unused(),
ext2fs_block_bitmap_loc_set(), ext2fs_inode_bitmap_loc_set(),
ext2fs_inode_table_loc_set(), ext2fs_bg_free_inodes_count(),
ext2fs_ext2fs_bg_used_dirs_count(), ext2fs_bg_free_inodes_count_set(),
ext2fs_bg_free_blocks_count_set(), ext2fs_bg_used_dirs_count_set()
Signed-off-by: Valerie Aurora Henson <vaurora@redhat.com>
Signed-off-by: Nick Dokos <nicholas.dokos@hp.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2009-10-26 04:43:47 +03:00
|
|
|
if ((ext2fs_inode_table_loc(fs, i) < first_block) ||
|
|
|
|
((ext2fs_inode_table_loc(fs, i) +
|
2006-09-12 22:55:22 +04:00
|
|
|
fs->inode_blocks_per_group - 1) > last_block)) {
|
Convert to use block group accessor functions
Convert direct accesses to use the following block group accessor
functions: ext2fs_block_bitmap_loc(), ext2fs_inode_bitmap_loc(),
ext2fs_inode_table_loc(), ext2fs_bg_itable_unused(),
ext2fs_block_bitmap_loc_set(), ext2fs_inode_bitmap_loc_set(),
ext2fs_inode_table_loc_set(), ext2fs_bg_free_inodes_count(),
ext2fs_ext2fs_bg_used_dirs_count(), ext2fs_bg_free_inodes_count_set(),
ext2fs_bg_free_blocks_count_set(), ext2fs_bg_used_dirs_count_set()
Signed-off-by: Valerie Aurora Henson <vaurora@redhat.com>
Signed-off-by: Nick Dokos <nicholas.dokos@hp.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2009-10-26 04:43:47 +03:00
|
|
|
pctx.blk = ext2fs_inode_table_loc(fs, i);
|
2001-11-26 23:51:14 +03:00
|
|
|
if (fix_problem(ctx, PR_0_ITABLE_NOT_GROUP, &pctx))
|
Convert to use block group accessor functions
Convert direct accesses to use the following block group accessor
functions: ext2fs_block_bitmap_loc(), ext2fs_inode_bitmap_loc(),
ext2fs_inode_table_loc(), ext2fs_bg_itable_unused(),
ext2fs_block_bitmap_loc_set(), ext2fs_inode_bitmap_loc_set(),
ext2fs_inode_table_loc_set(), ext2fs_bg_free_inodes_count(),
ext2fs_ext2fs_bg_used_dirs_count(), ext2fs_bg_free_inodes_count_set(),
ext2fs_bg_free_blocks_count_set(), ext2fs_bg_used_dirs_count_set()
Signed-off-by: Valerie Aurora Henson <vaurora@redhat.com>
Signed-off-by: Nick Dokos <nicholas.dokos@hp.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2009-10-26 04:43:47 +03:00
|
|
|
ext2fs_inode_table_loc_set(fs, i, 0);
|
2001-11-26 23:51:14 +03:00
|
|
|
}
|
Convert to use block group accessor functions
Convert direct accesses to use the following block group accessor
functions: ext2fs_block_bitmap_loc(), ext2fs_inode_bitmap_loc(),
ext2fs_inode_table_loc(), ext2fs_bg_itable_unused(),
ext2fs_block_bitmap_loc_set(), ext2fs_inode_bitmap_loc_set(),
ext2fs_inode_table_loc_set(), ext2fs_bg_free_inodes_count(),
ext2fs_ext2fs_bg_used_dirs_count(), ext2fs_bg_free_inodes_count_set(),
ext2fs_bg_free_blocks_count_set(), ext2fs_bg_used_dirs_count_set()
Signed-off-by: Valerie Aurora Henson <vaurora@redhat.com>
Signed-off-by: Nick Dokos <nicholas.dokos@hp.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2009-10-26 04:43:47 +03:00
|
|
|
if (ext2fs_inode_table_loc(fs, i) == 0) {
|
2001-11-26 23:51:14 +03:00
|
|
|
ctx->invalid_inode_table_flag[i]++;
|
|
|
|
ctx->invalid_bitmaps++;
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
}
|
Convert to use block group accessor functions
Convert direct accesses to use the following block group accessor
functions: ext2fs_block_bitmap_loc(), ext2fs_inode_bitmap_loc(),
ext2fs_inode_table_loc(), ext2fs_bg_itable_unused(),
ext2fs_block_bitmap_loc_set(), ext2fs_inode_bitmap_loc_set(),
ext2fs_inode_table_loc_set(), ext2fs_bg_free_inodes_count(),
ext2fs_ext2fs_bg_used_dirs_count(), ext2fs_bg_free_inodes_count_set(),
ext2fs_bg_free_blocks_count_set(), ext2fs_bg_used_dirs_count_set()
Signed-off-by: Valerie Aurora Henson <vaurora@redhat.com>
Signed-off-by: Nick Dokos <nicholas.dokos@hp.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2009-10-26 04:43:47 +03:00
|
|
|
free_blocks += ext2fs_bg_free_blocks_count(fs, i);
|
|
|
|
free_inodes += ext2fs_bg_free_inodes_count(fs, i);
|
2005-01-25 11:09:24 +03:00
|
|
|
|
Convert to use block group accessor functions
Convert direct accesses to use the following block group accessor
functions: ext2fs_block_bitmap_loc(), ext2fs_inode_bitmap_loc(),
ext2fs_inode_table_loc(), ext2fs_bg_itable_unused(),
ext2fs_block_bitmap_loc_set(), ext2fs_inode_bitmap_loc_set(),
ext2fs_inode_table_loc_set(), ext2fs_bg_free_inodes_count(),
ext2fs_ext2fs_bg_used_dirs_count(), ext2fs_bg_free_inodes_count_set(),
ext2fs_bg_free_blocks_count_set(), ext2fs_bg_used_dirs_count_set()
Signed-off-by: Valerie Aurora Henson <vaurora@redhat.com>
Signed-off-by: Nick Dokos <nicholas.dokos@hp.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2009-10-26 04:43:47 +03:00
|
|
|
if ((ext2fs_bg_free_blocks_count(fs, i) > sb->s_blocks_per_group) ||
|
|
|
|
(ext2fs_bg_free_inodes_count(fs, i) > sb->s_inodes_per_group) ||
|
|
|
|
(ext2fs_bg_used_dirs_count(fs, i) > sb->s_inodes_per_group))
|
2005-01-25 11:09:24 +03:00
|
|
|
ext2fs_unmark_valid(fs);
|
|
|
|
|
2008-03-31 20:14:22 +04:00
|
|
|
should_be = 0;
|
2007-10-22 06:04:03 +04:00
|
|
|
if (!ext2fs_group_desc_csum_verify(fs, i)) {
|
2012-03-16 03:29:19 +04:00
|
|
|
pctx.csum1 = ext2fs_bg_checksum(fs, i);
|
|
|
|
pctx.csum2 = ext2fs_group_desc_csum(fs, i);
|
2007-10-22 06:04:03 +04:00
|
|
|
if (fix_problem(ctx, PR_0_GDT_CSUM, &pctx)) {
|
libext2fs: clean up ext2fs_bg_flags_ interfaces
The ext2fs_bg_flag* functions were confusing.
Currently we have this:
void ext2fs_bg_flags_set(ext2_filsys fs, dgrp_t group, __u16 bg_flags);
void ext2fs_bg_flags_clear(ext2_filsys fs, dgrp_t group,__u16 bg_flags);
(_set (unused) sets exactly bg_flags; _clear clears all and ignores bg_flags)
and these, which can twiddle individual bits in bg_flags:
void ext2fs_bg_flag_set(ext2_filsys fs, dgrp_t group, __u16 bg_flag);
void ext2fs_bg_flag_clear(ext2_filsys fs, dgrp_t group, __u16 bg_flag);
A better interface, after the patch below, is just:
ext2fs_bg_flags_zap(fs, group) /* zeros bg_flags */
ext2fs_bg_flags_set(fs, group, flags) /* adds flags to bg_flags */
ext2fs_bg_flags_clear(fs, group, flags) /* clears flags in bg_flags */
and remove the original ext2fs_bg_flags_set / ext2fs_bg_flags_clear.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2009-10-26 04:41:32 +03:00
|
|
|
ext2fs_bg_flags_clear(fs, i, EXT2_BG_BLOCK_UNINIT);
|
|
|
|
ext2fs_bg_flags_clear(fs, i, EXT2_BG_INODE_UNINIT);
|
Convert to use block group accessor functions
Convert direct accesses to use the following block group accessor
functions: ext2fs_block_bitmap_loc(), ext2fs_inode_bitmap_loc(),
ext2fs_inode_table_loc(), ext2fs_bg_itable_unused(),
ext2fs_block_bitmap_loc_set(), ext2fs_inode_bitmap_loc_set(),
ext2fs_inode_table_loc_set(), ext2fs_bg_free_inodes_count(),
ext2fs_ext2fs_bg_used_dirs_count(), ext2fs_bg_free_inodes_count_set(),
ext2fs_bg_free_blocks_count_set(), ext2fs_bg_used_dirs_count_set()
Signed-off-by: Valerie Aurora Henson <vaurora@redhat.com>
Signed-off-by: Nick Dokos <nicholas.dokos@hp.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2009-10-26 04:43:47 +03:00
|
|
|
ext2fs_bg_itable_unused_set(fs, i, 0);
|
2008-03-31 20:14:22 +04:00
|
|
|
should_be = 1;
|
2007-10-22 06:04:03 +04:00
|
|
|
}
|
|
|
|
ext2fs_unmark_valid(fs);
|
|
|
|
}
|
|
|
|
|
2008-04-21 07:33:34 +04:00
|
|
|
if (!csum_flag &&
|
2009-10-26 04:42:12 +03:00
|
|
|
(ext2fs_bg_flags_test(fs, i, EXT2_BG_BLOCK_UNINIT) ||
|
|
|
|
ext2fs_bg_flags_test(fs, i, EXT2_BG_INODE_UNINIT) ||
|
Convert to use block group accessor functions
Convert direct accesses to use the following block group accessor
functions: ext2fs_block_bitmap_loc(), ext2fs_inode_bitmap_loc(),
ext2fs_inode_table_loc(), ext2fs_bg_itable_unused(),
ext2fs_block_bitmap_loc_set(), ext2fs_inode_bitmap_loc_set(),
ext2fs_inode_table_loc_set(), ext2fs_bg_free_inodes_count(),
ext2fs_ext2fs_bg_used_dirs_count(), ext2fs_bg_free_inodes_count_set(),
ext2fs_bg_free_blocks_count_set(), ext2fs_bg_used_dirs_count_set()
Signed-off-by: Valerie Aurora Henson <vaurora@redhat.com>
Signed-off-by: Nick Dokos <nicholas.dokos@hp.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2009-10-26 04:43:47 +03:00
|
|
|
ext2fs_bg_itable_unused(fs, i) != 0)) {
|
2007-10-22 06:04:03 +04:00
|
|
|
if (fix_problem(ctx, PR_0_GDT_UNINIT, &pctx)) {
|
libext2fs: clean up ext2fs_bg_flags_ interfaces
The ext2fs_bg_flag* functions were confusing.
Currently we have this:
void ext2fs_bg_flags_set(ext2_filsys fs, dgrp_t group, __u16 bg_flags);
void ext2fs_bg_flags_clear(ext2_filsys fs, dgrp_t group,__u16 bg_flags);
(_set (unused) sets exactly bg_flags; _clear clears all and ignores bg_flags)
and these, which can twiddle individual bits in bg_flags:
void ext2fs_bg_flag_set(ext2_filsys fs, dgrp_t group, __u16 bg_flag);
void ext2fs_bg_flag_clear(ext2_filsys fs, dgrp_t group, __u16 bg_flag);
A better interface, after the patch below, is just:
ext2fs_bg_flags_zap(fs, group) /* zeros bg_flags */
ext2fs_bg_flags_set(fs, group, flags) /* adds flags to bg_flags */
ext2fs_bg_flags_clear(fs, group, flags) /* clears flags in bg_flags */
and remove the original ext2fs_bg_flags_set / ext2fs_bg_flags_clear.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2009-10-26 04:41:32 +03:00
|
|
|
ext2fs_bg_flags_clear(fs, i, EXT2_BG_BLOCK_UNINIT);
|
|
|
|
ext2fs_bg_flags_clear(fs, i, EXT2_BG_INODE_UNINIT);
|
Convert to use block group accessor functions
Convert direct accesses to use the following block group accessor
functions: ext2fs_block_bitmap_loc(), ext2fs_inode_bitmap_loc(),
ext2fs_inode_table_loc(), ext2fs_bg_itable_unused(),
ext2fs_block_bitmap_loc_set(), ext2fs_inode_bitmap_loc_set(),
ext2fs_inode_table_loc_set(), ext2fs_bg_free_inodes_count(),
ext2fs_ext2fs_bg_used_dirs_count(), ext2fs_bg_free_inodes_count_set(),
ext2fs_bg_free_blocks_count_set(), ext2fs_bg_used_dirs_count_set()
Signed-off-by: Valerie Aurora Henson <vaurora@redhat.com>
Signed-off-by: Nick Dokos <nicholas.dokos@hp.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2009-10-26 04:43:47 +03:00
|
|
|
ext2fs_bg_itable_unused_set(fs, i, 0);
|
2008-03-31 20:14:22 +04:00
|
|
|
should_be = 1;
|
2007-10-22 06:04:03 +04:00
|
|
|
}
|
|
|
|
ext2fs_unmark_valid(fs);
|
|
|
|
}
|
2008-03-31 20:14:22 +04:00
|
|
|
|
|
|
|
if (i == fs->group_desc_count - 1 &&
|
2009-10-26 04:42:12 +03:00
|
|
|
ext2fs_bg_flags_test(fs, i, EXT2_BG_BLOCK_UNINIT)) {
|
2008-03-31 20:14:22 +04:00
|
|
|
if (fix_problem(ctx, PR_0_BB_UNINIT_LAST, &pctx)) {
|
libext2fs: clean up ext2fs_bg_flags_ interfaces
The ext2fs_bg_flag* functions were confusing.
Currently we have this:
void ext2fs_bg_flags_set(ext2_filsys fs, dgrp_t group, __u16 bg_flags);
void ext2fs_bg_flags_clear(ext2_filsys fs, dgrp_t group,__u16 bg_flags);
(_set (unused) sets exactly bg_flags; _clear clears all and ignores bg_flags)
and these, which can twiddle individual bits in bg_flags:
void ext2fs_bg_flag_set(ext2_filsys fs, dgrp_t group, __u16 bg_flag);
void ext2fs_bg_flag_clear(ext2_filsys fs, dgrp_t group, __u16 bg_flag);
A better interface, after the patch below, is just:
ext2fs_bg_flags_zap(fs, group) /* zeros bg_flags */
ext2fs_bg_flags_set(fs, group, flags) /* adds flags to bg_flags */
ext2fs_bg_flags_clear(fs, group, flags) /* clears flags in bg_flags */
and remove the original ext2fs_bg_flags_set / ext2fs_bg_flags_clear.
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2009-10-26 04:41:32 +03:00
|
|
|
ext2fs_bg_flags_clear(fs, i, EXT2_BG_BLOCK_UNINIT);
|
2008-03-31 20:14:22 +04:00
|
|
|
should_be = 1;
|
|
|
|
}
|
|
|
|
ext2fs_unmark_valid(fs);
|
|
|
|
}
|
|
|
|
|
2007-10-22 06:04:03 +04:00
|
|
|
if (csum_flag &&
|
Convert to use block group accessor functions
Convert direct accesses to use the following block group accessor
functions: ext2fs_block_bitmap_loc(), ext2fs_inode_bitmap_loc(),
ext2fs_inode_table_loc(), ext2fs_bg_itable_unused(),
ext2fs_block_bitmap_loc_set(), ext2fs_inode_bitmap_loc_set(),
ext2fs_inode_table_loc_set(), ext2fs_bg_free_inodes_count(),
ext2fs_ext2fs_bg_used_dirs_count(), ext2fs_bg_free_inodes_count_set(),
ext2fs_bg_free_blocks_count_set(), ext2fs_bg_used_dirs_count_set()
Signed-off-by: Valerie Aurora Henson <vaurora@redhat.com>
Signed-off-by: Nick Dokos <nicholas.dokos@hp.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2009-10-26 04:43:47 +03:00
|
|
|
(ext2fs_bg_itable_unused(fs, i) > ext2fs_bg_free_inodes_count(fs, i) ||
|
|
|
|
ext2fs_bg_itable_unused(fs, i) > sb->s_inodes_per_group)) {
|
|
|
|
pctx.blk = ext2fs_bg_itable_unused(fs, i);
|
2008-03-31 20:14:22 +04:00
|
|
|
if (fix_problem(ctx, PR_0_GDT_ITABLE_UNUSED, &pctx)) {
|
Convert to use block group accessor functions
Convert direct accesses to use the following block group accessor
functions: ext2fs_block_bitmap_loc(), ext2fs_inode_bitmap_loc(),
ext2fs_inode_table_loc(), ext2fs_bg_itable_unused(),
ext2fs_block_bitmap_loc_set(), ext2fs_inode_bitmap_loc_set(),
ext2fs_inode_table_loc_set(), ext2fs_bg_free_inodes_count(),
ext2fs_ext2fs_bg_used_dirs_count(), ext2fs_bg_free_inodes_count_set(),
ext2fs_bg_free_blocks_count_set(), ext2fs_bg_used_dirs_count_set()
Signed-off-by: Valerie Aurora Henson <vaurora@redhat.com>
Signed-off-by: Nick Dokos <nicholas.dokos@hp.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
2009-10-26 04:43:47 +03:00
|
|
|
ext2fs_bg_itable_unused_set(fs, i, 0);
|
2008-03-31 20:14:22 +04:00
|
|
|
should_be = 1;
|
|
|
|
}
|
2007-10-22 06:04:03 +04:00
|
|
|
ext2fs_unmark_valid(fs);
|
|
|
|
}
|
2008-03-31 20:14:22 +04:00
|
|
|
|
|
|
|
if (should_be)
|
|
|
|
ext2fs_group_desc_csum_set(fs, i);
|
2009-08-05 06:48:15 +04:00
|
|
|
/* If the user aborts e2fsck by typing ^C, stop right away */
|
|
|
|
if (ctx->flags & E2F_FLAG_SIGNAL_MASK)
|
|
|
|
return;
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
}
|
2005-01-25 11:09:24 +03:00
|
|
|
|
2011-06-16 09:38:43 +04:00
|
|
|
ctx->free_blocks = EXT2FS_C2B(fs, free_blocks);
|
2011-06-16 09:13:42 +04:00
|
|
|
ctx->free_inodes = free_inodes;
|
2008-08-28 07:07:54 +04:00
|
|
|
|
2009-09-08 04:46:34 +04:00
|
|
|
if ((ext2fs_free_blocks_count(sb) > ext2fs_blocks_count(sb)) ||
|
2005-01-25 11:09:24 +03:00
|
|
|
(sb->s_free_inodes_count > sb->s_inodes_count))
|
|
|
|
ext2fs_unmark_valid(fs);
|
|
|
|
|
|
|
|
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
/*
|
|
|
|
* If we have invalid bitmaps, set the error state of the
|
|
|
|
* filesystem.
|
|
|
|
*/
|
|
|
|
if (ctx->invalid_bitmaps && !(ctx->options & E2F_OPT_READONLY)) {
|
2005-01-25 11:09:24 +03:00
|
|
|
sb->s_state &= ~EXT2_VALID_FS;
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
ext2fs_mark_super_dirty(fs);
|
|
|
|
}
|
|
|
|
|
ChangeLog, problem.c, problem.h, super.c:
problem.c, problem.h (PR_0_HURD_CLEAR_FILETYPE): Add new problem code.
super.c (check_super_block): If the OS type in the superblock is the
Hurd, check to see if the filetype feature is set, and offer to clear
it if so. This needs to be done since the Hurd doesn't properly
support the filetype feature. (And since the hurd allows the
transmogrification of files to special files and vice versa --- for no
good reason that I can understand --- it can't support the filetype
feature for the forseeable future, either.)
ChangeLog, mke2fs.c:
mke2fs.c (main): We forcibly turn off the filetype feature if the OS
is the hurd, since the hurd doesn't support it. (And since the hurd
allows the transmogrification of files to special files and vice versa
--- for no good reason that I can understand --- it can't support the
filetype feature for the forseeable future, either.)
mke2fs.c (proceed_question): Fix reversed sense of proceed_question
that was busted due to the internationalization patch. Fixed bug
where if proceed_question was called twice, the input buffer wasn't
cleared of the previous question's newline.
ChangeLog, expect.1, expect.2, image.gz, name:
f_hurd: Add test for Hurd-specific features (right now, just checks to
make sure the filetype feature is cleared)
ChangeLog, ls.c:
ls.c (list_super): Change the string displayed for the Hurd to be
GNU/Hurd, instead of just "GNU".
2000-05-08 17:33:17 +04:00
|
|
|
clear_problem_context(&pctx);
|
2008-08-28 07:07:54 +04:00
|
|
|
|
1998-02-01 15:58:48 +03:00
|
|
|
#ifndef EXT2_SKIP_UUID
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
/*
|
|
|
|
* If the UUID field isn't assigned, assign it.
|
2014-01-20 02:09:34 +04:00
|
|
|
* Skip if checksums are enabled and the filesystem is mounted,
|
|
|
|
* if the id changes under the kernel remounting rw may fail.
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
*/
|
2014-01-20 02:09:34 +04:00
|
|
|
if (!(ctx->options & E2F_OPT_READONLY) && uuid_is_null(sb->s_uuid) &&
|
2016-04-16 03:51:36 +03:00
|
|
|
!ext2fs_has_feature_metadata_csum(ctx->fs->super) &&
|
2014-01-20 02:09:34 +04:00
|
|
|
(!csum_flag || !(ctx->mount_flags & EXT2_MF_MOUNTED))) {
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
if (fix_problem(ctx, PR_0_ADD_UUID, &pctx)) {
|
2001-01-01 18:51:50 +03:00
|
|
|
uuid_generate(sb->s_uuid);
|
2012-07-31 02:44:04 +04:00
|
|
|
ext2fs_init_csum_seed(fs);
|
2011-10-01 04:59:17 +04:00
|
|
|
fs->flags |= EXT2_FLAG_DIRTY;
|
2002-11-08 19:10:28 +03:00
|
|
|
fs->flags &= ~EXT2_FLAG_MASTER_SB_ONLY;
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
}
|
|
|
|
}
|
1998-02-01 15:58:48 +03:00
|
|
|
#endif
|
2003-04-06 07:50:44 +04:00
|
|
|
|
2008-10-13 07:09:26 +04:00
|
|
|
/*
|
|
|
|
* Check to see if we should disable the test_fs flag
|
|
|
|
*/
|
|
|
|
profile_get_boolean(ctx->profile, "options",
|
|
|
|
"clear_test_fs_flag", 0, 1,
|
|
|
|
&clear_test_fs_flag);
|
|
|
|
if (!(ctx->options & E2F_OPT_READONLY) &&
|
|
|
|
clear_test_fs_flag &&
|
|
|
|
(fs->super->s_flags & EXT2_FLAGS_TEST_FILESYS) &&
|
|
|
|
(fs_proc_check("ext4") || check_for_modules("ext4"))) {
|
|
|
|
if (fix_problem(ctx, PR_0_CLEAR_TESTFS_FLAG, &pctx)) {
|
|
|
|
fs->super->s_flags &= ~EXT2_FLAGS_TEST_FILESYS;
|
2011-10-01 04:59:17 +04:00
|
|
|
fs->flags |= EXT2_FLAG_DIRTY;
|
2008-10-13 07:09:26 +04:00
|
|
|
fs->flags &= ~EXT2_FLAG_MASTER_SB_ONLY;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
ChangeLog, problem.c, problem.h, super.c:
problem.c, problem.h (PR_0_HURD_CLEAR_FILETYPE): Add new problem code.
super.c (check_super_block): If the OS type in the superblock is the
Hurd, check to see if the filetype feature is set, and offer to clear
it if so. This needs to be done since the Hurd doesn't properly
support the filetype feature. (And since the hurd allows the
transmogrification of files to special files and vice versa --- for no
good reason that I can understand --- it can't support the filetype
feature for the forseeable future, either.)
ChangeLog, mke2fs.c:
mke2fs.c (main): We forcibly turn off the filetype feature if the OS
is the hurd, since the hurd doesn't support it. (And since the hurd
allows the transmogrification of files to special files and vice versa
--- for no good reason that I can understand --- it can't support the
filetype feature for the forseeable future, either.)
mke2fs.c (proceed_question): Fix reversed sense of proceed_question
that was busted due to the internationalization patch. Fixed bug
where if proceed_question was called twice, the input buffer wasn't
cleared of the previous question's newline.
ChangeLog, expect.1, expect.2, image.gz, name:
f_hurd: Add test for Hurd-specific features (right now, just checks to
make sure the filetype feature is cleared)
ChangeLog, ls.c:
ls.c (list_super): Change the string displayed for the Hurd to be
GNU/Hurd, instead of just "GNU".
2000-05-08 17:33:17 +04:00
|
|
|
/*
|
|
|
|
* For the Hurd, check to see if the filetype option is set,
|
|
|
|
* since it doesn't support it.
|
|
|
|
*/
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
if (!(ctx->options & E2F_OPT_READONLY) &&
|
|
|
|
fs->super->s_creator_os == EXT2_OS_HURD &&
|
2015-10-24 07:43:19 +03:00
|
|
|
ext2fs_has_feature_filetype(fs->super)) {
|
ChangeLog, problem.c, problem.h, super.c:
problem.c, problem.h (PR_0_HURD_CLEAR_FILETYPE): Add new problem code.
super.c (check_super_block): If the OS type in the superblock is the
Hurd, check to see if the filetype feature is set, and offer to clear
it if so. This needs to be done since the Hurd doesn't properly
support the filetype feature. (And since the hurd allows the
transmogrification of files to special files and vice versa --- for no
good reason that I can understand --- it can't support the filetype
feature for the forseeable future, either.)
ChangeLog, mke2fs.c:
mke2fs.c (main): We forcibly turn off the filetype feature if the OS
is the hurd, since the hurd doesn't support it. (And since the hurd
allows the transmogrification of files to special files and vice versa
--- for no good reason that I can understand --- it can't support the
filetype feature for the forseeable future, either.)
mke2fs.c (proceed_question): Fix reversed sense of proceed_question
that was busted due to the internationalization patch. Fixed bug
where if proceed_question was called twice, the input buffer wasn't
cleared of the previous question's newline.
ChangeLog, expect.1, expect.2, image.gz, name:
f_hurd: Add test for Hurd-specific features (right now, just checks to
make sure the filetype feature is cleared)
ChangeLog, ls.c:
ls.c (list_super): Change the string displayed for the Hurd to be
GNU/Hurd, instead of just "GNU".
2000-05-08 17:33:17 +04:00
|
|
|
if (fix_problem(ctx, PR_0_HURD_CLEAR_FILETYPE, &pctx)) {
|
2015-10-24 07:43:19 +03:00
|
|
|
ext2fs_clear_feature_filetype(fs->super);
|
ChangeLog, problem.c, problem.h, super.c:
problem.c, problem.h (PR_0_HURD_CLEAR_FILETYPE): Add new problem code.
super.c (check_super_block): If the OS type in the superblock is the
Hurd, check to see if the filetype feature is set, and offer to clear
it if so. This needs to be done since the Hurd doesn't properly
support the filetype feature. (And since the hurd allows the
transmogrification of files to special files and vice versa --- for no
good reason that I can understand --- it can't support the filetype
feature for the forseeable future, either.)
ChangeLog, mke2fs.c:
mke2fs.c (main): We forcibly turn off the filetype feature if the OS
is the hurd, since the hurd doesn't support it. (And since the hurd
allows the transmogrification of files to special files and vice versa
--- for no good reason that I can understand --- it can't support the
filetype feature for the forseeable future, either.)
mke2fs.c (proceed_question): Fix reversed sense of proceed_question
that was busted due to the internationalization patch. Fixed bug
where if proceed_question was called twice, the input buffer wasn't
cleared of the previous question's newline.
ChangeLog, expect.1, expect.2, image.gz, name:
f_hurd: Add test for Hurd-specific features (right now, just checks to
make sure the filetype feature is cleared)
ChangeLog, ls.c:
ls.c (list_super): Change the string displayed for the Hurd to be
GNU/Hurd, instead of just "GNU".
2000-05-08 17:33:17 +04:00
|
|
|
ext2fs_mark_super_dirty(fs);
|
2007-10-06 20:37:08 +04:00
|
|
|
fs->flags &= ~EXT2_FLAG_MASTER_SB_ONLY;
|
ChangeLog, problem.c, problem.h, super.c:
problem.c, problem.h (PR_0_HURD_CLEAR_FILETYPE): Add new problem code.
super.c (check_super_block): If the OS type in the superblock is the
Hurd, check to see if the filetype feature is set, and offer to clear
it if so. This needs to be done since the Hurd doesn't properly
support the filetype feature. (And since the hurd allows the
transmogrification of files to special files and vice versa --- for no
good reason that I can understand --- it can't support the filetype
feature for the forseeable future, either.)
ChangeLog, mke2fs.c:
mke2fs.c (main): We forcibly turn off the filetype feature if the OS
is the hurd, since the hurd doesn't support it. (And since the hurd
allows the transmogrification of files to special files and vice versa
--- for no good reason that I can understand --- it can't support the
filetype feature for the forseeable future, either.)
mke2fs.c (proceed_question): Fix reversed sense of proceed_question
that was busted due to the internationalization patch. Fixed bug
where if proceed_question was called twice, the input buffer wasn't
cleared of the previous question's newline.
ChangeLog, expect.1, expect.2, image.gz, name:
f_hurd: Add test for Hurd-specific features (right now, just checks to
make sure the filetype feature is cleared)
ChangeLog, ls.c:
ls.c (list_super): Change the string displayed for the Hurd to be
GNU/Hurd, instead of just "GNU".
2000-05-08 17:33:17 +04:00
|
|
|
}
|
|
|
|
}
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
|
2000-12-13 21:11:44 +03:00
|
|
|
/*
|
|
|
|
* If we have any of the compatibility flags set, we need to have a
|
|
|
|
* revision 1 filesystem. Most kernels will not check the flags on
|
|
|
|
* a rev 0 filesystem and we may have corruption issues because of
|
|
|
|
* the incompatible changes to the filesystem.
|
|
|
|
*/
|
|
|
|
if (!(ctx->options & E2F_OPT_READONLY) &&
|
|
|
|
fs->super->s_rev_level == EXT2_GOOD_OLD_REV &&
|
|
|
|
(fs->super->s_feature_compat ||
|
|
|
|
fs->super->s_feature_ro_compat ||
|
|
|
|
fs->super->s_feature_incompat) &&
|
|
|
|
fix_problem(ctx, PR_0_FS_REV_LEVEL, &pctx)) {
|
2000-12-13 21:36:23 +03:00
|
|
|
ext2fs_update_dynamic_rev(fs);
|
2000-12-13 21:11:44 +03:00
|
|
|
ext2fs_mark_super_dirty(fs);
|
2007-10-06 20:37:08 +04:00
|
|
|
fs->flags &= ~EXT2_FLAG_MASTER_SB_ONLY;
|
2000-12-13 21:11:44 +03:00
|
|
|
}
|
|
|
|
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
/*
|
|
|
|
* Clean up any orphan inodes, if present.
|
|
|
|
*/
|
|
|
|
if (!(ctx->options & E2F_OPT_READONLY) && release_orphan_inodes(ctx)) {
|
|
|
|
fs->super->s_state &= ~EXT2_VALID_FS;
|
2000-12-13 21:11:44 +03:00
|
|
|
ext2fs_mark_super_dirty(fs);
|
Many files:
Makefile.in: Update the make dependencies
problem.c, problem.h: Add the problem codes:
PR_0_ORPHAN_ILLEGAL_BLOCK_NUM, PR_0_ORPHAN_ALREADY_CLEARED_BLOCK,
PR_0_ORPHAN_ILLEGAL_HEAD_INODE, PR_0_ORPHAN_ILLEGAL_INODE,
PR_0_ORPHAN_INODE_INUSE
super.c (release_inode_blocks, release_orphan_inodes,
check_super_block): Add support for clearing orphaned inodes from the
unmounted filesystem.
journal.c (e2fsck_recover_ext3_journal): Remove the last orphan check;
this is now handled in check_super_block --- non-journaled filesystems
can use the orphan list in the future. Also, move the the re-opening
of the filesystem to e2fsck_run_ext3_journal().
debugfs.c:
debugfs.c (finish_range): Make sure the pager FILE pointer to use.
configure, configure.in, ChangeLog:
configure.in (JFS_DEBUG): Add support for --enable-jfs-debug
2000-08-18 19:08:37 +04:00
|
|
|
}
|
|
|
|
|
2007-09-23 04:42:04 +04:00
|
|
|
/*
|
2009-10-17 04:46:45 +04:00
|
|
|
* Unfortunately, due to Windows' unfortunate design decision
|
|
|
|
* to configure the hardware clock to tick localtime, instead
|
|
|
|
* of the more proper and less error-prone UTC time, many
|
|
|
|
* users end up in the situation where the system clock is
|
|
|
|
* incorrectly set at the time when e2fsck is run.
|
|
|
|
*
|
|
|
|
* Historically this was usually due to some distributions
|
|
|
|
* having buggy init scripts and/or installers that didn't
|
|
|
|
* correctly detect this case and take appropriate
|
|
|
|
* countermeasures. However, it's still possible, despite the
|
|
|
|
* best efforts of init script and installer authors to not be
|
|
|
|
* able to detect this misconfiguration, usually due to a
|
|
|
|
* buggy or misconfigured virtualization manager or the
|
|
|
|
* installer not having access to a network time server during
|
|
|
|
* the installation process. So by default, we allow the
|
|
|
|
* superblock times to be fudged by up to 24 hours. This can
|
|
|
|
* be disabled by setting options.accept_time_fudge to the
|
|
|
|
* boolean value of false in e2fsck.conf. We also support
|
|
|
|
* options.buggy_init_scripts for backwards compatibility.
|
2007-09-23 04:42:04 +04:00
|
|
|
*/
|
2009-10-17 04:46:45 +04:00
|
|
|
profile_get_boolean(ctx->profile, "options", "accept_time_fudge",
|
|
|
|
0, 1, &accept_time_fudge);
|
2007-09-23 04:42:04 +04:00
|
|
|
profile_get_boolean(ctx->profile, "options", "buggy_init_scripts",
|
2009-10-17 04:46:45 +04:00
|
|
|
0, accept_time_fudge, &accept_time_fudge);
|
|
|
|
ctx->time_fudge = accept_time_fudge ? 86400 : 0;
|
2007-09-23 04:42:04 +04:00
|
|
|
|
2010-05-14 01:36:36 +04:00
|
|
|
profile_get_boolean(ctx->profile, "options", "broken_system_clock",
|
|
|
|
0, 0, &broken_system_clock);
|
|
|
|
|
2008-08-28 07:07:54 +04:00
|
|
|
/*
|
2005-09-25 05:59:45 +04:00
|
|
|
* Check to see if the superblock last mount time or last
|
|
|
|
* write time is in the future.
|
|
|
|
*/
|
2010-05-14 01:36:36 +04:00
|
|
|
if (!broken_system_clock &&
|
|
|
|
!(ctx->flags & E2F_FLAG_TIME_INSANE) &&
|
|
|
|
fs->super->s_mtime > (__u32) ctx->now) {
|
2005-09-25 05:59:45 +04:00
|
|
|
pctx.num = fs->super->s_mtime;
|
2009-07-17 07:44:50 +04:00
|
|
|
problem = PR_0_FUTURE_SB_LAST_MOUNT;
|
|
|
|
if (fs->super->s_mtime <= (__u32) ctx->now + ctx->time_fudge)
|
|
|
|
problem = PR_0_FUTURE_SB_LAST_MOUNT_FUDGED;
|
|
|
|
if (fix_problem(ctx, problem, &pctx)) {
|
2005-09-25 05:59:45 +04:00
|
|
|
fs->super->s_mtime = ctx->now;
|
2011-10-01 04:59:17 +04:00
|
|
|
fs->flags |= EXT2_FLAG_DIRTY;
|
2005-09-25 05:59:45 +04:00
|
|
|
}
|
|
|
|
}
|
2010-05-14 01:36:36 +04:00
|
|
|
if (!broken_system_clock &&
|
|
|
|
!(ctx->flags & E2F_FLAG_TIME_INSANE) &&
|
|
|
|
fs->super->s_wtime > (__u32) ctx->now) {
|
2005-09-25 05:59:45 +04:00
|
|
|
pctx.num = fs->super->s_wtime;
|
2009-08-08 18:14:48 +04:00
|
|
|
problem = PR_0_FUTURE_SB_LAST_WRITE;
|
2009-07-17 07:44:50 +04:00
|
|
|
if (fs->super->s_wtime <= (__u32) ctx->now + ctx->time_fudge)
|
2009-10-04 07:17:45 +04:00
|
|
|
problem = PR_0_FUTURE_SB_LAST_WRITE_FUDGED;
|
2009-07-17 07:44:50 +04:00
|
|
|
if (fix_problem(ctx, problem, &pctx)) {
|
2005-09-25 05:59:45 +04:00
|
|
|
fs->super->s_wtime = ctx->now;
|
2011-10-01 04:59:17 +04:00
|
|
|
fs->flags |= EXT2_FLAG_DIRTY;
|
2005-09-25 05:59:45 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2001-10-07 05:26:27 +04:00
|
|
|
/*
|
|
|
|
* Move the ext3 journal file, if necessary.
|
|
|
|
*/
|
|
|
|
e2fsck_move_ext3_journal(ctx);
|
2006-03-10 23:25:59 +03:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Fix journal hint, if necessary
|
|
|
|
*/
|
|
|
|
e2fsck_fix_ext3_journal_hint(ctx);
|
|
|
|
|
2006-11-12 06:32:35 +03:00
|
|
|
/*
|
|
|
|
* Add dirhash hint if necessary
|
|
|
|
*/
|
|
|
|
e2fsck_fix_dirhash_hint(ctx);
|
|
|
|
|
2011-07-20 22:40:06 +04:00
|
|
|
/*
|
|
|
|
* Hide quota inodes if necessary.
|
|
|
|
*/
|
|
|
|
e2fsck_hide_quota(ctx);
|
|
|
|
|
Many files:
pass*.c, super.c: Massive changes to avoid using printf and com_err
routines. All diagnostic messages are now routed through the
fix_problem interface.
pass2.c (check_dir_block): Check for duplicate '.' and '..' entries.
problem.c, problem.h: Add new problem codes PR_2_DUP_DOT and
PR_2_DUP_DOT_DOT.
problem.c: Added new problem codes for some of the superblock
corruption checks, and for the pass header messages. ("Pass
1: xxxxx")
util.c (print_resource_track): Now takes a description argument.
super.c, unix.c, e2fsck.c: New files to separate out the
operating-specific operations out from e2fsck.c. e2fsck.c now
contains the global e2fsck context management routines, and
super.c contains the "pass 0" initial validation of the
superblock and global block group descriptors.
pass1.c, pass2.c, pass3.c, pass4.c, pass5.c, util.c: Eliminate
(nearly) all global variables and moved them to the e2fsck
context structure.
problem.c, problem.h: Added new problem codes PR_0_SB_CORRUPT,
PR_0_FS_SIZE_WRONG, PR_0_NO_FRAGMENTS, PR_0_BLOCKS_PER_GROUP,
PR_0_FIRST_DATA_BLOCK
expect.1, expect.2:
Updated tests to align with e2fsck problem.c changes.
1997-10-03 21:48:10 +04:00
|
|
|
return;
|
|
|
|
}
|
2007-10-01 17:18:54 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Check to see if we should backup the master sb to the backup super
|
2008-01-27 07:17:50 +03:00
|
|
|
* blocks. Returns non-zero if the sb should be backed up.
|
2007-10-01 17:18:54 +04:00
|
|
|
*/
|
2008-01-27 07:17:50 +03:00
|
|
|
|
|
|
|
/*
|
|
|
|
* A few flags are set on the fly by the kernel, but only in the
|
|
|
|
* primary superblock. This is actually a bad thing, and we should
|
|
|
|
* try to discourage it in the future. In particular, for the newer
|
|
|
|
* ext4 files, especially EXT4_FEATURE_RO_COMPAT_DIR_NLINK and
|
|
|
|
* EXT3_FEATURE_INCOMPAT_EXTENTS. So some of these may go away in the
|
2008-11-22 18:02:48 +03:00
|
|
|
* future. EXT3_FEATURE_INCOMPAT_RECOVER may also get set when
|
|
|
|
* copying the primary superblock during online resize.
|
2008-01-27 07:17:50 +03:00
|
|
|
*
|
|
|
|
* The kernel will set EXT2_FEATURE_COMPAT_EXT_ATTR, but
|
|
|
|
* unfortunately, we shouldn't ignore it since if it's not set in the
|
|
|
|
* backup, the extended attributes in the filesystem will be stripped
|
|
|
|
* away.
|
|
|
|
*/
|
|
|
|
#define FEATURE_RO_COMPAT_IGNORE (EXT2_FEATURE_RO_COMPAT_LARGE_FILE| \
|
|
|
|
EXT4_FEATURE_RO_COMPAT_DIR_NLINK)
|
2008-11-22 18:02:48 +03:00
|
|
|
#define FEATURE_INCOMPAT_IGNORE (EXT3_FEATURE_INCOMPAT_EXTENTS| \
|
|
|
|
EXT3_FEATURE_INCOMPAT_RECOVER)
|
2008-01-27 07:17:50 +03:00
|
|
|
|
2007-10-01 17:18:54 +04:00
|
|
|
int check_backup_super_block(e2fsck_t ctx)
|
|
|
|
{
|
|
|
|
ext2_filsys fs = ctx->fs;
|
|
|
|
errcode_t retval;
|
|
|
|
dgrp_t g;
|
2010-06-14 01:00:00 +04:00
|
|
|
blk64_t sb;
|
2007-10-01 17:18:54 +04:00
|
|
|
int ret = 0;
|
2009-04-23 09:27:07 +04:00
|
|
|
char buf[SUPERBLOCK_SIZE];
|
|
|
|
struct ext2_super_block *backup_sb;
|
2007-10-01 17:18:54 +04:00
|
|
|
|
|
|
|
/*
|
|
|
|
* If we are already writing out the backup blocks, then we
|
|
|
|
* don't need to test. Also, if the filesystem is invalid, or
|
|
|
|
* the check was aborted or cancelled, we also don't want to
|
|
|
|
* do the backup. If the filesystem was opened read-only then
|
|
|
|
* we can't do the backup.
|
|
|
|
*/
|
|
|
|
if (((fs->flags & EXT2_FLAG_MASTER_SB_ONLY) == 0) ||
|
|
|
|
!ext2fs_test_valid(fs) ||
|
|
|
|
(fs->super->s_state & EXT2_ERROR_FS) ||
|
|
|
|
(ctx->flags & (E2F_FLAG_ABORT | E2F_FLAG_CANCEL)) ||
|
|
|
|
(ctx->options & E2F_OPT_READONLY))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
for (g = 1; g < fs->group_desc_count; g++) {
|
|
|
|
if (!ext2fs_bg_has_super(fs, g))
|
|
|
|
continue;
|
|
|
|
|
2013-01-03 22:42:38 +04:00
|
|
|
sb = ext2fs_group_first_block2(fs, g);
|
2007-10-01 17:18:54 +04:00
|
|
|
|
2009-04-23 09:27:07 +04:00
|
|
|
retval = io_channel_read_blk(fs->io, sb, -SUPERBLOCK_SIZE,
|
|
|
|
buf);
|
|
|
|
if (retval)
|
|
|
|
continue;
|
|
|
|
backup_sb = (struct ext2_super_block *) buf;
|
|
|
|
#ifdef WORDS_BIGENDIAN
|
|
|
|
ext2fs_swap_super(backup_sb);
|
|
|
|
#endif
|
|
|
|
if ((backup_sb->s_magic != EXT2_SUPER_MAGIC) ||
|
|
|
|
(backup_sb->s_rev_level > EXT2_LIB_CURRENT_REV) ||
|
|
|
|
((backup_sb->s_log_block_size + EXT2_MIN_BLOCK_LOG_SIZE) >
|
|
|
|
EXT2_MAX_BLOCK_LOG_SIZE) ||
|
|
|
|
(EXT2_INODE_SIZE(backup_sb) < EXT2_GOOD_OLD_INODE_SIZE))
|
2007-10-01 17:18:54 +04:00
|
|
|
continue;
|
|
|
|
|
2008-01-27 07:17:50 +03:00
|
|
|
#define SUPER_INCOMPAT_DIFFERENT(x) \
|
2009-04-23 09:27:07 +04:00
|
|
|
((fs->super->x & ~FEATURE_INCOMPAT_IGNORE) != \
|
|
|
|
(backup_sb->x & ~FEATURE_INCOMPAT_IGNORE))
|
2008-01-27 07:17:50 +03:00
|
|
|
#define SUPER_RO_COMPAT_DIFFERENT(x) \
|
2009-04-23 09:27:07 +04:00
|
|
|
((fs->super->x & ~FEATURE_RO_COMPAT_IGNORE) != \
|
|
|
|
(backup_sb->x & ~FEATURE_RO_COMPAT_IGNORE))
|
2008-01-27 07:17:50 +03:00
|
|
|
#define SUPER_DIFFERENT(x) \
|
2009-04-23 09:27:07 +04:00
|
|
|
(fs->super->x != backup_sb->x)
|
2008-01-27 07:17:50 +03:00
|
|
|
|
2007-10-01 17:18:54 +04:00
|
|
|
if (SUPER_DIFFERENT(s_feature_compat) ||
|
2008-01-27 07:17:50 +03:00
|
|
|
SUPER_INCOMPAT_DIFFERENT(s_feature_incompat) ||
|
|
|
|
SUPER_RO_COMPAT_DIFFERENT(s_feature_ro_compat) ||
|
2007-10-01 17:18:54 +04:00
|
|
|
SUPER_DIFFERENT(s_blocks_count) ||
|
2013-12-04 05:02:12 +04:00
|
|
|
SUPER_DIFFERENT(s_blocks_count_hi) ||
|
2007-10-01 17:18:54 +04:00
|
|
|
SUPER_DIFFERENT(s_inodes_count) ||
|
2009-04-23 09:27:07 +04:00
|
|
|
memcmp(fs->super->s_uuid, backup_sb->s_uuid,
|
2007-10-01 17:18:54 +04:00
|
|
|
sizeof(fs->super->s_uuid)))
|
|
|
|
ret = 1;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|