X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=e2fsck%2Fe2fsck.h;h=2dc43df835b47c180613dac657098f677906227b;hb=be1e74c1c78c00bc9a31c4fe5cabd4f923c0cdd3;hp=d4df5f35e8ba6c97989d780f023be6c69b55af3c;hpb=6dc64392c052839f373b7bbbb58efa3048bfb355;p=tools%2Fe2fsprogs.git diff --git a/e2fsck/e2fsck.h b/e2fsck/e2fsck.h index d4df5f3..2dc43df 100644 --- a/e2fsck/e2fsck.h +++ b/e2fsck/e2fsck.h @@ -11,6 +11,7 @@ #include #include +#include #ifdef HAVE_UNISTD_H #include #endif @@ -61,6 +62,14 @@ #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 */ @@ -125,6 +134,8 @@ struct dx_dirblock_info { #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 @@ -155,6 +166,9 @@ struct resource_track { #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 @@ -177,9 +191,17 @@ struct resource_track { #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 */ @@ -190,6 +212,35 @@ struct resource_track { #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 */ @@ -208,12 +259,16 @@ struct e2fsck_struct { 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 */ @@ -226,11 +281,11 @@ struct e2fsck_struct { 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 */ @@ -241,6 +296,8 @@ struct e2fsck_struct { */ 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; @@ -301,6 +358,17 @@ struct e2fsck_struct { 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 @@ -344,9 +412,20 @@ struct e2fsck_struct { 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. @@ -373,6 +452,7 @@ extern void e2fsck_pass2(e2fsck_t ctx); 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); @@ -437,6 +517,12 @@ extern int e2fsck_run_ext3_journal(e2fsck_t ctx); 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); @@ -448,6 +534,11 @@ extern int e2fsck_pass1_check_symlink(ext2_filsys fs, ext2_ino_t ino, 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, @@ -471,6 +562,9 @@ extern int region_allocate(region_t region, region_addr_t start, int n); 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); @@ -480,8 +574,12 @@ void check_resize_inode(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); @@ -519,6 +617,28 @@ extern blk_t get_backup_sb(e2fsck_t ctx, ext2_filsys fs, 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);