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 | |
Doug Zongker | e8d74ff | 2011-10-28 10:21:08 -0700 | [diff] [blame] | 20 | #ifdef __cplusplus |
| 21 | extern "C" { |
| 22 | #endif |
| 23 | |
| 24 | #ifndef _GNU_SOURCE |
Colin Cross | 33f96c6 | 2010-12-22 18:40:14 -0800 | [diff] [blame] | 25 | #define _GNU_SOURCE |
Doug Zongker | e8d74ff | 2011-10-28 10:21:08 -0700 | [diff] [blame] | 26 | #endif |
Colin Cross | 33f96c6 | 2010-12-22 18:40:14 -0800 | [diff] [blame] | 27 | #define _FILE_OFFSET_BITS 64 |
Colin Cross | dc5abee | 2012-04-23 23:20:48 -0700 | [diff] [blame] | 28 | #define _LARGEFILE64_SOURCE 1 |
Colin Cross | 33f96c6 | 2010-12-22 18:40:14 -0800 | [diff] [blame] | 29 | #include <sys/types.h> |
| 30 | #include <unistd.h> |
| 31 | |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 32 | #include <sys/types.h> |
| 33 | #include <errno.h> |
| 34 | #include <stdarg.h> |
| 35 | #include <stdio.h> |
| 36 | #include <stdlib.h> |
| 37 | #include <string.h> |
Ken Sumrall | 2ae7663 | 2011-03-23 22:08:53 -0700 | [diff] [blame] | 38 | #include <setjmp.h> |
Nick Kralevich | 4df62f3 | 2013-02-07 14:21:34 -0800 | [diff] [blame] | 39 | #include <stdint.h> |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 40 | |
Colin Cross | 33f96c6 | 2010-12-22 18:40:14 -0800 | [diff] [blame] | 41 | #if defined(__APPLE__) && defined(__MACH__) |
| 42 | #define lseek64 lseek |
Colin Cross | fe4a031 | 2011-01-05 18:05:34 -0800 | [diff] [blame] | 43 | #define ftruncate64 ftruncate |
| 44 | #define mmap64 mmap |
Colin Cross | 33f96c6 | 2010-12-22 18:40:14 -0800 | [diff] [blame] | 45 | #define off64_t off_t |
| 46 | #endif |
| 47 | |
Colin Cross | 9a2b60b | 2014-01-23 13:13:02 -0800 | [diff] [blame^] | 48 | #include "ext4_sb.h" |
Colin Cross | 7900c77 | 2014-01-23 12:53:30 -0800 | [diff] [blame] | 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 | |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 58 | #define EXT4_JNL_BACKUP_BLOCKS 1 |
| 59 | |
Raphael Moll | 4605b3f | 2012-02-03 23:02:33 -0800 | [diff] [blame] | 60 | #ifndef min /* already defined by windows.h */ |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 61 | #define min(a, b) ((a) < (b) ? (a) : (b)) |
Raphael Moll | 4605b3f | 2012-02-03 23:02:33 -0800 | [diff] [blame] | 62 | #endif |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 63 | |
| 64 | #define DIV_ROUND_UP(x, y) (((x) + (y) - 1)/(y)) |
Colin Cross | 6bd2b5d | 2010-08-05 11:56:38 -0700 | [diff] [blame] | 65 | #define ALIGN(x, y) ((y) * DIV_ROUND_UP((x), (y))) |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 66 | |
Nick Kralevich | 4df62f3 | 2013-02-07 14:21:34 -0800 | [diff] [blame] | 67 | /* XXX */ |
| 68 | #define cpu_to_le32(x) (x) |
| 69 | #define cpu_to_le16(x) (x) |
| 70 | #define le32_to_cpu(x) (x) |
| 71 | #define le16_to_cpu(x) (x) |
| 72 | |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 73 | typedef unsigned long long u64; |
Ken Sumrall | 435a8b6 | 2011-01-14 18:33:06 -0800 | [diff] [blame] | 74 | typedef signed long long s64; |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 75 | typedef unsigned int u32; |
| 76 | typedef unsigned short int u16; |
| 77 | typedef unsigned char u8; |
| 78 | |
| 79 | struct block_group_info; |
Nick Kralevich | 4df62f3 | 2013-02-07 14:21:34 -0800 | [diff] [blame] | 80 | struct xattr_list_element; |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 81 | |
| 82 | struct ext2_group_desc { |
Colin Cross | 7900c77 | 2014-01-23 12:53:30 -0800 | [diff] [blame] | 83 | u32 bg_block_bitmap; |
| 84 | u32 bg_inode_bitmap; |
| 85 | u32 bg_inode_table; |
| 86 | u16 bg_free_blocks_count; |
| 87 | u16 bg_free_inodes_count; |
| 88 | u16 bg_used_dirs_count; |
| 89 | u16 bg_flags; |
| 90 | u32 bg_reserved[2]; |
| 91 | u16 bg_reserved16; |
| 92 | u16 bg_checksum; |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 93 | }; |
| 94 | |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 95 | struct fs_aux_info { |
| 96 | struct ext4_super_block *sb; |
Ken Sumrall | 107a9f1 | 2011-06-29 20:28:30 -0700 | [diff] [blame] | 97 | struct ext4_super_block **backup_sb; |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 98 | struct ext2_group_desc *bg_desc; |
| 99 | struct block_group_info *bgs; |
Nick Kralevich | 4df62f3 | 2013-02-07 14:21:34 -0800 | [diff] [blame] | 100 | struct xattr_list_element *xattrs; |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 101 | u32 first_data_block; |
| 102 | u64 len_blocks; |
| 103 | u32 inode_table_blocks; |
| 104 | u32 groups; |
| 105 | u32 bg_desc_blocks; |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 106 | u32 default_i_flags; |
| 107 | u32 blocks_per_ind; |
| 108 | u32 blocks_per_dind; |
| 109 | u32 blocks_per_tind; |
| 110 | }; |
| 111 | |
| 112 | extern struct fs_info info; |
| 113 | extern struct fs_aux_info aux_info; |
Colin Cross | 782879a | 2014-01-23 13:08:16 -0800 | [diff] [blame] | 114 | extern struct sparse_file *ext4_sparse_file; |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 115 | |
Ken Sumrall | 2ae7663 | 2011-03-23 22:08:53 -0700 | [diff] [blame] | 116 | extern jmp_buf setjmp_env; |
| 117 | |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 118 | static inline int log_2(int j) |
| 119 | { |
| 120 | int i; |
| 121 | |
| 122 | for (i = 0; j > 0; i++) |
| 123 | j >>= 1; |
| 124 | |
| 125 | return i - 1; |
| 126 | } |
| 127 | |
Colin Cross | 881cca2 | 2010-06-20 23:57:06 -0700 | [diff] [blame] | 128 | int ext4_bg_has_super_block(int bg); |
Colin Cross | dc5abee | 2012-04-23 23:20:48 -0700 | [diff] [blame] | 129 | void write_ext4_image(int fd, int gz, int sparse, int crc); |
Colin Cross | 881cca2 | 2010-06-20 23:57:06 -0700 | [diff] [blame] | 130 | void ext4_create_fs_aux_info(void); |
| 131 | void ext4_free_fs_aux_info(void); |
| 132 | void ext4_fill_in_sb(void); |
| 133 | void ext4_create_resize_inode(void); |
| 134 | void ext4_create_journal_inode(void); |
| 135 | void ext4_update_free(void); |
Colin Cross | b781330 | 2010-12-22 18:41:13 -0800 | [diff] [blame] | 136 | void ext4_queue_sb(void); |
Szymon Starzycki | fe87e11 | 2013-07-24 12:34:50 -0700 | [diff] [blame] | 137 | u64 get_block_device_size(int fd); |
Anatol Pomazau | 0349bd9 | 2012-01-11 15:12:27 -0800 | [diff] [blame] | 138 | u64 get_file_size(int fd); |
Colin Cross | 881cca2 | 2010-06-20 23:57:06 -0700 | [diff] [blame] | 139 | u64 parse_num(const char *arg); |
Colin Cross | 9a2b60b | 2014-01-23 13:13:02 -0800 | [diff] [blame^] | 140 | void ext4_parse_sb_info(struct ext4_super_block *sb); |
Colin Cross | 56497f2 | 2013-02-04 00:44:55 -0800 | [diff] [blame] | 141 | u16 ext4_crc16(u16 crc_in, const void *buf, int size); |
Colin Cross | 881cca2 | 2010-06-20 23:57:06 -0700 | [diff] [blame] | 142 | |
Colin Cross | 9652986 | 2013-01-23 15:38:57 -0800 | [diff] [blame] | 143 | typedef void (*fs_config_func_t)(const char *path, int dir, unsigned *uid, unsigned *gid, |
Nick Kralevich | 4df62f3 | 2013-02-07 14:21:34 -0800 | [diff] [blame] | 144 | unsigned *mode, uint64_t *capabilities); |
Colin Cross | 9652986 | 2013-01-23 15:38:57 -0800 | [diff] [blame] | 145 | |
| 146 | struct selabel_handle; |
| 147 | |
| 148 | int make_ext4fs_internal(int fd, const char *directory, |
| 149 | const char *mountpoint, fs_config_func_t fs_config_func, int gzip, |
Colin Cross | 56497f2 | 2013-02-04 00:44:55 -0800 | [diff] [blame] | 150 | int sparse, int crc, int wipe, |
William Roberts | 2057370 | 2013-01-17 13:24:27 -0800 | [diff] [blame] | 151 | struct selabel_handle *sehnd, int verbose); |
Colin Cross | 9652986 | 2013-01-23 15:38:57 -0800 | [diff] [blame] | 152 | |
Doug Zongker | e8d74ff | 2011-10-28 10:21:08 -0700 | [diff] [blame] | 153 | #ifdef __cplusplus |
| 154 | } |
| 155 | #endif |
| 156 | |
Colin Cross | ec0a2e8 | 2010-06-11 14:21:37 -0700 | [diff] [blame] | 157 | #endif |