2006-01-16 19:50:04 +03:00
/*
* Copyright ( C ) Sistina Software , Inc . 1997 - 2003 All rights reserved .
2006-05-18 23:09:15 +04:00
* Copyright ( C ) 2004 - 2006 Red Hat , Inc . All rights reserved .
2006-01-16 19:50:04 +03:00
*
* This copyrighted material is made available to anyone wishing to use ,
* modify , copy , or redistribute it subject to the terms and conditions
2006-09-01 19:05:15 +04:00
* of the GNU General Public License version 2.
2006-01-16 19:50:04 +03:00
*/
# ifndef __INODE_DOT_H__
# define __INODE_DOT_H__
2008-10-14 19:05:55 +04:00
# include <linux/fs.h>
2009-05-22 13:01:55 +04:00
# include <linux/buffer_head.h>
# include <linux/mm.h>
2008-02-12 17:17:27 +03:00
# include "util.h"
2009-05-22 13:01:55 +04:00
extern int gfs2_releasepage ( struct page * page , gfp_t gfp_mask ) ;
extern int gfs2_internal_read ( struct gfs2_inode * ip ,
char * buf , loff_t * pos , unsigned size ) ;
extern void gfs2_set_aops ( struct inode * inode ) ;
2007-05-15 18:37:50 +04:00
static inline int gfs2_is_stuffed ( const struct gfs2_inode * ip )
2006-01-16 19:50:04 +03:00
{
2008-01-28 13:37:35 +03:00
return ! ip - > i_height ;
2006-01-16 19:50:04 +03:00
}
2007-05-15 18:37:50 +04:00
static inline int gfs2_is_jdata ( const struct gfs2_inode * ip )
2006-01-16 19:50:04 +03:00
{
2008-11-04 13:05:22 +03:00
return ip - > i_diskflags & GFS2_DIF_JDATA ;
2006-01-16 19:50:04 +03:00
}
2007-10-17 11:35:19 +04:00
static inline int gfs2_is_writeback ( const struct gfs2_inode * ip )
{
const struct gfs2_sbd * sdp = GFS2_SB ( & ip - > i_inode ) ;
return ( sdp - > sd_args . ar_data = = GFS2_DATA_WRITEBACK ) & & ! gfs2_is_jdata ( ip ) ;
}
2007-10-17 11:47:38 +04:00
static inline int gfs2_is_ordered ( const struct gfs2_inode * ip )
{
const struct gfs2_sbd * sdp = GFS2_SB ( & ip - > i_inode ) ;
return ( sdp - > sd_args . ar_data = = GFS2_DATA_ORDERED ) & & ! gfs2_is_jdata ( ip ) ;
}
2007-05-15 18:37:50 +04:00
static inline int gfs2_is_dir ( const struct gfs2_inode * ip )
2006-02-08 14:50:51 +03:00
{
2006-11-01 20:22:46 +03:00
return S_ISDIR ( ip - > i_inode . i_mode ) ;
2006-02-08 14:50:51 +03:00
}
2008-02-12 17:17:27 +03:00
static inline void gfs2_set_inode_blocks ( struct inode * inode , u64 blocks )
{
inode - > i_blocks = blocks < <
( GFS2_SB ( inode ) - > sd_sb . sb_bsize_shift - GFS2_BASIC_BLOCK_SHIFT ) ;
}
static inline u64 gfs2_get_inode_blocks ( const struct inode * inode )
2006-11-08 23:45:46 +03:00
{
2008-02-12 17:17:27 +03:00
return inode - > i_blocks > >
2006-11-08 23:45:46 +03:00
( GFS2_SB ( inode ) - > sd_sb . sb_bsize_shift - GFS2_BASIC_BLOCK_SHIFT ) ;
}
2008-02-12 17:17:27 +03:00
static inline void gfs2_add_inode_blocks ( struct inode * inode , s64 change )
{
gfs2_assert ( GFS2_SB ( inode ) , ( change > = 0 | | inode - > i_blocks > - change ) ) ;
change * = ( GFS2_SB ( inode ) - > sd_sb . sb_bsize / GFS2_BASIC_BLOCK ) ;
inode - > i_blocks + = change ;
}
2007-05-15 18:37:50 +04:00
static inline int gfs2_check_inum ( const struct gfs2_inode * ip , u64 no_addr ,
u64 no_formal_ino )
{
return ip - > i_no_addr = = no_addr & & ip - > i_no_formal_ino = = no_formal_ino ;
}
2007-06-01 17:11:58 +04:00
static inline void gfs2_inum_out ( const struct gfs2_inode * ip ,
struct gfs2_dirent * dent )
{
dent - > de_inum . no_formal_ino = cpu_to_be64 ( ip - > i_no_formal_ino ) ;
dent - > de_inum . no_addr = cpu_to_be64 ( ip - > i_no_addr ) ;
}
2010-08-11 12:53:11 +04:00
static inline int gfs2_check_internal_file_size ( struct inode * inode ,
u64 minsize , u64 maxsize )
{
u64 size = i_size_read ( inode ) ;
if ( size < minsize | | size > maxsize )
goto err ;
if ( size & ( ( 1 < < inode - > i_blkbits ) - 1 ) )
goto err ;
return 0 ;
err :
gfs2_consist_inode ( GFS2_I ( inode ) ) ;
return - EIO ;
}
2007-06-01 17:11:58 +04:00
2009-05-22 13:01:55 +04:00
extern struct inode * gfs2_inode_lookup ( struct super_block * sb , unsigned type ,
2015-12-18 20:44:49 +03:00
u64 no_addr , u64 no_formal_ino ) ;
2010-11-03 23:01:07 +03:00
extern struct inode * gfs2_lookup_by_inum ( struct gfs2_sbd * sdp , u64 no_addr ,
u64 * no_formal_ino ,
unsigned int blktype ) ;
2015-03-27 16:25:41 +03:00
extern struct inode * gfs2_ilookup ( struct super_block * sb , u64 no_addr ) ;
2009-05-22 13:01:55 +04:00
extern int gfs2_inode_refresh ( struct gfs2_inode * ip ) ;
extern struct inode * gfs2_lookupi ( struct inode * dir , const struct qstr * name ,
int is_root ) ;
2011-06-21 03:28:19 +04:00
extern int gfs2_permission ( struct inode * inode , int mask ) ;
2011-08-15 17:20:36 +04:00
extern int gfs2_setattr_simple ( struct inode * inode , struct iattr * attr ) ;
2009-05-22 13:01:55 +04:00
extern struct inode * gfs2_lookup_simple ( struct inode * dip , const char * name ) ;
extern void gfs2_dinode_out ( const struct gfs2_inode * ip , void * buf ) ;
2013-06-14 14:17:15 +04:00
extern int gfs2_open_common ( struct inode * inode , struct file * file ) ;
2006-01-16 19:50:04 +03:00
2008-10-14 19:05:55 +04:00
extern const struct inode_operations gfs2_file_iops ;
extern const struct inode_operations gfs2_dir_iops ;
extern const struct inode_operations gfs2_symlink_iops ;
2009-04-07 21:42:17 +04:00
extern const struct file_operations gfs2_file_fops_nolock ;
extern const struct file_operations gfs2_dir_fops_nolock ;
2008-10-14 19:05:55 +04:00
extern void gfs2_set_inode_flags ( struct inode * inode ) ;
2009-01-12 13:43:39 +03:00
# ifdef CONFIG_GFS2_FS_LOCKING_DLM
2009-04-07 21:42:17 +04:00
extern const struct file_operations gfs2_file_fops ;
extern const struct file_operations gfs2_dir_fops ;
2009-01-12 13:43:39 +03:00
static inline int gfs2_localflocks ( const struct gfs2_sbd * sdp )
{
return sdp - > sd_args . ar_localflocks ;
}
# else /* Single node only */
2009-04-07 21:42:17 +04:00
# define gfs2_file_fops gfs2_file_fops_nolock
# define gfs2_dir_fops gfs2_dir_fops_nolock
2009-01-12 13:43:39 +03:00
static inline int gfs2_localflocks ( const struct gfs2_sbd * sdp )
{
return 1 ;
}
# endif /* CONFIG_GFS2_FS_LOCKING_DLM */
2008-10-14 19:05:55 +04:00
2006-01-16 19:50:04 +03:00
# endif /* __INODE_DOT_H__ */