linux/fs/gfs2/inode.h
<<
>>
Prefs
   1/*
   2 * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
   3 * Copyright (C) 2004-2006 Red Hat, Inc.  All rights reserved.
   4 *
   5 * This copyrighted material is made available to anyone wishing to use,
   6 * modify, copy, or redistribute it subject to the terms and conditions
   7 * of the GNU General Public License version 2.
   8 */
   9
  10#ifndef __INODE_DOT_H__
  11#define __INODE_DOT_H__
  12
  13#include <linux/fs.h>
  14#include <linux/buffer_head.h>
  15#include <linux/mm.h>
  16#include "util.h"
  17
  18extern int gfs2_releasepage(struct page *page, gfp_t gfp_mask);
  19extern int gfs2_internal_read(struct gfs2_inode *ip,
  20                              char *buf, loff_t *pos, unsigned size);
  21extern void gfs2_set_aops(struct inode *inode);
  22
  23static inline int gfs2_is_stuffed(const struct gfs2_inode *ip)
  24{
  25        return !ip->i_height;
  26}
  27
  28static inline int gfs2_is_jdata(const struct gfs2_inode *ip)
  29{
  30        return ip->i_diskflags & GFS2_DIF_JDATA;
  31}
  32
  33static inline bool gfs2_is_ordered(const struct gfs2_sbd *sdp)
  34{
  35        return sdp->sd_args.ar_data == GFS2_DATA_ORDERED;
  36}
  37
  38static inline bool gfs2_is_writeback(const struct gfs2_sbd *sdp)
  39{
  40        return sdp->sd_args.ar_data == GFS2_DATA_WRITEBACK;
  41}
  42
  43static inline int gfs2_is_dir(const struct gfs2_inode *ip)
  44{
  45        return S_ISDIR(ip->i_inode.i_mode);
  46}
  47
  48static inline void gfs2_set_inode_blocks(struct inode *inode, u64 blocks)
  49{
  50        inode->i_blocks = blocks <<
  51                (GFS2_SB(inode)->sd_sb.sb_bsize_shift - GFS2_BASIC_BLOCK_SHIFT);
  52}
  53
  54static inline u64 gfs2_get_inode_blocks(const struct inode *inode)
  55{
  56        return inode->i_blocks >>
  57                (GFS2_SB(inode)->sd_sb.sb_bsize_shift - GFS2_BASIC_BLOCK_SHIFT);
  58}
  59
  60static inline void gfs2_add_inode_blocks(struct inode *inode, s64 change)
  61{
  62        change <<= inode->i_blkbits - GFS2_BASIC_BLOCK_SHIFT;
  63        gfs2_assert(GFS2_SB(inode), (change >= 0 || inode->i_blocks >= -change));
  64        inode->i_blocks += change;
  65}
  66
  67static inline int gfs2_check_inum(const struct gfs2_inode *ip, u64 no_addr,
  68                                  u64 no_formal_ino)
  69{
  70        return ip->i_no_addr == no_addr && ip->i_no_formal_ino == no_formal_ino;
  71}
  72
  73static inline void gfs2_inum_out(const struct gfs2_inode *ip,
  74                                 struct gfs2_dirent *dent)
  75{
  76        dent->de_inum.no_formal_ino = cpu_to_be64(ip->i_no_formal_ino);
  77        dent->de_inum.no_addr = cpu_to_be64(ip->i_no_addr);
  78}
  79
  80static inline int gfs2_check_internal_file_size(struct inode *inode,
  81                                                u64 minsize, u64 maxsize)
  82{
  83        u64 size = i_size_read(inode);
  84        if (size < minsize || size > maxsize)
  85                goto err;
  86        if (size & (BIT(inode->i_blkbits) - 1))
  87                goto err;
  88        return 0;
  89err:
  90        gfs2_consist_inode(GFS2_I(inode));
  91        return -EIO;
  92}
  93
  94extern struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned type, 
  95                                       u64 no_addr, u64 no_formal_ino,
  96                                       unsigned int blktype);
  97extern struct inode *gfs2_lookup_by_inum(struct gfs2_sbd *sdp, u64 no_addr,
  98                                         u64 *no_formal_ino,
  99                                         unsigned int blktype);
 100
 101extern int gfs2_inode_refresh(struct gfs2_inode *ip);
 102
 103extern struct inode *gfs2_lookupi(struct inode *dir, const struct qstr *name,
 104                                  int is_root);
 105extern int gfs2_permission(struct inode *inode, int mask);
 106extern int gfs2_setattr_simple(struct inode *inode, struct iattr *attr);
 107extern struct inode *gfs2_lookup_simple(struct inode *dip, const char *name);
 108extern void gfs2_dinode_out(const struct gfs2_inode *ip, void *buf);
 109extern int gfs2_open_common(struct inode *inode, struct file *file);
 110extern loff_t gfs2_seek_data(struct file *file, loff_t offset);
 111extern loff_t gfs2_seek_hole(struct file *file, loff_t offset);
 112
 113extern const struct inode_operations gfs2_file_iops;
 114extern const struct inode_operations gfs2_dir_iops;
 115extern const struct inode_operations gfs2_symlink_iops;
 116extern const struct file_operations gfs2_file_fops_nolock;
 117extern const struct file_operations gfs2_dir_fops_nolock;
 118
 119extern void gfs2_set_inode_flags(struct inode *inode);
 120 
 121#ifdef CONFIG_GFS2_FS_LOCKING_DLM
 122extern const struct file_operations gfs2_file_fops;
 123extern const struct file_operations gfs2_dir_fops;
 124
 125static inline int gfs2_localflocks(const struct gfs2_sbd *sdp)
 126{
 127        return sdp->sd_args.ar_localflocks;
 128}
 129#else /* Single node only */
 130#define gfs2_file_fops gfs2_file_fops_nolock
 131#define gfs2_dir_fops gfs2_dir_fops_nolock
 132
 133static inline int gfs2_localflocks(const struct gfs2_sbd *sdp)
 134{
 135        return 1;
 136}
 137#endif /* CONFIG_GFS2_FS_LOCKING_DLM */
 138
 139#endif /* __INODE_DOT_H__ */
 140
 141