diff options
Diffstat (limited to 'fs/ocfs2/ocfs2.h')
-rw-r--r-- | fs/ocfs2/ocfs2.h | 52 |
1 files changed, 49 insertions, 3 deletions
diff --git a/fs/ocfs2/ocfs2.h b/fs/ocfs2/ocfs2.h index 39e1d5a39505..eae404602424 100644 --- a/fs/ocfs2/ocfs2.h +++ b/fs/ocfs2/ocfs2.h | |||
@@ -51,20 +51,51 @@ | |||
51 | /* For struct ocfs2_blockcheck_stats */ | 51 | /* For struct ocfs2_blockcheck_stats */ |
52 | #include "blockcheck.h" | 52 | #include "blockcheck.h" |
53 | 53 | ||
54 | |||
55 | /* Caching of metadata buffers */ | ||
56 | |||
54 | /* Most user visible OCFS2 inodes will have very few pieces of | 57 | /* Most user visible OCFS2 inodes will have very few pieces of |
55 | * metadata, but larger files (including bitmaps, etc) must be taken | 58 | * metadata, but larger files (including bitmaps, etc) must be taken |
56 | * into account when designing an access scheme. We allow a small | 59 | * into account when designing an access scheme. We allow a small |
57 | * amount of inlined blocks to be stored on an array and grow the | 60 | * amount of inlined blocks to be stored on an array and grow the |
58 | * structure into a rb tree when necessary. */ | 61 | * structure into a rb tree when necessary. */ |
59 | #define OCFS2_INODE_MAX_CACHE_ARRAY 2 | 62 | #define OCFS2_CACHE_INFO_MAX_ARRAY 2 |
63 | |||
64 | /* Flags for ocfs2_caching_info */ | ||
65 | |||
66 | enum ocfs2_caching_info_flags { | ||
67 | /* Indicates that the metadata cache is using the inline array */ | ||
68 | OCFS2_CACHE_FL_INLINE = 1<<1, | ||
69 | }; | ||
60 | 70 | ||
71 | struct ocfs2_caching_operations; | ||
61 | struct ocfs2_caching_info { | 72 | struct ocfs2_caching_info { |
73 | /* | ||
74 | * The parent structure provides the locks, but because the | ||
75 | * parent structure can differ, it provides locking operations | ||
76 | * to struct ocfs2_caching_info. | ||
77 | */ | ||
78 | const struct ocfs2_caching_operations *ci_ops; | ||
79 | |||
80 | /* next two are protected by trans_inc_lock */ | ||
81 | /* which transaction were we created on? Zero if none. */ | ||
82 | unsigned long ci_created_trans; | ||
83 | /* last transaction we were a part of. */ | ||
84 | unsigned long ci_last_trans; | ||
85 | |||
86 | /* Cache structures */ | ||
87 | unsigned int ci_flags; | ||
62 | unsigned int ci_num_cached; | 88 | unsigned int ci_num_cached; |
63 | union { | 89 | union { |
64 | sector_t ci_array[OCFS2_INODE_MAX_CACHE_ARRAY]; | 90 | sector_t ci_array[OCFS2_CACHE_INFO_MAX_ARRAY]; |
65 | struct rb_root ci_tree; | 91 | struct rb_root ci_tree; |
66 | } ci_cache; | 92 | } ci_cache; |
67 | }; | 93 | }; |
94 | /* | ||
95 | * Need this prototype here instead of in uptodate.h because journal.h | ||
96 | * uses it. | ||
97 | */ | ||
98 | struct super_block *ocfs2_metadata_cache_get_super(struct ocfs2_caching_info *ci); | ||
68 | 99 | ||
69 | /* this limits us to 256 nodes | 100 | /* this limits us to 256 nodes |
70 | * if we need more, we can do a kmalloc for the map */ | 101 | * if we need more, we can do a kmalloc for the map */ |
@@ -377,12 +408,17 @@ struct ocfs2_super | |||
377 | 408 | ||
378 | /* the group we used to allocate inodes. */ | 409 | /* the group we used to allocate inodes. */ |
379 | u64 osb_inode_alloc_group; | 410 | u64 osb_inode_alloc_group; |
411 | |||
412 | /* rb tree root for refcount lock. */ | ||
413 | struct rb_root osb_rf_lock_tree; | ||
414 | struct ocfs2_refcount_tree *osb_ref_tree_lru; | ||
380 | }; | 415 | }; |
381 | 416 | ||
382 | #define OCFS2_SB(sb) ((struct ocfs2_super *)(sb)->s_fs_info) | 417 | #define OCFS2_SB(sb) ((struct ocfs2_super *)(sb)->s_fs_info) |
383 | 418 | ||
384 | /* Useful typedef for passing around journal access functions */ | 419 | /* Useful typedef for passing around journal access functions */ |
385 | typedef int (*ocfs2_journal_access_func)(handle_t *handle, struct inode *inode, | 420 | typedef int (*ocfs2_journal_access_func)(handle_t *handle, |
421 | struct ocfs2_caching_info *ci, | ||
386 | struct buffer_head *bh, int type); | 422 | struct buffer_head *bh, int type); |
387 | 423 | ||
388 | static inline int ocfs2_should_order_data(struct inode *inode) | 424 | static inline int ocfs2_should_order_data(struct inode *inode) |
@@ -480,6 +516,13 @@ static inline void ocfs2_add_links_count(struct ocfs2_dinode *di, int n) | |||
480 | ocfs2_set_links_count(di, links); | 516 | ocfs2_set_links_count(di, links); |
481 | } | 517 | } |
482 | 518 | ||
519 | static inline int ocfs2_refcount_tree(struct ocfs2_super *osb) | ||
520 | { | ||
521 | if (osb->s_feature_incompat & OCFS2_FEATURE_INCOMPAT_REFCOUNT_TREE) | ||
522 | return 1; | ||
523 | return 0; | ||
524 | } | ||
525 | |||
483 | /* set / clear functions because cluster events can make these happen | 526 | /* set / clear functions because cluster events can make these happen |
484 | * in parallel so we want the transitions to be atomic. this also | 527 | * in parallel so we want the transitions to be atomic. this also |
485 | * means that any future flags osb_flags must be protected by spinlock | 528 | * means that any future flags osb_flags must be protected by spinlock |
@@ -578,6 +621,9 @@ static inline int ocfs2_uses_extended_slot_map(struct ocfs2_super *osb) | |||
578 | #define OCFS2_IS_VALID_DX_LEAF(ptr) \ | 621 | #define OCFS2_IS_VALID_DX_LEAF(ptr) \ |
579 | (!strcmp((ptr)->dl_signature, OCFS2_DX_LEAF_SIGNATURE)) | 622 | (!strcmp((ptr)->dl_signature, OCFS2_DX_LEAF_SIGNATURE)) |
580 | 623 | ||
624 | #define OCFS2_IS_VALID_REFCOUNT_BLOCK(ptr) \ | ||
625 | (!strcmp((ptr)->rf_signature, OCFS2_REFCOUNT_BLOCK_SIGNATURE)) | ||
626 | |||
581 | static inline unsigned long ino_from_blkno(struct super_block *sb, | 627 | static inline unsigned long ino_from_blkno(struct super_block *sb, |
582 | u64 blkno) | 628 | u64 blkno) |
583 | { | 629 | { |