提交 b3d3fa51 编写于 作者: M Mike Christie 提交者: Jens Axboe

btrfs: update __btrfs_map_block for REQ_OP transition

We no longer pass in a bitmap of rq_flag_bits bits to __btrfs_map_block.
It will always be a REQ_OP, or the btrfs specific REQ_GET_READ_MIRRORS,
so this drops the bit tests.
Signed-off-by: NMike Christie <mchristi@redhat.com>
Reviewed-by: NChristoph Hellwig <hch@lst.de>
Reviewed-by: NHannes Reinecke <hare@suse.com>
Signed-off-by: NJens Axboe <axboe@fb.com>
上级 37226b21
...@@ -2048,7 +2048,7 @@ int btrfs_discard_extent(struct btrfs_root *root, u64 bytenr, ...@@ -2048,7 +2048,7 @@ int btrfs_discard_extent(struct btrfs_root *root, u64 bytenr,
*/ */
btrfs_bio_counter_inc_blocked(root->fs_info); btrfs_bio_counter_inc_blocked(root->fs_info);
/* Tell the block device(s) that the sectors can be discarded */ /* Tell the block device(s) that the sectors can be discarded */
ret = btrfs_map_block(root->fs_info, REQ_DISCARD, ret = btrfs_map_block(root->fs_info, REQ_OP_DISCARD,
bytenr, &num_bytes, &bbio, 0); bytenr, &num_bytes, &bbio, 0);
/* Error condition is -ENOMEM */ /* Error condition is -ENOMEM */
if (!ret) { if (!ret) {
......
...@@ -1838,7 +1838,7 @@ int btrfs_merge_bio_hook(int rw, struct page *page, unsigned long offset, ...@@ -1838,7 +1838,7 @@ int btrfs_merge_bio_hook(int rw, struct page *page, unsigned long offset,
length = bio->bi_iter.bi_size; length = bio->bi_iter.bi_size;
map_length = length; map_length = length;
ret = btrfs_map_block(root->fs_info, rw, logical, ret = btrfs_map_block(root->fs_info, bio_op(bio), logical,
&map_length, NULL, 0); &map_length, NULL, 0);
/* Will always return 0 with map_multi == NULL */ /* Will always return 0 with map_multi == NULL */
BUG_ON(ret < 0); BUG_ON(ret < 0);
......
...@@ -5259,7 +5259,7 @@ void btrfs_put_bbio(struct btrfs_bio *bbio) ...@@ -5259,7 +5259,7 @@ void btrfs_put_bbio(struct btrfs_bio *bbio)
kfree(bbio); kfree(bbio);
} }
static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int op,
u64 logical, u64 *length, u64 logical, u64 *length,
struct btrfs_bio **bbio_ret, struct btrfs_bio **bbio_ret,
int mirror_num, int need_raid_map) int mirror_num, int need_raid_map)
...@@ -5345,7 +5345,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, ...@@ -5345,7 +5345,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw,
raid56_full_stripe_start *= full_stripe_len; raid56_full_stripe_start *= full_stripe_len;
} }
if (rw & REQ_DISCARD) { if (op == REQ_OP_DISCARD) {
/* we don't discard raid56 yet */ /* we don't discard raid56 yet */
if (map->type & BTRFS_BLOCK_GROUP_RAID56_MASK) { if (map->type & BTRFS_BLOCK_GROUP_RAID56_MASK) {
ret = -EOPNOTSUPP; ret = -EOPNOTSUPP;
...@@ -5358,7 +5358,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, ...@@ -5358,7 +5358,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw,
For other RAID types and for RAID[56] reads, just allow a single For other RAID types and for RAID[56] reads, just allow a single
stripe (on a single disk). */ stripe (on a single disk). */
if ((map->type & BTRFS_BLOCK_GROUP_RAID56_MASK) && if ((map->type & BTRFS_BLOCK_GROUP_RAID56_MASK) &&
(rw & REQ_WRITE)) { (op == REQ_OP_WRITE)) {
max_len = stripe_len * nr_data_stripes(map) - max_len = stripe_len * nr_data_stripes(map) -
(offset - raid56_full_stripe_start); (offset - raid56_full_stripe_start);
} else { } else {
...@@ -5383,8 +5383,8 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, ...@@ -5383,8 +5383,8 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw,
btrfs_dev_replace_set_lock_blocking(dev_replace); btrfs_dev_replace_set_lock_blocking(dev_replace);
if (dev_replace_is_ongoing && mirror_num == map->num_stripes + 1 && if (dev_replace_is_ongoing && mirror_num == map->num_stripes + 1 &&
!(rw & (REQ_WRITE | REQ_DISCARD | REQ_GET_READ_MIRRORS)) && op != REQ_OP_WRITE && op != REQ_OP_DISCARD &&
dev_replace->tgtdev != NULL) { op != REQ_GET_READ_MIRRORS && dev_replace->tgtdev != NULL) {
/* /*
* in dev-replace case, for repair case (that's the only * in dev-replace case, for repair case (that's the only
* case where the mirror is selected explicitly when * case where the mirror is selected explicitly when
...@@ -5471,15 +5471,17 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, ...@@ -5471,15 +5471,17 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw,
(offset + *length); (offset + *length);
if (map->type & BTRFS_BLOCK_GROUP_RAID0) { if (map->type & BTRFS_BLOCK_GROUP_RAID0) {
if (rw & REQ_DISCARD) if (op == REQ_OP_DISCARD)
num_stripes = min_t(u64, map->num_stripes, num_stripes = min_t(u64, map->num_stripes,
stripe_nr_end - stripe_nr_orig); stripe_nr_end - stripe_nr_orig);
stripe_nr = div_u64_rem(stripe_nr, map->num_stripes, stripe_nr = div_u64_rem(stripe_nr, map->num_stripes,
&stripe_index); &stripe_index);
if (!(rw & (REQ_WRITE | REQ_DISCARD | REQ_GET_READ_MIRRORS))) if (op != REQ_OP_WRITE && op != REQ_OP_DISCARD &&
op != REQ_GET_READ_MIRRORS)
mirror_num = 1; mirror_num = 1;
} else if (map->type & BTRFS_BLOCK_GROUP_RAID1) { } else if (map->type & BTRFS_BLOCK_GROUP_RAID1) {
if (rw & (REQ_WRITE | REQ_DISCARD | REQ_GET_READ_MIRRORS)) if (op == REQ_OP_WRITE || op == REQ_OP_DISCARD ||
op == REQ_GET_READ_MIRRORS)
num_stripes = map->num_stripes; num_stripes = map->num_stripes;
else if (mirror_num) else if (mirror_num)
stripe_index = mirror_num - 1; stripe_index = mirror_num - 1;
...@@ -5492,7 +5494,8 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, ...@@ -5492,7 +5494,8 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw,
} }
} else if (map->type & BTRFS_BLOCK_GROUP_DUP) { } else if (map->type & BTRFS_BLOCK_GROUP_DUP) {
if (rw & (REQ_WRITE | REQ_DISCARD | REQ_GET_READ_MIRRORS)) { if (op == REQ_OP_WRITE || REQ_OP_DISCARD ||
op == REQ_GET_READ_MIRRORS) {
num_stripes = map->num_stripes; num_stripes = map->num_stripes;
} else if (mirror_num) { } else if (mirror_num) {
stripe_index = mirror_num - 1; stripe_index = mirror_num - 1;
...@@ -5506,9 +5509,9 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, ...@@ -5506,9 +5509,9 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw,
stripe_nr = div_u64_rem(stripe_nr, factor, &stripe_index); stripe_nr = div_u64_rem(stripe_nr, factor, &stripe_index);
stripe_index *= map->sub_stripes; stripe_index *= map->sub_stripes;
if (rw & (REQ_WRITE | REQ_GET_READ_MIRRORS)) if (op == REQ_OP_WRITE || op == REQ_GET_READ_MIRRORS)
num_stripes = map->sub_stripes; num_stripes = map->sub_stripes;
else if (rw & REQ_DISCARD) else if (op == REQ_OP_DISCARD)
num_stripes = min_t(u64, map->sub_stripes * num_stripes = min_t(u64, map->sub_stripes *
(stripe_nr_end - stripe_nr_orig), (stripe_nr_end - stripe_nr_orig),
map->num_stripes); map->num_stripes);
...@@ -5526,7 +5529,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, ...@@ -5526,7 +5529,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw,
} else if (map->type & BTRFS_BLOCK_GROUP_RAID56_MASK) { } else if (map->type & BTRFS_BLOCK_GROUP_RAID56_MASK) {
if (need_raid_map && if (need_raid_map &&
((rw & (REQ_WRITE | REQ_GET_READ_MIRRORS)) || (op == REQ_OP_WRITE || op == REQ_GET_READ_MIRRORS ||
mirror_num > 1)) { mirror_num > 1)) {
/* push stripe_nr back to the start of the full stripe */ /* push stripe_nr back to the start of the full stripe */
stripe_nr = div_u64(raid56_full_stripe_start, stripe_nr = div_u64(raid56_full_stripe_start,
...@@ -5554,8 +5557,8 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, ...@@ -5554,8 +5557,8 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw,
/* We distribute the parity blocks across stripes */ /* We distribute the parity blocks across stripes */
div_u64_rem(stripe_nr + stripe_index, map->num_stripes, div_u64_rem(stripe_nr + stripe_index, map->num_stripes,
&stripe_index); &stripe_index);
if (!(rw & (REQ_WRITE | REQ_DISCARD | if ((op != REQ_OP_WRITE && op != REQ_OP_DISCARD &&
REQ_GET_READ_MIRRORS)) && mirror_num <= 1) op != REQ_GET_READ_MIRRORS) && mirror_num <= 1)
mirror_num = 1; mirror_num = 1;
} }
} else { } else {
...@@ -5578,9 +5581,9 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, ...@@ -5578,9 +5581,9 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw,
num_alloc_stripes = num_stripes; num_alloc_stripes = num_stripes;
if (dev_replace_is_ongoing) { if (dev_replace_is_ongoing) {
if (rw & (REQ_WRITE | REQ_DISCARD)) if (op == REQ_OP_WRITE || op == REQ_OP_DISCARD)
num_alloc_stripes <<= 1; num_alloc_stripes <<= 1;
if (rw & REQ_GET_READ_MIRRORS) if (op == REQ_GET_READ_MIRRORS)
num_alloc_stripes++; num_alloc_stripes++;
tgtdev_indexes = num_stripes; tgtdev_indexes = num_stripes;
} }
...@@ -5595,7 +5598,8 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, ...@@ -5595,7 +5598,8 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw,
/* build raid_map */ /* build raid_map */
if (map->type & BTRFS_BLOCK_GROUP_RAID56_MASK && if (map->type & BTRFS_BLOCK_GROUP_RAID56_MASK &&
need_raid_map && ((rw & (REQ_WRITE | REQ_GET_READ_MIRRORS)) || need_raid_map &&
((op == REQ_OP_WRITE || op == REQ_GET_READ_MIRRORS) ||
mirror_num > 1)) { mirror_num > 1)) {
u64 tmp; u64 tmp;
unsigned rot; unsigned rot;
...@@ -5620,7 +5624,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, ...@@ -5620,7 +5624,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw,
RAID6_Q_STRIPE; RAID6_Q_STRIPE;
} }
if (rw & REQ_DISCARD) { if (op == REQ_OP_DISCARD) {
u32 factor = 0; u32 factor = 0;
u32 sub_stripes = 0; u32 sub_stripes = 0;
u64 stripes_per_dev = 0; u64 stripes_per_dev = 0;
...@@ -5700,14 +5704,15 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, ...@@ -5700,14 +5704,15 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw,
} }
} }
if (rw & (REQ_WRITE | REQ_GET_READ_MIRRORS)) if (op == REQ_OP_WRITE || op == REQ_GET_READ_MIRRORS)
max_errors = btrfs_chunk_max_errors(map); max_errors = btrfs_chunk_max_errors(map);
if (bbio->raid_map) if (bbio->raid_map)
sort_parity_stripes(bbio, num_stripes); sort_parity_stripes(bbio, num_stripes);
tgtdev_indexes = 0; tgtdev_indexes = 0;
if (dev_replace_is_ongoing && (rw & (REQ_WRITE | REQ_DISCARD)) && if (dev_replace_is_ongoing &&
(op == REQ_OP_WRITE || op == REQ_OP_DISCARD) &&
dev_replace->tgtdev != NULL) { dev_replace->tgtdev != NULL) {
int index_where_to_add; int index_where_to_add;
u64 srcdev_devid = dev_replace->srcdev->devid; u64 srcdev_devid = dev_replace->srcdev->devid;
...@@ -5742,7 +5747,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, ...@@ -5742,7 +5747,7 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw,
} }
} }
num_stripes = index_where_to_add; num_stripes = index_where_to_add;
} else if (dev_replace_is_ongoing && (rw & REQ_GET_READ_MIRRORS) && } else if (dev_replace_is_ongoing && (op == REQ_GET_READ_MIRRORS) &&
dev_replace->tgtdev != NULL) { dev_replace->tgtdev != NULL) {
u64 srcdev_devid = dev_replace->srcdev->devid; u64 srcdev_devid = dev_replace->srcdev->devid;
int index_srcdev = 0; int index_srcdev = 0;
...@@ -5814,21 +5819,21 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, ...@@ -5814,21 +5819,21 @@ static int __btrfs_map_block(struct btrfs_fs_info *fs_info, int rw,
return ret; return ret;
} }
int btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, int btrfs_map_block(struct btrfs_fs_info *fs_info, int op,
u64 logical, u64 *length, u64 logical, u64 *length,
struct btrfs_bio **bbio_ret, int mirror_num) struct btrfs_bio **bbio_ret, int mirror_num)
{ {
return __btrfs_map_block(fs_info, rw, logical, length, bbio_ret, return __btrfs_map_block(fs_info, op, logical, length, bbio_ret,
mirror_num, 0); mirror_num, 0);
} }
/* For Scrub/replace */ /* For Scrub/replace */
int btrfs_map_sblock(struct btrfs_fs_info *fs_info, int rw, int btrfs_map_sblock(struct btrfs_fs_info *fs_info, int op,
u64 logical, u64 *length, u64 logical, u64 *length,
struct btrfs_bio **bbio_ret, int mirror_num, struct btrfs_bio **bbio_ret, int mirror_num,
int need_raid_map) int need_raid_map)
{ {
return __btrfs_map_block(fs_info, rw, logical, length, bbio_ret, return __btrfs_map_block(fs_info, op, logical, length, bbio_ret,
mirror_num, need_raid_map); mirror_num, need_raid_map);
} }
......
...@@ -375,10 +375,10 @@ int btrfs_account_dev_extents_size(struct btrfs_device *device, u64 start, ...@@ -375,10 +375,10 @@ int btrfs_account_dev_extents_size(struct btrfs_device *device, u64 start,
u64 end, u64 *length); u64 end, u64 *length);
void btrfs_get_bbio(struct btrfs_bio *bbio); void btrfs_get_bbio(struct btrfs_bio *bbio);
void btrfs_put_bbio(struct btrfs_bio *bbio); void btrfs_put_bbio(struct btrfs_bio *bbio);
int btrfs_map_block(struct btrfs_fs_info *fs_info, int rw, int btrfs_map_block(struct btrfs_fs_info *fs_info, int op,
u64 logical, u64 *length, u64 logical, u64 *length,
struct btrfs_bio **bbio_ret, int mirror_num); struct btrfs_bio **bbio_ret, int mirror_num);
int btrfs_map_sblock(struct btrfs_fs_info *fs_info, int rw, int btrfs_map_sblock(struct btrfs_fs_info *fs_info, int op,
u64 logical, u64 *length, u64 logical, u64 *length,
struct btrfs_bio **bbio_ret, int mirror_num, struct btrfs_bio **bbio_ret, int mirror_num,
int need_raid_map); int need_raid_map);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册