2006-10-11 12:20:50 +04:00
/*
2008-04-30 02:13:32 +04:00
* ext4_i . h
2006-10-11 12:20:50 +04:00
*
* Copyright ( C ) 1992 , 1993 , 1994 , 1995
* Remy Card ( card @ masi . ibp . fr )
* Laboratoire MASI - Institut Blaise Pascal
* Universite Pierre et Marie Curie ( Paris VI )
*
* from
*
* linux / include / linux / minix_fs_i . h
*
* Copyright ( C ) 1991 , 1992 Linus Torvalds
*/
2008-04-30 02:13:32 +04:00
# ifndef _EXT4_I
# define _EXT4_I
2006-10-11 12:20:50 +04:00
# include <linux/rwsem.h>
# include <linux/rbtree.h>
# include <linux/seqlock.h>
# include <linux/mutex.h>
/* data type for block offset of block group */
2006-10-11 12:20:53 +04:00
typedef int ext4_grpblk_t ;
2006-10-11 12:20:50 +04:00
/* data type for filesystem-wide blocks number */
2006-10-11 12:21:11 +04:00
typedef unsigned long long ext4_fsblk_t ;
2006-10-11 12:20:50 +04:00
2008-01-29 07:58:27 +03:00
/* data type for file logical block number */
typedef __u32 ext4_lblk_t ;
2008-01-29 07:58:27 +03:00
/* data type for block group number */
2009-01-06 06:18:16 +03:00
typedef unsigned int ext4_group_t ;
2008-01-29 07:58:27 +03:00
2006-10-11 12:20:50 +04:00
# define rsv_start rsv_window._rsv_start
# define rsv_end rsv_window._rsv_end
2006-10-11 12:21:03 +04:00
/*
* storage for cached extent
*/
struct ext4_ext_cache {
2006-10-11 12:21:05 +04:00
ext4_fsblk_t ec_start ;
2008-01-29 07:58:27 +03:00
ext4_lblk_t ec_block ;
2006-10-11 12:21:05 +04:00
__u32 ec_len ; /* must be 32bit to return holes */
__u32 ec_type ;
2006-10-11 12:21:03 +04:00
} ;
2006-10-11 12:20:50 +04:00
/*
2008-07-12 03:27:31 +04:00
* fourth extended file system inode data in memory
2006-10-11 12:20:50 +04:00
*/
2006-10-11 12:20:53 +04:00
struct ext4_inode_info {
2006-10-11 12:20:50 +04:00
__le32 i_data [ 15 ] ; /* unconverted */
__u32 i_flags ;
2006-10-11 12:20:53 +04:00
ext4_fsblk_t i_file_acl ;
2006-10-11 12:20:50 +04:00
__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 .
*/
2008-01-29 07:58:27 +03:00
ext4_group_t i_block_group ;
2006-10-11 12:20:53 +04:00
__u32 i_state ; /* Dynamic state flags for ext4 */
2006-10-11 12:20:50 +04:00
2008-01-29 07:58:27 +03:00
ext4_lblk_t i_dir_start_lookup ;
2008-10-11 04:02:48 +04:00
# ifdef CONFIG_EXT4_FS_XATTR
2006-10-11 12:20:50 +04:00
/*
* Extended attributes can be read independently of the main file
* data . Taking i_mutex even when reading would cause contention
* 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
2008-10-11 04:02:48 +04:00
# ifdef CONFIG_EXT4_FS_POSIX_ACL
2006-10-11 12:20:50 +04:00
struct posix_acl * i_acl ;
struct posix_acl * i_default_acl ;
# endif
struct list_head i_orphan ; /* unlinked but open inodes */
/*
* i_disksize keeps track of what the inode size is ON DISK , not
* in memory . During truncate , i_size is set to the new size by
2006-10-11 12:20:53 +04:00
* the VFS prior to calling ext4_truncate ( ) , but the filesystem won ' t
2006-10-11 12:20:50 +04:00
* set i_disksize to 0 until the truncate is actually under way .
*
* The intent is that i_disksize always represents the blocks which
* are used by this file . This allows recovery to restart truncate
* on orphans if we crash during truncate . We actually write i_disksize
* into the on - disk inode when writing inodes out , instead of i_size .
*
* The only time when i_disksize and i_size may be different is when
* a truncate is in progress . The only things which change i_disksize
2006-10-11 12:20:53 +04:00
* are ext4_get_block ( growth ) and ext4_truncate ( shrinkth ) .
2006-10-11 12:20:50 +04:00
*/
loff_t i_disksize ;
/*
2008-01-29 07:58:26 +03:00
* i_data_sem is for serialising ext4_truncate ( ) against
2006-10-11 12:20:53 +04:00
* ext4_getblock ( ) . In the 2.4 ext2 design , great chunks of inode ' s
2006-10-11 12:20:50 +04:00
* data tree are chopped off during truncate . We can ' t do that in
2006-10-11 12:20:53 +04:00
* ext4 because whenever we perform intermediate commits during
2006-10-11 12:20:50 +04:00
* truncate , the inode and all the metadata blocks * must * be in a
* consistent state which allows truncation of the orphans to restart
* during recovery . Hence we must fix the get_block - vs - truncate race
2008-01-29 07:58:26 +03:00
* by other means , so we have i_data_sem .
2006-10-11 12:20:50 +04:00
*/
2008-01-29 07:58:26 +03:00
struct rw_semaphore i_data_sem ;
2006-10-11 12:20:50 +04:00
struct inode vfs_inode ;
2008-07-12 03:27:31 +04:00
struct jbd2_inode jinode ;
2006-10-11 12:21:03 +04:00
struct ext4_ext_cache i_cached_extent ;
2007-07-18 17:15:20 +04:00
/*
* File creation time . Its function is same as that of
* struct timespec i_ { a , c , m } time in the generic inode .
*/
struct timespec i_crtime ;
2008-01-29 08:19:52 +03:00
/* mballoc */
struct list_head i_prealloc_list ;
spinlock_t i_prealloc_lock ;
2008-07-15 01:52:37 +04:00
/* allocation reservation info for delalloc */
2008-11-05 08:14:04 +03:00
unsigned int i_reserved_data_blocks ;
unsigned int i_reserved_meta_blocks ;
unsigned int i_allocated_meta_blocks ;
2008-07-15 01:52:37 +04:00
unsigned short i_delalloc_reserved_flag ;
2008-11-05 08:14:04 +03:00
/* on-disk additional length */
__u16 i_extra_isize ;
2008-07-15 01:52:37 +04:00
spinlock_t i_block_reservation_lock ;
2006-10-11 12:20:50 +04:00
} ;
2008-04-30 02:13:32 +04:00
# endif /* _EXT4_I */