summaryrefslogtreecommitdiff
path: root/sys/ufs/chfs/media.h
blob: 89c744613e5a5ff9d18f56844cc635690d1bfac8 (plain)
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
/*-
 * Copyright (c) 2010 Department of Software Engineering,
 *		      University of Szeged, Hungary
 * Copyright (C) 2009 Ferenc Havasi <havasi@inf.u-szeged.hu>
 * Copyright (C) 2009 Zoltan Sogor <weth@inf.u-szeged.hu>
 * Copyright (C) 2009 David Tengeri <dtengeri@inf.u-szeged.hu>
 * Copyright (C) 2010 Adam Hoka <ahoka@NetBSD.org>
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by the Department of Software Engineering, University of Szeged, Hungary
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#ifndef __CHFS_MEDIA_H__
#define __CHFS_MEDIA_H__

#ifndef _LE_TYPES
#define _LE_TYPES
typedef uint16_t le16;
typedef uint32_t le32;
typedef uint64_t le64;
#endif	/* _LE_TYPES */

/* node types */
enum {
	CHFS_NODETYPE_VNODE = 1,	/* vnode information */
	CHFS_NODETYPE_DATA,			/* data node */
	CHFS_NODETYPE_DIRENT,		/* directory enrty */
	CHFS_NODETYPE_PADDING,		/* padding node */
};

#define CHFS_NODE_HDR_SIZE sizeof(struct chfs_flash_node_hdr)

/*
 * Max size we have to read to get all info.
 * It is max size of chfs_flash_dirent_node with max name length.
 */
#define CHFS_MAX_NODE_SIZE 299

/* This will identify CHfs nodes */
#define CHFS_FS_MAGIC_BITMASK 0x4AF1

/*
 * struct chfs_flash_node_hdr - 
 * node header, its members are same for all nodes, used at scan
 */
struct chfs_flash_node_hdr
{
	le16 magic;		/* filesystem magic */
	le16 type;		/* node type */
	le32 length;	/* length of node */
	le32 hdr_crc;	/* crc of the first 3 fields */
} __packed;

/* struct chfs_flash_vnode - vnode informations stored on flash */
struct chfs_flash_vnode
{
	le16 magic;		/* filesystem magic */
	le16 type;		/* node type (should be CHFS_NODETYPE_VNODE) */
	le32 length;	/* length of node */
	le32 hdr_crc;	/* crc of the first 3 fields  */
	le64 vno;		/* vnode number */
	le64 version;	/* version of node */
	le32 uid;		/* owner of file */
	le32 gid;		/* group of file */
	le32 mode;		/* permission of vnode */
	le32 dn_size;	/* size of written data */
	le32 atime;		/* last access time */
	le32 mtime;		/* last modification time */
	le32 ctime;		/* change time */
	le32 dsize;		/* NOT USED, backward compatibility */
	le32 node_crc;	/* crc of all the previous fields */
} __packed;

/* struct chfs_flash_data_node - data stored on flash */
struct chfs_flash_data_node
{
	le16 magic;			/* filesystem magic */
	le16 type;			/* node type (should be CHFS_NODETYPE_DATA) */
	le32 length;		/* length of vnode with data */
	le32 hdr_crc;		/* crc of the first 3 fields */
	le64 vno;			/* vnode number */
	le64 version;		/* version of node */
	le64 offset;		/* offset in the file */
	le32 data_length;	/* length of data */
	le32 data_crc;		/* crc of data*/
	le32 node_crc;		/* crc of full node */
	uint8_t  data[0];	/* data */
} __packed;

/*
 * struct chfs_flash_dirent_node -
 * directory entry information stored on flash
 */
struct chfs_flash_dirent_node
{
	le16 magic;			/* filesystem magic */
	le16 type;			/* node type (should be CHFS_NODETYPE_DIRENT) */
	le32 length;		/* length of node with name */
	le32 hdr_crc;		/* crc of the first 3 fields */
	le64 vno;			/* vnode number */
	le64 pvno;			/* parent's vnode number */
	le64 version;		/* version of node */
	le32 mctime;		/* */
	uint8_t nsize;		/* length of name */
	uint8_t dtype;		/* file type */
	uint8_t unused[2];	/* just for padding */
	le32 name_crc;		/* crc of name */
	le32 node_crc;		/* crc of full node */
	uint8_t  name[0];	/* name of directory entry */
} __packed;

/* struct chfs_flash_padding_node - spaceholder node on flash */
struct chfs_flash_padding_node
{
	le16 magic;		/* filesystem magic */
	le16 type;		/* node type (should be CHFS_NODETYPE_PADDING )*/
	le32 length;	/* length of node */
	le32 hdr_crc;	/* crc of the first 3 fields */
} __packed;

#endif /* __CHFS_MEDIA_H__ */