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 int gfs2_is_writeback(const struct gfs2_inode *ip)
  34{
  35        const struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
  36        return (sdp->sd_args.ar_data == GFS2_DATA_WRITEBACK) && !gfs2_is_jdata(ip);
  37}
  38
  39static inline int gfs2_is_ordered(const struct gfs2_inode *ip)
  40{
  41        const struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode);
  42        return (sdp->sd_args.ar_data == GFS2_DATA_ORDERED) && !gfs2_is_jdata(ip);
  43}
  44
  45static inline int gfs2_is_dir(const struct gfs2_inode *ip)
  46{
  47        return S_ISDIR(ip->i_inode.i_mode);
  48}
  49
  50static inline void gfs2_set_inode_blocks(struct inode *inode, u64 blocks)
  51{
  52        inode->i_blocks = blocks <<
  53                (GFS2_SB(inode)->sd_sb.sb_bsize_shift - GFS2_BASIC_BLOCK_SHIFT);
  54}
  55
  56static inline u64 gfs2_get_inode_blocks(const struct inode *inode)
  57{
  58        return inode->i_blocks >>
  59                (GFS2_SB(inode)->sd_sb.sb_bsize_shift - GFS2_BASIC_BLOCK_SHIFT);
  60}
  61
  62static inline void gfs2_add_inode_blocks(struct inode *inode, s64 change)
  63{
  64        gfs2_assert(GFS2_SB(inode), (change >= 0 || inode->i_blocks > -change));
  65        change *= (GFS2_SB(inode)->sd_sb.sb_bsize/GFS2_BASIC_BLOCK);
  66        inode->i_blocks += change;
  67}
  68
  69static inline int gfs2_check_inum(const struct gfs2_inode *ip, u64 no_addr,
  70                                  u64 no_formal_ino)
  71{
  72        return ip->i_no_addr == no_addr && ip->i_no_formal_ino == no_formal_ino;
  73}
  74
  75static inline void gfs2_inum_out(const struct gfs2_inode *ip,
  76                                 struct gfs2_dirent *dent)
  77{
  78        dent->de_inum.no_formal_ino = cpu_to_be64(ip->i_no_formal_ino);
  79        dent->de_inum.no_addr = cpu_to_be64(ip->i_no_addr);
  80}
  81
  82static inline int gfs2_check_internal_file_size(struct inode *inode,
  83                                                u64 minsize, u64 maxsize)
  84{
  85        u64 size = i_size_read(inode);
  86        if (size < minsize || size > maxsize)
  87                goto err;
  88        if (size & ((1 << inode->i_blkbits) - 1))
  89                goto err;
  90        return 0;
  91err:
  92        gfs2_consist_inode(GFS2_I(inode));
  93        return -EIO;
  94}
  95
  96extern struct inode *gfs2_inode_lookup(struct super_block *sb, unsigned type, 
  97                                       u64 no_addr, u64 no_formal_ino,
  98                                       unsigned int blktype);
  99extern struct inode *gfs2_lookup_by_inum(struct gfs2_sbd *sdp, u64 no_addr,
 100                                         u64 *no_formal_ino,
 101                                         unsigned int blktype);
 102
 103extern int gfs2_inode_refresh(struct gfs2_inode *ip);
 104
 105extern struct inode *gfs2_lookupi(struct inode *dir, const struct qstr *name,
 106                                  int is_root);
 107extern int gfs2_permission(struct inode *inode, int mask);
 108extern int gfs2_setattr_simple(struct inode *inode, struct iattr *attr);
 109extern struct inode *gfs2_lookup_simple(struct inode *dip, const char *name);
 110extern void gfs2_dinode_out(const struct gfs2_inode *ip, void *buf);
 111extern int gfs2_open_common(struct inode *inode, struct file *file);
 112extern loff_t gfs2_seek_data(struct file *file, loff_t offset);
 113extern loff_t gfs2_seek_hole(struct file *file, loff_t offset);
 114
 115extern const struct inode_operations gfs2_file_iops;
 116extern const struct inode_operations_wrapper gfs2_dir_iops;
 117extern const struct inode_operations gfs2_symlink_iops;
 118extern const struct file_operations gfs2_file_fops_nolock;
 119extern const struct file_operations gfs2_dir_fops_nolock;
 120
 121extern void gfs2_set_inode_flags(struct inode *inode);
 122 
 123#ifdef CONFIG_GFS2_FS_LOCKING_DLM
 124extern const struct file_operations gfs2_file_fops;
 125extern const struct file_operations gfs2_dir_fops;
 126
 127static inline int gfs2_localflocks(const struct gfs2_sbd *sdp)
 128{
 129        return sdp->sd_args.ar_localflocks;
 130}
 131#else /* Single node only */
 132#define gfs2_file_fops gfs2_file_fops_nolock
 133#define gfs2_dir_fops gfs2_dir_fops_nolock
 134
 135static inline int gfs2_localflocks(const struct gfs2_sbd *sdp)
 136{
 137        return 1;
 138}
 139#endif /* CONFIG_GFS2_FS_LOCKING_DLM */
 140
 141#endif /* __INODE_DOT_H__ */
 142
 143