incore.h 21 KB
Newer Older
David Teigland's avatar
David Teigland committed
1
2
/*
 * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
Bob Peterson's avatar
Bob Peterson committed
3
 * Copyright (C) 2004-2008 Red Hat, Inc.  All rights reserved.
David Teigland's avatar
David Teigland committed
4
5
6
 *
 * This copyrighted material is made available to anyone wishing to use,
 * modify, copy, or redistribute it subject to the terms and conditions
7
 * of the GNU General Public License version 2.
David Teigland's avatar
David Teigland committed
8
9
10
11
12
 */

#ifndef __INCORE_DOT_H__
#define __INCORE_DOT_H__

13
#include <linux/fs.h>
Alexey Dobriyan's avatar
Alexey Dobriyan committed
14
#include <linux/kobject.h>
15
#include <linux/workqueue.h>
16
17
#include <linux/dlm.h>
#include <linux/buffer_head.h>
18
19
#include <linux/rcupdate.h>
#include <linux/rculist_bl.h>
20
#include <linux/completion.h>
21
#include <linux/rbtree.h>
22
23
#include <linux/ktime.h>
#include <linux/percpu.h>
24

David Teigland's avatar
David Teigland committed
25
26
27
28
#define DIO_WAIT	0x00000010
#define DIO_METADATA	0x00000020

struct gfs2_log_operations;
29
struct gfs2_bufdata;
David Teigland's avatar
David Teigland committed
30
31
32
33
34
35
36
struct gfs2_holder;
struct gfs2_glock;
struct gfs2_quota_data;
struct gfs2_trans;
struct gfs2_ail;
struct gfs2_jdesc;
struct gfs2_sbd;
37
struct lm_lockops;
David Teigland's avatar
David Teigland committed
38
39
40

typedef void (*gfs2_glop_bh_t) (struct gfs2_glock *gl, unsigned int ret);

41
42
43
44
45
46
47
48
struct gfs2_log_header_host {
	u64 lh_sequence;	/* Sequence number of this transaction */
	u32 lh_flags;		/* GFS2_LOG_HEAD_... */
	u32 lh_tail;		/* Block number of log tail */
	u32 lh_blkno;
	u32 lh_hash;
};

David Teigland's avatar
David Teigland committed
49
50
51
52
53
54
/*
 * Structure of operations that are associated with each
 * type of element in the log.
 */

struct gfs2_log_operations {
55
	void (*lo_add) (struct gfs2_sbd *sdp, struct gfs2_bufdata *bd);
David Teigland's avatar
David Teigland committed
56
57
58
	void (*lo_before_commit) (struct gfs2_sbd *sdp);
	void (*lo_after_commit) (struct gfs2_sbd *sdp, struct gfs2_ail *ai);
	void (*lo_before_scan) (struct gfs2_jdesc *jd,
59
				struct gfs2_log_header_host *head, int pass);
David Teigland's avatar
David Teigland committed
60
61
62
63
	int (*lo_scan_elements) (struct gfs2_jdesc *jd, unsigned int start,
				 struct gfs2_log_descriptor *ld, __be64 *ptr,
				 int pass);
	void (*lo_after_scan) (struct gfs2_jdesc *jd, int error, int pass);
64
	const char *lo_name;
David Teigland's avatar
David Teigland committed
65
66
};

67
68
#define GBF_FULL 1

David Teigland's avatar
David Teigland committed
69
70
71
struct gfs2_bitmap {
	struct buffer_head *bi_bh;
	char *bi_clone;
72
	unsigned long bi_flags;
73
74
75
	u32 bi_offset;
	u32 bi_start;
	u32 bi_len;
David Teigland's avatar
David Teigland committed
76
77
78
};

struct gfs2_rgrpd {
79
	struct rb_node rd_node;		/* Link with superblock */
David Teigland's avatar
David Teigland committed
80
	struct gfs2_glock *rd_gl;	/* Glock for this rgrp */
81
82
83
84
85
	u64 rd_addr;			/* grp block disk address */
	u64 rd_data0;			/* first data location */
	u32 rd_length;			/* length of rgrp header in fs blocks */
	u32 rd_data;			/* num of data blocks in rgrp */
	u32 rd_bitbytes;		/* number of bytes in data bitmaps */
86
	u32 rd_free;
Bob Peterson's avatar
Bob Peterson committed
87
	u32 rd_reserved;                /* number of blocks reserved */
88
89
	u32 rd_free_clone;
	u32 rd_dinodes;
90
	u64 rd_igeneration;
David Teigland's avatar
David Teigland committed
91
92
	struct gfs2_bitmap *rd_bits;
	struct gfs2_sbd *rd_sbd;
93
	struct gfs2_rgrp_lvb *rd_rgl;
94
	u32 rd_last_alloc;
95
	u32 rd_flags;
96
97
98
99
#define GFS2_RDF_CHECK		0x10000000 /* check for unlinked inodes */
#define GFS2_RDF_UPTODATE	0x20000000 /* rg is up to date */
#define GFS2_RDF_ERROR		0x40000000 /* error in rg */
#define GFS2_RDF_MASK		0xf0000000 /* mask for internal flags */
Bob Peterson's avatar
Bob Peterson committed
100
101
	spinlock_t rd_rsspin;           /* protects reservation related vars */
	struct rb_root rd_rstree;       /* multi-block reservation tree */
David Teigland's avatar
David Teigland committed
102
103
};

