1 /* $NetBSD: nilfs.h,v 1.6 2020/03/21 13:38:29 reinoud Exp $ */ 2 3 /* 4 * Copyright (c) 2008, 2009 Reinoud Zandijk 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 * 27 */ 28 29 #ifndef _FS_NILFS_NILFS_H_ 30 #define _FS_NILFS_NILFS_H_ 31 32 #include <sys/queue.h> 33 #include <sys/uio.h> 34 #include <sys/mutex.h> 35 36 #include <sys/bufq.h> 37 #include <sys/disk.h> 38 #include <sys/kthread.h> 39 #include <miscfs/genfs/genfs_node.h> 40 #include "nilfs_fs.h" 41 42 43 /* debug categories */ 44 #define NILFS_DEBUG_VOLUMES 0x000001 45 #define NILFS_DEBUG_VFSCALL 0x000002 46 #define NILFS_DEBUG_CALL 0x000004 47 #define NILFS_DEBUG_LOCKING 0x000008 48 #define NILFS_DEBUG_NODE 0x000010 49 #define NILFS_DEBUG_LOOKUP 0x000020 50 #define NILFS_DEBUG_READDIR 0x000040 51 #define NILFS_DEBUG_TRANSLATE 0x000080 52 #define NILFS_DEBUG_STRATEGY 0x000100 53 #define NILFS_DEBUG_READ 0x000200 54 #define NILFS_DEBUG_WRITE 0x000400 55 #define NILFS_DEBUG_ATTR 0x001000 56 #define NILFS_DEBUG_EXTATTR 0x002000 57 #define NILFS_DEBUG_ALLOC 0x004000 58 #define NILFS_DEBUG_DIRHASH 0x010000 59 #define NILFS_DEBUG_NOTIMPL 0x020000 60 #define NILFS_DEBUG_SHEDULE 0x040000 61 #define NILFS_DEBUG_SYNC 0x100000 62 #define NILFS_DEBUG_PARANOIA 0x200000 63 64 extern int nilfs_verbose; 65 66 /* initial value of nilfs_verbose */ 67 #define NILFS_DEBUGGING 0 68 69 #ifdef DEBUG 70 #define DPRINTF(name, arg) { \ 71 if (nilfs_verbose & NILFS_DEBUG_##name) {\ 72 printf arg;\ 73 };\ 74 } 75 #define DPRINTFIF(name, cond, arg) { \ 76 if (nilfs_verbose & NILFS_DEBUG_##name) { \ 77 if (cond) printf arg;\ 78 };\ 79 } 80 #else 81 #define DPRINTF(name, arg) {} 82 #define DPRINTFIF(name, cond, arg) {} 83 #endif 84 85 86 /* Configuration values */ 87 #define NILFS_INODE_HASHBITS 10 88 #define NILFS_INODE_HASHSIZE (1<<NILFS_INODE_HASHBITS) 89 #define NILFS_INODE_HASHMASK (NILFS_INODE_HASHSIZE - 1) 90 91 92 /* readdir cookies */ 93 #define NILFS_DIRCOOKIE_DOT 1 94 95 96 /* handies */ 97 #define VFSTONILFS(mp) ((struct nilfs_mount *)mp->mnt_data) 98 99 100 /* malloc pools */ 101 MALLOC_DECLARE(M_NILFSMNT); 102 MALLOC_DECLARE(M_NILFSTEMP); 103 104 extern struct pool nilfs_node_pool; 105 struct nilfs_node; 106 struct nilfs_mount; 107 108 109 #define NILFS_MAXNAMLEN 255 110 111 /* structure and derivatives */ 112 struct nilfs_mdt { 113 uint32_t entries_per_block; 114 uint32_t entries_per_group; 115 uint32_t blocks_per_group; 116 uint32_t groups_per_desc_block; /* desc is super group */ 117 uint32_t blocks_per_desc_block; /* desc is super group */ 118 }; 119 120 121 /* all that is related to the nilfs itself */ 122 struct nilfs_device { 123 /* device info */ 124 struct vnode *devvp; 125 struct mount *vfs_mountp; 126 int refcnt; 127 128 /* meta : super block etc. */ 129 uint64_t devsize; 130 uint32_t blocksize; 131 struct nilfs_super_block super, super2; 132 struct nilfs_node *dat_node; 133 struct nilfs_node *cp_node; 134 struct nilfs_node *su_node; 135 136 /* segment usage */ 137 /* checkpoints */ 138 139 /* dat structure and derivatives */ 140 struct nilfs_mdt dat_mdt; 141 struct nilfs_mdt ifile_mdt; 142 143 /* running values */ 144 int mount_state; /* ? */ 145 uint64_t last_seg_seq; /* current segment sequence number */ 146 uint64_t last_seg_num; /* last segment */ 147 uint64_t next_seg_num; /* next segment to fill */ 148 uint64_t last_cno; /* current checkpoint number */ 149 struct nilfs_segment_summary last_segsum; 150 struct nilfs_super_root super_root; 151 152 /* syncing and late allocation */ 153 int syncing; /* are we syncing? */ 154 /* XXX sync_cv on what mutex? */ 155 kcondvar_t sync_cv; /* sleeping on sync */ 156 uint32_t uncomitted_bl; /* for free space */ 157 158 /* lists */ 159 STAILQ_HEAD(nilfs_mnts, nilfs_mount) mounts; 160 SLIST_ENTRY(nilfs_device) next_device; 161 }; 162 163 extern SLIST_HEAD(_nilfs_devices, nilfs_device) nilfs_devices; 164 165 166 /* a specific mountpoint; head or a checkpoint/snapshot */ 167 struct nilfs_mount { 168 struct mount *vfs_mountp; 169 struct nilfs_device *nilfsdev; 170 struct nilfs_args mount_args; /* flags RO access */ 171 172 /* instance values */ 173 struct nilfs_node *ifile_node; 174 175 /* lists */ 176 STAILQ_ENTRY(nilfs_mount) next_mount; /* in nilfs_device */ 177 }; 178 179 180 /* 181 * NILFS node describing a file/directory. 182 * 183 * BUGALERT claim node_mutex before reading/writing to prevent inconsistencies ! 184 */ 185 struct nilfs_node { 186 struct genfs_node i_gnode; /* has to be first */ 187 struct vnode *vnode; /* vnode associated */ 188 struct nilfs_mount *ump; 189 struct nilfs_device *nilfsdev; 190 191 ino_t ino; 192 struct nilfs_inode inode; /* readin copy */ 193 struct dirhash *dir_hash; /* if VDIR */ 194 195 /* XXX do we need this lock? */ 196 kmutex_t node_mutex; 197 kcondvar_t node_lock; /* sleeping lock */ 198 char const *lock_fname; 199 int lock_lineno; 200 201 /* misc */ 202 uint32_t i_flags; /* associated flags */ 203 struct lockf *lockf; /* lock list */ 204 205 LIST_ENTRY(nilfs_node) hashchain; /* inside hash line */ 206 }; 207 208 209 /* misc. flags stored in i_flags (XXX needs cleaning up) */ 210 #define IN_ACCESS 0x0001 /* Inode access time update request */ 211 #define IN_CHANGE 0x0002 /* Inode change time update request */ 212 #define IN_UPDATE 0x0004 /* Inode was written to; update mtime*/ 213 #define IN_MODIFY 0x0008 /* Modification time update request */ 214 #define IN_MODIFIED 0x0010 /* node has been modified */ 215 #define IN_ACCESSED 0x0020 /* node has been accessed */ 216 #define IN_RENAME 0x0040 /* node is being renamed. XXX ?? */ 217 #define IN_DELETED 0x0080 /* node is unlinked, no FID reference*/ 218 #define IN_LOCKED 0x0100 /* node is locked by condvar */ 219 #define IN_SYNCED 0x0200 /* node is being used by sync */ 220 #define IN_CALLBACK_ULK 0x0400 /* node will be unlocked by callback */ 221 #define IN_NODE_REBUILD 0x0800 /* node is rebuild */ 222 223 #define IN_FLAGBITS \ 224 "\10\1IN_ACCESS\2IN_CHANGE\3IN_UPDATE\4IN_MODIFY\5IN_MODIFIED" \ 225 "\6IN_ACCESSED\7IN_RENAME\10IN_DELETED\11IN_LOCKED\12IN_SYNCED" \ 226 "\13IN_CALLBACK_ULK\14IN_NODE_REBUILD" 227 228 #endif /* !_FS_NILFS_NILFS_H_ */ 229