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 ;
2009-04-20 23:50:09 +04:00
struct btrfs_pending_bios {
struct bio * head ;
struct bio * tail ;
} ;
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-11-18 05:11:30 +03:00
struct btrfs_fs_devices * fs_devices ;
2008-03-24 22:01:56 +03:00
struct btrfs_root * dev_root ;
2009-04-20 23:50:09 +04:00
/* regular prio bios */
struct btrfs_pending_bios pending_bios ;
/* WRITE_SYNC bios */
struct btrfs_pending_bios pending_sync_bios ;
2008-06-12 00:50:36 +04:00
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-11-18 05:11:30 +03:00
int writeable ;
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-11-20 05:17:22 +03:00
/* the mode sent to open_bdev_exclusive */
fmode_t mode ;
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 ;
2009-04-27 15:29:03 +04:00
/* size of the disk */
u64 disk_total_bytes ;
2008-03-24 22:01:56 +03:00
/* 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 */
2009-04-03 00:46:06 +04:00
/* the device with this id has the most recent copy of the super */
2008-03-24 22:02:07 +03:00
u64 latest_devid ;
u64 latest_trans ;
u64 num_devices ;
2008-05-14 00:03:06 +04:00
u64 open_devices ;
2008-11-18 05:11:30 +03:00
u64 rw_devices ;
u64 total_rw_bytes ;
2008-03-24 22:02:07 +03:00
struct block_device * latest_bdev ;
2009-06-10 23:17:02 +04:00
/* all of the devices in the FS, protected by a mutex
* so we can safely walk it to write out the supers without
* worrying about add / remove by the multi - device code
*/
struct mutex device_list_mutex ;
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-11-18 05:11:30 +03:00
struct btrfs_fs_devices * seed ;
int seeding ;
int opened ;
2009-06-10 17:51:32 +04:00
/* set when we find or add a device that doesn't have the
* nonrot flag set
*/
int rotating ;
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 ;
2008-08-05 18:13:57 +04:00
struct bio * orig_bio ;
2008-04-10 00:28:12 +04:00
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 ,
2008-11-18 05:11:30 +03:00
u64 chunk_offset , u64 start , u64 num_bytes ) ;
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-12-09 00:46:26 +03:00
int btrfs_rmap_block ( struct btrfs_mapping_tree * map_tree ,
u64 chunk_start , u64 physical , u64 devid ,
u64 * * logical , int * naddrs , int * stripe_len ) ;
2008-12-12 18:03:26 +03:00
int btrfs_read_sys_array ( struct btrfs_root * root ) ;
2008-03-24 22:01:56 +03:00
int btrfs_read_chunk_tree ( struct btrfs_root * root ) ;
int btrfs_alloc_chunk ( struct btrfs_trans_handle * trans ,
2008-11-18 05:11:30 +03:00
struct btrfs_root * extent_root , 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 ,
2008-12-02 14:36:09 +03:00
fmode_t flags , void * holder ) ;
int btrfs_scan_one_device ( const char * path , fmode_t flags , void * holder ,
2008-03-24 22:02:07 +03:00
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 ,
2008-11-18 05:11:30 +03:00
u8 * uuid , u8 * fsid ) ;
2008-04-26 00:53:30 +04:00
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-11-18 05:11:30 +03:00
int btrfs_chunk_readonly ( struct btrfs_root * root , u64 chunk_offset ) ;
2008-03-24 22:01:56 +03:00
# endif