104
105
106
107
108
109
110
111
112
113
114
struct gfs2_rbm {
	struct gfs2_rgrpd *rgd;
	struct gfs2_bitmap *bi;	/* Bitmap must belong to the rgd */
	u32 offset;		/* The offset is bitmap relative */
};

static inline u64 gfs2_rbm_to_block(const struct gfs2_rbm *rbm)
{
	return rbm->rgd->rd_data0 + (rbm->bi->bi_start * GFS2_NBBY) + rbm->offset;
}

115
116
117
118
119
120
121
static inline bool gfs2_rbm_eq(const struct gfs2_rbm *rbm1,
			       const struct gfs2_rbm *rbm2)
{
	return (rbm1->rgd == rbm2->rgd) && (rbm1->bi == rbm2->bi) && 
	       (rbm1->offset == rbm2->offset);
}

David Teigland's avatar
David Teigland committed
122
123
enum gfs2_state_bits {
	BH_Pinned = BH_PrivateStart,
124
	BH_Escaped = BH_PrivateStart + 1,
125
	BH_Zeronew = BH_PrivateStart + 2,
David Teigland's avatar
David Teigland committed
126
127
128
129
};

BUFFER_FNS(Pinned, pinned)
TAS_BUFFER_FNS(Pinned, pinned)
130
131
BUFFER_FNS(Escaped, escaped)
TAS_BUFFER_FNS(Escaped, escaped)
132
133
BUFFER_FNS(Zeronew, zeronew)
TAS_BUFFER_FNS(Zeronew, zeronew)
David Teigland's avatar
David Teigland committed
134
135
136
137

struct gfs2_bufdata {
	struct buffer_head *bd_bh;
	struct gfs2_glock *bd_gl;
Steven Whitehouse's avatar
Steven Whitehouse committed
138
	u64 bd_blkno;
139

140
141
	struct list_head bd_list;
	const struct gfs2_log_operations *bd_ops;
David Teigland's avatar
David Teigland committed
142
143
144
145
146
147

	struct gfs2_ail *bd_ail;
	struct list_head bd_ail_st_list;
	struct list_head bd_ail_gl_list;
};

148
149
150
151
152
153
154
155
/*
 * Internally, we prefix things with gdlm_ and GDLM_ (for gfs-dlm) since a
 * prefix of lock_dlm_ gets awkward.
 */

#define GDLM_STRNAME_BYTES	25
#define GDLM_LVB_SIZE		32

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
/*
 * ls_recover_flags:
 *
 * DFL_BLOCK_LOCKS: dlm is in recovery and will grant locks that had been
 * held by failed nodes whose journals need recovery.  Those locks should
 * only be used for journal recovery until the journal recovery is done.
 * This is set by the dlm recover_prep callback and cleared by the
 * gfs2_control thread when journal recovery is complete.  To avoid
 * races between recover_prep setting and gfs2_control clearing, recover_spin
 * is held while changing this bit and reading/writing recover_block
 * and recover_start.
 *
 * DFL_NO_DLM_OPS: dlm lockspace ops/callbacks are not being used.
 *
 * DFL_FIRST_MOUNT: this node is the first to mount this fs and is doing
 * recovery of all journals before allowing other nodes to mount the fs.
 * This is cleared when FIRST_MOUNT_DONE is set.
 *
 * DFL_FIRST_MOUNT_DONE: this node was the first mounter, and has finished
 * recovery of all journals, and now allows other nodes to mount the fs.
 *
 * DFL_MOUNT_DONE: gdlm_mount has completed successfully and cleared
 * BLOCK_LOCKS for the first time.  The gfs2_control thread should now
 * control clearing BLOCK_LOCKS for further recoveries.
 *
 * DFL_UNMOUNT: gdlm_unmount sets to keep sdp off gfs2_control_wq.
 *
 * DFL_DLM_RECOVERY: set while dlm is in recovery, between recover_prep()
 * and recover_done(), i.e. set while recover_block == recover_start.
 */

