1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
|
/*
* vmfs-tools - Tools to access VMFS filesystems
* Copyright (C) 2009 Christophe Fillot <cf@utc.fr>
* Copyright (C) 2009,2011,2012 Mike Hommey <mh@glandium.org>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef VMFS_BLOCK_H
#define VMFS_BLOCK_H
/* Block types */
enum vmfs_block_type {
VMFS_BLK_TYPE_NONE = 0,
VMFS_BLK_TYPE_FB, /* File Block */
VMFS_BLK_TYPE_SB, /* Sub-Block */
VMFS_BLK_TYPE_PB, /* Pointer Block */
VMFS_BLK_TYPE_FD, /* File Descriptor */
VMFS_BLK_TYPE_MAX,
};
#define VMFS_BLK_SHIFT(mask) __builtin_ctz(mask)
#define VMFS_BLK_VALUE(blk_id, mask) (((blk_id) & (mask)) >> VMFS_BLK_SHIFT(mask))
#define VMFS_BLK_MAX_VALUE(mask) (((mask) >> VMFS_BLK_SHIFT(mask)) + 1)
#define VMFS_BLK_FILL(value, mask) (((value) << VMFS_BLK_SHIFT(mask)) & (mask))
#define VMFS_BLK_TYPE_MASK 0x00000007
/* Extract block type from a block ID */
#define VMFS_BLK_TYPE(blk_id) VMFS_BLK_VALUE(blk_id, VMFS_BLK_TYPE_MASK)
/* File-Block
* { unsigned int item:26;
* unsigned int flags:3;
* unsigned int type:3; }
* There is probably really no more than one flag, but so far, nothing
* indicates what can be stored between the significant bits for the block
* type and the TBZ flag, so we'll consider they are flags of some sort,
* and will display them as such.
*/
#define VMFS_BLK_FB_ITEM_MASK 0xffffffc0
#define VMFS_BLK_FB_FLAGS_MASK 0x00000038
/* TBZ flag specifies if the block must be zeroed. */
#define VMFS_BLK_FB_TBZ_FLAG 4
#define VMFS_BLK_FB_ITEM(blk_id) VMFS_BLK_VALUE(blk_id, VMFS_BLK_FB_ITEM_MASK)
#define VMFS_BLK_FB_FLAGS(blk_id) VMFS_BLK_VALUE(blk_id, VMFS_BLK_FB_FLAGS_MASK)
#define VMFS_BLK_FB_MAX_ITEM VMFS_BLK_MAX_VALUE(VMFS_BLK_FB_ITEM_MASK)
#define VMFS_BLK_FB_TBZ(blk_id) \
(VMFS_BLK_FB_FLAGS(blk_id) & VMFS_BLK_FB_TBZ_FLAG)
#define VMFS_BLK_FB_TBZ_CLEAR(blk_id) ((blk_id) & ~(VMFS_BLK_FILL(VMFS_BLK_FB_TBZ_FLAG, VMFS_BLK_FB_FLAGS_MASK)))
#define VMFS_BLK_FB_BUILD(item, flags) \
(VMFS_BLK_FILL(item, VMFS_BLK_FB_ITEM_MASK) | \
VMFS_BLK_FILL(flags, VMFS_BLK_FB_FLAGS_MASK) | \
VMFS_BLK_TYPE_FB)
/* Sub-Block
* { unsigned int item_lsb:4;
* unsigned int entry:22;
* unsigned int flags:1; // Not sure it even exists
* unsigned int item_msb: 2;
* unsigned int type:3; }
*/
#define VMFS_BLK_SB_ITEM_LSB_MASK 0xf0000000
#define VMFS_BLK_SB_ENTRY_MASK 0x0fffffc0
#define VMFS_BLK_SB_FLAGS_MASK 0x00000020
#define VMFS_BLK_SB_ITEM_MSB_MASK 0x00000018
#define VMFS_BLK_SB_ITEM_VALUE_LSB_MASK 0x0000000f
#define VMFS_BLK_SB_ITEM_VALUE_MSB_MASK 0x00000030
#define VMFS_BLK_SB_ITEM(blk_id) \
(VMFS_BLK_FILL(VMFS_BLK_VALUE(blk_id, VMFS_BLK_SB_ITEM_LSB_MASK), VMFS_BLK_SB_ITEM_VALUE_LSB_MASK) | \
VMFS_BLK_FILL(VMFS_BLK_VALUE(blk_id, VMFS_BLK_SB_ITEM_MSB_MASK), VMFS_BLK_SB_ITEM_VALUE_MSB_MASK))
#define VMFS_BLK_SB_ENTRY(blk_id) VMFS_BLK_VALUE(blk_id, VMFS_BLK_SB_ENTRY_MASK)
#define VMFS_BLK_SB_FLAGS(blk_id) VMFS_BLK_VALUE(blk_id, VMFS_BLK_SB_FLAGS_MASK)
#define VMFS_BLK_SB_MAX_ITEM VMFS_BLK_MAX_VALUE(VMFS_BLK_SB_ITEM_VALUE_LSB_MASK | VMFS_BLK_SB_ITEM_VALUE_MSB_MASK)
#define VMFS_BLK_SB_MAX_ENTRY VMFS_BLK_MAX_VALUE(VMFS_BLK_SB_ENTRY_MASK)
#define VMFS_BLK_SB_BUILD(entry, item, flags) \
(VMFS_BLK_FILL(entry, VMFS_BLK_SB_ENTRY_MASK) | \
VMFS_BLK_FILL(VMFS_BLK_VALUE(item, VMFS_BLK_SB_ITEM_VALUE_LSB_MASK), \
VMFS_BLK_SB_ITEM_LSB_MASK) | \
VMFS_BLK_FILL(VMFS_BLK_VALUE(item, VMFS_BLK_SB_ITEM_VALUE_MSB_MASK), \
VMFS_BLK_SB_ITEM_MSB_MASK) | \
VMFS_BLK_FILL(flags, VMFS_BLK_SB_FLAGS_MASK) | \
VMFS_BLK_TYPE_SB)
/* Pointer-Block
* { unsigned int item:4;
* unsigned int entry:22;
* unsigned int flags:3;
* unsigned int type:3; }
*/
#define VMFS_BLK_PB_ITEM_MASK 0xf0000000
#define VMFS_BLK_PB_ENTRY_MASK 0x0fffffc0
#define VMFS_BLK_PB_FLAGS_MASK 0x00000038
#define VMFS_BLK_PB_ITEM(blk_id) VMFS_BLK_VALUE(blk_id, VMFS_BLK_PB_ITEM_MASK)
#define VMFS_BLK_PB_ENTRY(blk_id) VMFS_BLK_VALUE(blk_id, VMFS_BLK_PB_ENTRY_MASK)
#define VMFS_BLK_PB_FLAGS(blk_id) VMFS_BLK_VALUE(blk_id, VMFS_BLK_PB_FLAGS_MASK)
#define VMFS_BLK_PB_MAX_ITEM VMFS_BLK_MAX_VALUE(VMFS_BLK_PB_ITEM_MASK)
#define VMFS_BLK_PB_MAX_ENTRY VMFS_BLK_MAX_VALUE(VMFS_BLK_PB_ENTRY_MASK)
#define VMFS_BLK_PB_BUILD(entry, item, flags) \
(VMFS_BLK_FILL(entry, VMFS_BLK_PB_ENTRY_MASK) | \
VMFS_BLK_FILL(item, VMFS_BLK_PB_ITEM_MASK) | \
VMFS_BLK_FILL(flags, VMFS_BLK_PB_FLAGS_MASK) | \
VMFS_BLK_TYPE_PB)
/* File Descriptor
* { unsigned int item:10;
* unsigned int entry:16;
* unsigned int flags:3;
* unsigned int type:3; }
*/
#define VMFS_BLK_FD_ITEM_MASK 0xffc00000
#define VMFS_BLK_FD_ENTRY_MASK 0x003fffc0
#define VMFS_BLK_FD_FLAGS_MASK 0x00000038
#define VMFS_BLK_FD_ITEM(blk_id) VMFS_BLK_VALUE(blk_id, VMFS_BLK_FD_ITEM_MASK)
#define VMFS_BLK_FD_ENTRY(blk_id) VMFS_BLK_VALUE(blk_id, VMFS_BLK_FD_ENTRY_MASK)
#define VMFS_BLK_FD_FLAGS(blk_id) VMFS_BLK_VALUE(blk_id, VMFS_BLK_FD_FLAGS_MASK)
#define VMFS_BLK_FD_MAX_ITEM VMFS_BLK_MAX_VALUE(VMFS_BLK_FD_ITEM_MASK)
#define VMFS_BLK_FD_MAX_ENTRY VMFS_BLK_MAX_VALUE(VMFS_BLK_FD_ENTRY_MASK)
#define VMFS_BLK_FD_BUILD(entry, item, flags) \
(VMFS_BLK_FILL(entry, VMFS_BLK_FD_ENTRY_MASK) | \
VMFS_BLK_FILL(item, VMFS_BLK_FD_ITEM_MASK) | \
VMFS_BLK_FILL(flags, VMFS_BLK_FD_FLAGS_MASK) | \
VMFS_BLK_TYPE_FD)
struct vmfs_block_info {
uint32_t entry, item, flags;
enum vmfs_block_type type;
};
/* Get bitmap info (bitmap type,entry and item) from a block ID */
int vmfs_block_get_info(uint32_t blk_id, vmfs_block_info_t *info);
/* Get block status (allocated or free) */
int vmfs_block_get_status(const vmfs_fs_t *fs,uint32_t blk_id);
/* Allocate the specified block */
int vmfs_block_alloc_specified(const vmfs_fs_t *fs,uint32_t blk_id);
/* Free the specified block */
int vmfs_block_free(const vmfs_fs_t *fs,uint32_t blk_id);
/* Allocate a single block */
int vmfs_block_alloc(const vmfs_fs_t *fs,uint32_t blk_type,uint32_t *blk_id);
/* Zeroize a file block */
int vmfs_block_zeroize_fb(const vmfs_fs_t *fs,uint32_t blk_id);
/* Free blocks hold by a pointer block */
int vmfs_block_free_pb(const vmfs_fs_t *fs,uint32_t pb_blk,
u_int start,u_int end);
/* Read a piece of a sub-block */
ssize_t vmfs_block_read_sb(const vmfs_fs_t *fs,uint32_t blk_id,off_t pos,
u_char *buf,size_t len);
/* Write a piece of a sub-block */
ssize_t vmfs_block_write_sb(const vmfs_fs_t *fs,uint32_t blk_id,off_t pos,
u_char *buf,size_t len);
/* Read a piece of a file block */
ssize_t vmfs_block_read_fb(const vmfs_fs_t *fs,uint32_t blk_id,off_t pos,
u_char *buf,size_t len);
/* Write a piece of a file block */
ssize_t vmfs_block_write_fb(const vmfs_fs_t *fs,uint32_t blk_id,off_t pos,
u_char *buf,size_t len);
#endif
|