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