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