2008-03-24 19:03:18 +00: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.
|
|
|
|
*/
|
|
|
|
|
2015-01-21 16:49:26 +00:00
|
|
|
#ifndef __BTRFS_VOLUMES_H__
|
|
|
|
#define __BTRFS_VOLUMES_H__
|
2012-02-22 02:20:54 +00:00
|
|
|
|
2015-06-10 00:21:42 +00:00
|
|
|
#include "kerncompat.h"
|
|
|
|
#include "ctree.h"
|
|
|
|
|
2017-01-24 03:03:05 +00:00
|
|
|
#define BTRFS_STRIPE_LEN SZ_64K
|
2013-12-16 12:33:57 +00:00
|
|
|
|
2008-03-24 19:03:18 +00:00
|
|
|
struct btrfs_device {
|
|
|
|
struct list_head dev_list;
|
|
|
|
struct btrfs_root *dev_root;
|
2008-11-18 15:40:06 +00:00
|
|
|
struct btrfs_fs_devices *fs_devices;
|
2008-03-24 19:03:18 +00:00
|
|
|
|
2008-04-03 20:35:48 +00:00
|
|
|
u64 total_ios;
|
|
|
|
|
2008-03-24 19:03:18 +00:00
|
|
|
int fd;
|
|
|
|
|
2008-11-18 15:40:06 +00:00
|
|
|
int writeable;
|
|
|
|
|
2008-03-24 19:05:44 +00:00
|
|
|
char *name;
|
|
|
|
|
2008-04-22 18:06:31 +00:00
|
|
|
/* these are read off the super block, only in the progs */
|
|
|
|
char *label;
|
|
|
|
u64 total_devs;
|
|
|
|
u64 super_bytes_used;
|
|
|
|
|
2014-10-06 10:16:46 +00:00
|
|
|
u64 generation;
|
|
|
|
|
2008-03-24 19:03:18 +00: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 19:42:08 +00:00
|
|
|
u8 uuid[BTRFS_UUID_SIZE];
|
2008-03-24 19:03:18 +00:00
|
|
|
};
|
|
|
|
|
2008-03-24 19:05:44 +00:00
|
|
|
struct btrfs_fs_devices {
|
|
|
|
u8 fsid[BTRFS_FSID_SIZE]; /* FS specific uuid */
|
|
|
|
|
2014-06-13 23:43:56 +00:00
|
|
|
/* the device with this id has the most recent copy of the super */
|
2008-03-24 19:05:44 +00:00
|
|
|
u64 latest_devid;
|
|
|
|
u64 latest_trans;
|
|
|
|
u64 lowest_devid;
|
|
|
|
int latest_bdev;
|
|
|
|
int lowest_bdev;
|
|
|
|
struct list_head devices;
|
|
|
|
struct list_head list;
|
2008-11-18 15:40:06 +00:00
|
|
|
|
|
|
|
int seeding;
|
|
|
|
struct btrfs_fs_devices *seed;
|
2008-03-24 19:05:44 +00:00
|
|
|
};
|
|
|
|
|
2008-04-09 20:28:12 +00:00
|
|
|
struct btrfs_bio_stripe {
|
|
|
|
struct btrfs_device *dev;
|
|
|
|
u64 physical;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct btrfs_multi_bio {
|
|
|
|
int error;
|
|
|
|
int num_stripes;
|
|
|
|
struct btrfs_bio_stripe stripes[];
|
|
|
|
};
|
|
|
|
|
2012-02-22 02:20:54 +00:00
|
|
|
struct map_lookup {
|
|
|
|
struct cache_extent ce;
|
|
|
|
u64 type;
|
|
|
|
int io_align;
|
|
|
|
int io_width;
|
|
|
|
int stripe_len;
|
|
|
|
int sector_size;
|
|
|
|
int num_stripes;
|
|
|
|
int sub_stripes;
|
|
|
|
struct btrfs_bio_stripe stripes[];
|
|
|
|
};
|
|
|
|
|
btrfs-progs: Introduce new btrfs_map_block function which returns more unified result.
Introduce a new function, __btrfs_map_block_v2().
Unlike old btrfs_map_block(), which needs different parameter to handle
different RAID profile, this new function uses unified btrfs_map_block
structure to handle all RAID profile in a more meaningful method:
Return physical address along with logical address for each stripe.
For RAID1/Single/DUP (none-stripped):
result would be like:
Map block: Logical 128M, Len 10M, Type RAID1, Stripe len 0, Nr_stripes 2
Stripe 0: Logical 128M, Physical X, Len: 10M Dev dev1
Stripe 1: Logical 128M, Physical Y, Len: 10M Dev dev2
Result will be as long as possible, since it's not stripped at all.
For RAID0/10 (stripped without parity):
Result will be aligned to full stripe size:
Map block: Logical 64K, Len 128K, Type RAID10, Stripe len 64K, Nr_stripes 4
Stripe 0: Logical 64K, Physical X, Len 64K Dev dev1
Stripe 1: Logical 64K, Physical Y, Len 64K Dev dev2
Stripe 2: Logical 128K, Physical Z, Len 64K Dev dev3
Stripe 3: Logical 128K, Physical W, Len 64K Dev dev4
For RAID5/6 (stripped with parity and dev-rotation):
Result will be aligned to full stripe size:
Map block: Logical 64K, Len 128K, Type RAID6, Stripe len 64K, Nr_stripes 4
Stripe 0: Logical 64K, Physical X, Len 64K Dev dev1
Stripe 1: Logical 128K, Physical Y, Len 64K Dev dev2
Stripe 2: Logical RAID5_P, Physical Z, Len 64K Dev dev3
Stripe 3: Logical RAID6_Q, Physical W, Len 64K Dev dev4
The new unified layout should be very flex and can even handle things
like N-way RAID1 (which old mirror_num basic one can't handle well).
Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
Signed-off-by: Gu Jinxiang <gujx@cn.fujitsu.com>
2017-07-14 07:31:08 +00:00
|
|
|
struct btrfs_map_stripe {
|
|
|
|
struct btrfs_device *dev;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Logical address of the stripe start.
|
|
|
|
* Caller should check if this logical is the desired map start.
|
|
|
|
* It's possible that the logical is smaller or larger than desired
|
|
|
|
* map range.
|
|
|
|
*
|
|
|
|
* For P/Q stipre, it will be BTRFS_RAID5_P_STRIPE
|
|
|
|
* and BTRFS_RAID6_Q_STRIPE.
|
|
|
|
*/
|
|
|
|
u64 logical;
|
|
|
|
|
|
|
|
u64 physical;
|
|
|
|
|
|
|
|
/* The length of the stripe */
|
|
|
|
u64 length;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct btrfs_map_block {
|
|
|
|
/*
|
|
|
|
* The logical start of the whole map block.
|
|
|
|
* For RAID5/6 it will be the bytenr of the full stripe start,
|
|
|
|
* so it's possible that @start is smaller than desired map range
|
|
|
|
* start.
|
|
|
|
*/
|
|
|
|
u64 start;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* The logical length of the map block.
|
|
|
|
* For RAID5/6 it will be total data stripe size
|
|
|
|
*/
|
|
|
|
u64 length;
|
|
|
|
|
|
|
|
/* Block group type */
|
|
|
|
u64 type;
|
|
|
|
|
|
|
|
/* Stripe length, for non-stripped mode, it will be 0 */
|
|
|
|
u32 stripe_len;
|
|
|
|
|
|
|
|
int num_stripes;
|
|
|
|
struct btrfs_map_stripe stripes[];
|
|
|
|
};
|
|
|
|
|
2008-04-09 20:28:12 +00:00
|
|
|
#define btrfs_multi_bio_size(n) (sizeof(struct btrfs_multi_bio) + \
|
|
|
|
(sizeof(struct btrfs_bio_stripe) * (n)))
|
2013-07-03 13:25:17 +00:00
|
|
|
#define btrfs_map_lookup_size(n) (sizeof(struct map_lookup) + \
|
|
|
|
(sizeof(struct btrfs_bio_stripe) * (n)))
|
2008-04-09 20:28:12 +00:00
|
|
|
|
2012-02-03 19:02:29 +00:00
|
|
|
/*
|
|
|
|
* Restriper's general type filter
|
|
|
|
*/
|
|
|
|
#define BTRFS_BALANCE_DATA (1ULL << 0)
|
|
|
|
#define BTRFS_BALANCE_SYSTEM (1ULL << 1)
|
|
|
|
#define BTRFS_BALANCE_METADATA (1ULL << 2)
|
|
|
|
|
|
|
|
#define BTRFS_BALANCE_TYPE_MASK (BTRFS_BALANCE_DATA | \
|
|
|
|
BTRFS_BALANCE_SYSTEM | \
|
|
|
|
BTRFS_BALANCE_METADATA)
|
|
|
|
|
|
|
|
#define BTRFS_BALANCE_FORCE (1ULL << 3)
|
|
|
|
#define BTRFS_BALANCE_RESUME (1ULL << 4)
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Balance filters
|
|
|
|
*/
|
|
|
|
#define BTRFS_BALANCE_ARGS_PROFILES (1ULL << 0)
|
|
|
|
#define BTRFS_BALANCE_ARGS_USAGE (1ULL << 1)
|
|
|
|
#define BTRFS_BALANCE_ARGS_DEVID (1ULL << 2)
|
|
|
|
#define BTRFS_BALANCE_ARGS_DRANGE (1ULL << 3)
|
|
|
|
#define BTRFS_BALANCE_ARGS_VRANGE (1ULL << 4)
|
2014-05-07 15:38:00 +00:00
|
|
|
#define BTRFS_BALANCE_ARGS_LIMIT (1ULL << 5)
|
2015-10-11 22:34:58 +00:00
|
|
|
#define BTRFS_BALANCE_ARGS_LIMIT_RANGE (1ULL << 6)
|
2015-09-28 22:33:04 +00:00
|
|
|
#define BTRFS_BALANCE_ARGS_STRIPES_RANGE (1ULL << 7)
|
2015-10-22 08:19:38 +00:00
|
|
|
#define BTRFS_BALANCE_ARGS_USAGE_RANGE (1ULL << 10)
|
2012-02-03 19:02:29 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Profile changing flags. When SOFT is set we won't relocate chunk if
|
|
|
|
* it already has the target profile (even though it may be
|
|
|
|
* half-filled).
|
|
|
|
*/
|
|
|
|
#define BTRFS_BALANCE_ARGS_CONVERT (1ULL << 8)
|
|
|
|
#define BTRFS_BALANCE_ARGS_SOFT (1ULL << 9)
|
|
|
|
|
2009-07-11 17:12:37 +00:00
|
|
|
#define BTRFS_RAID5_P_STRIPE ((u64)-2)
|
|
|
|
#define BTRFS_RAID6_Q_STRIPE ((u64)-1)
|
|
|
|
|
2015-07-23 09:18:08 +00:00
|
|
|
/*
|
|
|
|
* Check if the given range cross stripes.
|
|
|
|
* To ensure kernel scrub won't causing bug on with METADATA in mixed
|
|
|
|
* block group
|
2016-10-24 07:22:33 +00:00
|
|
|
*
|
|
|
|
* Return 1 if the range crosses STRIPE boundary
|
|
|
|
* Return 0 if the range doesn't cross STRIPE boundary or it
|
|
|
|
* doesn't belong to any block group (no boundary to cross)
|
2015-07-23 09:18:08 +00:00
|
|
|
*/
|
2016-10-24 07:22:33 +00:00
|
|
|
static inline int check_crossing_stripes(struct btrfs_fs_info *fs_info,
|
|
|
|
u64 start, u64 len)
|
2015-07-23 09:18:08 +00:00
|
|
|
{
|
2016-10-24 07:22:33 +00:00
|
|
|
struct btrfs_block_group_cache *bg_cache;
|
|
|
|
u64 bg_offset;
|
|
|
|
|
|
|
|
bg_cache = btrfs_lookup_block_group(fs_info, start);
|
|
|
|
/*
|
|
|
|
* Does not belong to block group, no boundary to cross
|
|
|
|
* although it's a bigger problem, but here we don't care.
|
|
|
|
*/
|
|
|
|
if (!bg_cache)
|
|
|
|
return 0;
|
|
|
|
bg_offset = start - bg_cache->key.objectid;
|
|
|
|
|
|
|
|
return (bg_offset / BTRFS_STRIPE_LEN !=
|
|
|
|
(bg_offset + len - 1) / BTRFS_STRIPE_LEN);
|
2015-07-23 09:18:08 +00:00
|
|
|
}
|
2009-07-11 17:12:37 +00:00
|
|
|
|
2017-06-13 09:19:17 +00:00
|
|
|
int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw,
|
2011-08-26 13:51:36 +00:00
|
|
|
u64 logical, u64 *length, u64 *type,
|
2009-07-11 17:12:37 +00:00
|
|
|
struct btrfs_multi_bio **multi_ret, int mirror_num,
|
|
|
|
u64 **raid_map);
|
2017-06-13 09:19:17 +00:00
|
|
|
int btrfs_map_block(struct btrfs_fs_info *fs_info, int rw,
|
2008-04-09 20:28:12 +00:00
|
|
|
u64 logical, u64 *length,
|
2009-07-11 17:12:37 +00:00
|
|
|
struct btrfs_multi_bio **multi_ret, int mirror_num,
|
|
|
|
u64 **raid_map_ret);
|
btrfs-progs: Introduce new btrfs_map_block function which returns more unified result.
Introduce a new function, __btrfs_map_block_v2().
Unlike old btrfs_map_block(), which needs different parameter to handle
different RAID profile, this new function uses unified btrfs_map_block
structure to handle all RAID profile in a more meaningful method:
Return physical address along with logical address for each stripe.
For RAID1/Single/DUP (none-stripped):
result would be like:
Map block: Logical 128M, Len 10M, Type RAID1, Stripe len 0, Nr_stripes 2
Stripe 0: Logical 128M, Physical X, Len: 10M Dev dev1
Stripe 1: Logical 128M, Physical Y, Len: 10M Dev dev2
Result will be as long as possible, since it's not stripped at all.
For RAID0/10 (stripped without parity):
Result will be aligned to full stripe size:
Map block: Logical 64K, Len 128K, Type RAID10, Stripe len 64K, Nr_stripes 4
Stripe 0: Logical 64K, Physical X, Len 64K Dev dev1
Stripe 1: Logical 64K, Physical Y, Len 64K Dev dev2
Stripe 2: Logical 128K, Physical Z, Len 64K Dev dev3
Stripe 3: Logical 128K, Physical W, Len 64K Dev dev4
For RAID5/6 (stripped with parity and dev-rotation):
Result will be aligned to full stripe size:
Map block: Logical 64K, Len 128K, Type RAID6, Stripe len 64K, Nr_stripes 4
Stripe 0: Logical 64K, Physical X, Len 64K Dev dev1
Stripe 1: Logical 128K, Physical Y, Len 64K Dev dev2
Stripe 2: Logical RAID5_P, Physical Z, Len 64K Dev dev3
Stripe 3: Logical RAID6_Q, Physical W, Len 64K Dev dev4
The new unified layout should be very flex and can even handle things
like N-way RAID1 (which old mirror_num basic one can't handle well).
Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
Signed-off-by: Gu Jinxiang <gujx@cn.fujitsu.com>
2017-07-14 07:31:08 +00:00
|
|
|
|
|
|
|
/*
|
|
|
|
* TODO: Use this map_block_v2 to replace __btrfs_map_block()
|
|
|
|
*
|
|
|
|
* New btrfs_map_block(), unlike old one, each stripe will contain the
|
|
|
|
* physical offset *AND* logical address.
|
|
|
|
* So caller won't ever need to care about how the stripe/mirror is organized.
|
|
|
|
* Which makes csum check quite easy.
|
|
|
|
*
|
|
|
|
* Only P/Q based profile needs to care their P/Q stripe.
|
|
|
|
*
|
|
|
|
* @map_ret example:
|
|
|
|
* Raid1:
|
|
|
|
* Map block: logical=128M len=10M type=RAID1 stripe_len=0 nr_stripes=2
|
|
|
|
* Stripe 0: logical=128M physical=X len=10M dev=devid1
|
|
|
|
* Stripe 1: logical=128M physical=Y len=10M dev=devid2
|
|
|
|
*
|
|
|
|
* Raid10:
|
|
|
|
* Map block: logical=64K len=128K type=RAID10 stripe_len=64K nr_stripes=4
|
|
|
|
* Stripe 0: logical=64K physical=X len=64K dev=devid1
|
|
|
|
* Stripe 1: logical=64K physical=Y len=64K dev=devid2
|
|
|
|
* Stripe 2: logical=128K physical=Z len=64K dev=devid3
|
|
|
|
* Stripe 3: logical=128K physical=W len=64K dev=devid4
|
|
|
|
*
|
|
|
|
* Raid6:
|
|
|
|
* Map block: logical=64K len=128K type=RAID6 stripe_len=64K nr_stripes=4
|
|
|
|
* Stripe 0: logical=64K physical=X len=64K dev=devid1
|
|
|
|
* Stripe 1: logical=128K physical=Y len=64K dev=devid2
|
|
|
|
* Stripe 2: logical=RAID5_P physical=Z len=64K dev=devid3
|
|
|
|
* Stripe 3: logical=RAID6_Q physical=W len=64K dev=devid4
|
|
|
|
*/
|
|
|
|
int __btrfs_map_block_v2(struct btrfs_fs_info *fs_info, int rw, u64 logical,
|
|
|
|
u64 length, struct btrfs_map_block **map_ret);
|
2017-06-13 09:19:19 +00:00
|
|
|
int btrfs_next_bg(struct btrfs_fs_info *map_tree, u64 *logical,
|
2015-11-13 02:53:41 +00:00
|
|
|
u64 *size, u64 type);
|
2017-06-13 09:19:19 +00:00
|
|
|
static inline int btrfs_next_bg_metadata(struct btrfs_fs_info *fs_info,
|
|
|
|
u64 *logical, u64 *size)
|
2015-11-13 02:53:41 +00:00
|
|
|
{
|
2017-06-13 09:19:19 +00:00
|
|
|
return btrfs_next_bg(fs_info, logical, size,
|
2015-11-13 02:53:41 +00:00
|
|
|
BTRFS_BLOCK_GROUP_METADATA);
|
|
|
|
}
|
2017-06-13 09:19:19 +00:00
|
|
|
static inline int btrfs_next_bg_system(struct btrfs_fs_info *fs_info,
|
|
|
|
u64 *logical, u64 *size)
|
2015-11-13 02:53:41 +00:00
|
|
|
{
|
2017-06-13 09:19:19 +00:00
|
|
|
return btrfs_next_bg(fs_info, logical, size,
|
2015-11-13 02:53:41 +00:00
|
|
|
BTRFS_BLOCK_GROUP_SYSTEM);
|
|
|
|
}
|
2017-06-13 09:19:17 +00:00
|
|
|
int btrfs_rmap_block(struct btrfs_fs_info *fs_info,
|
2008-12-05 17:21:31 +00:00
|
|
|
u64 chunk_start, u64 physical, u64 devid,
|
|
|
|
u64 **logical, int *naddrs, int *stripe_len);
|
2017-06-13 09:19:30 +00:00
|
|
|
int btrfs_read_sys_array(struct btrfs_fs_info *fs_info);
|
|
|
|
int btrfs_read_chunk_tree(struct btrfs_fs_info *fs_info);
|
2008-03-24 19:03:18 +00:00
|
|
|
int btrfs_alloc_chunk(struct btrfs_trans_handle *trans,
|
2017-06-13 09:19:35 +00:00
|
|
|
struct btrfs_fs_info *fs_info, u64 *start,
|
2008-03-24 19:03:58 +00:00
|
|
|
u64 *num_bytes, u64 type);
|
2010-07-08 09:17:59 +00:00
|
|
|
int btrfs_alloc_data_chunk(struct btrfs_trans_handle *trans,
|
2017-06-13 09:19:35 +00:00
|
|
|
struct btrfs_fs_info *fs_info, u64 *start,
|
2016-01-29 05:03:22 +00:00
|
|
|
u64 num_bytes, u64 type, int convert);
|
2008-03-24 19:05:44 +00:00
|
|
|
int btrfs_open_devices(struct btrfs_fs_devices *fs_devices,
|
|
|
|
int flags);
|
|
|
|
int btrfs_close_devices(struct btrfs_fs_devices *fs_devices);
|
2015-08-24 08:45:02 +00:00
|
|
|
void btrfs_close_all_devices(void);
|
2008-03-24 19:05:44 +00:00
|
|
|
int btrfs_add_device(struct btrfs_trans_handle *trans,
|
2017-06-13 09:19:33 +00:00
|
|
|
struct btrfs_fs_info *fs_info,
|
2008-03-24 19:05:44 +00:00
|
|
|
struct btrfs_device *device);
|
2008-04-22 18:06:56 +00:00
|
|
|
int btrfs_update_device(struct btrfs_trans_handle *trans,
|
|
|
|
struct btrfs_device *device);
|
2008-03-24 19:05:44 +00:00
|
|
|
int btrfs_scan_one_device(int fd, const char *path,
|
|
|
|
struct btrfs_fs_devices **fs_devices_ret,
|
2016-08-19 14:36:40 +00:00
|
|
|
u64 *total_devs, u64 super_offset, unsigned sbflags);
|
2017-06-13 09:19:18 +00:00
|
|
|
int btrfs_num_copies(struct btrfs_fs_info *fs_info, u64 logical, u64 len);
|
2008-04-22 18:06:31 +00:00
|
|
|
struct list_head *btrfs_scanned_uuids(void);
|
2017-06-13 09:19:31 +00:00
|
|
|
int btrfs_add_system_chunk(struct btrfs_fs_info *fs_info, struct btrfs_key *key,
|
2008-04-22 18:06:56 +00:00
|
|
|
struct btrfs_chunk *chunk, int item_size);
|
2017-06-13 09:19:32 +00:00
|
|
|
int btrfs_chunk_readonly(struct btrfs_fs_info *fs_info, u64 chunk_offset);
|
2013-07-03 13:25:19 +00:00
|
|
|
struct btrfs_device *
|
|
|
|
btrfs_find_device_by_devid(struct btrfs_fs_devices *fs_devices,
|
|
|
|
u64 devid, int instance);
|
2017-06-13 09:19:29 +00:00
|
|
|
struct btrfs_device *btrfs_find_device(struct btrfs_fs_info *fs_info, u64 devid,
|
2013-07-03 13:25:17 +00:00
|
|
|
u8 *uuid, u8 *fsid);
|
Btrfs-progs: enhance btrfs-image to restore image onto multiple disks
This adds a 'btrfs-image -m' option, which let us restore an image that
is built from a btrfs of multiple disks onto several disks altogether.
This aims to address the following case,
$ mkfs.btrfs -m raid0 sda sdb
$ btrfs-image sda image.file
$ btrfs-image -r image.file sdc
---------
so we can only restore metadata onto sdc, and another thing is we can
only mount sdc with degraded mode as we don't provide informations of
another disk. And, it's built as RAID0 and we have only one disk,
so after mount sdc we'll get into readonly mode.
This is just annoying for people(like me) who're trying to restore image
but turn to find they cannot make it work.
So this'll make your life easier, just tap
$ btrfs-image -m image.file sdc sdd
---------
then you get everything about metadata done, the same offset with that of
the originals(of course, you need offer enough disk size, at least the disk
size of the original disks).
Besides, this also works with raid5 and raid6 metadata image.
Signed-off-by: Liu Bo <bo.li.liu@oracle.com>
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
2013-06-22 05:32:45 +00:00
|
|
|
int write_raid56_with_parity(struct btrfs_fs_info *info,
|
|
|
|
struct extent_buffer *eb,
|
|
|
|
struct btrfs_multi_bio *multi,
|
|
|
|
u64 stripe_len, u64 *raid_map);
|
2017-06-13 09:19:28 +00:00
|
|
|
int btrfs_check_chunk_valid(struct btrfs_fs_info *fs_info,
|
2016-08-29 08:09:02 +00:00
|
|
|
struct extent_buffer *leaf,
|
|
|
|
struct btrfs_chunk *chunk,
|
|
|
|
int slot, u64 logical);
|
2017-05-31 05:56:08 +00:00
|
|
|
u64 btrfs_stripe_length(struct btrfs_fs_info *fs_info,
|
|
|
|
struct extent_buffer *leaf,
|
|
|
|
struct btrfs_chunk *chunk);
|
2008-03-24 19:03:18 +00:00
|
|
|
#endif
|