1*d06c4e1fSotto /* $OpenBSD: dinode.h,v 1.19 2020/05/28 15:48:29 otto Exp $ */ 2df930be7Sderaadt /* $NetBSD: dinode.h,v 1.7 1995/06/15 23:22:48 cgd Exp $ */ 3df930be7Sderaadt 4df930be7Sderaadt /* 5df930be7Sderaadt * Copyright (c) 1982, 1989, 1993 6df930be7Sderaadt * The Regents of the University of California. All rights reserved. 7df930be7Sderaadt * (c) UNIX System Laboratories, Inc. 8df930be7Sderaadt * All or some portions of this file are derived from material licensed 9df930be7Sderaadt * to the University of California by American Telephone and Telegraph 10df930be7Sderaadt * Co. or Unix System Laboratories, Inc. and are reproduced herein with 11df930be7Sderaadt * the permission of UNIX System Laboratories, Inc. 12df930be7Sderaadt * 13df930be7Sderaadt * Redistribution and use in source and binary forms, with or without 14df930be7Sderaadt * modification, are permitted provided that the following conditions 15df930be7Sderaadt * are met: 16df930be7Sderaadt * 1. Redistributions of source code must retain the above copyright 17df930be7Sderaadt * notice, this list of conditions and the following disclaimer. 18df930be7Sderaadt * 2. Redistributions in binary form must reproduce the above copyright 19df930be7Sderaadt * notice, this list of conditions and the following disclaimer in the 20df930be7Sderaadt * documentation and/or other materials provided with the distribution. 2129295d1cSmillert * 3. Neither the name of the University nor the names of its contributors 22df930be7Sderaadt * may be used to endorse or promote products derived from this software 23df930be7Sderaadt * without specific prior written permission. 24df930be7Sderaadt * 25df930be7Sderaadt * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 26df930be7Sderaadt * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27df930be7Sderaadt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28df930be7Sderaadt * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 29df930be7Sderaadt * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30df930be7Sderaadt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31df930be7Sderaadt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32df930be7Sderaadt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33df930be7Sderaadt * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34df930be7Sderaadt * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35df930be7Sderaadt * SUCH DAMAGE. 36df930be7Sderaadt * 3714e9adffSart * @(#)dinode.h 8.9 (Berkeley) 3/29/95 38df930be7Sderaadt */ 39df930be7Sderaadt 40bd802364Sdownsj #ifndef _UFS_DINODE_H_ 41bd802364Sdownsj #define _UFS_DINODE_H_ 42bd802364Sdownsj 43df930be7Sderaadt /* 44e012d6d3Sguenther * UFS directories use 32bit inode numbers internally, regardless 45e012d6d3Sguenther * of what the system on top of it uses. 46e012d6d3Sguenther */ 47e012d6d3Sguenther typedef u_int32_t ufsino_t; 48e012d6d3Sguenther 49e012d6d3Sguenther /* 50df930be7Sderaadt * The root inode is the root of the file system. Inode 0 can't be used for 51df930be7Sderaadt * normal purposes and historically bad blocks were linked to inode 1, thus 52df930be7Sderaadt * the root inode is 2. (Inode 1 is no longer used for this purpose, however 53df930be7Sderaadt * numerous dump tapes make this assumption, so we are stuck with it). 54df930be7Sderaadt */ 55e012d6d3Sguenther #define ROOTINO ((ufsino_t)2) 56df930be7Sderaadt 57df930be7Sderaadt /* 58df930be7Sderaadt * A dinode contains all the meta-data associated with a UFS file. 59df930be7Sderaadt * This structure defines the on-disk format of a dinode. Since 60df930be7Sderaadt * this structure describes an on-disk structure, all its fields 61df930be7Sderaadt * are defined by types with precise widths. 62df930be7Sderaadt */ 63895e8cacStedu #define NXADDR 2 /* External addresses in inode */ 64df930be7Sderaadt #define NDADDR 12 /* Direct addresses in inode. */ 65df930be7Sderaadt #define NIADDR 3 /* Indirect addresses in inode. */ 66df930be7Sderaadt 67f26feedbStedu struct ufs1_dinode { 68df930be7Sderaadt u_int16_t di_mode; /* 0: IFMT, permissions; see below. */ 69df930be7Sderaadt int16_t di_nlink; /* 2: File link count. */ 70df930be7Sderaadt union { 71df930be7Sderaadt u_int16_t oldids[2]; /* 4: Ffs: old user and group ids. */ 7214e9adffSart u_int32_t inumber; /* 4: Lfs: inode number. */ 73df930be7Sderaadt } di_u; 74df930be7Sderaadt u_int64_t di_size; /* 8: File byte count. */ 75df930be7Sderaadt int32_t di_atime; /* 16: Last access time. */ 76df930be7Sderaadt int32_t di_atimensec; /* 20: Last access time. */ 77df930be7Sderaadt int32_t di_mtime; /* 24: Last modified time. */ 78df930be7Sderaadt int32_t di_mtimensec; /* 28: Last modified time. */ 79df930be7Sderaadt int32_t di_ctime; /* 32: Last inode change time. */ 80df930be7Sderaadt int32_t di_ctimensec; /* 36: Last inode change time. */ 81a09be2a2Spedro int32_t di_db[NDADDR]; /* 40: Direct disk blocks. */ 82a09be2a2Spedro int32_t di_ib[NIADDR]; /* 88: Indirect disk blocks. */ 83df930be7Sderaadt u_int32_t di_flags; /* 100: Status flags (chflags). */ 84dda1766dSart int32_t di_blocks; /* 104: Blocks actually held. */ 85*d06c4e1fSotto u_int32_t di_gen; /* 108: Generation number. */ 86df930be7Sderaadt u_int32_t di_uid; /* 112: File owner. */ 87df930be7Sderaadt u_int32_t di_gid; /* 116: File group. */ 88df930be7Sderaadt int32_t di_spare[2]; /* 120: Reserved; currently unused */ 89df930be7Sderaadt }; 90df930be7Sderaadt 91895e8cacStedu struct ufs2_dinode { 92895e8cacStedu u_int16_t di_mode; /* 0: IFMT, permissions; see below. */ 93895e8cacStedu int16_t di_nlink; /* 2: File link count. */ 94895e8cacStedu u_int32_t di_uid; /* 4: File owner. */ 95895e8cacStedu u_int32_t di_gid; /* 8: File group. */ 96895e8cacStedu u_int32_t di_blksize; /* 12: Inode blocksize. */ 97895e8cacStedu u_int64_t di_size; /* 16: File byte count. */ 98895e8cacStedu u_int64_t di_blocks; /* 24: Bytes actually held. */ 996b67c7c5Spedro int64_t di_atime; /* 32: Last access time. */ 1006b67c7c5Spedro int64_t di_mtime; /* 40: Last modified time. */ 1016b67c7c5Spedro int64_t di_ctime; /* 48: Last inode change time. */ 1026b67c7c5Spedro int64_t di_birthtime; /* 56: Inode creation time. */ 103895e8cacStedu int32_t di_mtimensec; /* 64: Last modified time. */ 104895e8cacStedu int32_t di_atimensec; /* 68: Last access time. */ 105895e8cacStedu int32_t di_ctimensec; /* 72: Last inode change time. */ 106895e8cacStedu int32_t di_birthnsec; /* 76: Inode creation time. */ 107895e8cacStedu int32_t di_gen; /* 80: Generation number. */ 108895e8cacStedu u_int32_t di_kernflags; /* 84: Kernel flags. */ 109895e8cacStedu u_int32_t di_flags; /* 88: Status flags (chflags). */ 110895e8cacStedu int32_t di_extsize; /* 92: External attributes block. */ 111a09be2a2Spedro int64_t di_extb[NXADDR];/* 96: External attributes block. */ 112a09be2a2Spedro int64_t di_db[NDADDR]; /* 112: Direct disk blocks. */ 113a09be2a2Spedro int64_t di_ib[NIADDR]; /* 208: Indirect disk blocks. */ 114895e8cacStedu int64_t di_spare[3]; /* 232: Reserved; currently unused */ 115895e8cacStedu }; 116895e8cacStedu 117df930be7Sderaadt /* 118df930be7Sderaadt * The di_db fields may be overlaid with other information for 119df930be7Sderaadt * file types that do not have associated disk storage. Block 120df930be7Sderaadt * and character devices overlay the first data block with their 121df930be7Sderaadt * dev_t value. Short symbolic links place their path in the 122df930be7Sderaadt * di_db area. 123df930be7Sderaadt */ 124df930be7Sderaadt #define di_inumber di_u.inumber 125df930be7Sderaadt #define di_ogid di_u.oldids[1] 126df930be7Sderaadt #define di_ouid di_u.oldids[0] 127df930be7Sderaadt #define di_rdev di_db[0] 128df930be7Sderaadt #define di_shortlink di_db 12960221941Spedro 130a09be2a2Spedro #define MAXSYMLINKLEN_UFS1 ((NDADDR + NIADDR) * sizeof(int32_t)) 131a09be2a2Spedro #define MAXSYMLINKLEN_UFS2 ((NDADDR + NIADDR) * sizeof(int64_t)) 13260221941Spedro 13360221941Spedro #define MAXSYMLINKLEN(ip) \ 13460221941Spedro ((ip)->i_ump->um_fstype == UM_UFS1) ? \ 13560221941Spedro MAXSYMLINKLEN_UFS1 : MAXSYMLINKLEN_UFS2 136df930be7Sderaadt 137df930be7Sderaadt /* File permissions. */ 138df930be7Sderaadt #define IEXEC 0000100 /* Executable. */ 139df930be7Sderaadt #define IWRITE 0000200 /* Writeable. */ 140df930be7Sderaadt #define IREAD 0000400 /* Readable. */ 141df930be7Sderaadt #define ISVTX 0001000 /* Sticky bit. */ 142df930be7Sderaadt #define ISGID 0002000 /* Set-gid. */ 143df930be7Sderaadt #define ISUID 0004000 /* Set-uid. */ 144df930be7Sderaadt 145df930be7Sderaadt /* File types. */ 146df930be7Sderaadt #define IFMT 0170000 /* Mask of file type. */ 147df930be7Sderaadt #define IFIFO 0010000 /* Named pipe (fifo). */ 148df930be7Sderaadt #define IFCHR 0020000 /* Character device. */ 149df930be7Sderaadt #define IFDIR 0040000 /* Directory file. */ 150df930be7Sderaadt #define IFBLK 0060000 /* Block device. */ 151df930be7Sderaadt #define IFREG 0100000 /* Regular file. */ 152df930be7Sderaadt #define IFLNK 0120000 /* Symbolic link. */ 153df930be7Sderaadt #define IFSOCK 0140000 /* UNIX domain socket. */ 154df930be7Sderaadt #define IFWHT 0160000 /* Whiteout. */ 155bd802364Sdownsj 156bd802364Sdownsj #endif /* _UFS_DINODE_H_ */ 157