Whamcloud - gitweb
libe2p, libext2fs: Update file copyright permission states to match COPYING
[tools/e2fsprogs.git] / lib / ext2fs / ext2fs.h
index 15f4352..a3d3cd3 100644 (file)
@@ -1,11 +1,11 @@
 /*
  * ext2fs.h --- ext2fs
- * 
+ *
  * Copyright (C) 1993, 1994, 1995, 1996 Theodore Ts'o.
  *
  * %Begin-Header%
- * This file may be redistributed under the terms of the GNU Public
- * License.
+ * This file may be redistributed under the terms of the GNU Library
+ * General Public License, version 2.
  * %End-Header%
  */
 
@@ -229,6 +229,13 @@ struct struct_ext2_filsys {
         */
        struct ext2_inode_cache         *icache;
        io_channel                      image_io;
+
+       /*
+        * More callback functions
+        */
+       errcode_t (*get_alloc_block)(ext2_filsys fs, blk64_t goal,
+                                    blk64_t *ret);
+       void (*block_alloc_stats)(ext2_filsys fs, blk64_t blk, int inuse);
 };
 
 #if EXT2_FLAT_INCLUDES
@@ -252,7 +259,7 @@ struct struct_ext2_filsys {
  * This is used by ext2fs_expand_dir() to be able to add a new block
  * to an inode.  It can also be used for programs that want to be able
  * to deal with files that contain "holes".
- * 
+ *
  * BLOCK_FLAG_DEPTH_TRAVERSE indicates that the iterator function for
  * the indirect, doubly indirect, etc. blocks should be called after
  * all of the blocks containined in the indirect blocks are processed.
@@ -262,7 +269,7 @@ struct struct_ext2_filsys {
  * BLOCK_FLAG_DATA_ONLY indicates that the iterator function should be
  * called for data blocks only.
  *
- * BLOCK_FLAG_READ_ONLY is a promise by the caller that it will not 
+ * BLOCK_FLAG_READ_ONLY is a promise by the caller that it will not
  * modify returned block number.
  *
  * BLOCK_FLAG_NO_LARGE is for internal use only.  It informs
@@ -288,7 +295,7 @@ struct struct_ext2_filsys {
 /*
  * Flags for ext2fs_move_blocks
  */
-#define EXT2_BMOVE_GET_DBLIST  0x0001  
+#define EXT2_BMOVE_GET_DBLIST  0x0001
 #define EXT2_BMOVE_DEBUG       0x0002
 #endif
 
@@ -332,8 +339,18 @@ typedef struct ext2_extent_path *ext2_extent_path_t;
 /*
  * Flags used by ext2fs_extent_insert()
  */
+#define EXT2_EXTENT_INSERT_AFTER       0x0001 /* insert after handle loc'n */
+#define EXT2_EXTENT_INSERT_NOSPLIT     0x0002 /* insert may not cause split */
 
-#define EXT2_EXTENT_INSERT_AFTER  0x0001
+/*
+ * Flags used by ext2fs_extent_delete()
+ */
+#define EXT2_EXTENT_DELETE_KEEP_EMPTY  0x001 /* keep node if last extnt gone */
+
+/*
+ * Flags used by ext2fs_extent_set_bmap()
+ */
+#define EXT2_EXTENT_SET_BMAP_UNINIT    0x0001
 
 /*
  * Data structure returned by ext2fs_extent_get_info()
@@ -489,7 +506,6 @@ typedef struct ext2_icount *ext2_icount_t;
                                         EXT3_FEATURE_COMPAT_HAS_JOURNAL|\
                                         EXT2_FEATURE_COMPAT_RESIZE_INODE|\
                                         EXT2_FEATURE_COMPAT_DIR_INDEX|\
-                                        EXT2_FEATURE_COMPAT_LAZY_BG|\
                                         EXT2_FEATURE_COMPAT_EXT_ATTR)
 
 /* This #ifdef is temporary until compression is fully supported */
@@ -516,17 +532,18 @@ typedef struct ext2_icount *ext2_icount_t;
                                         EXT4_FEATURE_INCOMPAT_FLEX_BG)
 #endif
 #define EXT2_LIB_FEATURE_RO_COMPAT_SUPP        (EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER|\
-                                        EXT2_FEATURE_RO_COMPAT_LARGE_FILE)
+                                        EXT4_FEATURE_RO_COMPAT_HUGE_FILE|\
+                                        EXT2_FEATURE_RO_COMPAT_LARGE_FILE|\
+                                        EXT4_FEATURE_RO_COMPAT_DIR_NLINK|\
+                                        EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE|\
+                                        EXT4_FEATURE_RO_COMPAT_GDT_CSUM)
 
 /*
  * These features are only allowed if EXT2_FLAG_SOFTSUPP_FEATURES is passed
  * to ext2fs_openfs()
  */
