Whamcloud - gitweb
e2fsck: merge badblocks after thread finishes
[tools/e2fsprogs.git] / lib / ext2fs / ext2fsP.h
1 /*
2  * ext2fsP.h --- private header file for ext2 library
3  *
4  * Copyright (C) 1997 Theodore Ts'o.
5  *
6  * %Begin-Header%
7  * This file may be redistributed under the terms of the GNU Library
8  * General Public License, version 2.
9  * %End-Header%
10  */
11
12 #if HAVE_SYS_STAT_H
13 #include <sys/stat.h>
14 #endif
15
16 #include "ext2fs.h"
17
18 #define EXT2FS_MAX_NESTED_LINKS  8
19
20 static inline int ext2fsP_is_disk_device(mode_t mode)
21 {
22 #if defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
23         return S_ISBLK(mode) || S_ISCHR(mode);
24 #else
25         return S_ISBLK(mode);
26 #endif
27 }
28
29 /*
30  * Badblocks list
31  */
32 struct ext2_struct_u32_list {
33         int     magic;
34         int     num;
35         int     size;
36         __u32   *list;
37 };
38
39 struct ext2_struct_u32_iterate {
40         int                     magic;
41         ext2_u32_list           bb;
42         int                     ptr;
43 };
44
45
46 /*
47  * Directory block iterator definition
48  */
49 struct ext2_struct_dblist {
50         int                     magic;
51         ext2_filsys             fs;
52         unsigned long long      size;
53         unsigned long long      count;
54         int                     sorted;
55         struct ext2_db_entry2 * list;
56 };
57
58 /*
59  * For directory iterators
60  */
61 struct dir_context {
62         ext2_ino_t              dir;
63         int             flags;
64         char            *buf;
65         unsigned int    buflen;
66         int (*func)(ext2_ino_t  dir,
67                     int entry,
68                     struct ext2_dir_entry *dirent,
69                     int offset,
70                     int blocksize,
71                     char        *buf,
72                     void        *priv_data);
73         void            *priv_data;
74         errcode_t       errcode;
75 };
76
77 /*
78  * Inode cache structure
79  */
80 struct ext2_inode_cache {
81         void *                          buffer;
82         blk64_t                         buffer_blk;
83         int                             cache_last;
84         unsigned int                    cache_size;
85         int                             refcount;
86         struct ext2_inode_cache_ent     *cache;
87 };
88
89 struct ext2_inode_cache_ent {
90         ext2_ino_t              ino;
91         struct ext2_inode       *inode;
92 };
93
94 /*
95  * NLS defintions
96  */
97 struct ext2fs_nls_table {
98         int version;
99         const struct ext2fs_nls_ops *ops;
100 };
101
102 struct ext2fs_nls_ops {
103         int (*casefold)(const struct ext2fs_nls_table *charset,
104                         const unsigned char *str, size_t len,
105                         unsigned char *dest, size_t dlen);
106         int (*validate)(const struct ext2fs_nls_table *table,
107                         char *s, size_t len, char **pos);
108         int (*casefold_cmp)(const struct ext2fs_nls_table *table,
109                             const unsigned char *str1, size_t len1,
110                             const unsigned char *str2, size_t len2);
111 };
112
113 /* Function prototypes */
114
115 extern int ext2fs_process_dir_block(ext2_filsys         fs,
116                                     blk64_t             *blocknr,
117                                     e2_blkcnt_t         blockcnt,
118                                     blk64_t             ref_block,
119                                     int                 ref_offset,
120                                     void                *priv_data);
121
122 extern errcode_t ext2fs_inline_data_ea_remove(ext2_filsys fs, ext2_ino_t ino);
123 extern errcode_t ext2fs_inline_data_expand(ext2_filsys fs, ext2_ino_t ino);
124 extern int ext2fs_inline_data_dir_iterate(ext2_filsys fs,
125                                           ext2_ino_t ino,
126                                           void *priv_data);
127
128 /* Generic numeric progress meter */
129
130 struct ext2fs_numeric_progress_struct {
131         __u64           max;
132         int             log_max;
133         int             skip_progress;
134 };
135
136 /*
137  * progress callback functions
138  */
139 struct ext2fs_progress_ops {
140         void (*init)(ext2_filsys fs,
141                      struct ext2fs_numeric_progress_struct * progress,
142                      const char *label, __u64 max);
143         void (*update)(ext2_filsys fs,
144                        struct ext2fs_numeric_progress_struct * progress,
145                        __u64 val);
146         void (*close)(ext2_filsys fs,
147                       struct ext2fs_numeric_progress_struct * progress,
148                       const char *message);
149 };
150
151 extern struct ext2fs_progress_ops ext2fs_numeric_progress_ops;
152
153 extern void ext2fs_numeric_progress_init(ext2_filsys fs,
154                                          struct ext2fs_numeric_progress_struct * progress,
155                                          const char *label, __u64 max);
156 extern void ext2fs_numeric_progress_update(ext2_filsys fs,
157                                            struct ext2fs_numeric_progress_struct * progress,
158                                            __u64 val);
159 extern void ext2fs_numeric_progress_close(ext2_filsys fs,
160                                           struct ext2fs_numeric_progress_struct * progress,
161                                           const char *message);
162
163 /*
164  * 64-bit bitmap support
165  */
166
167 extern errcode_t ext2fs_alloc_generic_bmap(ext2_filsys fs, errcode_t magic,
168                                            int type, __u64 start, __u64 end,
169                                            __u64 real_end,
170                                            const char * description,
171                                            ext2fs_generic_bitmap *bmap);
172
173 extern void ext2fs_free_generic_bmap(ext2fs_generic_bitmap bmap);
174
175 extern errcode_t ext2fs_copy_generic_bmap(ext2fs_generic_bitmap src,
176                                           ext2fs_generic_bitmap *dest);
177
178 extern errcode_t ext2fs_resize_generic_bmap(ext2fs_generic_bitmap bmap,
179                                             __u64 new_end,
180                                             __u64 new_real_end);
181 extern errcode_t ext2fs_fudge_generic_bmap_end(ext2fs_generic_bitmap bitmap,
182                                                errcode_t neq,
183                                                __u64 end, __u64 *oend);
184 extern int ext2fs_mark_generic_bmap(ext2fs_generic_bitmap bitmap,
185                                     __u64 arg);
186 extern int ext2fs_unmark_generic_bmap(ext2fs_generic_bitmap bitmap,
187                                       __u64 arg);
188 extern int ext2fs_test_generic_bmap(ext2fs_generic_bitmap bitmap,
189                                     __u64 arg);
190 extern errcode_t ext2fs_set_generic_bmap_range(ext2fs_generic_bitmap bitmap,
191                                                __u64 start, unsigned int num,
192                                                void *in);
193 extern errcode_t ext2fs_get_generic_bmap_range(ext2fs_generic_bitmap bitmap,
194                                                __u64 start, unsigned int num,
195                                                void *out);
196 extern void ext2fs_warn_bitmap32(ext2fs_generic_bitmap bitmap,const char *func);
197
198 extern int ext2fs_mem_is_zero(const char *mem, size_t len);
199
200 extern int ext2fs_file_block_offset_too_big(ext2_filsys fs,
201                                             struct ext2_inode *inode,
202                                             blk64_t offset);
203
204 /* atexit support */
205 typedef void (*ext2_exit_fn)(void *);
206 errcode_t ext2fs_add_exit_fn(ext2_exit_fn fn, void *data);
207 errcode_t ext2fs_remove_exit_fn(ext2_exit_fn fn, void *data);
208
209 #define EXT2FS_BUILD_BUG_ON(cond) ((void)sizeof(char[1 - 2*!!(cond)]))