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