187
188
enum {
	DFL_BLOCK_LOCKS		= 0,
189
190
191
192
193
194
	DFL_NO_DLM_OPS		= 1,
	DFL_FIRST_MOUNT		= 2,
	DFL_FIRST_MOUNT_DONE	= 3,
	DFL_MOUNT_DONE		= 4,
	DFL_UNMOUNT		= 5,
	DFL_DLM_RECOVERY	= 6,
195
196
197
198
199
200
201
202
203
204
205
206
};

struct lm_lockname {
	u64 ln_number;
	unsigned int ln_type;
};

#define lm_name_equal(name1, name2) \
        (((name1)->ln_number == (name2)->ln_number) && \
         ((name1)->ln_type == (name2)->ln_type))


David Teigland's avatar
David Teigland committed
207
struct gfs2_glock_operations {
208
	void (*go_sync) (struct gfs2_glock *gl);
209
	int (*go_xmote_bh) (struct gfs2_glock *gl, struct gfs2_holder *gh);
210
	void (*go_inval) (struct gfs2_glock *gl, int flags);
211
	int (*go_demote_ok) (const struct gfs2_glock *gl);
212
213
	int (*go_lock) (struct gfs2_holder *gh);
	void (*go_unlock) (struct gfs2_holder *gh);
214
	int (*go_dump)(struct seq_file *seq, const struct gfs2_glock *gl);
215
	void (*go_callback) (struct gfs2_glock *gl);
216
	const int go_type;
217
218
	const unsigned long go_flags;
#define GLOF_ASPACE 1
David Teigland's avatar
David Teigland committed
219
220
};

221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
enum {
	GFS2_LKS_SRTT = 0,	/* Non blocking smoothed round trip time */
	GFS2_LKS_SRTTVAR = 1,	/* Non blocking smoothed variance */
	GFS2_LKS_SRTTB = 2,	/* Blocking smoothed round trip time */
	GFS2_LKS_SRTTVARB = 3,	/* Blocking smoothed variance */
	GFS2_LKS_SIRT = 4,	/* Smoothed Inter-request time */
	GFS2_LKS_SIRTVAR = 5,	/* Smoothed Inter-request variance */
	GFS2_LKS_DCOUNT = 6,	/* Count of dlm requests */
	GFS2_LKS_QCOUNT = 7,	/* Count of gfs2_holder queues */
	GFS2_NR_LKSTATS
};

struct gfs2_lkstats {
	s64 stats[GFS2_NR_LKSTATS];
};

David Teigland's avatar
David Teigland committed
237
238
enum {
	/* States */
239
	HIF_HOLDER		= 6,  /* Set for gh that "holds" the glock */
David Teigland's avatar
David Teigland committed
240
	HIF_FIRST		= 7,
241
	HIF_WAIT		= 10,
David Teigland's avatar
David Teigland committed
242
243
244
245
246
247
};

struct gfs2_holder {
	struct list_head gh_list;

	struct gfs2_glock *gh_gl;
248
	struct pid *gh_owner_pid;
David Teigland's avatar
David Teigland committed
249
	unsigned int gh_state;
250
	unsigned gh_flags;
David Teigland's avatar
David Teigland committed
251
252

	int gh_error;
253
	unsigned long gh_iflags; /* HIF_... */
254
	unsigned long gh_ip;
David Teigland's avatar
David Teigland committed
255
256
};

Bob Peterson's avatar
Bob Peterson committed
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
/* Resource group multi-block reservation, in order of appearance:

   Step 1. Function prepares to write, allocates a mb, sets the size hint.
   Step 2. User calls inplace_reserve to target an rgrp, sets the rgrp info
   Step 3. Function get_local_rgrp locks the rgrp, determines which bits to use
   Step 4. Bits are assigned from the rgrp based on either the reservation
           or wherever it can.
*/

struct gfs2_blkreserv {
	/* components used during write (step 1): */
	atomic_t rs_sizehint;         /* hint of the write size */

	struct gfs2_holder rs_rgd_gh; /* Filled in by get_local_rgrp */
	struct rb_node rs_node;       /* link to other block reservations */
272
	struct gfs2_rbm rs_rbm;       /* Start of reservation */
Bob Peterson's avatar
Bob Peterson committed
273
	u32 rs_free;                  /* how many blocks are still free */
274
	u64 rs_inum;                  /* Inode number for reservation */
Bob Peterson's avatar
Bob Peterson committed
275
276
277
278
279
280
281

	/* ancillary quota stuff */
	struct gfs2_quota_data *rs_qa_qd[2 * MAXQUOTAS];
	struct gfs2_holder rs_qa_qd_ghs[2 * MAXQUOTAS];
	unsigned int rs_qa_qd_num;
};

