1
2
3
4
5
6
7
8
9
10#ifndef __INCORE_DOT_H__
11#define __INCORE_DOT_H__
12
13#include <linux/fs.h>
14#include <linux/kobject.h>
15#include <linux/workqueue.h>
16#include <linux/dlm.h>
17#include <linux/buffer_head.h>
18#include <linux/rcupdate.h>
19#include <linux/rculist_bl.h>
20#include <linux/completion.h>
21#include <linux/rbtree.h>
22#include <linux/ktime.h>
23#include <linux/percpu.h>
24
25#define DIO_WAIT 0x00000010
26#define DIO_METADATA 0x00000020
27
28struct gfs2_log_operations;
29struct gfs2_bufdata;
30struct gfs2_holder;
31struct gfs2_glock;
32struct gfs2_quota_data;
33struct gfs2_trans;
34struct gfs2_ail;
35struct gfs2_jdesc;
36struct gfs2_sbd;
37struct lm_lockops;
38
39typedef void (*gfs2_glop_bh_t) (struct gfs2_glock *gl, unsigned int ret);
40
41struct gfs2_log_header_host {
42 u64 lh_sequence;
43 u32 lh_flags;
44 u32 lh_tail;
45 u32 lh_blkno;
46 u32 lh_hash;
47};
48
49
50
51
52
53
54struct gfs2_log_operations {
55 void (*lo_add) (struct gfs2_sbd *sdp, struct gfs2_bufdata *bd);
56 void (*lo_before_commit) (struct gfs2_sbd *sdp);
57 void (*lo_after_commit) (struct gfs2_sbd *sdp, struct gfs2_ail *ai);
58 void (*lo_before_scan) (struct gfs2_jdesc *jd,
59 struct gfs2_log_header_host *head, int pass);
60 int (*lo_scan_elements) (struct gfs2_jdesc *jd, unsigned int start,
61 struct gfs2_log_descriptor *ld, __be64 *ptr,
62 int pass);
63 void (*lo_after_scan) (struct gfs2_jdesc *jd, int error, int pass);
64 const char *lo_name;
65};
66
67#define GBF_FULL 1
68
69struct gfs2_bitmap {
70 struct buffer_head *bi_bh;
71 char *bi_clone;
72 unsigned long bi_flags;
73 u32 bi_offset;
74 u32 bi_start;
75 u32 bi_len;
76};
77
78struct gfs2_rgrpd {
79 struct rb_node rd_node;
80 struct gfs2_glock *rd_gl;
81 u64 rd_addr;
82 u64 rd_data0;
83 u32 rd_length;
84 u32 rd_data;
85 u32 rd_bitbytes;
86 u32 rd_free;
87 u32 rd_free_clone;
88 u32 rd_dinodes;
89 u64 rd_igeneration;
90 struct gfs2_bitmap *rd_bits;
91 struct gfs2_sbd *rd_sbd;
92 u32 rd_last_alloc;
93 u32 rd_flags;
94#define GFS2_RDF_CHECK 0x10000000
95#define GFS2_RDF_UPTODATE 0x20000000
96#define GFS2_RDF_ERROR 0x40000000
97#define GFS2_RDF_MASK 0xf0000000
98};
99
100enum gfs2_state_bits {
101 BH_Pinned = BH_PrivateStart,
102 BH_Escaped = BH_PrivateStart + 1,
103 BH_Zeronew = BH_PrivateStart + 2,
104};
105
106BUFFER_FNS(Pinned, pinned)
107TAS_BUFFER_FNS(Pinned, pinned)
108BUFFER_FNS(Escaped, escaped)
109TAS_BUFFER_FNS(Escaped, escaped)
110BUFFER_FNS(Zeronew, zeronew)
111TAS_BUFFER_FNS(Zeronew, zeronew)
112
113struct gfs2_bufdata {
114 struct buffer_head *bd_bh;
115 struct gfs2_glock *bd_gl;
116 u64 bd_blkno;
117
118 struct list_head bd_list;
119 const struct gfs2_log_operations *bd_ops;
120
121 struct gfs2_ail *bd_ail;
122 struct list_head bd_ail_st_list;
123 struct list_head bd_ail_gl_list;
124};
125
126
127
128
129
130
131#define GDLM_STRNAME_BYTES 25
132#define GDLM_LVB_SIZE 32
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
165enum {
166 DFL_BLOCK_LOCKS = 0,
167 DFL_NO_DLM_OPS = 1,
168 DFL_FIRST_MOUNT = 2,
169 DFL_FIRST_MOUNT_DONE = 3,
170 DFL_MOUNT_DONE = 4,
171 DFL_UNMOUNT = 5,
172 DFL_DLM_RECOVERY = 6,
173};
174
175struct lm_lockname {
176 u64 ln_number;
177 unsigned int ln_type;
178};
179
180#define lm_name_equal(name1, name2) \
181 (((name1)->ln_number == (name2)->ln_number) && \
182 ((name1)->ln_type == (name2)->ln_type))
183
184
185struct gfs2_glock_operations {
186 void (*go_xmote_th) (struct gfs2_glock *gl);
187 int (*go_xmote_bh) (struct gfs2_glock *gl, struct gfs2_holder *gh);
188 void (*go_inval) (struct gfs2_glock *gl, int flags);
189 int (*go_demote_ok) (const struct gfs2_glock *gl);
190 int (*go_lock) (struct gfs2_holder *gh);
191 void (*go_unlock) (struct gfs2_holder *gh);
192 int (*go_dump)(struct seq_file *seq, const struct gfs2_glock *gl);
193 void (*go_callback) (struct gfs2_glock *gl);
194 const int go_type;
195 const unsigned long go_flags;
196#define GLOF_ASPACE 1
197};
198
199enum {
200 GFS2_LKS_SRTT = 0,
201 GFS2_LKS_SRTTVAR = 1,
202 GFS2_LKS_SRTTB = 2,
203 GFS2_LKS_SRTTVARB = 3,
204 GFS2_LKS_SIRT = 4,
205 GFS2_LKS_SIRTVAR = 5,
206 GFS2_LKS_DCOUNT = 6,
207 GFS2_LKS_QCOUNT = 7,
208 GFS2_NR_LKSTATS
209};
210
211struct gfs2_lkstats {
212 s64 stats[GFS2_NR_LKSTATS];
213};
214
215enum {
216
217 HIF_HOLDER = 6,
218 HIF_FIRST = 7,
219 HIF_WAIT = 10,
220};
221
222struct gfs2_holder {
223 struct list_head gh_list;
224
225 struct gfs2_glock *gh_gl;
226 struct pid *gh_owner_pid;
227 unsigned int gh_state;
228 unsigned gh_flags;
229
230 int gh_error;
231 unsigned long gh_iflags;
232 unsigned long gh_ip;
233};
234
235enum {
236 GLF_LOCK = 1,
237 GLF_DEMOTE = 3,
238 GLF_PENDING_DEMOTE = 4,
239 GLF_DEMOTE_IN_PROGRESS = 5,
240 GLF_DIRTY = 6,
241 GLF_LFLUSH = 7,
242 GLF_INVALIDATE_IN_PROGRESS = 8,
243 GLF_REPLY_PENDING = 9,
244 GLF_INITIAL = 10,
245 GLF_FROZEN = 11,
246 GLF_QUEUED = 12,
247 GLF_LRU = 13,
248 GLF_OBJECT = 14,
249 GLF_BLOCKING = 15,
250};
251
252struct gfs2_glock {
253 struct hlist_bl_node gl_list;
254 struct gfs2_sbd *gl_sbd;
255 unsigned long gl_flags;
256 struct lm_lockname gl_name;
257 atomic_t gl_ref;
258
259 spinlock_t gl_spin;
260
261
262 unsigned int gl_state:2,
263 gl_target:2,
264 gl_demote_state:2,
265 gl_req:2,
266 gl_reply:8;
267
268 unsigned int gl_hash;
269 unsigned long gl_demote_time;
270 long gl_hold_time;
271 struct list_head gl_holders;
272
273 const struct gfs2_glock_operations *gl_ops;
274 ktime_t gl_dstamp;
275 struct gfs2_lkstats gl_stats;
276 struct dlm_lksb gl_lksb;
277 char gl_lvb[32];
278 unsigned long gl_tchange;
279 void *gl_object;
280
281 struct list_head gl_lru;
282 struct list_head gl_ail_list;
283 atomic_t gl_ail_count;
284 atomic_t gl_revokes;
285 struct delayed_work gl_work;
286 struct work_struct gl_delete;
287 struct rcu_head gl_rcu;
288};
289
290#define GFS2_MIN_LVB_SIZE 32
291
292struct gfs2_qadata {
293
294 struct gfs2_quota_data *qa_qd[2*MAXQUOTAS];
295 struct gfs2_holder qa_qd_ghs[2*MAXQUOTAS];
296 unsigned int qa_qd_num;
297};
298
299struct gfs2_blkreserv {
300 u32 rs_requested;
301 struct gfs2_holder rs_rgd_gh;
302};
303
304enum {
305 GIF_INVALID = 0,
306 GIF_QD_LOCKED = 1,
307 GIF_ALLOC_FAILED = 2,
308 GIF_SW_PAGED = 3,
309};
310
311
312struct gfs2_inode {
313 struct inode i_inode;
314 u64 i_no_addr;
315 u64 i_no_formal_ino;
316 u64 i_generation;
317 u64 i_eattr;
318 unsigned long i_flags;
319 struct gfs2_glock *i_gl;
320 struct gfs2_holder i_iopen_gh;
321 struct gfs2_holder i_gh;
322 struct gfs2_qadata *i_qadata;
323 struct gfs2_blkreserv *i_res;
324 struct gfs2_rgrpd *i_rgd;
325 u64 i_goal;
326 struct rw_semaphore i_rw_mutex;
327 struct list_head i_trunc_list;
328 __be64 *i_hash_cache;
329 u32 i_entries;
330 u32 i_diskflags;
331 u8 i_height;
332 u8 i_depth;
333};
334
335
336
337
338
339static inline struct gfs2_inode *GFS2_I(struct inode *inode)
340{
341 return container_of(inode, struct gfs2_inode, i_inode);
342}
343
344static inline struct gfs2_sbd *GFS2_SB(const struct inode *inode)
345{
346 return inode->i_sb->s_fs_info;
347}
348
349struct gfs2_file {
350 struct mutex f_fl_mutex;
351 struct gfs2_holder f_fl_gh;
352};
353
354struct gfs2_revoke_replay {
355 struct list_head rr_list;
356 u64 rr_blkno;
357 unsigned int rr_where;
358};
359
360enum {
361 QDF_USER = 0,
362 QDF_CHANGE = 1,
363 QDF_LOCKED = 2,
364 QDF_REFRESH = 3,
365};
366
367struct gfs2_quota_data {
368 struct list_head qd_list;
369 struct list_head qd_reclaim;
370
371 atomic_t qd_count;
372
373 u32 qd_id;
374 unsigned long qd_flags;
375
376 s64 qd_change;
377 s64 qd_change_sync;
378
379 unsigned int qd_slot;
380 unsigned int qd_slot_count;
381
382 struct buffer_head *qd_bh;
383 struct gfs2_quota_change *qd_bh_qc;
384 unsigned int qd_bh_count;
385
386 struct gfs2_glock *qd_gl;
387 struct gfs2_quota_lvb qd_qb;
388
389 u64 qd_sync_gen;
390 unsigned long qd_last_warn;
391};
392
393struct gfs2_trans {
394 unsigned long tr_ip;
395
396 unsigned int tr_blocks;
397 unsigned int tr_revokes;
398 unsigned int tr_reserved;
399
400 struct gfs2_holder tr_t_gh;
401
402 int tr_touched;
403
404 unsigned int tr_num_buf_new;
405 unsigned int tr_num_databuf_new;
406 unsigned int tr_num_buf_rm;
407 unsigned int tr_num_databuf_rm;
408 unsigned int tr_num_revoke;
409 unsigned int tr_num_revoke_rm;
410};
411
412struct gfs2_ail {
413 struct list_head ai_list;
414
415 unsigned int ai_first;
416 struct list_head ai_ail1_list;
417 struct list_head ai_ail2_list;
418};
419
420struct gfs2_journal_extent {
421 struct list_head extent_list;
422
423 unsigned int lblock;
424 u64 dblock;
425 u64 blocks;
426};
427
428struct gfs2_jdesc {
429 struct list_head jd_list;
430 struct list_head extent_list;
431 struct work_struct jd_work;
432 struct inode *jd_inode;
433 unsigned long jd_flags;
434#define JDF_RECOVERY 1
435 unsigned int jd_jid;
436 unsigned int jd_blocks;
437 int jd_recover_error;
438};
439
440struct gfs2_statfs_change_host {
441 s64 sc_total;
442 s64 sc_free;
443 s64 sc_dinodes;
444};
445
446#define GFS2_QUOTA_DEFAULT GFS2_QUOTA_OFF
447#define GFS2_QUOTA_OFF 0
448#define GFS2_QUOTA_ACCOUNT 1
449#define GFS2_QUOTA_ON 2
450
451#define GFS2_DATA_DEFAULT GFS2_DATA_ORDERED
452#define GFS2_DATA_WRITEBACK 1
453#define GFS2_DATA_ORDERED 2
454
455#define GFS2_ERRORS_DEFAULT GFS2_ERRORS_WITHDRAW
456#define GFS2_ERRORS_WITHDRAW 0
457#define GFS2_ERRORS_CONTINUE 1
458#define GFS2_ERRORS_RO 2
459#define GFS2_ERRORS_PANIC 3
460
461struct gfs2_args {
462 char ar_lockproto[GFS2_LOCKNAME_LEN];
463 char ar_locktable[GFS2_LOCKNAME_LEN];
464 char ar_hostdata[GFS2_LOCKNAME_LEN];
465 unsigned int ar_spectator:1;
466 unsigned int ar_localflocks:1;
467 unsigned int ar_debug:1;
468 unsigned int ar_posix_acl:1;
469 unsigned int ar_quota:2;
470 unsigned int ar_suiddir:1;
471 unsigned int ar_data:2;
472 unsigned int ar_meta:1;
473 unsigned int ar_discard:1;
474 unsigned int ar_errors:2;
475 unsigned int ar_nobarrier:1;
476 int ar_commit;
477 int ar_statfs_quantum;
478 int ar_quota_quantum;
479 int ar_statfs_percent;
480};
481
482struct gfs2_tune {
483 spinlock_t gt_spin;
484
485 unsigned int gt_logd_secs;
486
487 unsigned int gt_quota_simul_sync;
488 unsigned int gt_quota_warn_period;
489 unsigned int gt_quota_scale_num;
490 unsigned int gt_quota_scale_den;
491 unsigned int gt_quota_quantum;
492 unsigned int gt_new_files_jdata;
493 unsigned int gt_max_readahead;
494 unsigned int gt_complain_secs;
495 unsigned int gt_statfs_quantum;
496 unsigned int gt_statfs_slow;
497};
498
499enum {
500 SDF_JOURNAL_CHECKED = 0,
501 SDF_JOURNAL_LIVE = 1,
502 SDF_SHUTDOWN = 2,
503 SDF_NOBARRIERS = 3,
504 SDF_NORECOVERY = 4,
505 SDF_DEMOTE = 5,
506 SDF_NOJOURNALID = 6,
507 SDF_RORECOVERY = 7,
508};
509
510#define GFS2_FSNAME_LEN 256
511
512struct gfs2_inum_host {
513 u64 no_formal_ino;
514 u64 no_addr;
515};
516
517struct gfs2_sb_host {
518 u32 sb_magic;
519 u32 sb_type;
520 u32 sb_format;
521
522 u32 sb_fs_format;
523 u32 sb_multihost_format;
524 u32 sb_bsize;
525 u32 sb_bsize_shift;
526
527 struct gfs2_inum_host sb_master_dir;
528 struct gfs2_inum_host sb_root_dir;
529
530 char sb_lockproto[GFS2_LOCKNAME_LEN];
531 char sb_locktable[GFS2_LOCKNAME_LEN];
532};
533
534
535
536
537
538
539
540
541
542
543struct lm_lockstruct {
544 int ls_jid;
545 unsigned int ls_first;
546 const struct lm_lockops *ls_ops;
547 dlm_lockspace_t *ls_dlm;
548
549 int ls_recover_jid_done;
550 int ls_recover_jid_status;
551
552 struct dlm_lksb ls_mounted_lksb;
553 struct dlm_lksb ls_control_lksb;
554 char ls_control_lvb[GDLM_LVB_SIZE];
555 struct completion ls_sync_wait;
556
557 spinlock_t ls_recover_spin;
558 unsigned long ls_recover_flags;
559 uint32_t ls_recover_mount;
560 uint32_t ls_recover_start;
561 uint32_t ls_recover_block;
562 uint32_t ls_recover_size;
563 uint32_t *ls_recover_submit;
564 uint32_t *ls_recover_result;
565};
566
567struct gfs2_pcpu_lkstats {
568
569 struct gfs2_lkstats lkstats[10];
570};
571
572struct gfs2_sbd {
573 struct super_block *sd_vfs;
574 struct gfs2_pcpu_lkstats __percpu *sd_lkstats;
575 struct kobject sd_kobj;
576 unsigned long sd_flags;
577 struct gfs2_sb_host sd_sb;
578
579
580
581 u32 sd_fsb2bb;
582 u32 sd_fsb2bb_shift;
583 u32 sd_diptrs;
584 u32 sd_inptrs;
585 u32 sd_jbsize;
586 u32 sd_hash_bsize;
587 u32 sd_hash_bsize_shift;
588 u32 sd_hash_ptrs;
589 u32 sd_qc_per_block;
590 u32 sd_max_dirres;
591 u32 sd_max_height;
592 u64 sd_heightsize[GFS2_MAX_META_HEIGHT + 1];
593 u32 sd_max_jheight;
594 u64 sd_jheightsize[GFS2_MAX_META_HEIGHT + 1];
595
596 struct gfs2_args sd_args;
597 struct gfs2_tune sd_tune;
598
599
600
601 struct lm_lockstruct sd_lockstruct;
602 struct gfs2_holder sd_live_gh;
603 struct gfs2_glock *sd_rename_gl;
604 struct gfs2_glock *sd_trans_gl;
605 wait_queue_head_t sd_glock_wait;
606 atomic_t sd_glock_disposal;
607 struct completion sd_locking_init;
608 struct delayed_work sd_control_work;
609
610
611
612 struct dentry *sd_master_dir;
613 struct dentry *sd_root_dir;
614
615 struct inode *sd_jindex;
616 struct inode *sd_statfs_inode;
617 struct inode *sd_sc_inode;
618 struct inode *sd_qc_inode;
619 struct inode *sd_rindex;
620 struct inode *sd_quota_inode;
621
622
623
624 spinlock_t sd_statfs_spin;
625 struct gfs2_statfs_change_host sd_statfs_master;
626 struct gfs2_statfs_change_host sd_statfs_local;
627 int sd_statfs_force_sync;
628
629
630
631 int sd_rindex_uptodate;
632 spinlock_t sd_rindex_spin;
633 struct rb_root sd_rindex_tree;
634 unsigned int sd_rgrps;
635 unsigned int sd_max_rg_data;
636
637
638
639 struct list_head sd_jindex_list;
640 spinlock_t sd_jindex_spin;
641 struct mutex sd_jindex_mutex;
642 unsigned int sd_journals;
643
644 struct gfs2_jdesc *sd_jdesc;
645 struct gfs2_holder sd_journal_gh;
646 struct gfs2_holder sd_jinode_gh;
647
648 struct gfs2_holder sd_sc_gh;
649 struct gfs2_holder sd_qc_gh;
650
651
652
653 struct task_struct *sd_logd_process;
654 struct task_struct *sd_quotad_process;
655
656
657
658 struct list_head sd_quota_list;
659 atomic_t sd_quota_count;
660 struct mutex sd_quota_mutex;
661 wait_queue_head_t sd_quota_wait;
662 struct list_head sd_trunc_list;
663 spinlock_t sd_trunc_lock;
664
665 unsigned int sd_quota_slots;
666 unsigned int sd_quota_chunks;
667 unsigned char **sd_quota_bitmap;
668
669 u64 sd_quota_sync_gen;
670
671
672
673 spinlock_t sd_log_lock;
674
675 unsigned int sd_log_blks_reserved;
676 unsigned int sd_log_commited_buf;
677 unsigned int sd_log_commited_databuf;
678 int sd_log_commited_revoke;
679
680 atomic_t sd_log_pinned;
681 unsigned int sd_log_num_buf;
682 unsigned int sd_log_num_revoke;
683 unsigned int sd_log_num_rg;
684 unsigned int sd_log_num_databuf;
685
686 struct list_head sd_log_le_buf;
687 struct list_head sd_log_le_revoke;
688 struct list_head sd_log_le_databuf;
689 struct list_head sd_log_le_ordered;
690
691 atomic_t sd_log_thresh1;
692 atomic_t sd_log_thresh2;
693 atomic_t sd_log_blks_free;
694 wait_queue_head_t sd_log_waitq;
695 wait_queue_head_t sd_logd_waitq;
696
697 u64 sd_log_sequence;
698 unsigned int sd_log_head;
699 unsigned int sd_log_tail;
700 int sd_log_idle;
701
702 struct rw_semaphore sd_log_flush_lock;
703 atomic_t sd_log_in_flight;
704 struct bio *sd_log_bio;
705 wait_queue_head_t sd_log_flush_wait;
706 int sd_log_error;
707
708 unsigned int sd_log_flush_head;
709 u64 sd_log_flush_wrapped;
710
711 spinlock_t sd_ail_lock;
712 struct list_head sd_ail1_list;
713 struct list_head sd_ail2_list;
714
715
716
717 struct list_head sd_revoke_list;
718 unsigned int sd_replay_tail;
719
720 unsigned int sd_found_blocks;
721 unsigned int sd_found_revokes;
722 unsigned int sd_replayed_blocks;
723
724
725
726 struct gfs2_holder sd_freeze_gh;
727 struct mutex sd_freeze_lock;
728 unsigned int sd_freeze_count;
729
730 char sd_fsname[GFS2_FSNAME_LEN];
731 char sd_table_name[GFS2_FSNAME_LEN];
732 char sd_proto_name[GFS2_FSNAME_LEN];
733
734
735
736 unsigned long sd_last_warning;
737 struct dentry *debugfs_dir;
738 struct dentry *debugfs_dentry_glocks;
739 struct dentry *debugfs_dentry_glstats;
740 struct dentry *debugfs_dentry_sbstats;
741};
742
743static inline void gfs2_glstats_inc(struct gfs2_glock *gl, int which)
744{
745 gl->gl_stats.stats[which]++;
746}
747
748static inline void gfs2_sbstats_inc(const struct gfs2_glock *gl, int which)
749{
750 const struct gfs2_sbd *sdp = gl->gl_sbd;
751 preempt_disable();
752 this_cpu_ptr(sdp->sd_lkstats)->lkstats[gl->gl_name.ln_type].stats[which]++;
753 preempt_enable();
754}
755
756#endif
757
758