2012-11-09 00:18:54 +04:00
/*
* fs / ext4 / extents_status . h
*
* Written by Yongqiang Yang < xiaoqiangnk @ gmail . com >
* Modified by
* Allison Henderson < achender @ linux . vnet . ibm . com >
* Zheng Liu < wenqing . lz @ taobao . com >
*
*/
# ifndef _EXT4_EXTENTS_STATUS_H
# define _EXT4_EXTENTS_STATUS_H
2012-11-09 06:57:20 +04:00
/*
* Turn on ES_DEBUG__ to get lots of info about extent status operations .
*/
# ifdef ES_DEBUG__
# define es_debug(fmt, ...) printk(fmt, ##__VA_ARGS__)
# else
# define es_debug(fmt, ...) no_printk(fmt, ##__VA_ARGS__)
# endif
2013-02-18 09:26:51 +04:00
# define EXTENT_STATUS_WRITTEN 0x80000000 /* written extent */
# define EXTENT_STATUS_UNWRITTEN 0x40000000 /* unwritten extent */
# define EXTENT_STATUS_DELAYED 0x20000000 /* delayed extent */
# define EXTENT_STATUS_HOLE 0x10000000 /* hole */
# define EXTENT_STATUS_FLAGS (EXTENT_STATUS_WRITTEN | \
EXTENT_STATUS_UNWRITTEN | \
EXTENT_STATUS_DELAYED | \
EXTENT_STATUS_HOLE )
2012-11-09 00:18:54 +04:00
struct extent_status {
struct rb_node rb_node ;
2013-02-18 09:26:51 +04:00
ext4_lblk_t es_lblk ; /* first logical block extent covers */
ext4_lblk_t es_len ; /* length of extent in block */
2013-02-18 09:26:51 +04:00
ext4_fsblk_t es_pblk ; /* first physical block */
2012-11-09 00:18:54 +04:00
} ;
struct ext4_es_tree {
struct rb_root root ;
struct extent_status * cache_es ; /* recently accessed extent */
} ;
2012-11-09 06:57:20 +04:00
extern int __init ext4_init_es ( void ) ;
extern void ext4_exit_es ( void ) ;
extern void ext4_es_init_tree ( struct ext4_es_tree * tree ) ;
2013-02-18 09:26:51 +04:00
extern int ext4_es_insert_extent ( struct inode * inode , ext4_lblk_t lblk ,
2013-02-18 09:26:51 +04:00
ext4_lblk_t len , ext4_fsblk_t pblk ,
unsigned long long status ) ;
2013-02-18 09:26:51 +04:00
extern int ext4_es_remove_extent ( struct inode * inode , ext4_lblk_t lblk ,
2012-11-09 06:57:20 +04:00
ext4_lblk_t len ) ;
2013-02-18 09:27:26 +04:00
extern void ext4_es_find_delayed_extent ( struct inode * inode , ext4_lblk_t lblk ,
struct extent_status * es ) ;
2012-11-09 06:57:20 +04:00
2013-02-18 09:26:51 +04:00
static inline int ext4_es_is_written ( struct extent_status * es )
{
return ( es - > es_pblk & EXTENT_STATUS_WRITTEN ) ;
}
static inline int ext4_es_is_unwritten ( struct extent_status * es )
{
return ( es - > es_pblk & EXTENT_STATUS_UNWRITTEN ) ;
}
static inline int ext4_es_is_delayed ( struct extent_status * es )
{
return ( es - > es_pblk & EXTENT_STATUS_DELAYED ) ;
}
static inline int ext4_es_is_hole ( struct extent_status * es )
{
return ( es - > es_pblk & EXTENT_STATUS_HOLE ) ;
}
static inline ext4_fsblk_t ext4_es_status ( struct extent_status * es )
{
return ( es - > es_pblk & EXTENT_STATUS_FLAGS ) ;
}
static inline ext4_fsblk_t ext4_es_pblock ( struct extent_status * es )
{
return ( es - > es_pblk & ~ EXTENT_STATUS_FLAGS ) ;
}
static inline void ext4_es_store_pblock ( struct extent_status * es ,
ext4_fsblk_t pb )
{
ext4_fsblk_t block ;
block = ( pb & ~ EXTENT_STATUS_FLAGS ) |
( es - > es_pblk & EXTENT_STATUS_FLAGS ) ;
es - > es_pblk = block ;
}
static inline void ext4_es_store_status ( struct extent_status * es ,
unsigned long long status )
{
ext4_fsblk_t block ;
block = ( status & EXTENT_STATUS_FLAGS ) |
( es - > es_pblk & ~ EXTENT_STATUS_FLAGS ) ;
es - > es_pblk = block ;
}
2012-11-09 00:18:54 +04:00
# endif /* _EXT4_EXTENTS_STATUS_H */