David Teigland's avatar
David Teigland committed
282
enum {
283
284
285
286
287
288
289
290
	GLF_LOCK			= 1,
	GLF_DEMOTE			= 3,
	GLF_PENDING_DEMOTE		= 4,
	GLF_DEMOTE_IN_PROGRESS		= 5,
	GLF_DIRTY			= 6,
	GLF_LFLUSH			= 7,
	GLF_INVALIDATE_IN_PROGRESS	= 8,
	GLF_REPLY_PENDING		= 9,
291
292
	GLF_INITIAL			= 10,
	GLF_FROZEN			= 11,
293
	GLF_QUEUED			= 12,
294
295
	GLF_LRU				= 13,
	GLF_OBJECT			= 14, /* Used only for tracing */
296
	GLF_BLOCKING			= 15,
David Teigland's avatar
David Teigland committed
297
298
299
};

struct gfs2_glock {
300
	struct hlist_bl_node gl_list;
301
	struct gfs2_sbd *gl_sbd;
David Teigland's avatar
David Teigland committed
302
303
	unsigned long gl_flags;		/* GLF_... */
	struct lm_lockname gl_name;
304
	atomic_t gl_ref;
David Teigland's avatar
David Teigland committed
305
306
307

	spinlock_t gl_spin;

308
309
310
311
312
313
314
	/* State fields protected by gl_spin */
	unsigned int gl_state:2,	/* Current state */
		     gl_target:2,	/* Target state */
		     gl_demote_state:2,	/* State requested by remote node */
		     gl_req:2,		/* State in last dlm request */
		     gl_reply:8;	/* Last reply from the dlm */

315
	unsigned int gl_hash;
316
	unsigned long gl_demote_time; /* time of first demote request */
317
	long gl_hold_time;
David Teigland's avatar
David Teigland committed
318
319
	struct list_head gl_holders;

320
	const struct gfs2_glock_operations *gl_ops;
321
322
	ktime_t gl_dstamp;
	struct gfs2_lkstats gl_stats;
323
324
	struct dlm_lksb gl_lksb;
	char gl_lvb[32];
325
	unsigned long gl_tchange;
David Teigland's avatar
David Teigland committed
326
327
	void *gl_object;

328
	struct list_head gl_lru;
David Teigland's avatar
David Teigland committed
329
330
	struct list_head gl_ail_list;
	atomic_t gl_ail_count;
331
	atomic_t gl_revokes;
332
	struct delayed_work gl_work;
333
	struct work_struct gl_delete;
334
	struct rcu_head gl_rcu;
David Teigland's avatar
David Teigland committed
335
336
};

337
338
#define GFS2_MIN_LVB_SIZE 32	/* Min size of LVB that gfs2 supports */

David Teigland's avatar
David Teigland committed
339
enum {
340
	GIF_INVALID		= 0,
David Teigland's avatar
David Teigland committed
341
	GIF_QD_LOCKED		= 1,
342
	GIF_ALLOC_FAILED	= 2,
David Teigland's avatar
David Teigland committed
343
344
345
346
	GIF_SW_PAGED		= 3,
};

struct gfs2_inode {
347
	struct inode i_inode;
348
349
	u64 i_no_addr;
	u64 i_no_formal_ino;
350
	u64 i_generation;
351
	u64 i_eattr;
David Teigland's avatar
David Teigland committed
352
	unsigned long i_flags;		/* GIF_... */
353
	struct gfs2_glock *i_gl; /* Move into i_gh? */
David Teigland's avatar
David Teigland committed
354
	struct gfs2_holder i_iopen_gh;
355
	struct gfs2_holder i_gh; /* for prepare/commit_write only */
Bob Peterson's avatar
Bob Peterson committed
356
	struct gfs2_blkreserv *i_res; /* rgrp multi-block reservation */
357
	struct gfs2_rgrpd *i_rgd;
358
	u64 i_goal;	/* goal block for allocations */
David Teigland's avatar
David Teigland committed
359
	struct rw_semaphore i_rw_mutex;
360
	struct list_head i_trunc_list;
361
	__be64 *i_hash_cache;
362
	u32 i_entries;
363
	u32 i_diskflags;
364
	u8 i_height;
365
	u8 i_depth;
David Teigland's avatar
David Teigland committed
366
367
};

368
369
370
371
/*
 * Since i_inode is the first element of struct gfs2_inode,
 * this is effectively a cast.
 */
372
373
374
375
376
static inline struct gfs2_inode *GFS2_I(struct inode *inode)
{
	return container_of(inode, struct gfs2_inode, i_inode);
}

