2008-03-24 22:01:56 +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_VOLUMES_
# define __BTRFS_VOLUMES_
2008-04-04 00:29:03 +04:00
2008-04-10 00:28:12 +04:00
# include <linux/bio.h>
2008-06-12 00:50:36 +04:00
# include "async-thread.h"
2008-04-10 00:28:12 +04:00
2008-04-11 00:19:33 +04:00
struct buffer_head ;
2008-03-24 22:01:56 +03:00
struct btrfs_device {
struct list_head dev_list ;
2008-04-22 17:22:07 +04:00
struct list_head dev_alloc_list ;
2008-03-24 22:01:56 +03:00
struct btrfs_root * dev_root ;
2008-04-11 00:19:33 +04:00
struct buffer_head * pending_io ;
2008-06-12 00:50:36 +04:00
struct bio * pending_bios ;
struct bio * pending_bio_tail ;
int running_pending ;
2008-05-13 21:46:40 +04:00
u64 generation ;
2008-04-22 17:22:07 +04:00
2008-04-11 00:19:33 +04:00
int barriers ;
2008-05-13 21:46:40 +04:00
int in_fs_metadata ;
2008-04-22 17:22:07 +04:00
2008-04-04 00:29:03 +04:00
spinlock_t io_lock ;
2008-03-24 22:01:56 +03:00
struct block_device * bdev ;
2008-03-24 22:02:07 +03:00
char * name ;
2008-03-24 22:01:56 +03:00
/* the internal btrfs device id */
u64 devid ;
/* size of the device */
u64 total_bytes ;
/* bytes used */
u64 bytes_used ;
/* optimal io alignment for this device */
u32 io_align ;
/* optimal io width for this device */
u32 io_width ;
/* minimal io size for this device */
u32 sector_size ;
/* type and info about this device */
u64 type ;
/* physical drive uuid (or lvm uuid) */
2008-04-15 23:41:47 +04:00
u8 uuid [ BTRFS_UUID_SIZE ] ;
2008-06-12 00:50:36 +04:00
struct btrfs_work work ;
2008-03-24 22:01:56 +03:00
} ;
2008-03-24 22:02:07 +03:00
struct btrfs_fs_devices {
u8 fsid [ BTRFS_FSID_SIZE ] ; /* FS specific uuid */
/* the device with this id has the most recent coyp of the super */
u64 latest_devid ;
u64 latest_trans ;
u64 num_devices ;
2008-05-14 00:03:06 +04:00
u64 open_devices ;
2008-03-24 22:02:07 +03:00
struct block_device * latest_bdev ;
2008-04-22 17:22:07 +04:00
/* all of the devices in the FS */
2008-03-24 22:02:07 +03:00
struct list_head devices ;
2008-04-22 17:22:07 +04:00
/* devices not currently being allocated */
struct list_head alloc_list ;
2008-03-24 22:02:07 +03:00
struct list_head list ;
2008-05-14 00:03:06 +04:00
int mounted ;
2008-03-24 22:02:07 +03:00
} ;
2008-04-10 00:28:12 +04:00
struct btrfs_bio_stripe {
struct btrfs_device * dev ;
u64 physical ;
} ;
struct btrfs_multi_bio {
atomic_t stripes_pending ;
bio_end_io_t * end_io ;
void * private ;
2008-04-29 17:38:00 +04:00
atomic_t error ;
int max_errors ;
2008-04-10 00:28:12 +04:00
int num_stripes ;
struct btrfs_bio_stripe stripes [ ] ;
} ;
# define btrfs_multi_bio_size(n) (sizeof(struct btrfs_multi_bio) + \
( sizeof ( struct btrfs_bio_stripe ) * ( n ) ) )
2008-03-24 22:01:56 +03:00
int btrfs_alloc_dev_extent ( struct btrfs_trans_handle * trans ,
struct btrfs_device * device ,
2008-04-15 23:41:47 +04:00
u64 chunk_tree , u64 chunk_objectid ,
u64 chunk_offset ,
u64 num_bytes , u64 * start ) ;
2008-04-10 00:28:12 +04:00
int btrfs_map_block ( struct btrfs_mapping_tree * map_tree , int rw ,
u64 logical , u64 * length ,
2008-04-10 00:28:12 +04:00
struct btrfs_multi_bio * * multi_ret , int mirror_num ) ;
2008-03-24 22:01:56 +03:00
int btrfs_read_sys_array ( struct btrfs_root * root ) ;
int btrfs_read_chunk_tree ( struct btrfs_root * root ) ;
int btrfs_alloc_chunk ( struct btrfs_trans_handle * trans ,
struct btrfs_root * extent_root , u64 * start ,
2008-03-24 22:01:59 +03:00
u64 * num_bytes , u64 type ) ;
2008-03-24 22:01:56 +03:00
void btrfs_mapping_init ( struct btrfs_mapping_tree * tree ) ;
void btrfs_mapping_tree_free ( struct btrfs_mapping_tree * tree ) ;
2008-04-10 00:28:12 +04:00
int btrfs_map_bio ( struct btrfs_root * root , int rw , struct bio * bio ,
2008-06-12 00:50:36 +04:00
int mirror_num , int async_submit ) ;
2008-03-24 22:02:07 +03:00
int btrfs_read_super_device ( struct btrfs_root * root , struct extent_buffer * buf ) ;
2008-03-24 22:02:07 +03:00
int btrfs_open_devices ( struct btrfs_fs_devices * fs_devices ,
int flags , void * holder ) ;
int btrfs_scan_one_device ( const char * path , int flags , void * holder ,
struct btrfs_fs_devices * * fs_devices_ret ) ;
int btrfs_close_devices ( struct btrfs_fs_devices * fs_devices ) ;
2008-05-13 21:46:40 +04:00
int btrfs_close_extra_devices ( struct btrfs_fs_devices * fs_devices ) ;
2008-03-24 22:02:07 +03:00
int btrfs_add_device ( struct btrfs_trans_handle * trans ,
struct btrfs_root * root ,
struct btrfs_device * device ) ;
2008-05-07 19:43:44 +04:00
int btrfs_rm_device ( struct btrfs_root * root , char * device_path ) ;
2008-03-24 22:02:07 +03:00
int btrfs_cleanup_fs_uuids ( void ) ;
2008-04-10 00:28:12 +04:00
int btrfs_num_copies ( struct btrfs_mapping_tree * map_tree , u64 logical , u64 len ) ;
2008-04-21 18:03:05 +04:00
int btrfs_unplug_page ( struct btrfs_mapping_tree * map_tree ,
u64 logical , struct page * page ) ;
2008-04-26 00:53:30 +04:00
int btrfs_grow_device ( struct btrfs_trans_handle * trans ,
struct btrfs_device * device , u64 new_size ) ;
struct btrfs_device * btrfs_find_device ( struct btrfs_root * root , u64 devid ,
u8 * uuid ) ;
int btrfs_shrink_device ( struct btrfs_device * device , u64 new_size ) ;
2008-04-28 23:29:42 +04:00
int btrfs_init_new_device ( struct btrfs_root * root , char * path ) ;
2008-04-28 23:29:52 +04:00
int btrfs_balance ( struct btrfs_root * dev_root ) ;
2008-05-07 19:43:44 +04:00
void btrfs_unlock_volumes ( void ) ;
void btrfs_lock_volumes ( void ) ;
2008-03-24 22:01:56 +03:00
# endif