Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2010 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
| 17 | #ifndef _EXT4_UTILS_H_ |
| 18 | #define _EXT4_UTILS_H_ |
| 19 | |
Colin Cross | 33f96c6 | 2010-12-22 18:40:14 -0800 | [diff] [blame] | 20 | #define _GNU_SOURCE |
| 21 | #define _FILE_OFFSET_BITS 64 |
| 22 | #define _LARGEFILE64_SOURCE |
| 23 | #include <sys/types.h> |
| 24 | #include <unistd.h> |
| 25 | |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 26 | #include <sys/types.h> |
| 27 | #include <errno.h> |
| 28 | #include <stdarg.h> |
| 29 | #include <stdio.h> |
| 30 | #include <stdlib.h> |
| 31 | #include <string.h> |
Ken Sumrall | 2ae7663 | 2011-03-23 22:08:53 -0700 | [diff] [blame^] | 32 | #include <setjmp.h> |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 33 | |
Colin Cross | 33f96c6 | 2010-12-22 18:40:14 -0800 | [diff] [blame] | 34 | #if defined(__APPLE__) && defined(__MACH__) |
| 35 | #define lseek64 lseek |
Colin Cross | fe4a031 | 2011-01-05 18:05:34 -0800 | [diff] [blame] | 36 | #define ftruncate64 ftruncate |
| 37 | #define mmap64 mmap |
Colin Cross | 33f96c6 | 2010-12-22 18:40:14 -0800 | [diff] [blame] | 38 | #define off64_t off_t |
| 39 | #endif |
| 40 | |
| 41 | #ifdef __BIONIC__ |
| 42 | extern void* __mmap2(void *, size_t, int, int, int, off_t); |
| 43 | static inline void *mmap64(void *addr, size_t length, int prot, int flags, |
| 44 | int fd, off64_t offset) |
| 45 | { |
| 46 | return __mmap2(addr, length, prot, flags, fd, offset >> 12); |
| 47 | } |
| 48 | #endif |
| 49 | |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 50 | extern int force; |
| 51 | |
| 52 | #define warn(fmt, args...) do { fprintf(stderr, "warning: %s: " fmt "\n", __func__, ## args); } while (0) |
Ken Sumrall | 2ae7663 | 2011-03-23 22:08:53 -0700 | [diff] [blame^] | 53 | #define error(fmt, args...) do { fprintf(stderr, "error: %s: " fmt "\n", __func__, ## args); if (!force) longjmp(setjmp_env, EXIT_FAILURE); } while (0) |
Colin Cross | a7ed433 | 2010-12-22 23:08:15 -0800 | [diff] [blame] | 54 | #define error_errno(s, args...) error(s ": %s", ##args, strerror(errno)) |
Ken Sumrall | 2ae7663 | 2011-03-23 22:08:53 -0700 | [diff] [blame^] | 55 | #define critical_error(fmt, args...) do { fprintf(stderr, "critical error: %s: " fmt "\n", __func__, ## args); longjmp(setjmp_env, EXIT_FAILURE); } while (0) |
Colin Cross | a7ed433 | 2010-12-22 23:08:15 -0800 | [diff] [blame] | 56 | #define critical_error_errno(s, args...) critical_error(s ": %s", ##args, strerror(errno)) |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 57 | |
| 58 | #define EXT4_SUPER_MAGIC 0xEF53 |
| 59 | #define EXT4_JNL_BACKUP_BLOCKS 1 |
| 60 | |
| 61 | #define min(a, b) ((a) < (b) ? (a) : (b)) |
| 62 | |
| 63 | #define DIV_ROUND_UP(x, y) (((x) + (y) - 1)/(y)) |
Colin Cross | 6bd2b5d | 2010-08-05 11:56:38 -0700 | [diff] [blame] | 64 | #define ALIGN(x, y) ((y) * DIV_ROUND_UP((x), (y))) |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 65 | |
| 66 | #define __le64 u64 |
| 67 | #define __le32 u32 |
| 68 | #define __le16 u16 |
| 69 | |
| 70 | #define __be64 u64 |
| 71 | #define __be32 u32 |
| 72 | #define __be16 u16 |
| 73 | |
| 74 | #define __u64 u64 |
| 75 | #define __u32 u32 |
| 76 | #define __u16 u16 |
| 77 | #define __u8 u8 |
| 78 | |
| 79 | typedef unsigned long long u64; |
Ken Sumrall | 435a8b6 | 2011-01-14 18:33:06 -0800 | [diff] [blame] | 80 | typedef signed long long s64; |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 81 | typedef unsigned int u32; |
| 82 | typedef unsigned short int u16; |
| 83 | typedef unsigned char u8; |
| 84 | |
| 85 | struct block_group_info; |
| 86 | |
| 87 | struct ext2_group_desc { |
| 88 | __le32 bg_block_bitmap; |
| 89 | __le32 bg_inode_bitmap; |
| 90 | __le32 bg_inode_table; |
| 91 | __le16 bg_free_blocks_count; |
| 92 | __le16 bg_free_inodes_count; |
| 93 | __le16 bg_used_dirs_count; |
| 94 | __le16 bg_pad; |
| 95 | __le32 bg_reserved[3]; |
| 96 | }; |
| 97 | |
| 98 | struct fs_info { |
Ken Sumrall | 435a8b6 | 2011-01-14 18:33:06 -0800 | [diff] [blame] | 99 | s64 len; /* If set to 0, ask the block device for the size, |
| 100 | * if less than 0, reserve that much space at the |
| 101 | * end of the partition, else use the size given. */ |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 102 | u32 block_size; |
| 103 | u32 blocks_per_group; |
| 104 | u32 inodes_per_group; |
| 105 | u32 inode_size; |
| 106 | u32 inodes; |
| 107 | u32 journal_blocks; |
| 108 | u16 feat_ro_compat; |
| 109 | u16 feat_compat; |
| 110 | u16 feat_incompat; |
Colin Cross | 22742ce | 2010-12-22 16:01:52 -0800 | [diff] [blame] | 111 | u32 bg_desc_reserve_blocks; |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 112 | const char *label; |
Colin Cross | e4b5ae8 | 2010-08-03 14:10:07 -0700 | [diff] [blame] | 113 | u8 no_journal; |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 114 | }; |
| 115 | |
| 116 | struct fs_aux_info { |
| 117 | struct ext4_super_block *sb; |
| 118 | struct ext2_group_desc *bg_desc; |
| 119 | struct block_group_info *bgs; |
| 120 | u32 first_data_block; |
| 121 | u64 len_blocks; |
| 122 | u32 inode_table_blocks; |
| 123 | u32 groups; |
| 124 | u32 bg_desc_blocks; |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 125 | u32 default_i_flags; |
| 126 | u32 blocks_per_ind; |
| 127 | u32 blocks_per_dind; |
| 128 | u32 blocks_per_tind; |
| 129 | }; |
| 130 | |
| 131 | extern struct fs_info info; |
| 132 | extern struct fs_aux_info aux_info; |
| 133 | |
Ken Sumrall | 2ae7663 | 2011-03-23 22:08:53 -0700 | [diff] [blame^] | 134 | extern jmp_buf setjmp_env; |
| 135 | |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 136 | static inline int log_2(int j) |
| 137 | { |
| 138 | int i; |
| 139 | |
| 140 | for (i = 0; j > 0; i++) |
| 141 | j >>= 1; |
| 142 | |
| 143 | return i - 1; |
| 144 | } |
| 145 | |
Colin Cross | 881cca2 | 2010-06-20 23:57:06 -0700 | [diff] [blame] | 146 | int ext4_bg_has_super_block(int bg); |
Colin Cross | c247065 | 2011-01-26 16:39:46 -0800 | [diff] [blame] | 147 | void write_ext4_image(const char *filename, int gz, int sparse, int crc, |
| 148 | int wipe); |
Colin Cross | 881cca2 | 2010-06-20 23:57:06 -0700 | [diff] [blame] | 149 | void ext4_create_fs_aux_info(void); |
| 150 | void ext4_free_fs_aux_info(void); |
| 151 | void ext4_fill_in_sb(void); |
| 152 | void ext4_create_resize_inode(void); |
| 153 | void ext4_create_journal_inode(void); |
| 154 | void ext4_update_free(void); |
Colin Cross | b781330 | 2010-12-22 18:41:13 -0800 | [diff] [blame] | 155 | void ext4_queue_sb(void); |
Colin Cross | 881cca2 | 2010-06-20 23:57:06 -0700 | [diff] [blame] | 156 | u64 get_file_size(const char *filename); |
| 157 | u64 parse_num(const char *arg); |
Colin Cross | a7ed433 | 2010-12-22 23:08:15 -0800 | [diff] [blame] | 158 | void ext4_parse_sb(struct ext4_super_block *sb); |
Colin Cross | 881cca2 | 2010-06-20 23:57:06 -0700 | [diff] [blame] | 159 | |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 160 | #endif |