377
static inline struct gfs2_sbd *GFS2_SB(const struct inode *inode)
378
379
380
381
{
	return inode->i_sb->s_fs_info;
}

David Teigland's avatar
David Teigland committed
382
struct gfs2_file {
383
	struct mutex f_fl_mutex;
David Teigland's avatar
David Teigland committed
384
385
386
387
388
	struct gfs2_holder f_fl_gh;
};

struct gfs2_revoke_replay {
	struct list_head rr_list;
389
	u64 rr_blkno;
David Teigland's avatar
David Teigland committed
390
391
392
393
394
395
396
	unsigned int rr_where;
};

enum {
	QDF_USER		= 0,
	QDF_CHANGE		= 1,
	QDF_LOCKED		= 2,
397
	QDF_REFRESH		= 3,
David Teigland's avatar
David Teigland committed
398
399
400
401
};

struct gfs2_quota_data {
	struct list_head qd_list;
402
403
404
	struct list_head qd_reclaim;

	atomic_t qd_count;
David Teigland's avatar
David Teigland committed
405

406
	u32 qd_id;
David Teigland's avatar
David Teigland committed
407
408
	unsigned long qd_flags;		/* QDF_... */

409
410
	s64 qd_change;
	s64 qd_change_sync;
David Teigland's avatar
David Teigland committed
411
412
413
414
415
416
417
418
419
420
421

	unsigned int qd_slot;
	unsigned int qd_slot_count;

	struct buffer_head *qd_bh;
	struct gfs2_quota_change *qd_bh_qc;
	unsigned int qd_bh_count;

	struct gfs2_glock *qd_gl;
	struct gfs2_quota_lvb qd_qb;

422
	u64 qd_sync_gen;
David Teigland's avatar
David Teigland committed
423
424
425
426
	unsigned long qd_last_warn;
};

struct gfs2_trans {
427
	unsigned long tr_ip;
David Teigland's avatar
David Teigland committed
428
429
430
431
432

	unsigned int tr_blocks;
	unsigned int tr_revokes;
	unsigned int tr_reserved;

433
	struct gfs2_holder tr_t_gh;
David Teigland's avatar
David Teigland committed
434
435
436
437

	int tr_touched;

	unsigned int tr_num_buf_new;
438
	unsigned int tr_num_databuf_new;
David Teigland's avatar
David Teigland committed
439
	unsigned int tr_num_buf_rm;
440
	unsigned int tr_num_databuf_rm;
David Teigland's avatar
David Teigland committed
441
442
443
444
445
446
447
448
449
450
451
452
	unsigned int tr_num_revoke;
	unsigned int tr_num_revoke_rm;
};

struct gfs2_ail {
	struct list_head ai_list;

	unsigned int ai_first;
	struct list_head ai_ail1_list;
	struct list_head ai_ail2_list;
};

Bob Peterson's avatar
Bob Peterson committed
453
454
455
456
457
458
459
460
struct gfs2_journal_extent {
	struct list_head extent_list;

	unsigned int lblock; /* First logical block */
	u64 dblock; /* First disk block */
	u64 blocks;
};

David Teigland's avatar
David Teigland committed
461
462
struct gfs2_jdesc {
	struct list_head jd_list;
Bob Peterson's avatar
Bob Peterson committed
463
	struct list_head extent_list;
464
	struct work_struct jd_work;
465
	struct inode *jd_inode;
466
467
	unsigned long jd_flags;
#define JDF_RECOVERY 1
David Teigland's avatar
David Teigland committed
468
469
	unsigned int jd_jid;
	unsigned int jd_blocks;
470
	int jd_recover_error;
David Teigland's avatar
David Teigland committed
471
472
};

473
474
475
476
477
478
struct gfs2_statfs_change_host {
	s64 sc_total;
	s64 sc_free;
	s64 sc_dinodes;
};

David Teigland's avatar
David Teigland committed
479
480
481
482
483
484
485
486
487
#define GFS2_QUOTA_DEFAULT	GFS2_QUOTA_OFF
#define GFS2_QUOTA_OFF		0
#define GFS2_QUOTA_ACCOUNT	1
#define GFS2_QUOTA_ON		2

#define GFS2_DATA_DEFAULT	GFS2_DATA_ORDERED
#define GFS2_DATA_WRITEBACK	1
#define GFS2_DATA_ORDERED	2

488
489
490
491
492
493
#define GFS2_ERRORS_DEFAULT     GFS2_ERRORS_WITHDRAW
#define GFS2_ERRORS_WITHDRAW    0
#define GFS2_ERRORS_CONTINUE    1 /* place holder for future feature */
#define GFS2_ERRORS_RO          2 /* place holder for future feature */
#define GFS2_ERRORS_PANIC       3

