1*84d9c625SLionel Sambuc /* $NetBSD: minixfs3.h,v 1.5 2013/06/23 07:28:36 dholland Exp $ */ 258a2b000SEvgeniy Ivanov 358a2b000SEvgeniy Ivanov /*- 458a2b000SEvgeniy Ivanov * Copyright (c) 2012 558a2b000SEvgeniy Ivanov * Vrije Universiteit, Amsterdam, The Netherlands. All rights reserved. 658a2b000SEvgeniy Ivanov * 758a2b000SEvgeniy Ivanov * Author: Evgeniy Ivanov 858a2b000SEvgeniy Ivanov * 958a2b000SEvgeniy Ivanov * Redistribution and use in source and binary forms, with or without 1058a2b000SEvgeniy Ivanov * modification, are permitted provided that the following conditions 1158a2b000SEvgeniy Ivanov * are met: 1258a2b000SEvgeniy Ivanov * 1. Redistributions of source code must retain the above copyright 1358a2b000SEvgeniy Ivanov * notice, this list of conditions and the following disclaimer. 1458a2b000SEvgeniy Ivanov * 2. Redistributions in binary form must reproduce the above copyright 1558a2b000SEvgeniy Ivanov * notice, this list of conditions and the following disclaimer in the 1658a2b000SEvgeniy Ivanov * documentation and/or other materials provided with the distribution. 1758a2b000SEvgeniy Ivanov * 1858a2b000SEvgeniy Ivanov * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS 1958a2b000SEvgeniy Ivanov * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 2058a2b000SEvgeniy Ivanov * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 2158a2b000SEvgeniy Ivanov * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE 2258a2b000SEvgeniy Ivanov * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2358a2b000SEvgeniy Ivanov * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2458a2b000SEvgeniy Ivanov * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2558a2b000SEvgeniy Ivanov * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2658a2b000SEvgeniy Ivanov * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2758a2b000SEvgeniy Ivanov * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 2858a2b000SEvgeniy Ivanov * POSSIBILITY OF SUCH DAMAGE. 2958a2b000SEvgeniy Ivanov */ 3058a2b000SEvgeniy Ivanov 3158a2b000SEvgeniy Ivanov #ifndef MINIX_FS_3_H 3258a2b000SEvgeniy Ivanov #define MINIX_FS_3_H 3358a2b000SEvgeniy Ivanov 3458a2b000SEvgeniy Ivanov FS_DEF(minixfs3); 3558a2b000SEvgeniy Ivanov 36*84d9c625SLionel Sambuc #if !defined(__minix) 3758a2b000SEvgeniy Ivanov typedef uint32_t zone_t; 3858a2b000SEvgeniy Ivanov typedef uint16_t zone1_t; 3958a2b000SEvgeniy Ivanov typedef uint32_t block_t; 40*84d9c625SLionel Sambuc #endif /* !defined(__minix) */ 4158a2b000SEvgeniy Ivanov 4258a2b000SEvgeniy Ivanov #define NR_DZONES 7 /* # direct zone numbers in an inode */ 4358a2b000SEvgeniy Ivanov #define NR_TZONES 10 /* total # zone numbers in an inode */ 4458a2b000SEvgeniy Ivanov #define NIADDR 2 /* Indirect addresses in inode */ 4558a2b000SEvgeniy Ivanov 4658a2b000SEvgeniy Ivanov struct mfs_dinode { 4758a2b000SEvgeniy Ivanov uint16_t mdi_mode; /* file type, protection, etc. */ 4858a2b000SEvgeniy Ivanov uint16_t mdi_nlinks; /* how many links to this file */ 4958a2b000SEvgeniy Ivanov int16_t mdi_uid; /* user id of the file's owner */ 5058a2b000SEvgeniy Ivanov uint16_t mdi_gid; /* group number */ 5158a2b000SEvgeniy Ivanov uint32_t mdi_size; /* current file size in bytes */ 5258a2b000SEvgeniy Ivanov uint32_t mdi_atime; /* time of last access */ 5358a2b000SEvgeniy Ivanov uint32_t mdi_mtime; /* when was file data last changed */ 5458a2b000SEvgeniy Ivanov uint32_t mdi_ctime; /* when was inode itself changed */ 5558a2b000SEvgeniy Ivanov zone_t mdi_zone[NR_TZONES]; /* zone numbers for direct, ind, and 5658a2b000SEvgeniy Ivanov dbl ind */ 5758a2b000SEvgeniy Ivanov }; 5858a2b000SEvgeniy Ivanov 5958a2b000SEvgeniy Ivanov /* Maximum Minix MFS on-disk directory filename. 6058a2b000SEvgeniy Ivanov * MFS uses 'struct direct' to write and parse 6158a2b000SEvgeniy Ivanov * directory entries, so this can't be changed 6258a2b000SEvgeniy Ivanov * without breaking filesystems. 6358a2b000SEvgeniy Ivanov */ 6458a2b000SEvgeniy Ivanov #define MFS_DIRSIZ 60 6558a2b000SEvgeniy Ivanov 6658a2b000SEvgeniy Ivanov struct mfs_direct { 6758a2b000SEvgeniy Ivanov uint32_t mfsd_ino; 6858a2b000SEvgeniy Ivanov char mfsd_name[MFS_DIRSIZ]; 6958a2b000SEvgeniy Ivanov } __packed; 7058a2b000SEvgeniy Ivanov 7158a2b000SEvgeniy Ivanov struct mfs_sblock { 7258a2b000SEvgeniy Ivanov uint32_t mfs_ninodes; /* # usable inodes on the minor device */ 7358a2b000SEvgeniy Ivanov zone1_t mfs_nzones; /* total device size, including bit maps etc */ 7458a2b000SEvgeniy Ivanov int16_t mfs_imap_blocks; /* # of blocks used by inode bit map */ 7558a2b000SEvgeniy Ivanov int16_t mfs_zmap_blocks; /* # of blocks used by zone bit map */ 7658a2b000SEvgeniy Ivanov zone1_t mfs_firstdatazone_old;/* number of first data zone (small) */ 7758a2b000SEvgeniy Ivanov int16_t mfs_log_zone_size; /* log2 of blocks/zone */ 7858a2b000SEvgeniy Ivanov int16_t mfs_pad; /* try to avoid compiler-dependent padding */ 7958a2b000SEvgeniy Ivanov int32_t mfs_max_size; /* maximum file size on this device */ 8058a2b000SEvgeniy Ivanov zone_t mfs_zones; /* number of zones (replaces s_nzones in V2) */ 8158a2b000SEvgeniy Ivanov int16_t mfs_magic; /* magic number to recognize super-blocks */ 8258a2b000SEvgeniy Ivanov int16_t mfs_pad2; /* try to avoid compiler-dependent padding */ 8358a2b000SEvgeniy Ivanov uint16_t mfs_block_size; /* block size in bytes. */ 8458a2b000SEvgeniy Ivanov char mfs_disk_version; /* filesystem format sub-version */ 8558a2b000SEvgeniy Ivanov 8658a2b000SEvgeniy Ivanov /* The following items are only used when the super_block is in memory, 8758a2b000SEvgeniy Ivanov * mfs_inodes_per_block must be the firs one (see SBSIZE) 8858a2b000SEvgeniy Ivanov */ 8958a2b000SEvgeniy Ivanov unsigned mfs_inodes_per_block; /* precalculated from magic number */ 9058a2b000SEvgeniy Ivanov zone_t mfs_firstdatazone; /* number of first data zone (big) */ 9158a2b000SEvgeniy Ivanov int32_t mfs_bshift; /* ``lblkno'' calc of logical blkno */ 9258a2b000SEvgeniy Ivanov int32_t mfs_bmask; /* ``blkoff'' calc of blk offsets */ 9358a2b000SEvgeniy Ivanov int64_t mfs_qbmask; /* ~fs_bmask - for use with quad size */ 9458a2b000SEvgeniy Ivanov int32_t mfs_fsbtodb; /* fsbtodb and dbtofsb shift constant */ 9558a2b000SEvgeniy Ivanov }; 9658a2b000SEvgeniy Ivanov 9758a2b000SEvgeniy Ivanov #define LOG_MINBSIZE 10 9858a2b000SEvgeniy Ivanov #define MINBSIZE (1 << LOG_MINBSIZE) 9958a2b000SEvgeniy Ivanov 10058a2b000SEvgeniy Ivanov #define SUPER_MAGIC 0x4d5a /* magic # for MFSv3 file systems */ 10158a2b000SEvgeniy Ivanov 10258a2b000SEvgeniy Ivanov #define ROOT_INODE ((uint32_t) 1) /* inode number for root directory */ 10358a2b000SEvgeniy Ivanov #define SUPER_BLOCK_OFF (1024) /* bytes offset */ 10458a2b000SEvgeniy Ivanov #define START_BLOCK ((block_t) 2) /* first fs block (not counting SB) */ 10558a2b000SEvgeniy Ivanov 10658a2b000SEvgeniy Ivanov /* # bytes/dir entry */ 10758a2b000SEvgeniy Ivanov #define DIR_ENTRY_SIZE sizeof(struct mfs_direct) 10858a2b000SEvgeniy Ivanov /* # dir entries/blk */ 10958a2b000SEvgeniy Ivanov #define NR_DIR_ENTRIES(fs) ((fs)->mfs_block_size/DIR_ENTRY_SIZE) 11058a2b000SEvgeniy Ivanov /* mfs_sblock on-disk part size */ 11158a2b000SEvgeniy Ivanov #define SBSIZE offsetof(struct mfs_sblock, mfs_inodes_per_block) 11258a2b000SEvgeniy Ivanov 11358a2b000SEvgeniy Ivanov #define ZONE_NUM_SIZE sizeof(zone_t) /* # bytes in zone */ 11458a2b000SEvgeniy Ivanov #define INODE_SIZE sizeof(struct mfs_dinode) /* bytes in dsk ino */ 11558a2b000SEvgeniy Ivanov /* # zones/indir block */ 116*84d9c625SLionel Sambuc #define MFS_NINDIR(fs) ((fs)->mfs_block_size/ZONE_NUM_SIZE) 11758a2b000SEvgeniy Ivanov 11858a2b000SEvgeniy Ivanov #define NO_ZONE ((zone_t) 0) /* absence of a zone number */ 11958a2b000SEvgeniy Ivanov #define NO_BLOCK ((block_t) 0) /* absence of a block number */ 12058a2b000SEvgeniy Ivanov 12158a2b000SEvgeniy Ivanov /* Turn file system block numbers into disk block addresses */ 122*84d9c625SLionel Sambuc #define MFS_FSBTODB(fs, b) ((b) << (fs)->mfs_fsbtodb) 12358a2b000SEvgeniy Ivanov 12458a2b000SEvgeniy Ivanov #define ino_to_fsba(fs, x) \ 12558a2b000SEvgeniy Ivanov (((x) - 1) / (fs)->mfs_inodes_per_block + \ 12658a2b000SEvgeniy Ivanov START_BLOCK + (fs)->mfs_imap_blocks + (fs)->mfs_zmap_blocks) 12758a2b000SEvgeniy Ivanov #define ino_to_fsbo(fs, x) (((x) - 1) % (fs)->mfs_inodes_per_block) 12858a2b000SEvgeniy Ivanov 12958a2b000SEvgeniy Ivanov /* 13058a2b000SEvgeniy Ivanov * MFS metadatas are stored in little-endian byte order. These macros 13158a2b000SEvgeniy Ivanov * helps reading theses metadatas. 13258a2b000SEvgeniy Ivanov */ 13358a2b000SEvgeniy Ivanov #if BYTE_ORDER == LITTLE_ENDIAN 13458a2b000SEvgeniy Ivanov # define fs2h16(x) (x) 13558a2b000SEvgeniy Ivanov # define fs2h32(x) (x) 13658a2b000SEvgeniy Ivanov # define mfs_sbload(old, new) \ 13758a2b000SEvgeniy Ivanov memcpy((new), (old), SBSIZE); 13858a2b000SEvgeniy Ivanov # define mfs_iload(old, new) \ 13958a2b000SEvgeniy Ivanov memcpy((new),(old),sizeof(struct mfs_dinode)) 14058a2b000SEvgeniy Ivanov #else 14158a2b000SEvgeniy Ivanov void minixfs3_sb_bswap(struct mfs_sblock *, struct mfs_sblock *); 14258a2b000SEvgeniy Ivanov void minixfs3_i_bswap(struct mfs_dinode *, struct mfs_dinode *); 14358a2b000SEvgeniy Ivanov # define fs2h16(x) bswap16(x) 14458a2b000SEvgeniy Ivanov # define fs2h32(x) bswap32(x) 14558a2b000SEvgeniy Ivanov # define mfs_sbload(old, new) minixfs3_sb_bswap((old), (new)) 14658a2b000SEvgeniy Ivanov # define mfs_iload(old, new) minixfs3_i_bswap((old), (new)) 14758a2b000SEvgeniy Ivanov #endif /* BYTE_ORDER == LITTLE_ENDIAN */ 14858a2b000SEvgeniy Ivanov 14958a2b000SEvgeniy Ivanov /* 15058a2b000SEvgeniy Ivanov * The following macros optimize certain frequently calculated 15158a2b000SEvgeniy Ivanov * quantities by using shifts and masks in place of divisions 15258a2b000SEvgeniy Ivanov * modulos and multiplications. 15358a2b000SEvgeniy Ivanov */ 154*84d9c625SLionel Sambuc #define mfs_blkoff(fs, loc) /* calculates (loc % fs->mfs_bsize) */ \ 15558a2b000SEvgeniy Ivanov ((loc) & (fs)->mfs_qbmask) 156*84d9c625SLionel Sambuc #define mfs_lblkno(fs, loc) /* calculates (loc / fs->mfs_bsize) */ \ 15758a2b000SEvgeniy Ivanov ((loc) >> (fs)->mfs_bshift) 15858a2b000SEvgeniy Ivanov 15958a2b000SEvgeniy Ivanov /* Flag bits for i_mode in the inode. */ 16058a2b000SEvgeniy Ivanov #define I_TYPE 0170000 /* this field gives inode type */ 16158a2b000SEvgeniy Ivanov #define I_UNIX_SOCKET 0140000 /* unix domain socket */ 16258a2b000SEvgeniy Ivanov #define I_SYMBOLIC_LINK 0120000 /* file is a symbolic link */ 16358a2b000SEvgeniy Ivanov #define I_REGULAR 0100000 /* regular file, not dir or special */ 16458a2b000SEvgeniy Ivanov #define I_BLOCK_SPECIAL 0060000 /* block special file */ 16558a2b000SEvgeniy Ivanov #define I_DIRECTORY 0040000 /* file is a directory */ 16658a2b000SEvgeniy Ivanov #define I_CHAR_SPECIAL 0020000 /* character special file */ 16758a2b000SEvgeniy Ivanov #define I_NAMED_PIPE 0010000 /* named pipe (FIFO) */ 16858a2b000SEvgeniy Ivanov #define I_SET_UID_BIT 0004000 /* set effective uid_t on exec */ 16958a2b000SEvgeniy Ivanov #define I_SET_GID_BIT 0002000 /* set effective gid_t on exec */ 17058a2b000SEvgeniy Ivanov #define I_SET_STCKY_BIT 0001000 /* sticky bit */ 17158a2b000SEvgeniy Ivanov #define ALL_MODES 0007777 /* all bits for user, group and others */ 17258a2b000SEvgeniy Ivanov #define RWX_MODES 0000777 /* mode bits for RWX only */ 17358a2b000SEvgeniy Ivanov #define R_BIT 0000004 /* Rwx protection bit */ 17458a2b000SEvgeniy Ivanov #define W_BIT 0000002 /* rWx protection bit */ 17558a2b000SEvgeniy Ivanov #define X_BIT 0000001 /* rwX protection bit */ 17658a2b000SEvgeniy Ivanov #define I_NOT_ALLOC 0000000 /* this inode is free */ 17758a2b000SEvgeniy Ivanov 17858a2b000SEvgeniy Ivanov #endif /* MINIX_FS_3_H */ 179