diff options
Diffstat (limited to 'fs/nilfs2/mdt.h')
-rw-r--r-- | fs/nilfs2/mdt.h | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/fs/nilfs2/mdt.h b/fs/nilfs2/mdt.h new file mode 100644 index 000000000000..df683e0bca6a --- /dev/null +++ b/fs/nilfs2/mdt.h | |||
@@ -0,0 +1,125 @@ | |||
1 | /* | ||
2 | * mdt.h - NILFS meta data file prototype and definitions | ||
3 | * | ||
4 | * Copyright (C) 2005-2008 Nippon Telegraph and Telephone Corporation. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | ||
19 | * | ||
20 | * Written by Ryusuke Konishi <ryusuke@osrg.net> | ||
21 | */ | ||
22 | |||
23 | #ifndef _NILFS_MDT_H | ||
24 | #define _NILFS_MDT_H | ||
25 | |||
26 | #include <linux/buffer_head.h> | ||
27 | #include <linux/blockgroup_lock.h> | ||
28 | #include "nilfs.h" | ||
29 | #include "page.h" | ||
30 | |||
31 | /** | ||
32 | * struct nilfs_mdt_info - on-memory private data of meta data files | ||
33 | * @mi_nilfs: back pointer to the_nilfs struct | ||
34 | * @mi_sem: reader/writer semaphore for meta data operations | ||
35 | * @mi_bgl: per-blockgroup locking | ||
36 | * @mi_entry_size: size of an entry | ||
37 | * @mi_first_entry_offset: offset to the first entry | ||
38 | * @mi_entries_per_block: number of entries in a block | ||
39 | * @mi_blocks_per_group: number of blocks in a group | ||
40 | * @mi_blocks_per_desc_block: number of blocks per descriptor block | ||
41 | */ | ||
42 | struct nilfs_mdt_info { | ||
43 | struct the_nilfs *mi_nilfs; | ||
44 | struct rw_semaphore mi_sem; | ||
45 | struct blockgroup_lock *mi_bgl; | ||
46 | unsigned mi_entry_size; | ||
47 | unsigned mi_first_entry_offset; | ||
48 | unsigned long mi_entries_per_block; | ||
49 | unsigned long mi_blocks_per_group; | ||
50 | unsigned long mi_blocks_per_desc_block; | ||
51 | }; | ||
52 | |||
53 | static inline struct nilfs_mdt_info *NILFS_MDT(const struct inode *inode) | ||
54 | { | ||
55 | return inode->i_private; | ||
56 | } | ||
57 | |||
58 | static inline struct the_nilfs *NILFS_I_NILFS(struct inode *inode) | ||
59 | { | ||
60 | struct super_block *sb = inode->i_sb; | ||
61 | |||
62 | return sb ? NILFS_SB(sb)->s_nilfs : NILFS_MDT(inode)->mi_nilfs; | ||
63 | } | ||
64 | |||
65 | /* Default GFP flags using highmem */ | ||
66 | #define NILFS_MDT_GFP (__GFP_WAIT | __GFP_IO | __GFP_HIGHMEM) | ||
67 | |||
68 | int nilfs_mdt_get_block(struct inode *, unsigned long, int, | ||
69 | void (*init_block)(struct inode *, | ||
70 | struct buffer_head *, void *), | ||
71 | struct buffer_head **); | ||
72 | int nilfs_mdt_delete_block(struct inode *, unsigned long); | ||
73 | int nilfs_mdt_forget_block(struct inode *, unsigned long); | ||
74 | int nilfs_mdt_mark_block_dirty(struct inode *, unsigned long); | ||
75 | int nilfs_mdt_fetch_dirty(struct inode *); | ||
76 | |||
77 | struct inode *nilfs_mdt_new(struct the_nilfs *, struct super_block *, ino_t, | ||
78 | gfp_t); | ||
79 | struct inode *nilfs_mdt_new_common(struct the_nilfs *, struct super_block *, | ||
80 | ino_t, gfp_t); | ||
81 | void nilfs_mdt_destroy(struct inode *); | ||
82 | void nilfs_mdt_clear(struct inode *); | ||
83 | void nilfs_mdt_set_entry_size(struct inode *, unsigned, unsigned); | ||
84 | void nilfs_mdt_set_shadow(struct inode *, struct inode *); | ||
85 | |||
86 | |||
87 | #define nilfs_mdt_mark_buffer_dirty(bh) nilfs_mark_buffer_dirty(bh) | ||
88 | |||
89 | static inline void nilfs_mdt_mark_dirty(struct inode *inode) | ||
90 | { | ||
91 | if (!test_bit(NILFS_I_DIRTY, &NILFS_I(inode)->i_state)) | ||
92 | set_bit(NILFS_I_DIRTY, &NILFS_I(inode)->i_state); | ||
93 | } | ||
94 | |||
95 | static inline void nilfs_mdt_clear_dirty(struct inode *inode) | ||
96 | { | ||
97 | clear_bit(NILFS_I_DIRTY, &NILFS_I(inode)->i_state); | ||
98 | } | ||
99 | |||
100 | static inline __u64 nilfs_mdt_cno(struct inode *inode) | ||
101 | { | ||
102 | return NILFS_MDT(inode)->mi_nilfs->ns_cno; | ||
103 | } | ||
104 | |||
105 | #define nilfs_mdt_bgl_lock(inode, bg) \ | ||
106 | (&NILFS_MDT(inode)->mi_bgl->locks[(bg) & (NR_BG_LOCKS-1)].lock) | ||
107 | |||
108 | |||
109 | static inline int | ||
110 | nilfs_mdt_read_inode_direct(struct inode *inode, struct buffer_head *bh, | ||
111 | unsigned n) | ||
112 | { | ||
113 | return nilfs_read_inode_common( | ||
114 | inode, (struct nilfs_inode *)(bh->b_data + n)); | ||
115 | } | ||
116 | |||
117 | static inline void | ||
118 | nilfs_mdt_write_inode_direct(struct inode *inode, struct buffer_head *bh, | ||
119 | unsigned n) | ||
120 | { | ||
121 | nilfs_write_inode_common( | ||
122 | inode, (struct nilfs_inode *)(bh->b_data + n), 1); | ||
123 | } | ||
124 | |||
125 | #endif /* _NILFS_MDT_H */ | ||