David Teigland's avatar
David Teigland committed
494
struct gfs2_args {
Steven Whitehouse's avatar
Steven Whitehouse committed
495
496
497
498
499
500
501
502
503
504
505
	char ar_lockproto[GFS2_LOCKNAME_LEN];	/* Name of the Lock Protocol */
	char ar_locktable[GFS2_LOCKNAME_LEN];	/* Name of the Lock Table */
	char ar_hostdata[GFS2_LOCKNAME_LEN];	/* Host specific data */
	unsigned int ar_spectator:1;		/* Don't get a journal */
	unsigned int ar_localflocks:1;		/* Let the VFS do flock|fcntl */
	unsigned int ar_debug:1;		/* Oops on errors */
	unsigned int ar_posix_acl:1;		/* Enable posix acls */
	unsigned int ar_quota:2;		/* off/account/on */
	unsigned int ar_suiddir:1;		/* suiddir support */
	unsigned int ar_data:2;			/* ordered/writeback */
	unsigned int ar_meta:1;			/* mount metafs */
506
	unsigned int ar_discard:1;		/* discard requests */
507
	unsigned int ar_errors:2;               /* errors=withdraw | panic */
508
	unsigned int ar_nobarrier:1;            /* do not send barriers */
509
	unsigned int ar_rgrplvb:1;		/* use lvbs for rgrp info */
510
	int ar_commit;				/* Commit interval */
511
512
513
	int ar_statfs_quantum;			/* The fast statfs interval */
	int ar_quota_quantum;			/* The quota interval */
	int ar_statfs_percent;			/* The % change to force sync */
David Teigland's avatar
David Teigland committed
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
};

struct gfs2_tune {
	spinlock_t gt_spin;

	unsigned int gt_logd_secs;

	unsigned int gt_quota_simul_sync; /* Max quotavals to sync at once */
	unsigned int gt_quota_warn_period; /* Secs between quota warn msgs */
	unsigned int gt_quota_scale_num; /* Numerator */
	unsigned int gt_quota_scale_den; /* Denominator */
	unsigned int gt_quota_quantum; /* Secs between syncs to quota file */
	unsigned int gt_new_files_jdata;
	unsigned int gt_max_readahead; /* Max bytes to read-ahead from disk */
	unsigned int gt_complain_secs;
	unsigned int gt_statfs_quantum;
	unsigned int gt_statfs_slow;
};

enum {
	SDF_JOURNAL_CHECKED	= 0,
	SDF_JOURNAL_LIVE	= 1,
	SDF_SHUTDOWN		= 2,
537
	SDF_NOBARRIERS		= 3,
538
	SDF_NORECOVERY		= 4,
539
	SDF_DEMOTE		= 5,
540
	SDF_NOJOURNALID		= 6,
541
	SDF_RORECOVERY		= 7, /* read only recovery */
542
	SDF_SKIP_DLM_UNLOCK	= 8,
David Teigland's avatar
David Teigland committed
543
544
545
546
};

#define GFS2_FSNAME_LEN		256

547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
struct gfs2_inum_host {
	u64 no_formal_ino;
	u64 no_addr;
};

struct gfs2_sb_host {
	u32 sb_magic;
	u32 sb_type;
	u32 sb_format;

	u32 sb_fs_format;
	u32 sb_multihost_format;
	u32 sb_bsize;
	u32 sb_bsize_shift;

	struct gfs2_inum_host sb_master_dir;
	struct gfs2_inum_host sb_root_dir;

	char sb_lockproto[GFS2_LOCKNAME_LEN];
	char sb_locktable[GFS2_LOCKNAME_LEN];
};

569
570
571
572
573
574
575
576
577
578
/*
 * lm_mount() return values
 *
 * ls_jid - the journal ID this node should use
 * ls_first - this node is the first to mount the file system
 * ls_lockspace - lock module's context for this file system
 * ls_ops - lock module's functions
 */

struct lm_lockstruct {
579
	int ls_jid;
580
581
582
583
	unsigned int ls_first;
	const struct lm_lockops *ls_ops;
	dlm_lockspace_t *ls_dlm;

584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
	int ls_recover_jid_done;   /* These two are deprecated, */
	int ls_recover_jid_status; /* used previously by gfs_controld */

	struct dlm_lksb ls_mounted_lksb; /* mounted_lock */
	struct dlm_lksb ls_control_lksb; /* control_lock */
	char ls_control_lvb[GDLM_LVB_SIZE]; /* control_lock lvb */
	struct completion ls_sync_wait; /* {control,mounted}_{lock,unlock} */

