linux/fs/nilfs2/mdt.h
<<
>>
Prefs
   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 */
  42struct 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
  53static inline struct nilfs_mdt_info *NILFS_MDT(const struct inode *inode)
  54{
  55        return inode->i_private;
  56}
  57
  58static 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
  68int nilfs_mdt_get_block(struct inode *, unsigned long, int,
  69                        void (*init_block)(struct inode *,
  70                                           struct buffer_head *, void *),
  71                        struct buffer_head **);
  72int nilfs_mdt_delete_block(struct inode *, unsigned long);
  73int nilfs_mdt_forget_block(struct inode *, unsigned long);
  74int nilfs_mdt_mark_block_dirty(struct inode *, unsigned long);
  75int nilfs_mdt_fetch_dirty(struct inode *);
  76
  77struct inode *nilfs_mdt_new(struct the_nilfs *, struct super_block *, ino_t);
  78struct inode *nilfs_mdt_new_common(struct the_nilfs *, struct super_block *,
  79                                   ino_t, gfp_t);
  80void nilfs_mdt_destroy(struct inode *);
  81void nilfs_mdt_clear(struct inode *);
  82void nilfs_mdt_set_entry_size(struct inode *, unsigned, unsigned);
  83void nilfs_mdt_set_shadow(struct inode *, struct inode *);
  84
  85
  86#define nilfs_mdt_mark_buffer_dirty(bh) nilfs_mark_buffer_dirty(bh)
  87
  88static inline void nilfs_mdt_mark_dirty(struct inode *inode)
  89{
  90        if (!test_bit(NILFS_I_DIRTY, &NILFS_I(inode)->i_state))
  91                set_bit(NILFS_I_DIRTY, &NILFS_I(inode)->i_state);
  92}
  93
  94static inline void nilfs_mdt_clear_dirty(struct inode *inode)
  95{
  96        clear_bit(NILFS_I_DIRTY, &NILFS_I(inode)->i_state);
  97}
  98
  99static inline __u64 nilfs_mdt_cno(struct inode *inode)
 100{
 101        return NILFS_MDT(inode)->mi_nilfs->ns_cno;
 102}
 103
 104#define nilfs_mdt_bgl_lock(inode, bg) \
 105        (&NILFS_MDT(inode)->mi_bgl->locks[(bg) & (NR_BG_LOCKS-1)].lock)
 106
 107
 108static inline int
 109nilfs_mdt_read_inode_direct(struct inode *inode, struct buffer_head *bh,
 110                            unsigned n)
 111{
 112        return nilfs_read_inode_common(
 113                inode, (struct nilfs_inode *)(bh->b_data + n));
 114}
 115
 116static inline void
 117nilfs_mdt_write_inode_direct(struct inode *inode, struct buffer_head *bh,
 118                             unsigned n)
 119{
 120        nilfs_write_inode_common(
 121                inode, (struct nilfs_inode *)(bh->b_data + n), 1);
 122}
 123
 124#endif /* _NILFS_MDT_H */
 125