X-Git-Url: https://git.sven.stormbind.net/?p=sven%2Fexfatprogs.git;a=blobdiff_plain;f=fsck%2Ffsck.h;fp=fsck%2Ffsck.h;h=6c91face740c25f5ba10dc788d4305cf79338664;hp=ef46fa797d1ce277d2362edea6adf846d444ce8c;hb=77466d00ac72316d70c469b34dc8f5247520a31e;hpb=2d56c0684b4a1bc6dfa3efccb0200928850734f3 diff --git a/fsck/fsck.h b/fsck/fsck.h index ef46fa7..6c91fac 100644 --- a/fsck/fsck.h +++ b/fsck/fsck.h @@ -20,19 +20,29 @@ struct exfat_inode { __u16 attr; uint64_t size; bool is_contiguous; - off_t dentry_file_offset; __le16 name[0]; /* only for directory */ }; #define EXFAT_NAME_MAX 255 #define NAME_BUFFER_SIZE ((EXFAT_NAME_MAX+1)*2) +struct buffer_desc { + clus_t p_clus; + unsigned int offset; + char *buffer; + char *dirty; +}; + struct exfat_de_iter { struct exfat *exfat; struct exfat_inode *parent; - unsigned char *dentries; /* cluster * 2 allocated */ - unsigned int read_size; /* cluster size */ - off_t de_file_offset; /* offset in dentries buffer */ + struct buffer_desc *buffer_desc; /* cluster * 2 */ + clus_t ra_next_clus; + unsigned int ra_begin_offset; + unsigned int ra_partial_size; + unsigned int read_size; /* cluster size */ + unsigned int write_size; /* sector size */ + off_t de_file_offset; off_t next_read_offset; int max_skip_dentries; }; @@ -41,23 +51,49 @@ enum fsck_ui_options { FSCK_OPTS_REPAIR_ASK = 0x01, FSCK_OPTS_REPAIR_YES = 0x02, FSCK_OPTS_REPAIR_NO = 0x04, - FSCK_OPTS_REPAIR = 0x07, + FSCK_OPTS_REPAIR_AUTO = 0x08, + FSCK_OPTS_REPAIR_WRITE = 0x0b, + FSCK_OPTS_REPAIR_ALL = 0x0f, }; struct exfat { enum fsck_ui_options options; + bool dirty:1; + bool dirty_fat:1; struct exfat_blk_dev *blk_dev; struct pbr *bs; char volume_label[VOLUME_LABEL_BUFFER_SIZE]; struct exfat_inode *root; struct list_head dir_list; + clus_t clus_count; + unsigned int clus_size; + unsigned int sect_size; struct exfat_de_iter de_iter; - __u32 *alloc_bitmap; - __u64 bit_count; + struct buffer_desc buffer_desc[2]; /* cluster * 2 */ + char *alloc_bitmap; + char *disk_bitmap; + clus_t disk_bitmap_clus; + unsigned int disk_bitmap_size; }; #define EXFAT_CLUSTER_SIZE(pbr) (1 << ((pbr)->bsx.sect_size_bits + \ (pbr)->bsx.sect_per_clus_bits)) #define EXFAT_SECTOR_SIZE(pbr) (1 << (pbr)->bsx.sect_size_bits) +/* fsck.c */ +off_t exfat_c2o(struct exfat *exfat, unsigned int clus); +int get_next_clus(struct exfat *exfat, struct exfat_inode *node, + clus_t clus, clus_t *next); + +/* de_iter.c */ +int exfat_de_iter_init(struct exfat_de_iter *iter, struct exfat *exfat, + struct exfat_inode *dir); +int exfat_de_iter_get(struct exfat_de_iter *iter, + int ith, struct exfat_dentry **dentry); +int exfat_de_iter_get_dirty(struct exfat_de_iter *iter, + int ith, struct exfat_dentry **dentry); +int exfat_de_iter_flush(struct exfat_de_iter *iter); +int exfat_de_iter_advance(struct exfat_de_iter *iter, int skip_dentries); +off_t exfat_de_iter_file_offset(struct exfat_de_iter *iter); + #endif