xref: /netbsd/sys/fs/v7fs/v7fs.h (revision 887657bc)
1*887657bcSandvar /*	$NetBSD: v7fs.h,v 1.4 2022/05/24 06:28:01 andvar Exp $	*/
2ed990ef3Such 
3ed990ef3Such /*-
4ed990ef3Such  * Copyright (c) 2011 The NetBSD Foundation, Inc.
5ed990ef3Such  * All rights reserved.
6ed990ef3Such  *
7ed990ef3Such  * This code is derived from software contributed to The NetBSD Foundation
8ed990ef3Such  * by UCHIYAMA Yasushi.
9ed990ef3Such  *
10ed990ef3Such  * Redistribution and use in source and binary forms, with or without
11ed990ef3Such  * modification, are permitted provided that the following conditions
12ed990ef3Such  * are met:
13ed990ef3Such  * 1. Redistributions of source code must retain the above copyright
14ed990ef3Such  *    notice, this list of conditions and the following disclaimer.
15ed990ef3Such  * 2. Redistributions in binary form must reproduce the above copyright
16ed990ef3Such  *    notice, this list of conditions and the following disclaimer in the
17ed990ef3Such  *    documentation and/or other materials provided with the distribution.
18ed990ef3Such  *
19ed990ef3Such  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20ed990ef3Such  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21ed990ef3Such  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22ed990ef3Such  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23ed990ef3Such  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24ed990ef3Such  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25ed990ef3Such  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26ed990ef3Such  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27ed990ef3Such  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28ed990ef3Such  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29ed990ef3Such  * POSSIBILITY OF SUCH DAMAGE.
30ed990ef3Such  */
31ed990ef3Such 
32ed990ef3Such #ifndef _V7FS_H_
33ed990ef3Such /* 7th Edition of Unix(PDP-11) Filesystem definition. */
34ed990ef3Such #define	_V7FS_H_
35ed990ef3Such #include <sys/types.h>
36ed990ef3Such #ifndef _KERNEL
37ed990ef3Such #include <inttypes.h>
38ed990ef3Such #endif
39ed990ef3Such /*
40ed990ef3Such  *   V7 File System
41ed990ef3Such  *
42ed990ef3Such  *     +------------------
43ed990ef3Such  *     |Boot block (512byte)	sector [0]
44ed990ef3Such  *     |
45ed990ef3Such  *     +------------------
46ed990ef3Such  *     |Super block (512byte)	sector [1]
47ed990ef3Such  *     |
48ed990ef3Such  *     +------------------
49ed990ef3Such  *     |v7fs_inode(64byte       sector [2]
50ed990ef3Such  *         .
51ed990ef3Such  *         .
52ed990ef3Such  *     |
53ed990ef3Such  *     +------------------
54ed990ef3Such  *     |data block              sector [datablock_start_sector]
55ed990ef3Such  *     |
56ed990ef3Such  *         .
57ed990ef3Such  *         .
58ed990ef3Such  *     |
59ed990ef3Such  *     +------------------
60ed990ef3Such  *				 <-    [sector volume_size]
61ed990ef3Such  *
62ed990ef3Such  *     |
63ed990ef3Such  *     +------------------	volume size.
64ed990ef3Such  *
65ed990ef3Such  * Max volume size is 8GB (24bit daddr_t)
66ed990ef3Such  * Max file size is ~1GB
67ed990ef3Such  *
68ed990ef3Such  */
69ed990ef3Such 
70ed990ef3Such /* V7 type. */
71ed990ef3Such typedef uint16_t v7fs_ino_t;
72ed990ef3Such typedef uint32_t v7fs_daddr_t;
73ed990ef3Such typedef int32_t v7fs_time_t;
74ed990ef3Such typedef uint32_t v7fs_off_t;
75ed990ef3Such typedef uint16_t v7fs_dev_t;
76ed990ef3Such typedef uint16_t v7fs_mode_t;
77ed990ef3Such #define	V7FS_DADDR_MAX		0x00ffffff
78ed990ef3Such #define	V7FS_INODE_MAX		0xffff
79ed990ef3Such 
80ed990ef3Such #define	V7FS_BSIZE		512
81ed990ef3Such #define	V7FS_BSHIFT		9
82ed990ef3Such #define	V7FS_ROUND_BSIZE(x)					\
83ed990ef3Such 	((((x) + (V7FS_BSIZE - 1)) & ~(V7FS_BSIZE - 1)))
84ed990ef3Such #define	V7FS_TRUNC_BSIZE(x)	((x) & ~(V7FS_BSIZE - 1))
85ed990ef3Such 
86ed990ef3Such #define	V7FS_RESIDUE_BSIZE(x)					\
87ed990ef3Such 	((x) - ((((x) - 1) >> V7FS_BSHIFT) << V7FS_BSHIFT))
88ed990ef3Such 
89ed990ef3Such /* Disk location. */
90ed990ef3Such #define	V7FS_BOOTBLOCK_SECTOR	0
91ed990ef3Such #define	V7FS_SUPERBLOCK_SECTOR	1
92ed990ef3Such #define	V7FS_ILIST_SECTOR	2
93ed990ef3Such 
94ed990ef3Such /* Superblock */
95ed990ef3Such /* cache. */
96ed990ef3Such #define	V7FS_MAX_FREEBLOCK	50
97ed990ef3Such #define	V7FS_MAX_FREEINODE	100
98ed990ef3Such struct v7fs_superblock {
99ed990ef3Such 	/* [3 ... (datablock_start_sector-1)]are ilist */
100ed990ef3Such 	uint16_t datablock_start_sector;
101ed990ef3Such 	v7fs_daddr_t volume_size;
102ed990ef3Such 	int16_t nfreeblock;	/* # of freeblock in superblock cache. */
103ed990ef3Such 	v7fs_daddr_t freeblock[V7FS_MAX_FREEBLOCK];	/* cache. */
104ed990ef3Such 	int16_t nfreeinode;	/* # of free inode in superblock cache. */
105ed990ef3Such 	v7fs_ino_t freeinode[V7FS_MAX_FREEINODE];	/* cache. */
106ed990ef3Such 	int8_t lock_freeblock;
107ed990ef3Such 	int8_t lock_freeinode;
108ed990ef3Such 	int8_t modified;
109ed990ef3Such 	int8_t readonly;
110ed990ef3Such 	v7fs_time_t update_time;
111ed990ef3Such 	v7fs_daddr_t total_freeblock;
112ed990ef3Such 	v7fs_ino_t total_freeinode;
113ed990ef3Such } __packed;
114ed990ef3Such 
115ed990ef3Such /* Datablock */
116ed990ef3Such #define	V7FS_NADDR		13
117ed990ef3Such #define	V7FS_NADDR_DIRECT	10
118ed990ef3Such #define	V7FS_NADDR_INDEX1	10
119ed990ef3Such #define	V7FS_NADDR_INDEX2	11
120ed990ef3Such #define	V7FS_NADDR_INDEX3	12
121ed990ef3Such /* daddr index. */
122ed990ef3Such #define	V7FS_DADDR_PER_BLOCK	(V7FS_BSIZE / sizeof(v7fs_daddr_t))
123ed990ef3Such struct v7fs_freeblock {
124ed990ef3Such 	int16_t nfreeblock;
125ed990ef3Such 	v7fs_daddr_t freeblock[V7FS_MAX_FREEBLOCK];
126ed990ef3Such } __packed;
127ed990ef3Such 
128ed990ef3Such 
129ed990ef3Such /* Dirent */
130ed990ef3Such #define	V7FS_NAME_MAX		14
131ed990ef3Such #define	V7FS_PATH_MAX		PATH_MAX	/* No V7 limit. */
132ed990ef3Such #define	V7FS_LINK_MAX		LINK_MAX	/* No V7 limit. */
133ed990ef3Such struct v7fs_dirent {
134ed990ef3Such 	v7fs_ino_t inode_number;
135ed990ef3Such 	char name[V7FS_NAME_MAX];
136ed990ef3Such } __packed;	/*16byte */
137ed990ef3Such 
138ed990ef3Such /* Inode */
139ed990ef3Such #define	V7FS_BALBLK_INODE	1	/* monument */
140ed990ef3Such #define	V7FS_ROOT_INODE		2
141ed990ef3Such #define	V7FS_MAX_INODE(s)						\
142ed990ef3Such 	(((s)->datablock_start_sector -	V7FS_ILIST_SECTOR) *		\
143ed990ef3Such 	V7FS_BSIZE / sizeof(struct v7fs_inode_diskimage))
144ed990ef3Such #define	V7FS_INODE_PER_BLOCK						\
145ed990ef3Such 	(V7FS_BSIZE / sizeof(struct v7fs_inode_diskimage))
146ed990ef3Such #define	V7FS_ILISTBLK_MAX	(V7FS_INODE_MAX / V7FS_INODE_PER_BLOCK)
147ed990ef3Such 
148ed990ef3Such struct v7fs_inode_diskimage {
149ed990ef3Such 	int16_t mode;
150ed990ef3Such 	int16_t nlink;	/* [DIR] # of child directories. [REG] link count. */
151ed990ef3Such 	int16_t uid;
152ed990ef3Such 	int16_t gid;
153ed990ef3Such 	v7fs_off_t filesize;	/* byte */
154ed990ef3Such #define	V7FS_DINODE_ADDR_LEN	40
155ed990ef3Such 	/* 39 used; 13 addresses of 3 byte each. */
156ed990ef3Such 	uint8_t addr[V7FS_DINODE_ADDR_LEN];
157ed990ef3Such 	/*for device node: addr[0] is major << 8 | minor. */
158ed990ef3Such 	v7fs_time_t atime;
159ed990ef3Such 	v7fs_time_t mtime;
160ed990ef3Such 	v7fs_time_t ctime;
161ed990ef3Such } __packed;	/*64byte */
162ed990ef3Such 
163ed990ef3Such /* File type */
164ed990ef3Such #define	V7FS_IFMT	0170000	/* File type mask */
165*887657bcSandvar #define	V7FS_IFCHR	0020000	/* character device */
166ed990ef3Such #define	V7FS_IFDIR	0040000	/* directory */
167ed990ef3Such #define	V7FS_IFBLK	0060000	/* block device */
168ed990ef3Such #define	V7FS_IFREG	0100000	/* file. */
169ed990ef3Such /* Obsoleted file type. */
170ed990ef3Such #define	V7FS_IFMPC	0030000	/* multiplexed char special */
171ed990ef3Such #define	V7FS_IFMPB	0070000	/* multiplexed block special */
1722d52435aSandvar /* Don't appear original V7 filesystem. Found at 2.10BSD. */
173ed990ef3Such #define	V7FSBSD_IFLNK	0120000	/* symbolic link */
174ed990ef3Such #define	V7FSBSD_IFSOCK	0140000	/* socket */
1752d52435aSandvar /* Don't appear original V7 filesystem. NetBSD. */
176ed990ef3Such #define	V7FSBSD_IFFIFO	0010000	/* Named pipe. */
177ed990ef3Such 
17838172e6aSuch #define	V7FSBSD_MAXSYMLINKLEN	V7FS_BSIZE
179ed990ef3Such 
180ed990ef3Such #endif	/*!_V7FS_H_ */
181