2008-01-08 23:46:30 +03:00
/*
* Copyright ( C ) 2007 Oracle . All rights reserved .
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public
* License v2 as published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* General Public License for more details .
*
* You should have received a copy of the GNU General Public
* License along with this program ; if not , write to the
* Free Software Foundation , Inc . , 59 Temple Place - Suite 330 ,
* Boston , MA 021110 - 1307 , USA .
*/
# ifndef __BTRFS_ORDERED_DATA__
# define __BTRFS_ORDERED_DATA__
2008-07-17 21:53:27 +04:00
/* one of these per inode */
2008-01-08 23:46:30 +03:00
struct btrfs_ordered_inode_tree {
2008-07-17 20:53:50 +04:00
struct mutex mutex ;
2008-01-08 23:46:30 +03:00
struct rb_root tree ;
2008-07-17 20:53:50 +04:00
struct rb_node * last ;
2008-01-08 23:46:30 +03:00
} ;
2008-07-17 21:53:27 +04:00
/*
* these are used to collect checksums done just before bios submission .
* They are attached via a list into the ordered extent , and
* checksum items are inserted into the tree after all the blocks in
* the ordered extent are on disk
*/
2008-07-17 20:53:50 +04:00
struct btrfs_sector_sum {
u64 offset ;
u32 sum ;
} ;
struct btrfs_ordered_sum {
u64 file_offset ;
2008-07-18 14:17:13 +04:00
/*
* this is the length in bytes covered by the sums array below .
* But , the sums array may not be contiguous in the file .
*/
unsigned long len ;
2008-07-17 20:53:50 +04:00
struct list_head list ;
2008-07-17 21:53:27 +04:00
/* last field is a variable length array of btrfs_sector_sums */
2008-07-23 07:06:42 +04:00
struct btrfs_sector_sum sums [ ] ;
2008-07-17 20:53:50 +04:00
} ;
2008-07-17 21:53:27 +04:00
/*
* bits for the flags field :
*
* BTRFS_ORDERED_IO_DONE is set when all of the blocks are written .
* It is used to make sure metadata is inserted into the tree only once
* per extent .
*
* BTRFS_ORDERED_COMPLETE is set when the extent is removed from the
* rbtree , just before waking any waiters . It is used to indicate the
* IO is done and any metadata is inserted into the tree .
*/
2008-07-17 20:53:50 +04:00
# define BTRFS_ORDERED_IO_DONE 0 /* set when all the pages are written */
2008-07-17 21:53:27 +04:00
2008-07-17 20:53:50 +04:00
# define BTRFS_ORDERED_COMPLETE 1 /* set when removed from the tree */
2008-08-05 21:05:02 +04:00
# define BTRFS_ORDERED_NOCOW 2 /* set when we want to write in place */
2008-07-17 20:53:50 +04:00
struct btrfs_ordered_extent {
2008-07-17 21:53:27 +04:00
/* logical offset in the file */
2008-07-17 20:53:50 +04:00
u64 file_offset ;
2008-07-17 21:53:27 +04:00
/* disk byte number */
2008-07-17 20:53:50 +04:00
u64 start ;
2008-07-17 21:53:27 +04:00
/* length of the extent in bytes */
2008-07-17 20:53:50 +04:00
u64 len ;
2008-07-17 21:53:27 +04:00
/* flags (described above) */
2008-07-17 20:53:50 +04:00
unsigned long flags ;
2008-07-17 21:53:27 +04:00
/* reference count */
2008-07-17 20:53:50 +04:00
atomic_t refs ;
2008-07-17 21:53:27 +04:00
2008-07-24 19:57:52 +04:00
/* the inode we belong to */
struct inode * inode ;
2008-07-17 21:53:27 +04:00
/* list of checksums for insertion when the extent io is done */
2008-07-17 20:53:50 +04:00
struct list_head list ;
2008-07-17 21:53:27 +04:00
/* used to wait for the BTRFS_ORDERED_COMPLETE bit */
2008-07-17 20:53:50 +04:00
wait_queue_head_t wait ;
2008-07-17 21:53:27 +04:00
/* our friendly rbtree entry */
2008-07-17 20:53:50 +04:00
struct rb_node rb_node ;
2008-07-24 19:57:52 +04:00
/* a per root list of all the pending ordered extents */
struct list_head root_extent_list ;
2008-07-17 20:53:50 +04:00
} ;
2008-07-17 21:53:27 +04:00
/*
* calculates the total size you need to allocate for an ordered sum
* structure spanning ' bytes ' in the file
*/
2008-07-23 17:26:26 +04:00
static inline int btrfs_ordered_sum_size ( struct btrfs_root * root ,
unsigned long bytes )
2008-07-17 20:53:50 +04:00
{
unsigned long num_sectors = ( bytes + root - > sectorsize - 1 ) /
root - > sectorsize ;
2008-07-18 14:17:13 +04:00
num_sectors + + ;
2008-07-17 20:53:50 +04:00
return sizeof ( struct btrfs_ordered_sum ) +
num_sectors * sizeof ( struct btrfs_sector_sum ) ;
}
2008-01-08 23:46:30 +03:00
static inline void
btrfs_ordered_inode_tree_init ( struct btrfs_ordered_inode_tree * t )
{
2008-07-17 20:53:50 +04:00
mutex_init ( & t - > mutex ) ;
2008-01-08 23:46:30 +03:00
t - > tree . rb_node = NULL ;
2008-07-17 20:53:50 +04:00
t - > last = NULL ;
2008-01-08 23:46:30 +03:00
}
2008-07-17 20:53:50 +04:00
int btrfs_put_ordered_extent ( struct btrfs_ordered_extent * entry ) ;
int btrfs_remove_ordered_extent ( struct inode * inode ,
struct btrfs_ordered_extent * entry ) ;
int btrfs_dec_test_ordered_pending ( struct inode * inode ,
u64 file_offset , u64 io_size ) ;
int btrfs_add_ordered_extent ( struct inode * inode , u64 file_offset ,
2008-08-05 21:05:02 +04:00
u64 start , u64 len , int nocow ) ;
2008-07-18 14:17:13 +04:00
int btrfs_add_ordered_sum ( struct inode * inode ,
struct btrfs_ordered_extent * entry ,
struct btrfs_ordered_sum * sum ) ;
2008-07-17 20:53:50 +04:00
struct btrfs_ordered_extent * btrfs_lookup_ordered_extent ( struct inode * inode ,
u64 file_offset ) ;
2008-07-17 21:53:27 +04:00
void btrfs_start_ordered_extent ( struct inode * inode ,
struct btrfs_ordered_extent * entry , int wait ) ;
2008-10-03 20:30:02 +04:00
int btrfs_wait_ordered_range ( struct inode * inode , u64 start , u64 len ) ;
2008-07-17 20:53:50 +04:00
struct btrfs_ordered_extent *
btrfs_lookup_first_ordered_extent ( struct inode * inode , u64 file_offset ) ;
2008-07-17 20:54:05 +04:00
int btrfs_ordered_update_i_size ( struct inode * inode ,
struct btrfs_ordered_extent * ordered ) ;
2008-07-17 20:54:15 +04:00
int btrfs_find_ordered_sum ( struct inode * inode , u64 offset , u32 * sum ) ;
2008-07-22 19:18:09 +04:00
int btrfs_wait_on_page_writeback_range ( struct address_space * mapping ,
pgoff_t start , pgoff_t end ) ;
int btrfs_fdatawrite_range ( struct address_space * mapping , loff_t start ,
loff_t end , int sync_mode ) ;
2008-08-05 21:05:02 +04:00
int btrfs_wait_ordered_extents ( struct btrfs_root * root , int nocow_only ) ;
2008-01-08 23:46:30 +03:00
# endif