1 /* 2 * linux/include/linux/ext3_fs_i.h 3 * 4 * Copyright (C) 1992, 1993, 1994, 1995 5 * Remy Card (card@masi.ibp.fr) 6 * Laboratoire MASI - Institut Blaise Pascal 7 * Universite Pierre et Marie Curie (Paris VI) 8 * 9 * from 10 * 11 * linux/include/linux/minix_fs_i.h 12 * 13 * Copyright (C) 1991, 1992 Linus Torvalds 14 */ 15 16 #ifndef _LINUX_EXT3_FS_I 17 #define _LINUX_EXT3_FS_I 18 19 #include <linux/rwsem.h> 20 #include <linux/rbtree.h> 21 #include <linux/seqlock.h> 22 #include <linux/mutex.h> 23 24 /* data type for block offset of block group */ 25 typedef int ext3_grpblk_t; 26 27 /* data type for filesystem-wide blocks number */ 28 typedef unsigned long ext3_fsblk_t; 29 30 #define E3FSBLK "%lu" 31 32 struct ext3_reserve_window { 33 ext3_fsblk_t _rsv_start; /* First byte reserved */ 34 ext3_fsblk_t _rsv_end; /* Last byte reserved or 0 */ 35 }; 36 37 struct ext3_reserve_window_node { 38 struct rb_node rsv_node; 39 __u32 rsv_goal_size; 40 __u32 rsv_alloc_hit; 41 struct ext3_reserve_window rsv_window; 42 }; 43 44 struct ext3_block_alloc_info { 45 /* information about reservation window */ 46 struct ext3_reserve_window_node rsv_window_node; 47 /* 48 * was i_next_alloc_block in ext3_inode_info 49 * is the logical (file-relative) number of the 50 * most-recently-allocated block in this file. 51 * We use this for detecting linearly ascending allocation requests. 52 */ 53 __u32 last_alloc_logical_block; 54 /* 55 * Was i_next_alloc_goal in ext3_inode_info 56 * is the *physical* companion to i_next_alloc_block. 57 * it the physical block number of the block which was most-recentl 58 * allocated to this file. This give us the goal (target) for the next 59 * allocation when we detect linearly ascending requests. 60 */ 61 ext3_fsblk_t last_alloc_physical_block; 62 }; 63 64 #define rsv_start rsv_window._rsv_start 65 #define rsv_end rsv_window._rsv_end 66 67 /* 68 * third extended file system inode data in memory 69 */ 70 struct ext3_inode_info { 71 __le32 i_data[15]; /* unconverted */ 72 __u32 i_flags; 73 #ifdef EXT3_FRAGMENTS 74 __u32 i_faddr; 75 __u8 i_frag_no; 76 __u8 i_frag_size; 77 #endif 78 ext3_fsblk_t i_file_acl; 79 __u32 i_dir_acl; 80 __u32 i_dtime; 81 82 /* 83 * i_block_group is the number of the block group which contains 84 * this file's inode. Constant across the lifetime of the inode, 85 * it is ued for making block allocation decisions - we try to 86 * place a file's data blocks near its inode block, and new inodes 87 * near to their parent directory's inode. 88 */ 89 __u32 i_block_group; 90 unsigned long i_state_flags; /* Dynamic state flags for ext3 */ 91 92 /* block reservation info */ 93 struct ext3_block_alloc_info *i_block_alloc_info; 94 95 __u32 i_dir_start_lookup; 96 #ifdef CONFIG_EXT3_FS_XATTR 97 /* 98 * Extended attributes can be read independently of the main file 99 * data. Taking i_mutex even when reading would cause contention 100 * between readers of EAs and writers of regular file data, so 101 * instead we synchronize on xattr_sem when reading or changing 102 * EAs. 103 */ 104 struct rw_semaphore xattr_sem; 105 #endif 106 107 struct list_head i_orphan; /* unlinked but open inodes */ 108 109 /* 110 * i_disksize keeps track of what the inode size is ON DISK, not 111 * in memory. During truncate, i_size is set to the new size by 112 * the VFS prior to calling ext3_truncate(), but the filesystem won't 113 * set i_disksize to 0 until the truncate is actually under way. 114 * 115 * The intent is that i_disksize always represents the blocks which 116 * are used by this file. This allows recovery to restart truncate 117 * on orphans if we crash during truncate. We actually write i_disksize 118 * into the on-disk inode when writing inodes out, instead of i_size. 119 * 120 * The only time when i_disksize and i_size may be different is when 121 * a truncate is in progress. The only things which change i_disksize 122 * are ext3_get_block (growth) and ext3_truncate (shrinkth). 123 */ 124 loff_t i_disksize; 125 126 /* on-disk additional length */ 127 __u16 i_extra_isize; 128 129 /* 130 * truncate_mutex is for serialising ext3_truncate() against 131 * ext3_getblock(). In the 2.4 ext2 design, great chunks of inode's 132 * data tree are chopped off during truncate. We can't do that in 133 * ext3 because whenever we perform intermediate commits during 134 * truncate, the inode and all the metadata blocks *must* be in a 135 * consistent state which allows truncation of the orphans to restart 136 * during recovery. Hence we must fix the get_block-vs-truncate race 137 * by other means, so we have truncate_mutex. 138 */ 139 struct mutex truncate_mutex; 140 141 /* 142 * Transactions that contain inode's metadata needed to complete 143 * fsync and fdatasync, respectively. 144 */ 145 atomic_t i_sync_tid; 146 atomic_t i_datasync_tid; 147 148 struct inode vfs_inode; 149 }; 150 151 #endif /* _LINUX_EXT3_FS_I */ 152