#include <stdio.h>
#include <string.h>
+#include <stddef.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#define P_(singular, plural, n) ((n) == 1 ? (singular) : (plural))
#endif
+#ifdef __GNUC__
+#define E2FSCK_ATTR(x) __attribute__(x)
+#else
+#define E2FSCK_ATTR(x)
+#endif
+
+#include "quota/mkquota.h"
+
/*
* Exit codes used by fsck-type programs
*/
#define DX_FLAG_FIRST 4
#define DX_FLAG_LAST 8
+#define RESOURCE_TRACK
+
#ifdef RESOURCE_TRACK
/*
* This structure is used for keeping track of how much resources have
#define E2F_OPT_WRITECHECK 0x0200
#define E2F_OPT_COMPRESS_DIRS 0x0400
#define E2F_OPT_FRAGCHECK 0x0800
+#define E2F_OPT_JOURNAL_ONLY 0x1000 /* only replay the journal */
+#define E2F_OPT_DISCARD 0x2000
+#define E2F_OPT_VERBOSE 0x4000
/*
* E2fsck flags
#define E2F_FLAG_GOT_DEVSIZE 0x0800 /* Device size has been fetched */
#define E2F_FLAG_EXITING 0x1000 /* E2fsck exiting due to errors */
#define E2F_FLAG_TIME_INSANE 0x2000 /* Time is insane */
+#define E2F_FLAG_EXPAND_EISIZE 0x4000 /* Expand the inodes (i_extra_isize) */
#define E2F_RESET_FLAGS (E2F_FLAG_TIME_INSANE)
+/* Defines for Lustre */
+#define LUSTRE_NULL 0x0000
+#define LUSTRE_MDS 0x0001
+#define LUSTRE_OST 0x0002
+#define LUSTRE_TYPE 0x000f
+#define LUSTRE_ONLY 0x1000
+
/*
* Defines for indicating the e2fsck pass number
*/
#define E2F_PASS_5 5
#define E2F_PASS_1B 6
+enum shared_opt {
+ E2F_SHARED_PRESERVE = 0,
+ E2F_SHARED_DELETE,
+ E2F_SHARED_LPF
+};
+
+enum clone_opt {
+ E2F_CLONE_DUP = 0,
+ E2F_CLONE_ZERO
+};
+
+#define EXT4_FITS_IN_INODE(ext4_inode, einode, field) \
+ ((offsetof(typeof(*ext4_inode), field) + \
+ sizeof(ext4_inode->field)) <= \
+ (EXT2_GOOD_OLD_INODE_SIZE + \
+ (einode)->i_extra_isize)) \
+
+#define EXT4_XTIME_FUTURE(ctx, sb, xtime, margin) \
+ (!((ctx)->flags & E2F_FLAG_TIME_INSANE) && \
+ (xtime) > (ctx)->now + (margin))
+#define EXT4_XTIME_ANCIENT(ctx, sb, xtime, margin) \
+ ((sb)->s_mkfs_time > (margin) && (xtime) < (sb)->s_mkfs_time - (margin))
+
+#define BADNESS_NORMAL 1
+#define BADNESS_HIGH 2
+#define BADNESS_THRESHOLD 8
+#define BADNESS_BAD_MODE 100
+#define BADNESS_LARGE_FILE 2199023255552ULL
+
/*
* Define the extended attribute refcount structure
*/
char *filesystem_name;
char *device_name;
char *io_options;
+ FILE *logf;
+ char *log_fn;
int flags; /* E2fsck internal flags */
int options;
+ int blocksize; /* blocksize */
blk64_t use_superblock; /* sb requested by user */
blk64_t superblock; /* sb used to open fs */
- int blocksize; /* blocksize */
blk64_t num_blocks; /* Total number of blocks */
+ blk64_t free_blocks;
+ ino_t free_inodes;
int mount_flags;
blkid_cache blkid; /* blkid cache */
unsigned long max);
ext2fs_inode_bitmap inode_used_map; /* Inodes which are in use */
- ext2fs_inode_bitmap inode_bad_map; /* Inodes which are bad somehow */
ext2fs_inode_bitmap inode_dir_map; /* Inodes which are directories */
ext2fs_inode_bitmap inode_bb_map; /* Inodes which are in bad blocks */
ext2fs_inode_bitmap inode_imagic_map; /* AFS inodes */
ext2fs_inode_bitmap inode_reg_map; /* Inodes which are regular files*/
+ ext2fs_inode_bitmap inode_ea_map; /* EA inodes which are non-orphan */
ext2fs_block_bitmap block_found_map; /* Blocks which are in use */
ext2fs_block_bitmap block_dup_map; /* Blks referenced more than once */
*/
ext2_icount_t inode_count;
ext2_icount_t inode_link_info;
+ ext2_icount_t inode_badness;
+ int inode_badness_threshold;
ext2_refcount_t refcount;
ext2_refcount_t refcount_extra;
io_channel journal_io;
char *journal_name;
+ /*
+ * Ext4 quota support
+ */
+ quota_ctx_t qctx;
+
+ /* lustre support */
+ int lustre_devtype;
+ char *lustre_mdsdb;
+ char *lustre_ostdb;
+ struct lfsck_outdb_info *lfsck_oinfo;
+
#ifdef RESOURCE_TRACK
/*
* For timing purposes
time_t now;
time_t time_fudge; /* For working around buggy init scripts */
int ext_attr_ver;
+ enum shared_opt shared;
+ enum clone_opt clone;
profile_t profile;
int blocks_per_page;
+ /* Expand large inodes to atleast these many bytes */
+ int want_extra_isize;
+ /* minimum i_extra_isize found in used inodes. Should not be lesser
+ * than s_min_extra_isize.
+ */
+ __u32 min_extra_isize;
+ int fs_unexpanded_inodes;
+ ext2fs_inode_bitmap expand_eisize_map;
+
/*
* For the use of callers of the e2fsck functions; not used by
* e2fsck functions themselves.
extern void e2fsck_pass3(e2fsck_t ctx);
extern void e2fsck_pass4(e2fsck_t ctx);
extern void e2fsck_pass5(e2fsck_t ctx);
+extern void e2fsck_pass6(e2fsck_t ctx);
/* e2fsck.c */
extern errcode_t e2fsck_allocate_context(e2fsck_t *ret);
extern void e2fsck_move_ext3_journal(e2fsck_t ctx);
extern int e2fsck_fix_ext3_journal_hint(e2fsck_t ctx);
+/* logfile.c */
+extern void set_up_logging(e2fsck_t ctx);
+
+/* quota.c */
+extern void e2fsck_hide_quota(e2fsck_t ctx);
+
/* pass1.c */
extern void e2fsck_setup_tdb_icount(e2fsck_t ctx, int flags,
ext2_icount_t *ret);
extern void e2fsck_clear_inode(e2fsck_t ctx, ext2_ino_t ino,
struct ext2_inode *inode, int restart_flag,
const char *source);
+#define e2fsck_mark_inode_bad(ctx, ino, count) \
+ e2fsck_mark_inode_bad_loc(ctx, ino, count, __func__, __LINE__)
+extern void e2fsck_mark_inode_bad_loc(e2fsck_t ctx, ino_t ino, int count,
+ const char *func, const int line);
+extern int is_inode_bad(e2fsck_t ctx, ino_t ino);
/* pass2.c */
extern int e2fsck_process_bad_inode(e2fsck_t ctx, ext2_ino_t dir,
errcode_t e2fsck_rehash_dir(e2fsck_t ctx, ext2_ino_t ino);
void e2fsck_rehash_directories(e2fsck_t ctx);
+/* sigcatcher.c */
+void sigcatcher_setup(void);
+
/* super.c */
void check_super_block(e2fsck_t ctx);
int check_backup_super_block(e2fsck_t ctx);
extern void *e2fsck_allocate_memory(e2fsck_t ctx, unsigned int size,
const char *description);
extern int ask(e2fsck_t ctx, const char * string, int def);
-extern int ask_yn(const char * string, int def);
+extern int ask_yn(e2fsck_t ctx, const char * string, int def);
extern void fatal_error(e2fsck_t ctx, const char * fmt_string);
+extern void log_out(e2fsck_t ctx, const char *fmt, ...)
+ E2FSCK_ATTR((format(printf, 2, 3)));
+extern void log_err(e2fsck_t ctx, const char *fmt, ...)
+ E2FSCK_ATTR((format(printf, 2, 3)));
extern void e2fsck_read_bitmaps(e2fsck_t ctx);
extern void e2fsck_write_bitmaps(e2fsck_t ctx);
extern void preenhalt(e2fsck_t ctx);
const char *name, io_manager manager);
extern int ext2_file_type(unsigned int mode);
extern int write_all(int fd, char *buf, size_t count);
+void dump_mmp_msg(struct mmp_struct *mmp, const char *msg);
+errcode_t e2fsck_mmp_update(ext2_filsys fs);
+
+extern void e2fsck_set_bitmap_type(ext2_filsys fs,
+ unsigned int default_type,
+ const char *profile_name,
+ unsigned int *old_type);
+extern errcode_t e2fsck_allocate_inode_bitmap(ext2_filsys fs,
+ const char *descr,
+ int default_type,
+ const char *profile_name,
+ ext2fs_inode_bitmap *ret);
+extern errcode_t e2fsck_allocate_block_bitmap(ext2_filsys fs,
+ const char *descr,
+ int default_type,
+ const char *profile_name,
+ ext2fs_block_bitmap *ret);
+extern errcode_t e2fsck_allocate_subcluster_bitmap(ext2_filsys fs,
+ const char *descr,
+ int default_type,
+ const char *profile_name,
+ ext2fs_block_bitmap *ret);
/* unix.c */
extern void e2fsck_clear_progbar(e2fsck_t ctx);