-#define EXT2_LIB_SOFTSUPP_INCOMPAT     (EXT3_FEATURE_INCOMPAT_EXTENTS)
-#define EXT2_LIB_SOFTSUPP_RO_COMPAT    (EXT4_FEATURE_RO_COMPAT_HUGE_FILE|\
-                                        EXT4_FEATURE_RO_COMPAT_GDT_CSUM|\
-                                        EXT4_FEATURE_RO_COMPAT_DIR_NLINK|\
-                                        EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE)
+#define EXT2_LIB_SOFTSUPP_INCOMPAT     (0)
+#define EXT2_LIB_SOFTSUPP_RO_COMPAT    (0)
 
 /*
  * function prototypes
@@ -543,11 +560,25 @@ extern errcode_t ext2fs_get_free_blocks(ext2_filsys fs, blk_t start,
                                        blk_t *ret);
 extern errcode_t ext2fs_alloc_block(ext2_filsys fs, blk_t goal,
                                    char *block_buf, blk_t *ret);
+extern void ext2fs_set_alloc_block_callback(ext2_filsys fs,
+                                           errcode_t (*func)(ext2_filsys fs,
+                                                             blk64_t goal,
+                                                             blk64_t *ret),
+                                           errcode_t (**old)(ext2_filsys fs,
+                                                             blk64_t goal,
+                                                             blk64_t *ret));
 
 /* alloc_sb.c */
