Expand PMF_FN_* macros.
[netbsd-mini2440.git] / sys / fs / nilfs / nilfs.h
blobbcf5261e999151e1d3c054157c9df5151354ac07
1 /* $NetBSD: nilfs.h,v 2.26 2008/08/06 13:41:12 reinoud Exp $ */
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.
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.
29 #ifndef _FS_NILFS_NILFS_H_
30 #define _FS_NILFS_NILFS_H_
32 #include <sys/queue.h>
33 #include <sys/uio.h>
34 #include <sys/mutex.h>
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"
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
64 extern int nilfs_verbose;
66 /* initial value of nilfs_verbose */
67 #define NILFS_DEBUGGING 0
69 #ifdef DEBUG
70 #define DPRINTF(name, arg) { \
71 if (nilfs_verbose & NILFS_DEBUG_##name) {\
72 printf arg;\
73 };\
75 #define DPRINTFIF(name, cond, arg) { \
76 if (nilfs_verbose & NILFS_DEBUG_##name) { \
77 if (cond) printf arg;\
78 };\
80 #else
81 #define DPRINTF(name, arg) {}
82 #define DPRINTFIF(name, cond, arg) {}
83 #endif
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)
92 /* readdir cookies */
93 #define NILFS_DIRCOOKIE_DOT 1
96 /* handies */
97 #define VFSTONILFS(mp) ((struct nilfs_mount *)mp->mnt_data)
100 /* malloc pools */
101 MALLOC_DECLARE(M_NILFSMNT);
102 MALLOC_DECLARE(M_NILFSTEMP);
104 struct pool nilfs_node_pool;
105 struct nilfs_node;
106 struct nilfs_mount;
109 /* structure and derivatives */
110 struct nilfs_mdt {
111 uint32_t entries_per_block;
112 uint32_t entries_per_group;
113 uint32_t blocks_per_group;
114 uint32_t groups_per_desc_block; /* desc is super group */
115 uint32_t blocks_per_desc_block; /* desc is super group */
119 /* all that is related to the nilfs itself */
120 struct nilfs_device {
121 /* device info */
122 struct vnode *devvp;
123 struct mount *vfs_mountp;
124 int refcnt;
126 /* meta : super block etc. */
127 uint64_t devsize;
128 uint32_t blocksize;
129 struct nilfs_super_block super, super2;
130 struct nilfs_node *dat_node;
131 struct nilfs_node *cp_node;
132 struct nilfs_node *su_node;
134 /* segment usage */
135 /* checkpoints */
137 /* dat structure and derivatives */
138 struct nilfs_mdt dat_mdt;
139 struct nilfs_mdt ifile_mdt;
141 /* running values */
142 int mount_state; /* ? */
143 uint64_t last_seg_seq; /* current segment sequence number */
144 uint64_t last_seg_num; /* last segment */
145 uint64_t next_seg_num; /* next segment to fill */
146 uint64_t last_cno; /* current checkpoint number */
147 struct nilfs_segment_summary last_segsum;
148 struct nilfs_super_root super_root;
150 /* syncing and late allocation */
151 int syncing; /* are we syncing? */
152 /* XXX sync_cv on what mutex? */
153 kcondvar_t sync_cv; /* sleeping on sync */
154 uint32_t uncomitted_bl; /* for free space */
156 /* lists */
157 STAILQ_HEAD(nilfs_mnts, nilfs_mount) mounts;
158 SLIST_ENTRY(nilfs_device) next_device;
161 extern SLIST_HEAD(_nilfs_devices, nilfs_device) nilfs_devices;
164 /* a specific mountpoint; head or a checkpoint/snapshot */
165 struct nilfs_mount {
166 struct mount *vfs_mountp;
167 struct nilfs_device *nilfsdev;
168 struct nilfs_args mount_args; /* flags RO access */
170 /* instance values */
171 struct nilfs_node *ifile_node;
173 /* hash table to lookup ino -> nilfs_node */
174 kmutex_t ihash_lock;
175 kmutex_t get_node_lock;
176 LIST_HEAD(, nilfs_node) nilfs_nodes[NILFS_INODE_HASHSIZE];
178 /* lists */
179 STAILQ_ENTRY(nilfs_mount) next_mount; /* in nilfs_device */
184 * NILFS node describing a file/directory.
186 * BUGALERT claim node_mutex before reading/writing to prevent inconsistencies !
188 struct nilfs_node {
189 struct genfs_node i_gnode; /* has to be first */
190 struct vnode *vnode; /* vnode associated */
191 struct nilfs_mount *ump;
192 struct nilfs_device *nilfsdev;
194 ino_t ino;
195 struct nilfs_inode inode; /* readin copy */
196 struct dirhash *dir_hash; /* if VDIR */
198 /* XXX do we need this lock? */
199 kmutex_t node_mutex;
200 kcondvar_t node_lock; /* sleeping lock */
201 char const *lock_fname;
202 int lock_lineno;
204 /* misc */
205 uint32_t i_flags; /* associated flags */
206 struct lockf *lockf; /* lock list */
208 LIST_ENTRY(nilfs_node) hashchain; /* inside hash line */
212 /* misc. flags stored in i_flags (XXX needs cleaning up) */
213 #define IN_ACCESS 0x0001 /* Inode access time update request */
214 #define IN_CHANGE 0x0002 /* Inode change time update request */
215 #define IN_UPDATE 0x0004 /* Inode was written to; update mtime*/
216 #define IN_MODIFY 0x0008 /* Modification time update request */
217 #define IN_MODIFIED 0x0010 /* node has been modified */
218 #define IN_ACCESSED 0x0020 /* node has been accessed */
219 #define IN_RENAME 0x0040 /* node is being renamed. XXX ?? */
220 #define IN_DELETED 0x0080 /* node is unlinked, no FID reference*/
221 #define IN_LOCKED 0x0100 /* node is locked by condvar */
222 #define IN_SYNCED 0x0200 /* node is being used by sync */
223 #define IN_CALLBACK_ULK 0x0400 /* node will be unlocked by callback */
224 #define IN_NODE_REBUILD 0x0800 /* node is rebuild */
226 #define IN_FLAGBITS \
227 "\10\1IN_ACCESS\2IN_CHANGE\3IN_UPDATE\4IN_MODIFY\5IN_MODIFIED" \
228 "\6IN_ACCESSED\7IN_RENAME\10IN_DELETED\11IN_LOCKED\12IN_SYNCED" \
229 "\13IN_CALLBACK_ULK\14IN_NODE_REBUILD"
231 #endif /* !_FS_NILFS_NILFS_H_ */