X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=e2fsck%2Fe2fsck.h;h=feb605c7bad244ad2488b9161965ba80436dd3e5;hb=abeb84e31d69d97669da0785e5f53587438e76ed;hp=6ca3a6a65674d3ce2a884ba87f1aba31edae121a;hpb=3d78d037ec127feb531958537c0eca25386502cd;p=thirdparty%2Fe2fsprogs.git diff --git a/e2fsck/e2fsck.h b/e2fsck/e2fsck.h index 6ca3a6a65..feb605c7b 100644 --- a/e2fsck/e2fsck.h +++ b/e2fsck/e2fsck.h @@ -36,8 +36,8 @@ #include "blkid/blkid.h" #endif -#include "profile.h" -#include "prof_err.h" +#include "support/profile.h" +#include "support/prof_err.h" #ifdef ENABLE_NLS #include @@ -67,7 +67,7 @@ #define E2FSCK_ATTR(x) #endif -#include "quota/quotaio.h" +#include "support/quotaio.h" /* * Exit codes used by fsck-type programs @@ -104,11 +104,12 @@ struct dir_info { * directories which contain a hash tree index. */ struct dx_dir_info { - ext2_ino_t ino; /* Inode number */ - int numblocks; /* number of blocks */ - int hashversion; - short depth; /* depth of tree */ - struct dx_dirblock_info *dx_block; /* Array of size numblocks */ + ext2_ino_t ino; /* Inode number */ + short depth; /* depth of tree (15 bits) */ + __u8 hashversion; + __u8 casefolded_hash:1; + blk_t numblocks; /* number of blocks in dir */ + struct dx_dirblock_info *dx_block; /* Array of size numblocks */ }; #define DX_DIRBLOCK_ROOT 1 @@ -119,9 +120,10 @@ struct dx_dir_info { struct dx_dirblock_info { int type; - blk64_t phys; int flags; + blk64_t phys; blk64_t parent; + blk64_t previous; ext2_dirhash_t min_hash; ext2_dirhash_t max_hash; ext2_dirhash_t node_min_hash; @@ -167,16 +169,21 @@ struct resource_track { #define E2F_OPT_FRAGCHECK 0x0800 #define E2F_OPT_JOURNAL_ONLY 0x1000 /* only replay the journal */ #define E2F_OPT_DISCARD 0x2000 +#define E2F_OPT_CONVERT_BMAP 0x4000 /* convert blockmap to extent */ +#define E2F_OPT_FIXES_ONLY 0x8000 /* skip all optimizations */ +#define E2F_OPT_NOOPT_EXTENTS 0x10000 /* don't optimize extents */ +#define E2F_OPT_ICOUNT_FULLMAP 0x20000 /* use an array for inode counts */ +#define E2F_OPT_UNSHARE_BLOCKS 0x40000 /* * E2fsck flags */ #define E2F_FLAG_ABORT 0x0001 /* Abort signaled */ #define E2F_FLAG_CANCEL 0x0002 /* Cancel signaled */ -#define E2F_FLAG_SIGNAL_MASK 0x0003 +#define E2F_FLAG_SIGNAL_MASK (E2F_FLAG_ABORT | E2F_FLAG_CANCEL) #define E2F_FLAG_RESTART 0x0004 /* Restart signaled */ +#define E2F_FLAG_RUN_RETURN (E2F_FLAG_SIGNAL_MASK | E2F_FLAG_RESTART) #define E2F_FLAG_RESTART_LATER 0x0008 /* Restart after all iterations done */ - #define E2F_FLAG_SETJMP_OK 0x0010 /* Setjmp valid for abort */ #define E2F_FLAG_PROG_BAR 0x0020 /* Progress bar on screen */ @@ -190,6 +197,7 @@ struct resource_track { #define E2F_FLAG_EXITING 0x1000 /* E2fsck exiting due to errors */ #define E2F_FLAG_TIME_INSANE 0x2000 /* Time is insane */ #define E2F_FLAG_PROBLEMS_FIXED 0x4000 /* At least one problem was fixed */ +#define E2F_FLAG_ALLOC_OK 0x8000 /* Can we allocate blocks? */ #define E2F_RESET_FLAGS (E2F_FLAG_TIME_INSANE | E2F_FLAG_PROBLEMS_FIXED) @@ -223,14 +231,16 @@ struct e2fsck_struct { char *io_options; FILE *logf; char *log_fn; + FILE *problem_logf; + char *problem_log_fn; int flags; /* E2fsck internal flags */ int options; - int blocksize; /* blocksize */ + unsigned blocksize; /* blocksize */ blk64_t use_superblock; /* sb requested by user */ blk64_t superblock; /* sb used to open fs */ blk64_t num_blocks; /* Total number of blocks */ - blk64_t free_blocks; - ino_t free_inodes; + blk64_t free_blocks; + ext2_ino_t free_inodes; int mount_flags; int openfs_flags; blkid_cache blkid; /* blkid cache */ @@ -263,6 +273,17 @@ struct e2fsck_struct { ext2_refcount_t refcount; ext2_refcount_t refcount_extra; + /* + * Quota blocks and inodes to be charged for each ea block. + */ + ext2_refcount_t ea_block_quota_blocks; + ext2_refcount_t ea_block_quota_inodes; + + /* + * ea_inode references from attr entries. + */ + ext2_refcount_t ea_inode_refs; + /* * Array of flags indicating whether an inode bitmap, block * bitmap, or inode table is invalid @@ -297,9 +318,9 @@ struct e2fsck_struct { /* * Indexed directory information */ - int dx_dir_info_count; - int dx_dir_info_size; - struct dx_dir_info *dx_dir_info; + ext2_ino_t dx_dir_info_count; + ext2_ino_t dx_dir_info_size; + struct dx_dir_info *dx_dir_info; /* * Directories to hash @@ -368,6 +389,7 @@ struct e2fsck_struct { int ext_attr_ver; profile_t profile; int blocks_per_page; + ext2_u32_list encrypted_dirs; /* Reserve blocks for root and l+f re-creation */ blk64_t root_repair_block, lnf_repair_block; @@ -378,6 +400,29 @@ struct e2fsck_struct { */ void *priv_data; ext2fs_block_bitmap block_metadata_map; /* Metadata blocks */ + + /* How much are we allowed to readahead? */ + unsigned long long readahead_kb; + + /* + * Inodes to rebuild extent trees + */ + ext2fs_inode_bitmap inodes_to_rebuild; + + /* Undo file */ + char *undo_file; +}; + +/* Data structures to evaluate whether an extent tree needs rebuilding. */ +struct extent_tree_level { + unsigned int num_extents; + unsigned int max_extents; +}; + +struct extent_tree_info { + ext2_ino_t ino; + int force_rebuild; + struct extent_tree_level ext_info[MAX_EXTENT_DEPTH_COUNT]; }; /* Used by the region allocation code */ @@ -429,30 +474,50 @@ extern int e2fsck_dir_info_get_dotdot(e2fsck_t ctx, ext2_ino_t ino, ext2_ino_t *dotdot); /* dx_dirinfo.c */ -extern void e2fsck_add_dx_dir(e2fsck_t ctx, ext2_ino_t ino, int num_blocks); +extern void e2fsck_add_dx_dir(e2fsck_t ctx, ext2_ino_t ino, + struct ext2_inode *inode, int num_blocks); extern struct dx_dir_info *e2fsck_get_dx_dir_info(e2fsck_t ctx, ext2_ino_t ino); extern void e2fsck_free_dx_dir_info(e2fsck_t ctx); -extern int e2fsck_get_num_dx_dirinfo(e2fsck_t ctx); -extern struct dx_dir_info *e2fsck_dx_dir_info_iter(e2fsck_t ctx, int *control); +extern ext2_ino_t e2fsck_get_num_dx_dirinfo(e2fsck_t ctx); +extern struct dx_dir_info *e2fsck_dx_dir_info_iter(e2fsck_t ctx, + ext2_ino_t *control); /* ea_refcount.c */ -extern errcode_t ea_refcount_create(int size, ext2_refcount_t *ret); +typedef __u64 ea_key_t; +typedef __u64 ea_value_t; + +extern errcode_t ea_refcount_create(size_t size, ext2_refcount_t *ret); extern void ea_refcount_free(ext2_refcount_t refcount); -extern errcode_t ea_refcount_fetch(ext2_refcount_t refcount, blk64_t blk, int *ret); +extern errcode_t ea_refcount_fetch(ext2_refcount_t refcount, ea_key_t ea_key, + ea_value_t *ret); extern errcode_t ea_refcount_increment(ext2_refcount_t refcount, - blk64_t blk, int *ret); + ea_key_t ea_key, ea_value_t *ret); extern errcode_t ea_refcount_decrement(ext2_refcount_t refcount, - blk64_t blk, int *ret); -extern errcode_t ea_refcount_store(ext2_refcount_t refcount, - blk64_t blk, int count); -extern blk_t ext2fs_get_refcount_size(ext2_refcount_t refcount); + ea_key_t ea_key, ea_value_t *ret); +extern errcode_t ea_refcount_store(ext2_refcount_t refcount, ea_key_t ea_key, + ea_value_t count); +extern size_t ext2fs_get_refcount_size(ext2_refcount_t refcount); extern void ea_refcount_intr_begin(ext2_refcount_t refcount); -extern blk64_t ea_refcount_intr_next(ext2_refcount_t refcount, int *ret); +extern ea_key_t ea_refcount_intr_next(ext2_refcount_t refcount, + ea_value_t *ret); /* ehandler.c */ extern const char *ehandler_operation(const char *op); extern void ehandler_init(io_channel channel); +/* extents.c */ +struct problem_context; +errcode_t e2fsck_rebuild_extents_later(e2fsck_t ctx, ext2_ino_t ino); +int e2fsck_ino_will_be_rebuilt(e2fsck_t ctx, ext2_ino_t ino); +void e2fsck_pass1e(e2fsck_t ctx); +errcode_t e2fsck_check_rebuild_extents(e2fsck_t ctx, ext2_ino_t ino, + struct ext2_inode *inode, + struct problem_context *pctx); +errcode_t e2fsck_should_rebuild_extents(e2fsck_t ctx, + struct problem_context *pctx, + struct extent_tree_info *eti, + struct ext2_extent_info *info); + /* journal.c */ extern errcode_t e2fsck_check_ext3_journal(e2fsck_t ctx); extern errcode_t e2fsck_run_ext3_journal(e2fsck_t ctx); @@ -464,10 +529,12 @@ extern void set_up_logging(e2fsck_t ctx); /* quota.c */ extern void e2fsck_hide_quota(e2fsck_t ctx); +extern void e2fsck_validate_quota_inodes(e2fsck_t ctx); /* pass1.c */ -extern void e2fsck_setup_tdb_icount(e2fsck_t ctx, int flags, - ext2_icount_t *ret); +extern errcode_t e2fsck_setup_icount(e2fsck_t ctx, const char *icount_name, + int flags, ext2_icount_t hint, + ext2_icount_t *ret); extern void e2fsck_use_inode_shortcuts(e2fsck_t ctx, int use_shortcuts); extern int e2fsck_pass1_check_device_inode(ext2_filsys fs, struct ext2_inode *inode); @@ -490,6 +557,23 @@ extern ext2_ino_t e2fsck_get_lost_and_found(e2fsck_t ctx, int fix); extern errcode_t e2fsck_adjust_inode_count(e2fsck_t ctx, ext2_ino_t ino, int adj); +/* readahead.c */ +#define E2FSCK_READA_SUPER (0x01) +#define E2FSCK_READA_GDT (0x02) +#define E2FSCK_READA_BBITMAP (0x04) +#define E2FSCK_READA_IBITMAP (0x08) +#define E2FSCK_READA_ITABLE (0x10) +#define E2FSCK_READA_ALL_FLAGS (0x1F) +errcode_t e2fsck_readahead(ext2_filsys fs, int flags, dgrp_t start, + dgrp_t ngroups); +#define E2FSCK_RA_DBLIST_IGNORE_BLOCKCNT (0x01) +#define E2FSCK_RA_DBLIST_ALL_FLAGS (0x01) +errcode_t e2fsck_readahead_dblist(ext2_filsys fs, int flags, + ext2_dblist dblist, + unsigned long long start, + unsigned long long count); +int e2fsck_can_readahead(ext2_filsys fs); +unsigned long long e2fsck_guess_readahead(ext2_filsys fs); /* region.c */ extern region_t region_create(region_addr_t min, region_addr_t max); @@ -499,7 +583,8 @@ extern int region_allocate(region_t region, region_addr_t start, int n); /* rehash.c */ void e2fsck_rehash_dir_later(e2fsck_t ctx, ext2_ino_t ino); int e2fsck_dir_will_be_rehashed(e2fsck_t ctx, ext2_ino_t ino); -errcode_t e2fsck_rehash_dir(e2fsck_t ctx, ext2_ino_t ino); +errcode_t e2fsck_rehash_dir(e2fsck_t ctx, ext2_ino_t ino, + struct problem_context *pctx); void e2fsck_rehash_directories(e2fsck_t ctx); /* sigcatcher.c */ @@ -511,7 +596,7 @@ int check_backup_super_block(e2fsck_t ctx); void check_resize_inode(e2fsck_t ctx); /* util.c */ -extern void *e2fsck_allocate_memory(e2fsck_t ctx, unsigned int size, +extern void *e2fsck_allocate_memory(e2fsck_t ctx, unsigned long size, const char *description); extern int ask(e2fsck_t ctx, const char * string, int def); extern int ask_yn(e2fsck_t ctx, const char * string, int def); @@ -524,8 +609,6 @@ extern void e2fsck_read_bitmaps(e2fsck_t ctx); extern void e2fsck_write_bitmaps(e2fsck_t ctx); extern void preenhalt(e2fsck_t ctx); extern char *string_copy(e2fsck_t ctx, const char *str, int len); -extern errcode_t e2fsck_zero_blocks(ext2_filsys fs, blk_t blk, int num, - blk_t *ret_blk, int *ret_count); extern int fs_proc_check(const char *fs_name); extern int check_for_modules(const char *fs_name); #ifdef RESOURCE_TRACK @@ -557,7 +640,8 @@ extern blk64_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); +void dump_mmp_msg(struct mmp_struct *mmp, const char *fmt, ...) + E2FSCK_ATTR((format(printf, 2, 3))); errcode_t e2fsck_mmp_update(ext2_filsys fs); extern void e2fsck_set_bitmap_type(ext2_filsys fs, @@ -579,9 +663,13 @@ extern errcode_t e2fsck_allocate_subcluster_bitmap(ext2_filsys fs, int default_type, const char *profile_name, ext2fs_block_bitmap *ret); +unsigned long long get_memory_size(void); /* unix.c */ extern void e2fsck_clear_progbar(e2fsck_t ctx); extern int e2fsck_simple_progress(e2fsck_t ctx, const char *label, float percent, unsigned int dpynum); + +#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) + #endif /* _E2FSCK_H */