Skip to content

Commit

Permalink
btrfs: btrfs_multi_bio replaced with btrfs_bio
Browse files Browse the repository at this point in the history
btrfs_bio is a bio abstraction able to split and not complete after the last
bio has returned (like the old btrfs_multi_bio). Additionally, btrfs_bio
tracks the mirror_num used to read data which can be used for error
correction purposes.

Signed-off-by: Jan Schmidt <list.btrfs@jan-o-sch.net>
  • Loading branch information
Jan Schmidt committed Sep 29, 2011
1 parent d7728c9 commit a1d3c47
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 78 deletions.
10 changes: 5 additions & 5 deletions fs/btrfs/extent-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -1770,18 +1770,18 @@ static int btrfs_discard_extent(struct btrfs_root *root, u64 bytenr,
{
int ret;
u64 discarded_bytes = 0;
struct btrfs_multi_bio *multi = NULL;
struct btrfs_bio *bbio = NULL;


/* Tell the block device(s) that the sectors can be discarded */
ret = btrfs_map_block(&root->fs_info->mapping_tree, REQ_DISCARD,
bytenr, &num_bytes, &multi, 0);
bytenr, &num_bytes, &bbio, 0);
if (!ret) {
struct btrfs_bio_stripe *stripe = multi->stripes;
struct btrfs_bio_stripe *stripe = bbio->stripes;
int i;


for (i = 0; i < multi->num_stripes; i++, stripe++) {
for (i = 0; i < bbio->num_stripes; i++, stripe++) {
if (!stripe->dev->can_discard)
continue;

Expand All @@ -1800,7 +1800,7 @@ static int btrfs_discard_extent(struct btrfs_root *root, u64 bytenr,
*/
ret = 0;
}
kfree(multi);
kfree(bbio);
}

if (actual_bytes)
Expand Down
20 changes: 10 additions & 10 deletions fs/btrfs/scrub.c
Original file line number Diff line number Diff line change
Expand Up @@ -572,7 +572,7 @@ static void scrub_fixup(struct scrub_bio *sbio, int ix)
struct scrub_dev *sdev = sbio->sdev;
struct btrfs_fs_info *fs_info = sdev->dev->dev_root->fs_info;
struct btrfs_mapping_tree *map_tree = &fs_info->mapping_tree;
struct btrfs_multi_bio *multi = NULL;
struct btrfs_bio *bbio = NULL;
struct scrub_fixup_nodatasum *fixup;
u64 logical = sbio->logical + ix * PAGE_SIZE;
u64 length;
Expand Down Expand Up @@ -610,28 +610,28 @@ static void scrub_fixup(struct scrub_bio *sbio, int ix)

length = PAGE_SIZE;
ret = btrfs_map_block(map_tree, REQ_WRITE, logical, &length,
&multi, 0);
if (ret || !multi || length < PAGE_SIZE) {
&bbio, 0);
if (ret || !bbio || length < PAGE_SIZE) {
printk(KERN_ERR
"scrub_fixup: btrfs_map_block failed us for %llu\n",
(unsigned long long)logical);
WARN_ON(1);
return;
}

if (multi->num_stripes == 1)
if (bbio->num_stripes == 1)
/* there aren't any replicas */
goto uncorrectable;

/*
* first find a good copy
*/
for (i = 0; i < multi->num_stripes; ++i) {
for (i = 0; i < bbio->num_stripes; ++i) {
if (i + 1 == sbio->spag[ix].mirror_num)
continue;

if (scrub_fixup_io(READ, multi->stripes[i].dev->bdev,
multi->stripes[i].physical >> 9,
if (scrub_fixup_io(READ, bbio->stripes[i].dev->bdev,
bbio->stripes[i].physical >> 9,
sbio->bio->bi_io_vec[ix].bv_page)) {
/* I/O-error, this is not a good copy */
continue;
Expand All @@ -640,7 +640,7 @@ static void scrub_fixup(struct scrub_bio *sbio, int ix)
if (scrub_fixup_check(sbio, ix) == 0)
break;
}
if (i == multi->num_stripes)
if (i == bbio->num_stripes)
goto uncorrectable;

if (!sdev->readonly) {
Expand All @@ -655,7 +655,7 @@ static void scrub_fixup(struct scrub_bio *sbio, int ix)
}
}

kfree(multi);
kfree(bbio);
spin_lock(&sdev->stat_lock);
++sdev->stat.corrected_errors;
spin_unlock(&sdev->stat_lock);
Expand All @@ -665,7 +665,7 @@ static void scrub_fixup(struct scrub_bio *sbio, int ix)
return;

uncorrectable:
kfree(multi);
kfree(bbio);
spin_lock(&sdev->stat_lock);
++sdev->stat.uncorrectable_errors;
spin_unlock(&sdev->stat_lock);
Expand Down
Loading

0 comments on commit a1d3c47

Please sign in to comment.