-
Notifications
You must be signed in to change notification settings - Fork 24
/
bfs.h
179 lines (161 loc) · 5.49 KB
/
bfs.h
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
/* $NetBSD: bfs.h,v 1.3 2007/02/21 23:00:03 thorpej Exp $ */
/*-
* Copyright (c) 2004 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by UCHIYAMA Yasushi.
*
* 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.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``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 FOUNDATION OR CONTRIBUTORS
* 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 _FS_SYSVBFS_BFS_H_
#define _FS_SYSVBFS_BFS_H_
/*
* Boot File System
*
* +----------
* |bfs_super_block (512byte)
* | 1 sector
* |
* +----------
* |bfs_inode (64byte) * 8
* | . 1 sector
* |bfs_inode
* +---------- <--- bfs_super_block.header.data_start
* |DATA BLOCK
* | .
* | .
* |
* +---------- <--- bfs_super_block.header.data_end
*/
/* BFS specification */
#define BFS_SECTOR 0 /* no offset */
#define BFS_MAGIC 0x1badface
#define BFS_FILENAME_MAXLEN 14
#define BFS_ROOT_INODE 2
#define BFS_BSIZE 512
#define BFS_BSHIFT 9
struct bfs_super_block_header {
uint32_t magic;
uint32_t data_start_byte;
uint32_t data_end_byte;
} __attribute__((__packed__));
struct bfs_compaction {
uint32_t from;
uint32_t to;
uint32_t from_backup;
uint32_t to_backup;
} __attribute__((__packed__));
struct bfs_fileattr {
uint32_t type;
uint32_t mode;
int32_t uid;
int32_t gid;
uint32_t nlink;
int32_t atime;
int32_t mtime;
int32_t ctime;
int32_t padding[4];
} __attribute__((__packed__)); /* 48byte */
struct bfs_inode {
uint16_t number; /* 0 */
int16_t padding;
uint32_t start_sector; /* 4 */
uint32_t end_sector; /* 8 */
uint32_t eof_offset_byte; /* 12 (offset from super block start) */
struct bfs_fileattr attr; /* 16 */
} __attribute__((__packed__)); /* 64byte */
struct bfs_super_block {
struct bfs_super_block_header header;
struct bfs_compaction compaction;
char fsname[6];
char volume[6];
int32_t padding[118];
} __attribute__((__packed__));
struct bfs_dirent {
uint16_t inode;
char name[BFS_FILENAME_MAXLEN];
} __attribute__((__packed__)); /* 16byte */
#if defined _KERNEL || defined _STANDALONE
/* Software definition */
struct sector_io_ops;
struct bfs {
int start_sector;
/* Super block */
struct bfs_super_block *super_block;
size_t super_block_size;
/* Data block */
uint32_t data_start, data_end;
/* Inode */
struct bfs_inode *inode;
int n_inode;
int max_inode;
/* root directory */
struct bfs_dirent *dirent;
size_t dirent_size;
int n_dirent;
int max_dirent;
struct bfs_inode *root_inode;
/* Sector I/O operation */
struct sector_io_ops *io;
bool debug;
};
struct sector_io_ops {
bool (*read)(void *, uint8_t *, daddr_t);
bool (*read_n)(void *, uint8_t *, daddr_t, int);
bool (*write)(void *, uint8_t *, daddr_t);
bool (*write_n)(void *, uint8_t *, daddr_t, int);
};
int bfs_init2(struct bfs **, int, struct sector_io_ops *, bool);
void bfs_fini(struct bfs *);
int bfs_file_read(const struct bfs *, const char *, void *, size_t, size_t *);
int bfs_file_write(struct bfs *, const char *, void *, size_t);
int bfs_file_create(struct bfs *, const char *, void *, size_t,
const struct bfs_fileattr *);
int bfs_file_delete(struct bfs *, const char *);
int bfs_file_rename(struct bfs *, const char *, const char *);
bool bfs_file_lookup(const struct bfs *, const char *, int *, int *,
size_t *);
size_t bfs_file_size(const struct bfs_inode *);
bool bfs_dump(const struct bfs *);
/* filesystem ops */
struct vnode;
int sysvbfs_bfs_init(struct bfs **, struct vnode *);
void sysvbfs_bfs_fini(struct bfs *);
bool bfs_inode_lookup(const struct bfs *, ino_t, struct bfs_inode **);
bool bfs_dirent_lookup_by_name(const struct bfs *, const char *,
struct bfs_dirent **);
bool bfs_dirent_lookup_by_inode(const struct bfs *, int,
struct bfs_dirent **);
void bfs_inode_set_attr(const struct bfs *, struct bfs_inode *,
const struct bfs_fileattr *attr);
int bfs_inode_alloc(const struct bfs *, struct bfs_inode **, int *,
int *);
#endif /* _KERNEL || _STANDALONE */
#endif /* _FS_SYSVBFS_BFS_H_ */