summaryrefslogtreecommitdiff
path: root/sys/fs/nilfs/nilfs.h
blob: d7ac22c214f84950359781f237591776e7820d7e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
/* $NetBSD: nilfs.h,v 1.6 2020/03/21 13:38:29 reinoud Exp $ */

/*
 * Copyright (c) 2008, 2009 Reinoud Zandijk
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * 
 */

#ifndef _FS_NILFS_NILFS_H_
#define _FS_NILFS_NILFS_H_

#include <sys/queue.h>
#include <sys/uio.h>
#include <sys/mutex.h>

#include <sys/bufq.h>
#include <sys/disk.h>
#include <sys/kthread.h>
#include <miscfs/genfs/genfs_node.h>
#include "nilfs_fs.h"


/* debug categories */
#define NILFS_DEBUG_VOLUMES		0x000001
#define NILFS_DEBUG_VFSCALL		0x000002
#define NILFS_DEBUG_CALL		0x000004
#define NILFS_DEBUG_LOCKING		0x000008
#define NILFS_DEBUG_NODE		0x000010
#define NILFS_DEBUG_LOOKUP		0x000020
#define NILFS_DEBUG_READDIR		0x000040
#define NILFS_DEBUG_TRANSLATE		0x000080
#define NILFS_DEBUG_STRATEGY		0x000100
#define NILFS_DEBUG_READ		0x000200
#define NILFS_DEBUG_WRITE		0x000400
#define NILFS_DEBUG_ATTR		0x001000
#define NILFS_DEBUG_EXTATTR		0x002000
#define NILFS_DEBUG_ALLOC		0x004000
#define NILFS_DEBUG_DIRHASH		0x010000
#define NILFS_DEBUG_NOTIMPL		0x020000
#define NILFS_DEBUG_SHEDULE		0x040000
#define NILFS_DEBUG_SYNC		0x100000
#define NILFS_DEBUG_PARANOIA		0x200000

extern int nilfs_verbose;

/* initial value of nilfs_verbose */
#define NILFS_DEBUGGING		0

#ifdef DEBUG
#define DPRINTF(name, arg) { \
		if (nilfs_verbose & NILFS_DEBUG_##name) {\
			printf arg;\
		};\
	}
#define DPRINTFIF(name, cond, arg) { \
		if (nilfs_verbose & NILFS_DEBUG_##name) { \
			if (cond) printf arg;\
		};\
	}
#else
#define DPRINTF(name, arg) {}
#define DPRINTFIF(name, cond, arg) {}
#endif


/* Configuration values */
#define NILFS_INODE_HASHBITS 	10
#define NILFS_INODE_HASHSIZE	(1<<NILFS_INODE_HASHBITS)
#define NILFS_INODE_HASHMASK	(NILFS_INODE_HASHSIZE - 1)


/* readdir cookies */
#define NILFS_DIRCOOKIE_DOT 1


/* handies */
#define VFSTONILFS(mp)    ((struct nilfs_mount *)mp->mnt_data)


/* malloc pools */
MALLOC_DECLARE(M_NILFSMNT);
MALLOC_DECLARE(M_NILFSTEMP);

extern struct pool nilfs_node_pool;
struct nilfs_node;
struct nilfs_mount;


#define NILFS_MAXNAMLEN	255

/* structure and derivatives */
struct nilfs_mdt {
	uint32_t  entries_per_block;
	uint32_t  entries_per_group;
	uint32_t  blocks_per_group;
	uint32_t  groups_per_desc_block;	/* desc is super group */
	uint32_t  blocks_per_desc_block;	/* desc is super group */
};


/* all that is related to the nilfs itself */
struct nilfs_device {
	/* device info */
	struct vnode		*devvp;	
	struct mount		*vfs_mountp;
	int 			 refcnt;

	/* meta : super block etc. */
	uint64_t devsize;
	uint32_t blocksize;
	struct nilfs_super_block super, super2;
	struct nilfs_node	*dat_node;
	struct nilfs_node	*cp_node;
	struct nilfs_node	*su_node;

