LCOV - code coverage report
Current view: top level - fs/btrfs - volumes.h (source / functions) Hit Total Coverage
Test: btrfstest.info Lines: 3 7 42.9 %
Date: 2014-11-28 Functions: 0 0 -

          Line data    Source code
       1             : /*
       2             :  * Copyright (C) 2007 Oracle.  All rights reserved.
       3             :  *
       4             :  * This program is free software; you can redistribute it and/or
       5             :  * modify it under the terms of the GNU General Public
       6             :  * License v2 as published by the Free Software Foundation.
       7             :  *
       8             :  * This program is distributed in the hope that it will be useful,
       9             :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      10             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      11             :  * General Public License for more details.
      12             :  *
      13             :  * You should have received a copy of the GNU General Public
      14             :  * License along with this program; if not, write to the
      15             :  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
      16             :  * Boston, MA 021110-1307, USA.
      17             :  */
      18             : 
      19             : #ifndef __BTRFS_VOLUMES_
      20             : #define __BTRFS_VOLUMES_
      21             : 
      22             : #include <linux/bio.h>
      23             : #include <linux/sort.h>
      24             : #include <linux/btrfs.h>
      25             : #include "async-thread.h"
      26             : 
      27             : #define BTRFS_STRIPE_LEN        (64 * 1024)
      28             : 
      29             : struct buffer_head;
      30             : struct btrfs_pending_bios {
      31             :         struct bio *head;
      32             :         struct bio *tail;
      33             : };
      34             : 
      35             : struct btrfs_device {
      36             :         struct list_head dev_list;
      37             :         struct list_head dev_alloc_list;
      38             :         struct btrfs_fs_devices *fs_devices;
      39             :         struct btrfs_root *dev_root;
      40             : 
      41             :         /* regular prio bios */
      42             :         struct btrfs_pending_bios pending_bios;
      43             :         /* WRITE_SYNC bios */
      44             :         struct btrfs_pending_bios pending_sync_bios;
      45             : 
      46             :         u64 generation;
      47             :         int running_pending;
      48             :         int writeable;
      49             :         int in_fs_metadata;
      50             :         int missing;
      51             :         int can_discard;
      52             :         int is_tgtdev_for_dev_replace;
      53             : 
      54             :         spinlock_t io_lock;
      55             :         /* the mode sent to blkdev_get */
      56             :         fmode_t mode;
      57             : 
      58             :         struct block_device *bdev;
      59             : 
      60             : 
      61             :         struct rcu_string *name;
      62             : 
      63             :         /* the internal btrfs device id */
      64             :         u64 devid;
      65             : 
      66             :         /* size of the device */
      67             :         u64 total_bytes;
      68             : 
      69             :         /* size of the disk */
      70             :         u64 disk_total_bytes;
      71             : 
      72             :         /* bytes used */
      73             :         u64 bytes_used;
      74             : 
      75             :         /* optimal io alignment for this device */
      76             :         u32 io_align;
      77             : 
      78             :         /* optimal io width for this device */
      79             :         u32 io_width;
      80             :         /* type and info about this device */
      81             :         u64 type;
      82             : 
      83             :         /* minimal io size for this device */
      84             :         u32 sector_size;
      85             : 
      86             : 
      87             :         /* physical drive uuid (or lvm uuid) */
      88             :         u8 uuid[BTRFS_UUID_SIZE];
      89             : 
      90             :         /* for sending down flush barriers */
      91             :         int nobarriers;
      92             :         struct bio *flush_bio;
      93             :         struct completion flush_wait;
      94             : 
      95             :         /* per-device scrub information */
      96             :         struct scrub_ctx *scrub_device;
      97             : 
      98             :         struct btrfs_work work;
      99             :         struct rcu_head rcu;
     100             :         struct work_struct rcu_work;
     101             : 
     102             :         /* readahead state */
     103             :         spinlock_t reada_lock;
     104             :         atomic_t reada_in_flight;
     105             :         u64 reada_next;
     106             :         struct reada_zone *reada_curr_zone;
     107             :         struct radix_tree_root reada_zones;
     108             :         struct radix_tree_root reada_extents;
     109             : 
     110             : 
     111             :         /* disk I/O failure stats. For detailed description refer to
     112             :          * enum btrfs_dev_stat_values in ioctl.h */
     113             :         int dev_stats_valid;
     114             :         int dev_stats_dirty; /* counters need to be written to disk */
     115             :         atomic_t dev_stat_values[BTRFS_DEV_STAT_VALUES_MAX];
     116             : };
     117             : 
     118             : struct btrfs_fs_devices {
     119             :         u8 fsid[BTRFS_FSID_SIZE]; /* FS specific uuid */
     120             : 
     121             :         /* the device with this id has the most recent copy of the super */
     122             :         u64 latest_devid;
     123             :         u64 latest_trans;
     124             :         u64 num_devices;
     125             :         u64 open_devices;
     126             :         u64 rw_devices;
     127             :         u64 missing_devices;
     128             :         u64 total_rw_bytes;
     129             :         u64 num_can_discard;
     130             :         u64 total_devices;
     131             :         struct block_device *latest_bdev;
     132             : 
     133             :         /* all of the devices in the FS, protected by a mutex
     134             :          * so we can safely walk it to write out the supers without
     135             :          * worrying about add/remove by the multi-device code.
     136             :          * Scrubbing super can kick off supers writing by holding
     137             :          * this mutex lock.
     138             :          */
     139             :         struct mutex device_list_mutex;
     140             :         struct list_head devices;
     141             : 
     142             :         /* devices not currently being allocated */
     143             :         struct list_head alloc_list;
     144             :         struct list_head list;
     145             : 
     146             :         struct btrfs_fs_devices *seed;
     147             :         int seeding;
     148             : 
     149             :         int opened;
     150             : 
     151             :         /* set when we find or add a device that doesn't have the
     152             :          * nonrot flag set
     153             :          */
     154             :         int rotating;
     155             : };
     156             : 
     157             : #define BTRFS_BIO_INLINE_CSUM_SIZE      64
     158             : 
     159             : /*
     160             :  * we need the mirror number and stripe index to be passed around
     161             :  * the call chain while we are processing end_io (especially errors).
     162             :  * Really, what we need is a btrfs_bio structure that has this info
     163             :  * and is properly sized with its stripe array, but we're not there
     164             :  * quite yet.  We have our own btrfs bioset, and all of the bios
     165             :  * we allocate are actually btrfs_io_bios.  We'll cram as much of
     166             :  * struct btrfs_bio as we can into this over time.
     167             :  */
     168             : typedef void (btrfs_io_bio_end_io_t) (struct btrfs_io_bio *bio, int err);
     169             : struct btrfs_io_bio {
     170             :         unsigned long mirror_num;
     171             :         unsigned long stripe_index;
     172             :         u8 *csum;
     173             :         u8 csum_inline[BTRFS_BIO_INLINE_CSUM_SIZE];
     174             :         u8 *csum_allocated;
     175             :         btrfs_io_bio_end_io_t *end_io;
     176             :         struct bio bio;
     177             : };
     178             : 
     179             : static inline struct btrfs_io_bio *btrfs_io_bio(struct bio *bio)
     180             : {
     181             :         return container_of(bio, struct btrfs_io_bio, bio);
     182             : }
     183             : 
     184             : struct btrfs_bio_stripe {
     185             :         struct btrfs_device *dev;
     186             :         u64 physical;
     187             :         u64 length; /* only used for discard mappings */
     188             : };
     189             : 
     190             : struct btrfs_bio;
     191             : typedef void (btrfs_bio_end_io_t) (struct btrfs_bio *bio, int err);
     192             : 
     193             : #define BTRFS_BIO_ORIG_BIO_SUBMITTED    0x1
     194             : 
     195             : struct btrfs_bio {
     196             :         atomic_t stripes_pending;
     197             :         struct btrfs_fs_info *fs_info;
     198             :         bio_end_io_t *end_io;
     199             :         struct bio *orig_bio;
     200             :         unsigned long flags;
     201             :         void *private;
     202             :         atomic_t error;
     203             :         int max_errors;
     204             :         int num_stripes;
     205             :         int mirror_num;
     206             :         struct btrfs_bio_stripe stripes[];
     207             : };
     208             : 
     209             : struct btrfs_device_info {
     210             :         struct btrfs_device *dev;
     211             :         u64 dev_offset;
     212             :         u64 max_avail;
     213             :         u64 total_avail;
     214             : };
     215             : 
     216             : struct btrfs_raid_attr {
     217             :         int sub_stripes;        /* sub_stripes info for map */
     218             :         int dev_stripes;        /* stripes per dev */
     219             :         int devs_max;           /* max devs to use */
     220             :         int devs_min;           /* min devs needed */
     221             :         int devs_increment;     /* ndevs has to be a multiple of this */
     222             :         int ncopies;            /* how many copies to data has */
     223             : };
     224             : 
     225             : struct map_lookup {
     226             :         u64 type;
     227             :         int io_align;
     228             :         int io_width;
     229             :         int stripe_len;
     230             :         int sector_size;
     231             :         int num_stripes;
     232             :         int sub_stripes;
     233             :         struct btrfs_bio_stripe stripes[];
     234             : };
     235             : 
     236             : #define map_lookup_size(n) (sizeof(struct map_lookup) + \
     237             :                             (sizeof(struct btrfs_bio_stripe) * (n)))
     238             : 
     239             : /*
     240             :  * Restriper's general type filter
     241             :  */
     242             : #define BTRFS_BALANCE_DATA              (1ULL << 0)
     243             : #define BTRFS_BALANCE_SYSTEM            (1ULL << 1)
     244             : #define BTRFS_BALANCE_METADATA          (1ULL << 2)
     245             : 
     246             : #define BTRFS_BALANCE_TYPE_MASK         (BTRFS_BALANCE_DATA |       \
     247             :                                          BTRFS_BALANCE_SYSTEM |     \
     248             :                                          BTRFS_BALANCE_METADATA)
     249             : 
     250             : #define BTRFS_BALANCE_FORCE             (1ULL << 3)
     251             : #define BTRFS_BALANCE_RESUME            (1ULL << 4)
     252             : 
     253             : /*
     254             :  * Balance filters
     255             :  */
     256             : #define BTRFS_BALANCE_ARGS_PROFILES     (1ULL << 0)
     257             : #define BTRFS_BALANCE_ARGS_USAGE        (1ULL << 1)
     258             : #define BTRFS_BALANCE_ARGS_DEVID        (1ULL << 2)
     259             : #define BTRFS_BALANCE_ARGS_DRANGE       (1ULL << 3)
     260             : #define BTRFS_BALANCE_ARGS_VRANGE       (1ULL << 4)
     261             : #define BTRFS_BALANCE_ARGS_LIMIT        (1ULL << 5)
     262             : 
     263             : /*
     264             :  * Profile changing flags.  When SOFT is set we won't relocate chunk if
     265             :  * it already has the target profile (even though it may be
     266             :  * half-filled).
     267             :  */
     268             : #define BTRFS_BALANCE_ARGS_CONVERT      (1ULL << 8)
     269             : #define BTRFS_BALANCE_ARGS_SOFT         (1ULL << 9)
     270             : 
     271             : struct btrfs_balance_args;
     272             : struct btrfs_balance_progress;
     273             : struct btrfs_balance_control {
     274             :         struct btrfs_fs_info *fs_info;
     275             : 
     276             :         struct btrfs_balance_args data;
     277             :         struct btrfs_balance_args meta;
     278             :         struct btrfs_balance_args sys;
     279             : 
     280             :         u64 flags;
     281             : 
     282             :         struct btrfs_balance_progress stat;
     283             : };
     284             : 
     285             : int btrfs_account_dev_extents_size(struct btrfs_device *device, u64 start,
     286             :                                    u64 end, u64 *length);
     287             : 
     288             : #define btrfs_bio_size(n) (sizeof(struct btrfs_bio) + \
     289             :                             (sizeof(struct btrfs_bio_stripe) * (n)))
     290             : 
     291             : int btrfs_map_block(struct btrfs_fs_info *fs_info, int rw,
     292             :                     u64 logical, u64 *length,
     293             :                     struct btrfs_bio **bbio_ret, int mirror_num);
     294             : int btrfs_rmap_block(struct btrfs_mapping_tree *map_tree,
     295             :                      u64 chunk_start, u64 physical, u64 devid,
     296             :                      u64 **logical, int *naddrs, int *stripe_len);
     297             : int btrfs_read_sys_array(struct btrfs_root *root);
     298             : int btrfs_read_chunk_tree(struct btrfs_root *root);
     299             : int btrfs_alloc_chunk(struct btrfs_trans_handle *trans,
     300             :                       struct btrfs_root *extent_root, u64 type);
     301             : void btrfs_mapping_init(struct btrfs_mapping_tree *tree);
     302             : void btrfs_mapping_tree_free(struct btrfs_mapping_tree *tree);
     303             : int btrfs_map_bio(struct btrfs_root *root, int rw, struct bio *bio,
     304             :                   int mirror_num, int async_submit);
     305             : int btrfs_open_devices(struct btrfs_fs_devices *fs_devices,
     306             :                        fmode_t flags, void *holder);
     307             : int btrfs_scan_one_device(const char *path, fmode_t flags, void *holder,
     308             :                           struct btrfs_fs_devices **fs_devices_ret);
     309             : int btrfs_close_devices(struct btrfs_fs_devices *fs_devices);
     310             : void btrfs_close_extra_devices(struct btrfs_fs_info *fs_info,
     311             :                                struct btrfs_fs_devices *fs_devices, int step);
     312             : int btrfs_find_device_missing_or_by_path(struct btrfs_root *root,
     313             :                                          char *device_path,
     314             :                                          struct btrfs_device **device);
     315             : struct btrfs_device *btrfs_alloc_device(struct btrfs_fs_info *fs_info,
     316             :                                         const u64 *devid,
     317             :                                         const u8 *uuid);
     318             : int btrfs_rm_device(struct btrfs_root *root, char *device_path);
     319             : void btrfs_cleanup_fs_uuids(void);
     320             : int btrfs_num_copies(struct btrfs_fs_info *fs_info, u64 logical, u64 len);
     321             : int btrfs_grow_device(struct btrfs_trans_handle *trans,
     322             :                       struct btrfs_device *device, u64 new_size);
     323             : struct btrfs_device *btrfs_find_device(struct btrfs_fs_info *fs_info, u64 devid,
     324             :                                        u8 *uuid, u8 *fsid);
     325             : int btrfs_shrink_device(struct btrfs_device *device, u64 new_size);
     326             : int btrfs_init_new_device(struct btrfs_root *root, char *path);
     327             : int btrfs_init_dev_replace_tgtdev(struct btrfs_root *root, char *device_path,
     328             :                                   struct btrfs_device **device_out);
     329             : int btrfs_balance(struct btrfs_balance_control *bctl,
     330             :                   struct btrfs_ioctl_balance_args *bargs);
     331             : int btrfs_resume_balance_async(struct btrfs_fs_info *fs_info);
     332             : int btrfs_recover_balance(struct btrfs_fs_info *fs_info);
     333             : int btrfs_pause_balance(struct btrfs_fs_info *fs_info);
     334             : int btrfs_cancel_balance(struct btrfs_fs_info *fs_info);
     335             : int btrfs_create_uuid_tree(struct btrfs_fs_info *fs_info);
     336             : int btrfs_check_uuid_tree(struct btrfs_fs_info *fs_info);
     337             : int btrfs_chunk_readonly(struct btrfs_root *root, u64 chunk_offset);
     338             : int find_free_dev_extent(struct btrfs_trans_handle *trans,
     339             :                          struct btrfs_device *device, u64 num_bytes,
     340             :                          u64 *start, u64 *max_avail);
     341             : void btrfs_dev_stat_inc_and_print(struct btrfs_device *dev, int index);
     342             : int btrfs_get_dev_stats(struct btrfs_root *root,
     343             :                         struct btrfs_ioctl_get_dev_stats *stats);
     344             : void btrfs_init_devices_late(struct btrfs_fs_info *fs_info);
     345             : int btrfs_init_dev_stats(struct btrfs_fs_info *fs_info);
     346             : int btrfs_run_dev_stats(struct btrfs_trans_handle *trans,
     347             :                         struct btrfs_fs_info *fs_info);
     348             : void btrfs_rm_dev_replace_srcdev(struct btrfs_fs_info *fs_info,
     349             :                                  struct btrfs_device *srcdev);
     350             : void btrfs_destroy_dev_replace_tgtdev(struct btrfs_fs_info *fs_info,
     351             :                                       struct btrfs_device *tgtdev);
     352             : void btrfs_init_dev_replace_tgtdev_for_resume(struct btrfs_fs_info *fs_info,
     353             :                                               struct btrfs_device *tgtdev);
     354             : int btrfs_scratch_superblock(struct btrfs_device *device);
     355             : int btrfs_is_parity_mirror(struct btrfs_mapping_tree *map_tree,
     356             :                            u64 logical, u64 len, int mirror_num);
     357             : unsigned long btrfs_full_stripe_len(struct btrfs_root *root,
     358             :                                     struct btrfs_mapping_tree *map_tree,
     359             :                                     u64 logical);
     360             : int btrfs_finish_chunk_alloc(struct btrfs_trans_handle *trans,
     361             :                                 struct btrfs_root *extent_root,
     362             :                                 u64 chunk_offset, u64 chunk_size);
     363             : static inline void btrfs_dev_stat_inc(struct btrfs_device *dev,
     364             :                                       int index)
     365             : {
     366           0 :         atomic_inc(dev->dev_stat_values + index);
     367           0 :         dev->dev_stats_dirty = 1;
     368             : }
     369             : 
     370             : static inline int btrfs_dev_stat_read(struct btrfs_device *dev,
     371             :                                       int index)
     372             : {
     373        1785 :         return atomic_read(dev->dev_stat_values + index);
     374             : }
     375             : 
     376             : static inline int btrfs_dev_stat_read_and_reset(struct btrfs_device *dev,
     377             :                                                 int index)
     378             : {
     379             :         int ret;
     380             : 
     381           0 :         ret = atomic_xchg(dev->dev_stat_values + index, 0);
     382           0 :         dev->dev_stats_dirty = 1;
     383             :         return ret;
     384             : }
     385             : 
     386             : static inline void btrfs_dev_stat_set(struct btrfs_device *dev,
     387             :                                       int index, unsigned long val)
     388             : {
     389        1240 :         atomic_set(dev->dev_stat_values + index, val);
     390        1240 :         dev->dev_stats_dirty = 1;
     391             : }
     392             : 
     393             : static inline void btrfs_dev_stat_reset(struct btrfs_device *dev,
     394             :                                         int index)
     395             : {
     396             :         btrfs_dev_stat_set(dev, index, 0);
     397             : }
     398             : #endif

Generated by: LCOV version 1.10