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