-extern int ext2fs_reserve_super_and_bgd(ext2_filsys fs, 
+extern int ext2fs_reserve_super_and_bgd(ext2_filsys fs,
                                        dgrp_t group,
                                        ext2fs_block_bitmap bmap);
+extern void ext2fs_set_block_alloc_stats_callback(ext2_filsys fs,
+                                                 void (*func)(ext2_filsys fs,
+                                                              blk64_t blk,
+                                                              int inuse),
+                                                 void (**old)(ext2_filsys fs,
+                                                              blk64_t blk,
+                                                              int inuse));
 
 /* alloc_stats.c */
 void ext2fs_inode_alloc_stats(ext2_filsys fs, ext2_ino_t ino, int inuse);
@@ -675,10 +706,10 @@ errcode_t ext2fs_block_iterate2(ext2_filsys fs,
 
 /* bmap.c */
 extern errcode_t ext2fs_bmap(ext2_filsys fs, ext2_ino_t ino,
-                            struct ext2_inode *inode, 
+                            struct ext2_inode *inode,
                             char *block_buf, int bmap_flags,
                             blk_t block, blk_t *phys_blk);
-extern errcode_t ext2fs_bmap2(ext2_filsys fs, ext2_ino_t ino, 
+extern errcode_t ext2fs_bmap2(ext2_filsys fs, ext2_ino_t ino,
                              struct ext2_inode *inode,
                              char *block_buf, int bmap_flags, blk64_t block,
                              int *ret_flags, blk64_t *phys_blk);
@@ -698,7 +729,7 @@ extern errcode_t ext2fs_check_desc(ext2_filsys fs);
 extern errcode_t ext2fs_close(ext2_filsys fs);
 extern errcode_t ext2fs_flush(ext2_filsys fs);
 extern int ext2fs_bg_has_super(ext2_filsys fs, int group_block);
-extern int ext2fs_super_and_bgd_loc(ext2_filsys fs, 
+extern int ext2fs_super_and_bgd_loc(ext2_filsys fs,
                                    dgrp_t group,
                                    blk_t *ret_super_blk,
                                    blk_t *ret_old_desc_blk,
@@ -706,6 +737,11 @@ extern int ext2fs_super_and_bgd_loc(ext2_filsys fs,
                                    int *ret_meta_bg);
 extern void ext2fs_update_dynamic_rev(ext2_filsys fs);
 
+/* csum.c */
+extern void ext2fs_group_desc_csum_set(ext2_filsys fs, dgrp_t group);
+extern int ext2fs_group_desc_csum_verify(ext2_filsys fs, dgrp_t group);
+extern errcode_t ext2fs_set_gdt_csum(ext2_filsys fs);
+
 /* dblist.c */
 
 extern errcode_t ext2fs_get_num_dirs(ext2_filsys fs, ext2_ino_t *ret_num_dirs);
@@ -724,7 +760,7 @@ extern errcode_t ext2fs_set_dir_block(ext2_dblist dblist, ext2_ino_t ino,
 extern errcode_t ext2fs_copy_dblist(ext2_dblist src,
                                    ext2_dblist *dest);
 extern int ext2fs_dblist_count(ext2_dblist dblist);
-extern errcode_t ext2fs_dblist_get_last(ext2_dblist dblist, 
+extern errcode_t ext2fs_dblist_get_last(ext2_dblist dblist,
                                        struct ext2_db_entry **entry);
 extern errcode_t ext2fs_dblist_drop_last(ext2_dblist dblist);
 
@@ -760,7 +796,13 @@ extern errcode_t ext2fs_dirhash(int version, const char *name, int len,
 
 
 /* dir_iterate.c */
-extern errcode_t ext2fs_dir_iterate(ext2_filsys fs, 
+extern errcode_t ext2fs_get_rec_len(ext2_filsys fs,
+                                   struct ext2_dir_entry *dirent,
+                                   unsigned int *rec_len);
+extern errcode_t ext2fs_set_rec_len(ext2_filsys fs,
+                                   unsigned int len,
+                                   struct ext2_dir_entry *dirent);
+extern errcode_t ext2fs_dir_iterate(ext2_filsys fs,
                              ext2_ino_t dir,
                              int flags,
                              char *block_buf,
@@ -770,7 +812,7 @@ extern errcode_t ext2fs_dir_iterate(ext2_filsys fs,
                                          char  *buf,
                                          void  *priv_data),
                              void *priv_data);
-extern errcode_t ext2fs_dir_iterate2(ext2_filsys fs, 
+extern errcode_t ext2fs_dir_iterate2(ext2_filsys fs,
                              ext2_ino_t dir,
                              int flags,
                              char *block_buf,
@@ -803,12 +845,19 @@ extern errcode_t ext2fs_adjust_ea_refcount(ext2_filsys fs, blk_t blk,
 extern errcode_t ext2fs_extent_header_verify(void *ptr, int size);
 extern errcode_t ext2fs_extent_open(ext2_filsys fs, ext2_ino_t ino,
                                    ext2_extent_handle_t *handle);
+extern errcode_t ext2fs_extent_open2(ext2_filsys fs, ext2_ino_t ino,
+                                       struct ext2_inode *inode,
+                                       ext2_extent_handle_t *ret_handle);
+extern void ext2fs_extent_free(ext2_extent_handle_t handle);
 extern errcode_t ext2fs_extent_get(ext2_extent_handle_t handle,
                                   int flags, struct ext2fs_extent *extent);
 extern errcode_t ext2fs_extent_replace(ext2_extent_handle_t handle, int flags,
                                       struct ext2fs_extent *extent);
 extern errcode_t ext2fs_extent_insert(ext2_extent_handle_t handle, int flags,
                                      struct ext2fs_extent *extent);
+extern errcode_t ext2fs_extent_set_bmap(ext2_extent_handle_t handle,
+                                       blk64_t logical, blk64_t physical,
+                                       int flags);
 extern errcode_t ext2fs_extent_delete(ext2_extent_handle_t handle, int flags);
 extern errcode_t ext2fs_extent_get_info(ext2_extent_handle_t handle,
                                        struct ext2_extent_info *info);
@@ -850,8 +899,8 @@ extern void ext2fs_u32_list_free(ext2_u32_list bb);
 
 /* gen_bitmap.c */
 extern void ext2fs_free_generic_bitmap(ext2fs_inode_bitmap bitmap);
-extern errcode_t ext2fs_make_generic_bitmap(errcode_t magic, ext2_filsys fs, 
-                                           __u32 start, __u32 end, 
+extern errcode_t ext2fs_make_generic_bitmap(errcode_t magic, ext2_filsys fs,
+                                           __u32 start, __u32 end,
                                            __u32 real_end,
                                            const char *descr, char *init_map,
                                            ext2fs_generic_bitmap *ret);
@@ -864,9 +913,9 @@ extern errcode_t ext2fs_copy_generic_bitmap(ext2fs_generic_bitmap src,
                                            ext2fs_generic_bitmap *dest);
 extern void ext2fs_clear_generic_bitmap(ext2fs_generic_bitmap bitmap);
 extern errcode_t ext2fs_fudge_generic_bitmap_end(ext2fs_inode_bitmap bitmap,
-                                                errcode_t magic, 
+                                                errcode_t magic,
                                                 errcode_t neq,
-                                                ext2_ino_t end, 
+                                                ext2_ino_t end,
                                                 ext2_ino_t *oend);
 extern void ext2fs_set_generic_bitmap_padding(ext2fs_generic_bitmap map);
 extern errcode_t ext2fs_resize_generic_bitmap(errcode_t magic,
@@ -888,10 +937,19 @@ extern errcode_t ext2fs_set_generic_bitmap_range(ext2fs_generic_bitmap bmap,
 /* getsize.c */
 extern errcode_t ext2fs_get_device_size(const char *file, int blocksize,
                                        blk_t *retblocks);
+extern errcode_t ext2fs_get_device_size2(const char *file, int blocksize,
+                                       blk64_t *retblocks);
 
 /* getsectsize.c */
 errcode_t ext2fs_get_device_sectsize(const char *file, int *sectsize);
 
+/* i_block.c */
+errcode_t ext2fs_iblk_add_blocks(ext2_filsys fs, struct ext2_inode *inode,
+                                blk64_t num_blocks);
+errcode_t ext2fs_iblk_sub_blocks(ext2_filsys fs, struct ext2_inode *inode,
+                                blk64_t num_blocks);
+errcode_t ext2fs_iblk_set(ext2_filsys fs, struct ext2_inode *inode, blk64_t b);
+
 /* imager.c */
 extern errcode_t ext2fs_image_inode_write(ext2_filsys fs, int fd, int flags);
 extern errcode_t ext2fs_image_inode_read(ext2_filsys fs, int fd, int flags);
@@ -913,10 +971,10 @@ extern errcode_t ext2fs_initialize(const char *name, int flags,
 extern void ext2fs_free_icount(ext2_icount_t icount);
 extern errcode_t ext2fs_create_icount_tdb(ext2_filsys fs, char *tdb_dir,
                                          int flags, ext2_icount_t *ret);
-extern errcode_t ext2fs_create_icount2(ext2_filsys fs, int flags, 
+extern errcode_t ext2fs_create_icount2(ext2_filsys fs, int flags,
                                       unsigned int size,
                                       ext2_icount_t hint, ext2_icount_t *ret);
-extern errcode_t ext2fs_create_icount(ext2_filsys fs, int flags, 
+extern errcode_t ext2fs_create_icount(ext2_filsys fs, int flags,
                                      unsigned int size,
                                      ext2_icount_t *ret);
 extern errcode_t ext2fs_icount_fetch(ext2_icount_t icount, ext2_ino_t ino,
@@ -932,9 +990,9 @@ errcode_t ext2fs_icount_validate(ext2_icount_t icount, FILE *);
 
 /* inode.c */
 extern errcode_t ext2fs_flush_icache(ext2_filsys fs);
-extern errcode_t ext2fs_get_next_inode_full(ext2_inode_scan scan, 
+extern errcode_t ext2fs_get_next_inode_full(ext2_inode_scan scan,
                                            ext2_ino_t *ino,
-                                           struct ext2_inode *inode, 
+                                           struct ext2_inode *inode,
                                            int bufsize);
 extern errcode_t ext2fs_open_inode_scan(ext2_filsys fs, int buffer_blocks,
                                  ext2_inode_scan *ret_scan);
@@ -953,12 +1011,12 @@ extern void ext2fs_set_inode_callback
 extern int ext2fs_inode_scan_flags(ext2_inode_scan scan, int set_flags,
                                   int clear_flags);
 extern errcode_t ext2fs_read_inode_full(ext2_filsys fs, ext2_ino_t ino,
-                                       struct ext2_inode * inode, 
+                                       struct ext2_inode * inode,
                                        int bufsize);
 extern errcode_t ext2fs_read_inode (ext2_filsys fs, ext2_ino_t ino,
                            struct ext2_inode * inode);
 extern errcode_t ext2fs_write_inode_full(ext2_filsys fs, ext2_ino_t ino,
-                                        struct ext2_inode * inode, 
+                                        struct ext2_inode * inode,
                                         int bufsize);
 extern errcode_t ext2fs_write_inode(ext2_filsys fs, ext2_ino_t ino,
                            struct ext2_inode * inode);
@@ -969,12 +1027,12 @@ extern errcode_t ext2fs_check_directory(ext2_filsys fs, ext2_ino_t ino);
 
 /* inode_io.c */
 extern io_manager inode_io_manager;
-extern errcode_t ext2fs_inode_io_intern(ext2_filsys fs, ext2_ino_t ino, 
+extern errcode_t ext2fs_inode_io_intern(ext2_filsys fs, ext2_ino_t ino,
                                        char **name);
 extern errcode_t ext2fs_inode_io_intern2(ext2_filsys fs, ext2_ino_t ino,
                                         struct ext2_inode *inode,
                                         char **name);
-       
+
 /* ismounted.c */
 extern errcode_t ext2fs_check_if_mounted(const char *file, int *mount_flags);
 extern errcode_t ext2fs_check_mount_point(const char *device, int *mount_flags,
@@ -1002,6 +1060,8 @@ extern errcode_t ext2fs_mkdir(ext2_filsys fs, ext2_ino_t parent, ext2_ino_t inum
                              const char *name);
 
 /* mkjournal.c */
+extern errcode_t ext2fs_zero_blocks(ext2_filsys fs, blk_t blk, int num,
+                                   blk_t *ret_blk, int *ret_count);
 extern errcode_t ext2fs_create_journal_superblock(ext2_filsys fs,
                                                  __u32 size, int flags,
                                                  char  **ret_jsb);
@@ -1015,11 +1075,11 @@ extern int ext2fs_default_journal_size(__u64 blocks);
 extern errcode_t ext2fs_open(const char *name, int flags, int superblock,
                             unsigned int block_size, io_manager manager,
                             ext2_filsys *ret_fs);
-extern errcode_t ext2fs_open2(const char *name, const char *io_options, 
-                             int flags, int superblock, 
+extern errcode_t ext2fs_open2(const char *name, const char *io_options,
+                             int flags, int superblock,
                              unsigned int block_size, io_manager manager,
                              ext2_filsys *ret_fs);
-extern blk_t ext2fs_descriptor_block_loc(ext2_filsys fs, blk_t group_block, 
+extern blk_t ext2fs_descriptor_block_loc(ext2_filsys fs, blk_t group_block,
                                         dgrp_t i);
 errcode_t ext2fs_get_data_io(ext2_filsys fs, io_channel *old_io);
 errcode_t ext2fs_set_data_io(ext2_filsys fs, io_channel new_io);
@@ -1040,14 +1100,14 @@ extern errcode_t ext2fs_read_bb_inode(ext2_filsys fs,
                                      ext2_badblocks_list *bb_list);
 
 /* read_bb_file.c */
-extern errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f, 
+extern errcode_t ext2fs_read_bb_FILE2(ext2_filsys fs, FILE *f,
                                      ext2_badblocks_list *bb_list,
                                      void *priv_data,
                                      void (*invalid)(ext2_filsys fs,
                                                      blk_t blk,
                                                      char *badstr,
                                                      void *priv_data));
-extern errcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f, 
+extern errcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f,
                                     ext2_badblocks_list *bb_list,
                                     void (*invalid)(ext2_filsys fs,
                                                     blk_t blk));
@@ -1056,7 +1116,7 @@ extern errcode_t ext2fs_read_bb_FILE(ext2_filsys fs, FILE *f,
 extern errcode_t ext2fs_create_resize_inode(ext2_filsys fs);
 
 /* swapfs.c */
-extern void ext2fs_swap_ext_attr(char *to, char *from, int bufsize, 
+extern void ext2fs_swap_ext_attr(char *to, char *from, int bufsize,
                                 int has_header);
 extern void ext2fs_swap_ext_attr_header(struct ext2_ext_attr_header *to_header,
                                        struct ext2_ext_attr_header *from_hdr);
@@ -1161,7 +1221,7 @@ _INLINE_ errcode_t ext2fs_free_mem(void *ptr)
        memcpy(ptr, &p, sizeof(p));
        return 0;
 }
-       
+
 /*
  *  Resize memory
  */