1*cfe60390STomohiro Kusumi /*- 2*cfe60390STomohiro Kusumi * SPDX-License-Identifier: BSD-3-Clause 3*cfe60390STomohiro Kusumi * 4*cfe60390STomohiro Kusumi * Copyright (c) 1982, 1989, 1993 5*cfe60390STomohiro Kusumi * The Regents of the University of California. All rights reserved. 6*cfe60390STomohiro Kusumi * (c) UNIX System Laboratories, Inc. 7*cfe60390STomohiro Kusumi * All or some portions of this file are derived from material licensed 8*cfe60390STomohiro Kusumi * to the University of California by American Telephone and Telegraph 9*cfe60390STomohiro Kusumi * Co. or Unix System Laboratories, Inc. and are reproduced herein with 10*cfe60390STomohiro Kusumi * the permission of UNIX System Laboratories, Inc. 11*cfe60390STomohiro Kusumi * 12*cfe60390STomohiro Kusumi * Redistribution and use in source and binary forms, with or without 13*cfe60390STomohiro Kusumi * modification, are permitted provided that the following conditions 14*cfe60390STomohiro Kusumi * are met: 15*cfe60390STomohiro Kusumi * 1. Redistributions of source code must retain the above copyright 16*cfe60390STomohiro Kusumi * notice, this list of conditions and the following disclaimer. 17*cfe60390STomohiro Kusumi * 2. Redistributions in binary form must reproduce the above copyright 18*cfe60390STomohiro Kusumi * notice, this list of conditions and the following disclaimer in the 19*cfe60390STomohiro Kusumi * documentation and/or other materials provided with the distribution. 20*cfe60390STomohiro Kusumi * 3. Neither the name of the University nor the names of its contributors 21*cfe60390STomohiro Kusumi * may be used to endorse or promote products derived from this software 22*cfe60390STomohiro Kusumi * without specific prior written permission. 23*cfe60390STomohiro Kusumi * 24*cfe60390STomohiro Kusumi * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25*cfe60390STomohiro Kusumi * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26*cfe60390STomohiro Kusumi * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27*cfe60390STomohiro Kusumi * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28*cfe60390STomohiro Kusumi * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29*cfe60390STomohiro Kusumi * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30*cfe60390STomohiro Kusumi * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31*cfe60390STomohiro Kusumi * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32*cfe60390STomohiro Kusumi * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33*cfe60390STomohiro Kusumi * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34*cfe60390STomohiro Kusumi * SUCH DAMAGE. 35*cfe60390STomohiro Kusumi * 36*cfe60390STomohiro Kusumi * @(#)inode.h 8.9 (Berkeley) 5/14/95 37*cfe60390STomohiro Kusumi * $FreeBSD$ 38*cfe60390STomohiro Kusumi */ 39*cfe60390STomohiro Kusumi 40*cfe60390STomohiro Kusumi #ifndef _FS_EXT2FS_INODE_H_ 41*cfe60390STomohiro Kusumi #define _FS_EXT2FS_INODE_H_ 42*cfe60390STomohiro Kusumi 43*cfe60390STomohiro Kusumi #include <sys/param.h> 44*cfe60390STomohiro Kusumi #include <sys/lock.h> 45*cfe60390STomohiro Kusumi #include <sys/mutex.h> 46*cfe60390STomohiro Kusumi #include <sys/queue.h> 47*cfe60390STomohiro Kusumi 48*cfe60390STomohiro Kusumi #include <vfs/ext2fs/ext2_extents.h> 49*cfe60390STomohiro Kusumi 50*cfe60390STomohiro Kusumi /* 51*cfe60390STomohiro Kusumi * This must agree with the definition in <ufs/ufs/dir.h>. 52*cfe60390STomohiro Kusumi */ 53*cfe60390STomohiro Kusumi #define doff_t int32_t 54*cfe60390STomohiro Kusumi 55*cfe60390STomohiro Kusumi #define EXT2_NDADDR 12 /* Direct addresses in inode. */ 56*cfe60390STomohiro Kusumi #define EXT2_NIADDR 3 /* Indirect addresses in inode. */ 57*cfe60390STomohiro Kusumi 58*cfe60390STomohiro Kusumi /* 59*cfe60390STomohiro Kusumi * The size of physical and logical block numbers in EXT2FS. 60*cfe60390STomohiro Kusumi */ 61*cfe60390STomohiro Kusumi typedef uint32_t e2fs_daddr_t; 62*cfe60390STomohiro Kusumi typedef int64_t e2fs_lbn_t; 63*cfe60390STomohiro Kusumi typedef int64_t e4fs_daddr_t; 64*cfe60390STomohiro Kusumi 65*cfe60390STomohiro Kusumi /* 66*cfe60390STomohiro Kusumi * The inode is used to describe each active (or recently active) file in the 67*cfe60390STomohiro Kusumi * EXT2FS filesystem. It is composed of two types of information. The first 68*cfe60390STomohiro Kusumi * part is the information that is needed only while the file is active (such 69*cfe60390STomohiro Kusumi * as the identity of the file and linkage to speed its lookup). The second 70*cfe60390STomohiro Kusumi * part is the permanent meta-data associated with the file which is read in 71*cfe60390STomohiro Kusumi * from the permanent dinode from long term storage when the file becomes 72*cfe60390STomohiro Kusumi * active, and is put back when the file is no longer being used. 73*cfe60390STomohiro Kusumi */ 74*cfe60390STomohiro Kusumi struct inode { 75*cfe60390STomohiro Kusumi struct inode *i_next;/* Hash chain */ 76*cfe60390STomohiro Kusumi struct vnode *i_vnode;/* Vnode associated with this inode. */ 77*cfe60390STomohiro Kusumi struct ext2mount *i_ump; 78*cfe60390STomohiro Kusumi uint32_t i_flag; /* flags, see below */ 79*cfe60390STomohiro Kusumi cdev_t i_dev; /* Device associated with the inode. */ 80*cfe60390STomohiro Kusumi ino_t i_number; /* The identity of the inode. */ 81*cfe60390STomohiro Kusumi 82*cfe60390STomohiro Kusumi struct m_ext2fs *i_e2fs; /* EXT2FS */ 83*cfe60390STomohiro Kusumi u_quad_t i_modrev; /* Revision level for NFS lease. */ 84*cfe60390STomohiro Kusumi /* 85*cfe60390STomohiro Kusumi * Side effects; used during directory lookup. 86*cfe60390STomohiro Kusumi */ 87*cfe60390STomohiro Kusumi int32_t i_count; /* Size of free slot in directory. */ 88*cfe60390STomohiro Kusumi doff_t i_endoff; /* End of useful stuff in directory. */ 89*cfe60390STomohiro Kusumi doff_t i_diroff; /* Offset in dir, where we found last entry. */ 90*cfe60390STomohiro Kusumi doff_t i_offset; /* Offset of free space in directory. */ 91*cfe60390STomohiro Kusumi 92*cfe60390STomohiro Kusumi uint32_t i_block_group; 93*cfe60390STomohiro Kusumi uint32_t i_next_alloc_block; 94*cfe60390STomohiro Kusumi uint32_t i_next_alloc_goal; 95*cfe60390STomohiro Kusumi 96*cfe60390STomohiro Kusumi /* Fields from struct dinode in UFS. */ 97*cfe60390STomohiro Kusumi uint16_t i_mode; /* IFMT, permissions; see below. */ 98*cfe60390STomohiro Kusumi int32_t i_nlink; /* File link count. */ 99*cfe60390STomohiro Kusumi uint32_t i_uid; /* File owner. */ 100*cfe60390STomohiro Kusumi uint32_t i_gid; /* File group. */ 101*cfe60390STomohiro Kusumi uint64_t i_size; /* File byte count. */ 102*cfe60390STomohiro Kusumi uint64_t i_blocks; /* Blocks actually held. */ 103*cfe60390STomohiro Kusumi int32_t i_atime; /* Last access time. */ 104*cfe60390STomohiro Kusumi int32_t i_mtime; /* Last modified time. */ 105*cfe60390STomohiro Kusumi int32_t i_ctime; /* Last inode change time. */ 106*cfe60390STomohiro Kusumi int32_t i_birthtime; /* Inode creation time. */ 107*cfe60390STomohiro Kusumi int32_t i_mtimensec; /* Last modified time. */ 108*cfe60390STomohiro Kusumi int32_t i_atimensec; /* Last access time. */ 109*cfe60390STomohiro Kusumi int32_t i_ctimensec; /* Last inode change time. */ 110*cfe60390STomohiro Kusumi int32_t i_birthnsec; /* Inode creation time. */ 111*cfe60390STomohiro Kusumi uint32_t i_gen; /* Generation number. */ 112*cfe60390STomohiro Kusumi uint64_t i_facl; /* EA block number. */ 113*cfe60390STomohiro Kusumi uint32_t i_flags; /* Status flags (chflags). */ 114*cfe60390STomohiro Kusumi union { 115*cfe60390STomohiro Kusumi struct { 116*cfe60390STomohiro Kusumi uint32_t i_db[EXT2_NDADDR]; /* Direct disk blocks. */ 117*cfe60390STomohiro Kusumi uint32_t i_ib[EXT2_NIADDR]; /* Indirect disk blocks. */ 118*cfe60390STomohiro Kusumi }; 119*cfe60390STomohiro Kusumi uint32_t i_data[EXT2_NDADDR + EXT2_NIADDR]; 120*cfe60390STomohiro Kusumi }; 121*cfe60390STomohiro Kusumi 122*cfe60390STomohiro Kusumi struct ext4_extent_cache i_ext_cache; /* cache for ext4 extent */ 123*cfe60390STomohiro Kusumi }; 124*cfe60390STomohiro Kusumi 125*cfe60390STomohiro Kusumi /* 126*cfe60390STomohiro Kusumi * The di_db fields may be overlaid with other information for 127*cfe60390STomohiro Kusumi * file types that do not have associated disk storage. Block 128*cfe60390STomohiro Kusumi * and character devices overlay the first data block with their 129*cfe60390STomohiro Kusumi * dev_t value. Short symbolic links place their path in the 130*cfe60390STomohiro Kusumi * di_db area. 131*cfe60390STomohiro Kusumi */ 132*cfe60390STomohiro Kusumi #define i_shortlink i_db 133*cfe60390STomohiro Kusumi #define i_rdev i_db[0] 134*cfe60390STomohiro Kusumi 135*cfe60390STomohiro Kusumi /* File permissions. */ 136*cfe60390STomohiro Kusumi #define IEXEC 0000100 /* Executable. */ 137*cfe60390STomohiro Kusumi #define IWRITE 0000200 /* Writeable. */ 138*cfe60390STomohiro Kusumi #define IREAD 0000400 /* Readable. */ 139*cfe60390STomohiro Kusumi #define ISVTX 0001000 /* Sticky bit. */ 140*cfe60390STomohiro Kusumi #define ISGID 0002000 /* Set-gid. */ 141*cfe60390STomohiro Kusumi #define ISUID 0004000 /* Set-uid. */ 142*cfe60390STomohiro Kusumi 143*cfe60390STomohiro Kusumi /* File types. */ 144*cfe60390STomohiro Kusumi #define IFMT 0170000 /* Mask of file type. */ 145*cfe60390STomohiro Kusumi #define IFIFO 0010000 /* Named pipe (fifo). */ 146*cfe60390STomohiro Kusumi #define IFCHR 0020000 /* Character device. */ 147*cfe60390STomohiro Kusumi #define IFDIR 0040000 /* Directory file. */ 148*cfe60390STomohiro Kusumi #define IFBLK 0060000 /* Block device. */ 149*cfe60390STomohiro Kusumi #define IFREG 0100000 /* Regular file. */ 150*cfe60390STomohiro Kusumi #define IFLNK 0120000 /* Symbolic link. */ 151*cfe60390STomohiro Kusumi #define IFSOCK 0140000 /* UNIX domain socket. */ 152*cfe60390STomohiro Kusumi #define IFWHT 0160000 /* Whiteout. */ 153*cfe60390STomohiro Kusumi 154*cfe60390STomohiro Kusumi /* These flags are kept in i_flag. */ 155*cfe60390STomohiro Kusumi #define IN_ACCESS 0x0001 /* Access time update request. */ 156*cfe60390STomohiro Kusumi #define IN_CHANGE 0x0002 /* Inode change time update request. */ 157*cfe60390STomohiro Kusumi #define IN_UPDATE 0x0004 /* Modification time update request. */ 158*cfe60390STomohiro Kusumi #define IN_MODIFIED 0x0008 /* Inode has been modified. */ 159*cfe60390STomohiro Kusumi #define IN_RENAME 0x0010 /* Inode is being renamed. */ 160*cfe60390STomohiro Kusumi #define IN_HASHED 0x0020 /* Inode is on hash list */ 161*cfe60390STomohiro Kusumi #define IN_LAZYMOD 0x0040 /* Modified, but don't write yet. */ 162*cfe60390STomohiro Kusumi #define IN_SPACECOUNTED 0x0080 /* Blocks to be freed in free count. */ 163*cfe60390STomohiro Kusumi #define IN_LAZYACCESS 0x0100 /* Process IN_ACCESS after the 164*cfe60390STomohiro Kusumi suspension finished */ 165*cfe60390STomohiro Kusumi 166*cfe60390STomohiro Kusumi /* 167*cfe60390STomohiro Kusumi * These are translation flags for some attributes that Ext4 168*cfe60390STomohiro Kusumi * passes as inode flags but that we cannot pass directly. 169*cfe60390STomohiro Kusumi */ 170*cfe60390STomohiro Kusumi #define IN_E3INDEX 0x010000 171*cfe60390STomohiro Kusumi #define IN_E4EXTENTS 0x020000 172*cfe60390STomohiro Kusumi 173*cfe60390STomohiro Kusumi #define i_devvp i_ump->um_devvp 174*cfe60390STomohiro Kusumi 175*cfe60390STomohiro Kusumi #ifdef _KERNEL 176*cfe60390STomohiro Kusumi /* 177*cfe60390STomohiro Kusumi * Structure used to pass around logical block paths generated by 178*cfe60390STomohiro Kusumi * ext2_getlbns and used by truncate and bmap code. 179*cfe60390STomohiro Kusumi */ 180*cfe60390STomohiro Kusumi struct indir { 181*cfe60390STomohiro Kusumi e2fs_lbn_t in_lbn; /* Logical block number. */ 182*cfe60390STomohiro Kusumi int in_off; /* Offset in buffer. */ 183*cfe60390STomohiro Kusumi }; 184*cfe60390STomohiro Kusumi 185*cfe60390STomohiro Kusumi /* Convert between inode pointers and vnode pointers. */ 186*cfe60390STomohiro Kusumi #define VTOI(vp) ((struct inode *)(vp)->v_data) 187*cfe60390STomohiro Kusumi #define ITOV(ip) ((ip)->i_vnode) 188*cfe60390STomohiro Kusumi 189*cfe60390STomohiro Kusumi /* This overlays the fid structure (see mount.h). */ 190*cfe60390STomohiro Kusumi struct ufid { 191*cfe60390STomohiro Kusumi uint16_t ufid_len; /* Length of structure. */ 192*cfe60390STomohiro Kusumi uint16_t ufid_pad; /* Force 32-bit alignment. */ 193*cfe60390STomohiro Kusumi ino_t ufid_ino; /* File number (ino). */ 194*cfe60390STomohiro Kusumi uint32_t ufid_gen; /* Generation number. */ 195*cfe60390STomohiro Kusumi }; 196*cfe60390STomohiro Kusumi #endif /* _KERNEL */ 197*cfe60390STomohiro Kusumi 198*cfe60390STomohiro Kusumi #endif /* !_FS_EXT2FS_INODE_H_ */ 199