1 /*- 2 * Copyright (c) 2010 Department of Software Engineering, 3 * University of Szeged, Hungary 4 * Copyright (C) 2009 Ferenc Havasi <havasi@inf.u-szeged.hu> 5 * Copyright (C) 2009 Zoltan Sogor <weth@inf.u-szeged.hu> 6 * Copyright (C) 2009 David Tengeri <dtengeri@inf.u-szeged.hu> 7 * Copyright (C) 2010 Adam Hoka <ahoka@NetBSD.org> 8 * All rights reserved. 9 * 10 * This code is derived from software contributed to The NetBSD Foundation 11 * by the Department of Software Engineering, University of Szeged, Hungary 12 * 13 * Redistribution and use in source and binary forms, with or without 14 * modification, are permitted provided that the following conditions 15 * are met: 16 * 1. Redistributions of source code must retain the above copyright 17 * notice, this list of conditions and the following disclaimer. 18 * 2. Redistributions in binary form must reproduce the above copyright 19 * notice, this list of conditions and the following disclaimer in the 20 * documentation and/or other materials provided with the distribution. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 23 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 24 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 25 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 27 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 28 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 29 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 30 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 */ 34 35 #ifndef __CHFS_MEDIA_H__ 36 #define __CHFS_MEDIA_H__ 37 38 #ifndef _LE_TYPES 39 #define _LE_TYPES 40 typedef uint16_t le16; 41 typedef uint32_t le32; 42 typedef uint64_t le64; 43 #endif /* _LE_TYPES */ 44 45 /* node types */ 46 enum { 47 CHFS_NODETYPE_VNODE = 1, /* vnode information */ 48 CHFS_NODETYPE_DATA, /* data node */ 49 CHFS_NODETYPE_DIRENT, /* directory enrty */ 50 CHFS_NODETYPE_PADDING, /* padding node */ 51 }; 52 53 #define CHFS_NODE_HDR_SIZE sizeof(struct chfs_flash_node_hdr) 54 55 /* 56 * Max size we have to read to get all info. 57 * It is max size of chfs_flash_dirent_node with max name length. 58 */ 59 #define CHFS_MAX_NODE_SIZE 299 60 61 /* This will identify CHfs nodes */ 62 #define CHFS_FS_MAGIC_BITMASK 0x4AF1 63 64 /* 65 * struct chfs_flash_node_hdr - 66 * node header, its members are same for all nodes, used at scan 67 */ 68 struct chfs_flash_node_hdr 69 { 70 le16 magic; /* filesystem magic */ 71 le16 type; /* node type */ 72 le32 length; /* length of node */ 73 le32 hdr_crc; /* crc of the first 3 fields */ 74 } __packed; 75 76 /* struct chfs_flash_vnode - vnode informations stored on flash */ 77 struct chfs_flash_vnode 78 { 79 le16 magic; /* filesystem magic */ 80 le16 type; /* node type (should be CHFS_NODETYPE_VNODE) */ 81 le32 length; /* length of node */ 82 le32 hdr_crc; /* crc of the first 3 fields */ 83 le64 vno; /* vnode number */ 84 le64 version; /* version of node */ 85 le32 uid; /* owner of file */ 86 le32 gid; /* group of file */ 87 le32 mode; /* permission of vnode */ 88 le32 dn_size; /* size of written data */ 89 le32 atime; /* last access time */ 90 le32 mtime; /* last modification time */ 91 le32 ctime; /* change time */ 92 le32 dsize; /* NOT USED, backward compatibility */ 93 le32 node_crc; /* crc of all the previous fields */ 94 } __packed; 95 96 /* struct chfs_flash_data_node - data stored on flash */ 97 struct chfs_flash_data_node 98 { 99 le16 magic; /* filesystem magic */ 100 le16 type; /* node type (should be CHFS_NODETYPE_DATA) */ 101 le32 length; /* length of vnode with data */ 102 le32 hdr_crc; /* crc of the first 3 fields */ 103 le64 vno; /* vnode number */ 104 le64 version; /* version of node */ 105 le64 offset; /* offset in the file */ 106 le32 data_length; /* length of data */ 107 le32 data_crc; /* crc of data*/ 108 le32 node_crc; /* crc of full node */ 109 uint8_t data[0]; /* data */ 110 } __packed; 111 112 /* 113 * struct chfs_flash_dirent_node - 114 * directory entry information stored on flash 115 */ 116 struct chfs_flash_dirent_node 117 { 118 le16 magic; /* filesystem magic */ 119 le16 type; /* node type (should be CHFS_NODETYPE_DIRENT) */ 120 le32 length; /* length of node with name */ 121 le32 hdr_crc; /* crc of the first 3 fields */ 122 le64 vno; /* vnode number */ 123 le64 pvno; /* parent's vnode number */ 124 le64 version; /* version of node */ 125 le32 mctime; /* */ 126 uint8_t nsize; /* length of name */ 127 uint8_t dtype; /* file type */ 128 uint8_t unused[2]; /* just for padding */ 129 le32 name_crc; /* crc of name */ 130 le32 node_crc; /* crc of full node */ 131 uint8_t name[0]; /* name of directory entry */ 132 } __packed; 133 134 /* struct chfs_flash_padding_node - spaceholder node on flash */ 135 struct chfs_flash_padding_node 136 { 137 le16 magic; /* filesystem magic */ 138 le16 type; /* node type (should be CHFS_NODETYPE_PADDING )*/ 139 le32 length; /* length of node */ 140 le32 hdr_crc; /* crc of the first 3 fields */ 141 } __packed; 142 143 #endif /* __CHFS_MEDIA_H__ */ 144