2005-04-17 02:20:36 +04:00
# include <linux/fs.h>
# include <linux/ext2_fs.h>
2005-07-13 00:58:29 +04:00
/*
* ext2 mount options
*/
struct ext2_mount_options {
unsigned long s_mount_opt ;
uid_t s_resuid ;
gid_t s_resgid ;
} ;
2005-04-17 02:20:36 +04:00
/*
* second extended file system inode data in memory
*/
struct ext2_inode_info {
__le32 i_data [ 15 ] ;
__u32 i_flags ;
__u32 i_faddr ;
__u8 i_frag_no ;
__u8 i_frag_size ;
__u16 i_state ;
__u32 i_file_acl ;
__u32 i_dir_acl ;
__u32 i_dtime ;
/*
* i_block_group is the number of the block group which contains
* this file ' s inode . Constant across the lifetime of the inode ,
* it is ued for making block allocation decisions - we try to
* place a file ' s data blocks near its inode block , and new inodes
* near to their parent directory ' s inode .
*/
__u32 i_block_group ;
2007-10-17 10:30:46 +04:00
/* block reservation info */
struct ext2_block_alloc_info * i_block_alloc_info ;
2005-04-17 02:20:36 +04:00
__u32 i_dir_start_lookup ;
# ifdef CONFIG_EXT2_FS_XATTR
/*
* Extended attributes can be read independently of the main file
2006-01-10 02:59:24 +03:00
* data . Taking i_mutex even when reading would cause contention
2005-04-17 02:20:36 +04:00
* between readers of EAs and writers of regular file data , so
* instead we synchronize on xattr_sem when reading or changing
* EAs .
*/
struct rw_semaphore xattr_sem ;
# endif
# ifdef CONFIG_EXT2_FS_POSIX_ACL
struct posix_acl * i_acl ;
struct posix_acl * i_default_acl ;
# endif
rwlock_t i_meta_lock ;
2007-10-17 10:30:46 +04:00
/*
* truncate_mutex is for serialising ext2_truncate ( ) against
* ext2_getblock ( ) . It also protects the internals of the inode ' s
* reservation data structures : ext2_reserve_window and
* ext2_reserve_window_node .
*/
struct mutex truncate_mutex ;
2005-04-17 02:20:36 +04:00
struct inode vfs_inode ;
2007-10-17 10:30:46 +04:00
struct list_head i_orphan ; /* unlinked but open inodes */
2005-04-17 02:20:36 +04:00
} ;
/*
* Inode dynamic state flags
*/
# define EXT2_STATE_NEW 0x00000001 /* inode is newly created */
/*
* Function prototypes
*/
/*
* Ok , these declarations are also in < linux / kernel . h > but none of the
* ext2 source programs needs to include it so they are duplicated here .
*/
static inline struct ext2_inode_info * EXT2_I ( struct inode * inode )
{
return container_of ( inode , struct ext2_inode_info , vfs_inode ) ;
}
/* balloc.c */
extern int ext2_bg_has_super ( struct super_block * sb , int group ) ;
extern unsigned long ext2_bg_num_gdb ( struct super_block * sb , int group ) ;
2007-10-17 10:30:46 +04:00
extern ext2_fsblk_t ext2_new_block ( struct inode * , unsigned long , int * ) ;
extern ext2_fsblk_t ext2_new_blocks ( struct inode * , unsigned long ,
unsigned long * , int * ) ;
2005-04-17 02:20:36 +04:00
extern void ext2_free_blocks ( struct inode * , unsigned long ,
unsigned long ) ;
extern unsigned long ext2_count_free_blocks ( struct super_block * ) ;
extern unsigned long ext2_count_dirs ( struct super_block * ) ;
extern void ext2_check_blocks_bitmap ( struct super_block * ) ;
extern struct ext2_group_desc * ext2_get_group_desc ( struct super_block * sb ,
unsigned int block_group ,
struct buffer_head * * bh ) ;
2007-10-17 10:30:46 +04:00
extern void ext2_discard_reservation ( struct inode * ) ;
extern int ext2_should_retry_alloc ( struct super_block * sb , int * retries ) ;
extern void ext2_init_block_alloc_info ( struct inode * ) ;
extern void ext2_rsv_window_add ( struct super_block * sb , struct ext2_reserve_window_node * rsv ) ;
2005-04-17 02:20:36 +04:00
/* dir.c */
extern int ext2_add_link ( struct dentry * , struct inode * ) ;
2008-08-24 15:28:39 +04:00
extern ino_t ext2_inode_by_name ( struct inode * , struct qstr * ) ;
2005-04-17 02:20:36 +04:00
extern int ext2_make_empty ( struct inode * , struct inode * ) ;
2008-08-24 15:28:39 +04:00
extern struct ext2_dir_entry_2 * ext2_find_entry ( struct inode * , struct qstr * , struct page * * ) ;
2005-04-17 02:20:36 +04:00
extern int ext2_delete_entry ( struct ext2_dir_entry_2 * , struct page * ) ;
extern int ext2_empty_dir ( struct inode * ) ;
extern struct ext2_dir_entry_2 * ext2_dotdot ( struct inode * , struct page * * ) ;
extern void ext2_set_link ( struct inode * , struct ext2_dir_entry_2 * , struct page * , struct inode * ) ;
/* fsync.c */
extern int ext2_sync_file ( struct file * , struct dentry * , int ) ;
/* ialloc.c */
extern struct inode * ext2_new_inode ( struct inode * , int ) ;
extern void ext2_free_inode ( struct inode * ) ;
extern unsigned long ext2_count_free_inodes ( struct super_block * ) ;
extern void ext2_check_inodes_bitmap ( struct super_block * ) ;
extern unsigned long ext2_count_free ( struct buffer_head * , unsigned ) ;
/* inode.c */
2008-02-07 11:15:35 +03:00
extern struct inode * ext2_iget ( struct super_block * , unsigned long ) ;
2005-04-17 02:20:36 +04:00
extern int ext2_write_inode ( struct inode * , int ) ;
extern void ext2_delete_inode ( struct inode * ) ;
extern int ext2_sync_inode ( struct inode * ) ;
extern int ext2_get_block ( struct inode * , sector_t , struct buffer_head * , int ) ;
extern void ext2_truncate ( struct inode * ) ;
extern int ext2_setattr ( struct dentry * , struct iattr * ) ;
extern void ext2_set_inode_flags ( struct inode * inode ) ;
2007-05-08 11:31:04 +04:00
extern void ext2_get_inode_flags ( struct ext2_inode_info * ) ;
2008-10-04 01:32:43 +04:00
extern int ext2_fiemap ( struct inode * inode , struct fiemap_extent_info * fieinfo ,
u64 start , u64 len ) ;
2007-10-16 12:25:04 +04:00
int __ext2_write_begin ( struct file * file , struct address_space * mapping ,
loff_t pos , unsigned len , unsigned flags ,
struct page * * pagep , void * * fsdata ) ;
2005-04-17 02:20:36 +04:00
/* ioctl.c */
2008-02-06 12:40:10 +03:00
extern long ext2_ioctl ( struct file * , unsigned int , unsigned long ) ;
2006-08-29 22:06:20 +04:00
extern long ext2_compat_ioctl ( struct file * , unsigned int , unsigned long ) ;
2005-04-17 02:20:36 +04:00
2006-03-24 14:15:53 +03:00
/* namei.c */
struct dentry * ext2_get_parent ( struct dentry * child ) ;
2005-04-17 02:20:36 +04:00
/* super.c */
extern void ext2_error ( struct super_block * , const char * , const char * , . . . )
__attribute__ ( ( format ( printf , 3 , 4 ) ) ) ;
extern void ext2_warning ( struct super_block * , const char * , const char * , . . . )
__attribute__ ( ( format ( printf , 3 , 4 ) ) ) ;
extern void ext2_update_dynamic_rev ( struct super_block * sb ) ;
extern void ext2_write_super ( struct super_block * ) ;
/*
* Inodes and files operations
*/
/* dir.c */
2006-03-28 13:56:42 +04:00
extern const struct file_operations ext2_dir_operations ;
2005-04-17 02:20:36 +04:00
/* file.c */
2007-02-12 11:55:38 +03:00
extern const struct inode_operations ext2_file_inode_operations ;
2006-03-28 13:56:42 +04:00
extern const struct file_operations ext2_file_operations ;
extern const struct file_operations ext2_xip_file_operations ;
2005-04-17 02:20:36 +04:00
/* inode.c */
2006-06-28 15:26:44 +04:00
extern const struct address_space_operations ext2_aops ;
extern const struct address_space_operations ext2_aops_xip ;
extern const struct address_space_operations ext2_nobh_aops ;
2005-04-17 02:20:36 +04:00
/* namei.c */
2007-02-12 11:55:38 +03:00
extern const struct inode_operations ext2_dir_inode_operations ;
extern const struct inode_operations ext2_special_inode_operations ;
2005-04-17 02:20:36 +04:00
/* symlink.c */
2007-02-12 11:55:38 +03:00
extern const struct inode_operations ext2_fast_symlink_inode_operations ;
extern const struct inode_operations ext2_symlink_inode_operations ;
2007-11-29 03:21:45 +03:00
static inline ext2_fsblk_t
ext2_group_first_block_no ( struct super_block * sb , unsigned long group_no )
{
return group_no * ( ext2_fsblk_t ) EXT2_BLOCKS_PER_GROUP ( sb ) +
le32_to_cpu ( EXT2_SB ( sb ) - > s_es - > s_first_data_block ) ;
}