	spinlock_t ls_recover_spin; /* protects following fields */
	unsigned long ls_recover_flags; /* DFL_ */
	uint32_t ls_recover_mount; /* gen in first recover_done cb */
	uint32_t ls_recover_start; /* gen in last recover_done cb */
	uint32_t ls_recover_block; /* copy recover_start in last recover_prep */
	uint32_t ls_recover_size; /* size of recover_submit, recover_result */
	uint32_t *ls_recover_submit; /* gen in last recover_slot cb per jid */
	uint32_t *ls_recover_result; /* result of last jid recovery */
600
601
};

602
603
604
605
606
struct gfs2_pcpu_lkstats {
	/* One struct for each glock type */
	struct gfs2_lkstats lkstats[10];
};

David Teigland's avatar
David Teigland committed
607
608
struct gfs2_sbd {
	struct super_block *sd_vfs;
609
	struct gfs2_pcpu_lkstats __percpu *sd_lkstats;
David Teigland's avatar
David Teigland committed
610
611
	struct kobject sd_kobj;
	unsigned long sd_flags;	/* SDF_... */
Al Viro's avatar
Al Viro committed
612
	struct gfs2_sb_host sd_sb;
David Teigland's avatar
David Teigland committed
613
614
615

	/* Constants computed on mount */

616
617
618
619
620
621
622
623
624
	u32 sd_fsb2bb;
	u32 sd_fsb2bb_shift;
	u32 sd_diptrs;	/* Number of pointers in a dinode */
	u32 sd_inptrs;	/* Number of pointers in a indirect block */
	u32 sd_jbsize;	/* Size of a journaled data block */
	u32 sd_hash_bsize;	/* sizeof(exhash block) */
	u32 sd_hash_bsize_shift;
	u32 sd_hash_ptrs;	/* Number of pointers in a hash block */
	u32 sd_qc_per_block;
625
	u32 sd_blocks_per_bitmap;
626
627
	u32 sd_max_dirres;	/* Max blocks needed to add a directory entry */
	u32 sd_max_height;	/* Max height of a file's metadata tree */
628
	u64 sd_heightsize[GFS2_MAX_META_HEIGHT + 1];
629
	u32 sd_max_jheight; /* Max height of journaled file's meta tree */
630
	u64 sd_jheightsize[GFS2_MAX_META_HEIGHT + 1];
David Teigland's avatar
David Teigland committed
631
632
633
634
635
636
637
638
639
640

	struct gfs2_args sd_args;	/* Mount arguments */
	struct gfs2_tune sd_tune;	/* Filesystem tuning structure */

	/* Lock Stuff */

	struct lm_lockstruct sd_lockstruct;
	struct gfs2_holder sd_live_gh;
	struct gfs2_glock *sd_rename_gl;
	struct gfs2_glock *sd_trans_gl;
641
642
	wait_queue_head_t sd_glock_wait;
	atomic_t sd_glock_disposal;
643
	struct completion sd_locking_init;
644
	struct delayed_work sd_control_work;
David Teigland's avatar
David Teigland committed
645
646
647

	/* Inode Stuff */

Steven Whitehouse's avatar
Steven Whitehouse committed
648
649
650
	struct dentry *sd_master_dir;
	struct dentry *sd_root_dir;

651
652
653
654
655
656
	struct inode *sd_jindex;
	struct inode *sd_statfs_inode;
	struct inode *sd_sc_inode;
	struct inode *sd_qc_inode;
	struct inode *sd_rindex;
	struct inode *sd_quota_inode;
David Teigland's avatar
David Teigland committed
657
658
659
660

	/* StatFS stuff */

	spinlock_t sd_statfs_spin;
661
662
	struct gfs2_statfs_change_host sd_statfs_master;
	struct gfs2_statfs_change_host sd_statfs_local;
663
	int sd_statfs_force_sync;
David Teigland's avatar
David Teigland committed
664
665
666

	/* Resource group stuff */

667
	int sd_rindex_uptodate;
David Teigland's avatar
David Teigland committed
668
	spinlock_t sd_rindex_spin;
669
	struct rb_root sd_rindex_tree;
David Teigland's avatar
David Teigland committed
670
	unsigned int sd_rgrps;
Benjamin Marzinski's avatar
Benjamin Marzinski committed
671
	unsigned int sd_max_rg_data;
David Teigland's avatar
David Teigland committed
672
673
674
675
676

	/* Journal index stuff */

	struct list_head sd_jindex_list;
	spinlock_t sd_jindex_spin;
677
	struct mutex sd_jindex_mutex;
David Teigland's avatar
David Teigland committed
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
	unsigned int sd_journals;

	struct gfs2_jdesc *sd_jdesc;
	struct gfs2_holder sd_journal_gh;
	struct gfs2_holder sd_jinode_gh;

