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