	/* segment usage */
	/* checkpoints   */

	/* dat structure and derivatives */
	struct nilfs_mdt	 dat_mdt;
	struct nilfs_mdt	 ifile_mdt;

	/* running values */
	int	 mount_state;	/* ? */
	uint64_t last_seg_seq;	/* current segment sequence number */
	uint64_t last_seg_num;	/* last segment                    */
	uint64_t next_seg_num;	/* next segment to fill            */
	uint64_t last_cno;	/* current checkpoint number       */
	struct nilfs_segment_summary last_segsum;
	struct nilfs_super_root      super_root;

	/* syncing and late allocation */
	int			 syncing;		/* are we syncing?   */
	/* XXX sync_cv on what mutex? */
	kcondvar_t 		 sync_cv;		/* sleeping on sync  */
	uint32_t		 uncomitted_bl;		/* for free space    */

	/* lists */
	STAILQ_HEAD(nilfs_mnts, nilfs_mount) mounts;
	SLIST_ENTRY(nilfs_device) next_device;
};

extern SLIST_HEAD(_nilfs_devices, nilfs_device) nilfs_devices;


/* a specific mountpoint; head or a checkpoint/snapshot */
struct nilfs_mount {
	struct mount		*vfs_mountp;
	struct nilfs_device	*nilfsdev;
	struct nilfs_args	 mount_args;		/* flags RO access */

	/* instance values */
	struct nilfs_node	*ifile_node;

	/* lists */
	STAILQ_ENTRY(nilfs_mount) next_mount;		/* in nilfs_device   */
};


/*
 * NILFS node describing a file/directory.
 *
 * BUGALERT claim node_mutex before reading/writing to prevent inconsistencies !
 */
struct nilfs_node {
	struct genfs_node	 i_gnode;		/* has to be first   */
	struct vnode		*vnode;			/* vnode associated  */
	struct nilfs_mount	*ump;
	struct nilfs_device	*nilfsdev;

	ino_t			 ino;
	struct nilfs_inode	 inode;			/* readin copy */
	struct dirhash		*dir_hash;		/* if VDIR */

	/* XXX do we need this lock? */
	kmutex_t		 node_mutex;
	kcondvar_t		 node_lock;		/* sleeping lock */
	char const		*lock_fname;
	int			 lock_lineno;

	/* misc */
	uint32_t		 i_flags;		/* associated flags  */
	struct lockf		*lockf;			/* lock list         */

	LIST_ENTRY(nilfs_node)	 hashchain;		/* inside hash line  */
};


/* misc. flags stored in i_flags (XXX needs cleaning up) */
#define	IN_ACCESS		0x0001	/* Inode access time update request  */
#define	IN_CHANGE		0x0002	/* Inode change time update request  */
#define	IN_UPDATE		0x0004	/* Inode was written to; update mtime*/
#define	IN_MODIFY		0x0008	/* Modification time update request  */
#define	IN_MODIFIED		0x0010	/* node has been modified */
#define	IN_ACCESSED		0x0020	/* node has been accessed */
#define	IN_RENAME		0x0040	/* node is being renamed. XXX ?? */
#define	IN_DELETED		0x0080	/* node is unlinked, no FID reference*/
#define	IN_LOCKED		0x0100	/* node is locked by condvar */
#define	IN_SYNCED		0x0200	/* node is being used by sync */
#define	IN_CALLBACK_ULK		0x0400	/* node will be unlocked by callback */
#define	IN_NODE_REBUILD		0x0800	/* node is rebuild */

#define IN_FLAGBITS \
	"\10\1IN_ACCESS\2IN_CHANGE\3IN_UPDATE\4IN_MODIFY\5IN_MODIFIED" \
	"\6IN_ACCESSED\7IN_RENAME\10IN_DELETED\11IN_LOCKED\12IN_SYNCED" \
	"\13IN_CALLBACK_ULK\14IN_NODE_REBUILD"

#endif /* !_FS_NILFS_NILFS_H_ */