1 /* 2 * Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved. 3 * Copyright (C) 2004-2006 Red Hat, Inc. All rights reserved. 4 * 5 * This copyrighted material is made available to anyone wishing to use, 6 * modify, copy, or redistribute it subject to the terms and conditions 7 * of the GNU General Public License version 2. 8 */ 9 10 #ifndef __INCORE_DOT_H__ 11 #define __INCORE_DOT_H__ 12 13 #include <linux/fs.h> 14 15 #define DIO_WAIT 0x00000010 16 #define DIO_METADATA 0x00000020 17 #define DIO_ALL 0x00000100 18 19 struct gfs2_log_operations; 20 struct gfs2_log_element; 21 struct gfs2_holder; 22 struct gfs2_glock; 23 struct gfs2_quota_data; 24 struct gfs2_trans; 25 struct gfs2_ail; 26 struct gfs2_jdesc; 27 struct gfs2_sbd; 28 29 typedef void (*gfs2_glop_bh_t) (struct gfs2_glock *gl, unsigned int ret); 30 31 /* 32 * Structure of operations that are associated with each 33 * type of element in the log. 34 */ 35 36 struct gfs2_log_operations { 37 void (*lo_add) (struct gfs2_sbd *sdp, struct gfs2_log_element *le); 38 void (*lo_incore_commit) (struct gfs2_sbd *sdp, struct gfs2_trans *tr); 39 void (*lo_before_commit) (struct gfs2_sbd *sdp); 40 void (*lo_after_commit) (struct gfs2_sbd *sdp, struct gfs2_ail *ai); 41 void (*lo_before_scan) (struct gfs2_jdesc *jd, 42 struct gfs2_log_header_host *head, int pass); 43 int (*lo_scan_elements) (struct gfs2_jdesc *jd, unsigned int start, 44 struct gfs2_log_descriptor *ld, __be64 *ptr, 45 int pass); 46 void (*lo_after_scan) (struct gfs2_jdesc *jd, int error, int pass); 47 const char *lo_name; 48 }; 49 50 struct gfs2_log_element { 51 struct list_head le_list; 52 const struct gfs2_log_operations *le_ops; 53 }; 54 55 struct gfs2_bitmap { 56 struct buffer_head *bi_bh; 57 char *bi_clone; 58 u32 bi_offset; 59 u32 bi_start; 60 u32 bi_len; 61 }; 62 63 struct gfs2_rgrpd { 64 struct list_head rd_list; /* Link with superblock */ 65 struct list_head rd_list_mru; 66 struct list_head rd_recent; /* Recently used rgrps */ 67 struct gfs2_glock *rd_gl; /* Glock for this rgrp */ 68 struct gfs2_rindex_host rd_ri; 69 struct gfs2_rgrp_host rd_rg; 70 u64 rd_rg_vn; 71 struct gfs2_bitmap *rd_bits; 72 unsigned int rd_bh_count; 73 struct mutex rd_mutex; 74 u32 rd_free_clone; 75 struct gfs2_log_element rd_le; 76 u32 rd_last_alloc_data; 77 u32 rd_last_alloc_meta; 78 struct gfs2_sbd *rd_sbd; 79 }; 80 81 enum gfs2_state_bits { 82 BH_Pinned = BH_PrivateStart, 83 BH_Escaped = BH_PrivateStart + 1, 84 }; 85 86 BUFFER_FNS(Pinned, pinned) 87 TAS_BUFFER_FNS(Pinned, pinned) 88 BUFFER_FNS(Escaped, escaped) 89 TAS_BUFFER_FNS(Escaped, escaped) 90 91 struct gfs2_bufdata { 92 struct buffer_head *bd_bh; 93 struct gfs2_glock *bd_gl; 94 95 struct list_head bd_list_tr; 96 struct gfs2_log_element bd_le; 97 98 struct gfs2_ail *bd_ail; 99 struct list_head bd_ail_st_list; 100 struct list_head bd_ail_gl_list; 101 }; 102 103 struct gfs2_glock_operations { 104 void (*go_xmote_th) (struct gfs2_glock *gl); 105 void (*go_xmote_bh) (struct gfs2_glock *gl); 106 void (*go_drop_th) (struct gfs2_glock *gl); 107 void (*go_drop_bh) (struct gfs2_glock *gl); 108 void (*go_inval) (struct gfs2_glock *gl, int flags); 109 int (*go_demote_ok) (struct gfs2_glock *gl); 110 int (*go_lock) (struct gfs2_holder *gh); 111 void (*go_unlock) (struct gfs2_holder *gh); 112 const int go_type; 113 }; 114 115 enum { 116 /* Actions */ 117 HIF_MUTEX = 0, 118 HIF_PROMOTE = 1, 119 HIF_DEMOTE = 2, 120 121 /* States */ 122 HIF_ALLOCED = 4, 123 HIF_DEALLOC = 5, 124 HIF_HOLDER = 6, 125 HIF_FIRST = 7, 126 HIF_ABORTED = 9, 127 HIF_WAIT = 10, 128 }; 129 130 struct gfs2_holder { 131 struct list_head gh_list; 132 133 struct gfs2_glock *gh_gl; 134 struct task_struct *gh_owner; 135 unsigned int gh_state; 136 unsigned gh_flags; 137 138 int gh_error; 139 unsigned long gh_iflags; 140 unsigned long gh_ip; 141 }; 142 143 enum { 144 GLF_LOCK = 1, 145 GLF_STICKY = 2, 146 GLF_DIRTY = 5, 147 GLF_SKIP_WAITERS2 = 6, 148 }; 149 150 struct gfs2_glock { 151 struct hlist_node gl_list; 152 unsigned long gl_flags; /* GLF_... */ 153 struct lm_lockname gl_name; 154 atomic_t gl_ref; 155 156 spinlock_t gl_spin; 157 158 unsigned int gl_state; 159 unsigned int gl_hash; 160 struct task_struct *gl_owner; 161 unsigned long gl_ip; 162 struct list_head gl_holders; 163 struct list_head gl_waiters1; /* HIF_MUTEX */ 164 struct list_head gl_waiters2; /* HIF_DEMOTE */ 165 struct list_head gl_waiters3; /* HIF_PROMOTE */ 166 167 const struct gfs2_glock_operations *gl_ops; 168 169 struct gfs2_holder *gl_req_gh; 170 gfs2_glop_bh_t gl_req_bh; 171 172 void *gl_lock; 173 char *gl_lvb; 174 atomic_t gl_lvb_count; 175 176 u64 gl_vn; 177 unsigned long gl_stamp; 178 void *gl_object; 179 180 struct list_head gl_reclaim; 181 182 struct gfs2_sbd *gl_sbd; 183 184 struct inode *gl_aspace; 185 struct gfs2_log_element gl_le; 186 struct list_head gl_ail_list; 187 atomic_t gl_ail_count; 188 }; 189 190 struct gfs2_alloc { 191 /* Quota stuff */ 192 193 struct gfs2_quota_data *al_qd[2*MAXQUOTAS]; 194 struct gfs2_holder al_qd_ghs[2*MAXQUOTAS]; 195 unsigned int al_qd_num; 196 197 u32 al_requested; /* Filled in by caller of gfs2_inplace_reserve() */ 198 u32 al_alloced; /* Filled in by gfs2_alloc_*() */ 199 200 /* Filled in by gfs2_inplace_reserve() */ 201 202 unsigned int al_line; 203 char *al_file; 204 struct gfs2_holder al_ri_gh; 205 struct gfs2_holder al_rgd_gh; 206 struct gfs2_rgrpd *al_rgd; 207 208 }; 209 210 enum { 211 GIF_INVALID = 0, 212 GIF_QD_LOCKED = 1, 213 GIF_PAGED = 2, 214 GIF_SW_PAGED = 3, 215 }; 216 217 struct gfs2_inode { 218 struct inode i_inode; 219 struct gfs2_inum_host i_num; 220 221 unsigned long i_flags; /* GIF_... */ 222 223 struct gfs2_dinode_host i_di; /* To be replaced by ref to block */ 224 225 struct gfs2_glock *i_gl; /* Move into i_gh? */ 226 struct gfs2_holder i_iopen_gh; 227 struct gfs2_holder i_gh; /* for prepare/commit_write only */ 228 struct gfs2_alloc i_alloc; 229 u64 i_last_rg_alloc; 230 231 spinlock_t i_spin; 232 struct rw_semaphore i_rw_mutex; 233 unsigned long i_last_pfault; 234 235 struct buffer_head *i_cache[GFS2_MAX_META_HEIGHT]; 236 }; 237 238 /* 239 * Since i_inode is the first element of struct gfs2_inode, 240 * this is effectively a cast. 241 */ 242 static inline struct gfs2_inode *GFS2_I(struct inode *inode) 243 { 244 return container_of(inode, struct gfs2_inode, i_inode); 245 } 246 247 /* To be removed? */ 248 static inline struct gfs2_sbd *GFS2_SB(struct inode *inode) 249 { 250 return inode->i_sb->s_fs_info; 251 } 252 253 enum { 254 GFF_DID_DIRECT_ALLOC = 0, 255 GFF_EXLOCK = 1, 256 }; 257 258 struct gfs2_file { 259 unsigned long f_flags; /* GFF_... */ 260 struct mutex f_fl_mutex; 261 struct gfs2_holder f_fl_gh; 262 }; 263 264 struct gfs2_revoke { 265 struct gfs2_log_element rv_le; 266 u64 rv_blkno; 267 }; 268 269 struct gfs2_revoke_replay { 270 struct list_head rr_list; 271 u64 rr_blkno; 272 unsigned int rr_where; 273 }; 274 275 enum { 276 QDF_USER = 0, 277 QDF_CHANGE = 1, 278 QDF_LOCKED = 2, 279 }; 280 281 struct gfs2_quota_lvb { 282 __be32 qb_magic; 283 u32 __pad; 284 __be64 qb_limit; /* Hard limit of # blocks to alloc */ 285 __be64 qb_warn; /* Warn user when alloc is above this # */ 286 __be64 qb_value; /* Current # blocks allocated */ 287 }; 288 289 struct gfs2_quota_data { 290 struct list_head qd_list; 291 unsigned int qd_count; 292 293 u32 qd_id; 294 unsigned long qd_flags; /* QDF_... */ 295 296 s64 qd_change; 297 s64 qd_change_sync; 298 299 unsigned int qd_slot; 300 unsigned int qd_slot_count; 301 302 struct buffer_head *qd_bh; 303 struct gfs2_quota_change *qd_bh_qc; 304 unsigned int qd_bh_count; 305 306 struct gfs2_glock *qd_gl; 307 struct gfs2_quota_lvb qd_qb; 308 309 u64 qd_sync_gen; 310 unsigned long qd_last_warn; 311 unsigned long qd_last_touched; 312 }; 313 314 struct gfs2_log_buf { 315 struct list_head lb_list; 316 struct buffer_head *lb_bh; 317 struct buffer_head *lb_real; 318 }; 319 320 struct gfs2_trans { 321 unsigned long tr_ip; 322 323 unsigned int tr_blocks; 324 unsigned int tr_revokes; 325 unsigned int tr_reserved; 326 327 struct gfs2_holder tr_t_gh; 328 329 int tr_touched; 330 331 unsigned int tr_num_buf; 332 unsigned int tr_num_buf_new; 333 unsigned int tr_num_buf_rm; 334 struct list_head tr_list_buf; 335 336 unsigned int tr_num_revoke; 337 unsigned int tr_num_revoke_rm; 338 }; 339 340 struct gfs2_ail { 341 struct list_head ai_list; 342 343 unsigned int ai_first; 344 struct list_head ai_ail1_list; 345 struct list_head ai_ail2_list; 346 347 u64 ai_sync_gen; 348 }; 349 350 struct gfs2_jdesc { 351 struct list_head jd_list; 352 353 struct inode *jd_inode; 354 unsigned int jd_jid; 355 int jd_dirty; 356 357 unsigned int jd_blocks; 358 }; 359 360 #define GFS2_GLOCKD_DEFAULT 1 361 #define GFS2_GLOCKD_MAX 16 362 363 #define GFS2_QUOTA_DEFAULT GFS2_QUOTA_OFF 364 #define GFS2_QUOTA_OFF 0 365 #define GFS2_QUOTA_ACCOUNT 1 366 #define GFS2_QUOTA_ON 2 367 368 #define GFS2_DATA_DEFAULT GFS2_DATA_ORDERED 369 #define GFS2_DATA_WRITEBACK 1 370 #define GFS2_DATA_ORDERED 2 371 372 struct gfs2_args { 373 char ar_lockproto[GFS2_LOCKNAME_LEN]; /* Name of the Lock Protocol */ 374 char ar_locktable[GFS2_LOCKNAME_LEN]; /* Name of the Lock Table */ 375 char ar_hostdata[GFS2_LOCKNAME_LEN]; /* Host specific data */ 376 int ar_spectator; /* Don't get a journal because we're always RO */ 377 int ar_ignore_local_fs; /* Don't optimize even if local_fs is 1 */ 378 int ar_localflocks; /* Let the VFS do flock|fcntl locks for us */ 379 int ar_localcaching; /* Local-style caching (dangerous on multihost) */ 380 int ar_debug; /* Oops on errors instead of trying to be graceful */ 381 int ar_upgrade; /* Upgrade ondisk/multihost format */ 382 unsigned int ar_num_glockd; /* Number of glockd threads */ 383 int ar_posix_acl; /* Enable posix acls */ 384 int ar_quota; /* off/account/on */ 385 int ar_suiddir; /* suiddir support */ 386 int ar_data; /* ordered/writeback */ 387 }; 388 389 struct gfs2_tune { 390 spinlock_t gt_spin; 391 392 unsigned int gt_ilimit; 393 unsigned int gt_ilimit_tries; 394 unsigned int gt_ilimit_min; 395 unsigned int gt_demote_secs; /* Cache retention for unheld glock */ 396 unsigned int gt_incore_log_blocks; 397 unsigned int gt_log_flush_secs; 398 unsigned int gt_jindex_refresh_secs; /* Check for new journal index */ 399 400 unsigned int gt_scand_secs; 401 unsigned int gt_recoverd_secs; 402 unsigned int gt_logd_secs; 403 unsigned int gt_quotad_secs; 404 405 unsigned int gt_quota_simul_sync; /* Max quotavals to sync at once */ 406 unsigned int gt_quota_warn_period; /* Secs between quota warn msgs */ 407 unsigned int gt_quota_scale_num; /* Numerator */ 408 unsigned int gt_quota_scale_den; /* Denominator */ 409 unsigned int gt_quota_cache_secs; 410 unsigned int gt_quota_quantum; /* Secs between syncs to quota file */ 411 unsigned int gt_atime_quantum; /* Min secs between atime updates */ 412 unsigned int gt_new_files_jdata; 413 unsigned int gt_new_files_directio; 414 unsigned int gt_max_readahead; /* Max bytes to read-ahead from disk */ 415 unsigned int gt_lockdump_size; 416 unsigned int gt_stall_secs; /* Detects trouble! */ 417 unsigned int gt_complain_secs; 418 unsigned int gt_reclaim_limit; /* Max num of glocks in reclaim list */ 419 unsigned int gt_entries_per_readdir; 420 unsigned int gt_statfs_quantum; 421 unsigned int gt_statfs_slow; 422 }; 423 424 enum { 425 SDF_JOURNAL_CHECKED = 0, 426 SDF_JOURNAL_LIVE = 1, 427 SDF_SHUTDOWN = 2, 428 SDF_NOATIME = 3, 429 }; 430 431 #define GFS2_FSNAME_LEN 256 432 433 struct gfs2_sbd { 434 struct super_block *sd_vfs; 435 struct super_block *sd_vfs_meta; 436 struct kobject sd_kobj; 437 unsigned long sd_flags; /* SDF_... */ 438 struct gfs2_sb_host sd_sb; 439 440 /* Constants computed on mount */ 441 442 u32 sd_fsb2bb; 443 u32 sd_fsb2bb_shift; 444 u32 sd_diptrs; /* Number of pointers in a dinode */ 445 u32 sd_inptrs; /* Number of pointers in a indirect block */ 446 u32 sd_jbsize; /* Size of a journaled data block */ 447 u32 sd_hash_bsize; /* sizeof(exhash block) */ 448 u32 sd_hash_bsize_shift; 449 u32 sd_hash_ptrs; /* Number of pointers in a hash block */ 450 u32 sd_qc_per_block; 451 u32 sd_max_dirres; /* Max blocks needed to add a directory entry */ 452 u32 sd_max_height; /* Max height of a file's metadata tree */ 453 u64 sd_heightsize[GFS2_MAX_META_HEIGHT]; 454 u32 sd_max_jheight; /* Max height of journaled file's meta tree */ 455 u64 sd_jheightsize[GFS2_MAX_META_HEIGHT]; 456 457 struct gfs2_args sd_args; /* Mount arguments */ 458 struct gfs2_tune sd_tune; /* Filesystem tuning structure */ 459 460 /* Lock Stuff */ 461 462 struct lm_lockstruct sd_lockstruct; 463 struct list_head sd_reclaim_list; 464 spinlock_t sd_reclaim_lock; 465 wait_queue_head_t sd_reclaim_wq; 466 atomic_t sd_reclaim_count; 467 struct gfs2_holder sd_live_gh; 468 struct gfs2_glock *sd_rename_gl; 469 struct gfs2_glock *sd_trans_gl; 470 471 /* Inode Stuff */ 472 473 struct inode *sd_master_dir; 474 struct inode *sd_jindex; 475 struct inode *sd_inum_inode; 476 struct inode *sd_statfs_inode; 477 struct inode *sd_ir_inode; 478 struct inode *sd_sc_inode; 479 struct inode *sd_qc_inode; 480 struct inode *sd_rindex; 481 struct inode *sd_quota_inode; 482 483 /* Inum stuff */ 484 485 struct mutex sd_inum_mutex; 486 487 /* StatFS stuff */ 488 489 spinlock_t sd_statfs_spin; 490 struct mutex sd_statfs_mutex; 491 struct gfs2_statfs_change_host sd_statfs_master; 492 struct gfs2_statfs_change_host sd_statfs_local; 493 unsigned long sd_statfs_sync_time; 494 495 /* Resource group stuff */ 496 497 u64 sd_rindex_vn; 498 spinlock_t sd_rindex_spin; 499 struct mutex sd_rindex_mutex; 500 struct list_head sd_rindex_list; 501 struct list_head sd_rindex_mru_list; 502 struct list_head sd_rindex_recent_list; 503 struct gfs2_rgrpd *sd_rindex_forward; 504 unsigned int sd_rgrps; 505 506 /* Journal index stuff */ 507 508 struct list_head sd_jindex_list; 509 spinlock_t sd_jindex_spin; 510 struct mutex sd_jindex_mutex; 511 unsigned int sd_journals; 512 unsigned long sd_jindex_refresh_time; 513 514 struct gfs2_jdesc *sd_jdesc; 515 struct gfs2_holder sd_journal_gh; 516 struct gfs2_holder sd_jinode_gh; 517 518 struct gfs2_holder sd_ir_gh; 519 struct gfs2_holder sd_sc_gh; 520 struct gfs2_holder sd_qc_gh; 521 522 /* Daemon stuff */ 523 524 struct task_struct *sd_scand_process; 525 struct task_struct *sd_recoverd_process; 526 struct task_struct *sd_logd_process; 527 struct task_struct *sd_quotad_process; 528 struct task_struct *sd_glockd_process[GFS2_GLOCKD_MAX]; 529 unsigned int sd_glockd_num; 530 531 /* Quota stuff */ 532 533 struct list_head sd_quota_list; 534 atomic_t sd_quota_count; 535 spinlock_t sd_quota_spin; 536 struct mutex sd_quota_mutex; 537 538 unsigned int sd_quota_slots; 539 unsigned int sd_quota_chunks; 540 unsigned char **sd_quota_bitmap; 541 542 u64 sd_quota_sync_gen; 543 unsigned long sd_quota_sync_time; 544 545 /* Log stuff */ 546 547 spinlock_t sd_log_lock; 548 549 unsigned int sd_log_blks_reserved; 550 unsigned int sd_log_commited_buf; 551 unsigned int sd_log_commited_revoke; 552 553 unsigned int sd_log_num_gl; 554 unsigned int sd_log_num_buf; 555 unsigned int sd_log_num_revoke; 556 unsigned int sd_log_num_rg; 557 unsigned int sd_log_num_databuf; 558 unsigned int sd_log_num_jdata; 559 unsigned int sd_log_num_hdrs; 560 561 struct list_head sd_log_le_gl; 562 struct list_head sd_log_le_buf; 563 struct list_head sd_log_le_revoke; 564 struct list_head sd_log_le_rg; 565 struct list_head sd_log_le_databuf; 566 567 unsigned int sd_log_blks_free; 568 struct mutex sd_log_reserve_mutex; 569 570 u64 sd_log_sequence; 571 unsigned int sd_log_head; 572 unsigned int sd_log_tail; 573 int sd_log_idle; 574 575 unsigned long sd_log_flush_time; 576 struct rw_semaphore sd_log_flush_lock; 577 struct list_head sd_log_flush_list; 578 579 unsigned int sd_log_flush_head; 580 u64 sd_log_flush_wrapped; 581 582 struct list_head sd_ail1_list; 583 struct list_head sd_ail2_list; 584 u64 sd_ail_sync_gen; 585 586 /* Replay stuff */ 587 588 struct list_head sd_revoke_list; 589 unsigned int sd_replay_tail; 590 591 unsigned int sd_found_blocks; 592 unsigned int sd_found_revokes; 593 unsigned int sd_replayed_blocks; 594 595 /* For quiescing the filesystem */ 596 597 struct gfs2_holder sd_freeze_gh; 598 struct mutex sd_freeze_lock; 599 unsigned int sd_freeze_count; 600 601 /* Counters */ 602 603 atomic_t sd_glock_count; 604 atomic_t sd_glock_held_count; 605 atomic_t sd_inode_count; 606 atomic_t sd_reclaimed; 607 608 char sd_fsname[GFS2_FSNAME_LEN]; 609 char sd_table_name[GFS2_FSNAME_LEN]; 610 char sd_proto_name[GFS2_FSNAME_LEN]; 611 612 /* Debugging crud */ 613 614 unsigned long sd_last_warning; 615 struct vfsmount *sd_gfs2mnt; 616 }; 617 618 #endif /* __INCORE_DOT_H__ */ 619 620