	struct gfs2_holder sd_sc_gh;
	struct gfs2_holder sd_qc_gh;

	/* Daemon stuff */

	struct task_struct *sd_logd_process;
	struct task_struct *sd_quotad_process;

	/* Quota stuff */

	struct list_head sd_quota_list;
	atomic_t sd_quota_count;
696
	struct mutex sd_quota_mutex;
697
	wait_queue_head_t sd_quota_wait;
698
699
	struct list_head sd_trunc_list;
	spinlock_t sd_trunc_lock;
David Teigland's avatar
David Teigland committed
700
701
702
703
704

	unsigned int sd_quota_slots;
	unsigned int sd_quota_chunks;
	unsigned char **sd_quota_bitmap;

705
	u64 sd_quota_sync_gen;
David Teigland's avatar
David Teigland committed
706
707
708
709
710
711
712

	/* Log stuff */

	spinlock_t sd_log_lock;

	unsigned int sd_log_blks_reserved;
	unsigned int sd_log_commited_buf;
713
	unsigned int sd_log_commited_databuf;
714
	int sd_log_commited_revoke;
David Teigland's avatar
David Teigland committed
715

716
	atomic_t sd_log_pinned;
David Teigland's avatar
David Teigland committed
717
718
719
720
	unsigned int sd_log_num_buf;
	unsigned int sd_log_num_revoke;
	unsigned int sd_log_num_rg;
	unsigned int sd_log_num_databuf;
721

David Teigland's avatar
David Teigland committed
722
723
724
	struct list_head sd_log_le_buf;
	struct list_head sd_log_le_revoke;
	struct list_head sd_log_le_databuf;
725
	struct list_head sd_log_le_ordered;
David Teigland's avatar
David Teigland committed
726

727
728
	atomic_t sd_log_thresh1;
	atomic_t sd_log_thresh2;
729
	atomic_t sd_log_blks_free;
730
731
	wait_queue_head_t sd_log_waitq;
	wait_queue_head_t sd_logd_waitq;
David Teigland's avatar
David Teigland committed
732

733
	u64 sd_log_sequence;
David Teigland's avatar
David Teigland committed
734
735
736
737
	unsigned int sd_log_head;
	unsigned int sd_log_tail;
	int sd_log_idle;

738
	struct rw_semaphore sd_log_flush_lock;
739
	atomic_t sd_log_in_flight;
740
	struct bio *sd_log_bio;
741
	wait_queue_head_t sd_log_flush_wait;
742
	int sd_log_error;
David Teigland's avatar
David Teigland committed
743
744

	unsigned int sd_log_flush_head;
745
	u64 sd_log_flush_wrapped;
David Teigland's avatar
David Teigland committed
746

Dave Chinner's avatar
Dave Chinner committed
747
	spinlock_t sd_ail_lock;
David Teigland's avatar
David Teigland committed
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
	struct list_head sd_ail1_list;
	struct list_head sd_ail2_list;

	/* Replay stuff */

	struct list_head sd_revoke_list;
	unsigned int sd_replay_tail;

	unsigned int sd_found_blocks;
	unsigned int sd_found_revokes;
	unsigned int sd_replayed_blocks;

	/* For quiescing the filesystem */

	struct gfs2_holder sd_freeze_gh;
763
	struct mutex sd_freeze_lock;
David Teigland's avatar
David Teigland committed
764
765
766
767
768
769
770
771
772
	unsigned int sd_freeze_count;

	char sd_fsname[GFS2_FSNAME_LEN];
	char sd_table_name[GFS2_FSNAME_LEN];
	char sd_proto_name[GFS2_FSNAME_LEN];

	/* Debugging crud */

	unsigned long sd_last_warning;
Robert Peterson's avatar
Robert Peterson committed
773
	struct dentry *debugfs_dir;    /* debugfs directory */
774
775
776
	struct dentry *debugfs_dentry_glocks;
	struct dentry *debugfs_dentry_glstats;
	struct dentry *debugfs_dentry_sbstats;
David Teigland's avatar
David Teigland committed
777
778
};

779
780
781
782
783
784
785
786
787
788
789
790
791
static inline void gfs2_glstats_inc(struct gfs2_glock *gl, int which)
{
	gl->gl_stats.stats[which]++;
}

static inline void gfs2_sbstats_inc(const struct gfs2_glock *gl, int which)
{
	const struct gfs2_sbd *sdp = gl->gl_sbd;
	preempt_disable();
	this_cpu_ptr(sdp->sd_lkstats)->lkstats[gl->gl_name.ln_type].stats[which]++;
	preempt_enable();
}

David Teigland's avatar
David Teigland committed
792
793
#endif /* __INCORE_DOT_H__ */