Skip to content

Commit

Permalink
Merge branch 'for-4.13-rc7' of git://git.kernel.org/pub/scm/linux/ker…
Browse files Browse the repository at this point in the history
…nel/git/kdave/linux

Pull btrfs fix from David Sterba:
 "We have one more fixup that stems from the blk_status_t conversion
  that did not quite cover everything.

  The normal cases were not affected because the code is 0, but any
  error and retries could mix up new and old values"

* 'for-4.13-rc7' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux:
  Btrfs: fix blk_status_t/errno confusion
  • Loading branch information
torvalds committed Aug 24, 2017
2 parents 415be6c + 58efbc9 commit b71a5e3
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 60 deletions.
4 changes: 2 additions & 2 deletions fs/btrfs/disk-io.c
Original file line number Diff line number Diff line change
Expand Up @@ -3516,7 +3516,7 @@ static blk_status_t wait_dev_flush(struct btrfs_device *device)
struct bio *bio = device->flush_bio;

if (!device->flush_bio_sent)
return 0;
return BLK_STS_OK;

device->flush_bio_sent = 0;
wait_for_completion_io(&device->flush_wait);
Expand Down Expand Up @@ -3563,7 +3563,7 @@ static int barrier_all_devices(struct btrfs_fs_info *info)
continue;

write_dev_flush(dev);
dev->last_flush_error = 0;
dev->last_flush_error = BLK_STS_OK;
}

/* wait for all the barriers */
Expand Down
70 changes: 37 additions & 33 deletions fs/btrfs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -7924,11 +7924,12 @@ static int btrfs_get_blocks_direct(struct inode *inode, sector_t iblock,
return ret;
}

static inline int submit_dio_repair_bio(struct inode *inode, struct bio *bio,
int mirror_num)
static inline blk_status_t submit_dio_repair_bio(struct inode *inode,
struct bio *bio,
int mirror_num)
{
struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
int ret;
blk_status_t ret;

BUG_ON(bio_op(bio) == REQ_OP_WRITE);

Expand Down Expand Up @@ -7980,10 +7981,10 @@ static int btrfs_check_dio_repairable(struct inode *inode,
return 1;
}

static int dio_read_error(struct inode *inode, struct bio *failed_bio,
struct page *page, unsigned int pgoff,
u64 start, u64 end, int failed_mirror,
bio_end_io_t *repair_endio, void *repair_arg)
static blk_status_t dio_read_error(struct inode *inode, struct bio *failed_bio,
struct page *page, unsigned int pgoff,
u64 start, u64 end, int failed_mirror,
bio_end_io_t *repair_endio, void *repair_arg)
{
struct io_failure_record *failrec;
struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree;
Expand All @@ -7993,18 +7994,19 @@ static int dio_read_error(struct inode *inode, struct bio *failed_bio,
int read_mode = 0;
int segs;
int ret;
blk_status_t status;

BUG_ON(bio_op(failed_bio) == REQ_OP_WRITE);

ret = btrfs_get_io_failure_record(inode, start, end, &failrec);
if (ret)
return ret;
return errno_to_blk_status(ret);

ret = btrfs_check_dio_repairable(inode, failed_bio, failrec,
failed_mirror);
if (!ret) {
free_io_failure(failure_tree, io_tree, failrec);
return -EIO;
return BLK_STS_IOERR;
}

segs = bio_segments(failed_bio);
Expand All @@ -8022,13 +8024,13 @@ static int dio_read_error(struct inode *inode, struct bio *failed_bio,
"Repair DIO Read Error: submitting new dio read[%#x] to this_mirror=%d, in_validation=%d\n",
read_mode, failrec->this_mirror, failrec->in_validation);

ret = submit_dio_repair_bio(inode, bio, failrec->this_mirror);
if (ret) {
status = submit_dio_repair_bio(inode, bio, failrec->this_mirror);
if (status) {
free_io_failure(failure_tree, io_tree, failrec);
bio_put(bio);
}

return ret;
return status;
}

struct btrfs_retry_complete {
Expand Down Expand Up @@ -8065,8 +8067,8 @@ static void btrfs_retry_endio_nocsum(struct bio *bio)
bio_put(bio);
}

static int __btrfs_correct_data_nocsum(struct inode *inode,
struct btrfs_io_bio *io_bio)
static blk_status_t __btrfs_correct_data_nocsum(struct inode *inode,
struct btrfs_io_bio *io_bio)
{
struct btrfs_fs_info *fs_info;
struct bio_vec bvec;
Expand All @@ -8076,8 +8078,8 @@ static int __btrfs_correct_data_nocsum(struct inode *inode,
unsigned int pgoff;
u32 sectorsize;
int nr_sectors;
int ret;
int err = 0;
blk_status_t ret;
blk_status_t err = BLK_STS_OK;

fs_info = BTRFS_I(inode)->root->fs_info;
sectorsize = fs_info->sectorsize;
Expand Down Expand Up @@ -8183,11 +8185,12 @@ static blk_status_t __btrfs_subio_endio_read(struct inode *inode,
int csum_pos;
bool uptodate = (err == 0);
int ret;
blk_status_t status;

fs_info = BTRFS_I(inode)->root->fs_info;
sectorsize = fs_info->sectorsize;

err = 0;
err = BLK_STS_OK;
start = io_bio->logical;
done.inode = inode;
io_bio->bio.bi_iter = io_bio->iter;
Expand All @@ -8209,12 +8212,12 @@ static blk_status_t __btrfs_subio_endio_read(struct inode *inode,
done.start = start;
init_completion(&done.done);

ret = dio_read_error(inode, &io_bio->bio, bvec.bv_page,
pgoff, start, start + sectorsize - 1,
io_bio->mirror_num,
btrfs_retry_endio, &done);
if (ret) {
err = errno_to_blk_status(ret);
status = dio_read_error(inode, &io_bio->bio, bvec.bv_page,
pgoff, start, start + sectorsize - 1,
io_bio->mirror_num, btrfs_retry_endio,
&done);
if (status) {
err = status;
goto next;
}

Expand Down Expand Up @@ -8250,7 +8253,7 @@ static blk_status_t btrfs_subio_endio_read(struct inode *inode,
if (unlikely(err))
return __btrfs_correct_data_nocsum(inode, io_bio);
else
return 0;
return BLK_STS_OK;
} else {
return __btrfs_subio_endio_read(inode, io_bio, err);
}
Expand Down Expand Up @@ -8423,9 +8426,9 @@ static inline blk_status_t btrfs_lookup_and_bind_dio_csum(struct inode *inode,
return 0;
}

static inline int __btrfs_submit_dio_bio(struct bio *bio, struct inode *inode,
u64 file_offset, int skip_sum,
int async_submit)
static inline blk_status_t
__btrfs_submit_dio_bio(struct bio *bio, struct inode *inode, u64 file_offset,
int skip_sum, int async_submit)
{
struct btrfs_fs_info *fs_info = btrfs_sb(inode->i_sb);
struct btrfs_dio_private *dip = bio->bi_private;
Expand Down Expand Up @@ -8488,6 +8491,7 @@ static int btrfs_submit_direct_hook(struct btrfs_dio_private *dip,
int clone_offset = 0;
int clone_len;
int ret;
blk_status_t status;

map_length = orig_bio->bi_iter.bi_size;
submit_len = map_length;
Expand Down Expand Up @@ -8537,9 +8541,9 @@ static int btrfs_submit_direct_hook(struct btrfs_dio_private *dip,
*/
atomic_inc(&dip->pending_bios);

ret = __btrfs_submit_dio_bio(bio, inode, file_offset, skip_sum,
async_submit);
if (ret) {
status = __btrfs_submit_dio_bio(bio, inode, file_offset, skip_sum,
async_submit);
if (status) {
bio_put(bio);
atomic_dec(&dip->pending_bios);
goto out_err;
Expand All @@ -8557,9 +8561,9 @@ static int btrfs_submit_direct_hook(struct btrfs_dio_private *dip,
} while (submit_len > 0);

submit:
ret = __btrfs_submit_dio_bio(bio, inode, file_offset, skip_sum,
async_submit);
if (!ret)
status = __btrfs_submit_dio_bio(bio, inode, file_offset, skip_sum,
async_submit);
if (!status)
return 0;

bio_put(bio);
Expand Down
34 changes: 17 additions & 17 deletions fs/btrfs/raid56.c
Original file line number Diff line number Diff line change
Expand Up @@ -905,7 +905,7 @@ static void raid_write_end_io(struct bio *bio)
if (!atomic_dec_and_test(&rbio->stripes_pending))
return;

err = 0;
err = BLK_STS_OK;

/* OK, we have read all the stripes we need to. */
max_errors = (rbio->operation == BTRFS_RBIO_PARITY_SCRUB) ?
Expand Down Expand Up @@ -1324,7 +1324,7 @@ static noinline void finish_rmw(struct btrfs_raid_bio *rbio)
return;

cleanup:
rbio_orig_end_io(rbio, -EIO);
rbio_orig_end_io(rbio, BLK_STS_IOERR);
}

/*
Expand Down Expand Up @@ -1475,7 +1475,7 @@ static void raid_rmw_end_io(struct bio *bio)

cleanup:

rbio_orig_end_io(rbio, -EIO);
rbio_orig_end_io(rbio, BLK_STS_IOERR);
}

static void async_rmw_stripe(struct btrfs_raid_bio *rbio)
Expand Down Expand Up @@ -1579,7 +1579,7 @@ static int raid56_rmw_stripe(struct btrfs_raid_bio *rbio)
return 0;

cleanup:
rbio_orig_end_io(rbio, -EIO);
rbio_orig_end_io(rbio, BLK_STS_IOERR);
return -EIO;

finish:
Expand Down Expand Up @@ -1795,12 +1795,12 @@ static void __raid_recover_end_io(struct btrfs_raid_bio *rbio)
void **pointers;
int faila = -1, failb = -1;
struct page *page;
int err;
blk_status_t err;
int i;

pointers = kcalloc(rbio->real_stripes, sizeof(void *), GFP_NOFS);
if (!pointers) {
err = -ENOMEM;
err = BLK_STS_RESOURCE;
goto cleanup_io;
}

Expand Down Expand Up @@ -1856,7 +1856,7 @@ static void __raid_recover_end_io(struct btrfs_raid_bio *rbio)
* a bad data or Q stripe.
* TODO, we should redo the xor here.
*/
err = -EIO;
err = BLK_STS_IOERR;
goto cleanup;
}
/*
Expand All @@ -1882,7 +1882,7 @@ static void __raid_recover_end_io(struct btrfs_raid_bio *rbio)
if (rbio->bbio->raid_map[failb] == RAID6_Q_STRIPE) {
if (rbio->bbio->raid_map[faila] ==
RAID5_P_STRIPE) {
err = -EIO;
err = BLK_STS_IOERR;
goto cleanup;
}
/*
Expand Down Expand Up @@ -1954,21 +1954,21 @@ static void __raid_recover_end_io(struct btrfs_raid_bio *rbio)
}
}

err = 0;
err = BLK_STS_OK;
cleanup:
kfree(pointers);

cleanup_io:
if (rbio->operation == BTRFS_RBIO_READ_REBUILD) {
if (err == 0)
if (err == BLK_STS_OK)
cache_rbio_pages(rbio);
else
clear_bit(RBIO_CACHE_READY_BIT, &rbio->flags);

rbio_orig_end_io(rbio, err);
} else if (rbio->operation == BTRFS_RBIO_REBUILD_MISSING) {
rbio_orig_end_io(rbio, err);
} else if (err == 0) {
} else if (err == BLK_STS_OK) {
rbio->faila = -1;
rbio->failb = -1;

Expand Down Expand Up @@ -2005,7 +2005,7 @@ static void raid_recover_end_io(struct bio *bio)
return;

if (atomic_read(&rbio->error) > rbio->bbio->max_errors)
rbio_orig_end_io(rbio, -EIO);
rbio_orig_end_io(rbio, BLK_STS_IOERR);
else
__raid_recover_end_io(rbio);
}
Expand Down Expand Up @@ -2104,7 +2104,7 @@ static int __raid56_parity_recover(struct btrfs_raid_bio *rbio)
cleanup:
if (rbio->operation == BTRFS_RBIO_READ_REBUILD ||
rbio->operation == BTRFS_RBIO_REBUILD_MISSING)
rbio_orig_end_io(rbio, -EIO);
rbio_orig_end_io(rbio, BLK_STS_IOERR);
return -EIO;
}

Expand Down Expand Up @@ -2431,7 +2431,7 @@ static noinline void finish_parity_scrub(struct btrfs_raid_bio *rbio,
nr_data = bio_list_size(&bio_list);
if (!nr_data) {
/* Every parity is right */
rbio_orig_end_io(rbio, 0);
rbio_orig_end_io(rbio, BLK_STS_OK);
return;
}

Expand All @@ -2451,7 +2451,7 @@ static noinline void finish_parity_scrub(struct btrfs_raid_bio *rbio,
return;

cleanup:
rbio_orig_end_io(rbio, -EIO);
rbio_orig_end_io(rbio, BLK_STS_IOERR);
}

static inline int is_data_stripe(struct btrfs_raid_bio *rbio, int stripe)
Expand Down Expand Up @@ -2519,7 +2519,7 @@ static void validate_rbio_for_parity_scrub(struct btrfs_raid_bio *rbio)
return;

cleanup:
rbio_orig_end_io(rbio, -EIO);
rbio_orig_end_io(rbio, BLK_STS_IOERR);
}

/*
Expand Down Expand Up @@ -2633,7 +2633,7 @@ static void raid56_parity_scrub_stripe(struct btrfs_raid_bio *rbio)
return;

cleanup:
rbio_orig_end_io(rbio, -EIO);
rbio_orig_end_io(rbio, BLK_STS_IOERR);
return;

finish:
Expand Down
10 changes: 5 additions & 5 deletions fs/btrfs/volumes.c
Original file line number Diff line number Diff line change
Expand Up @@ -6212,8 +6212,8 @@ static void bbio_error(struct btrfs_bio *bbio, struct bio *bio, u64 logical)
}
}

int btrfs_map_bio(struct btrfs_fs_info *fs_info, struct bio *bio,
int mirror_num, int async_submit)
blk_status_t btrfs_map_bio(struct btrfs_fs_info *fs_info, struct bio *bio,
int mirror_num, int async_submit)
{
struct btrfs_device *dev;
struct bio *first_bio = bio;
Expand All @@ -6233,7 +6233,7 @@ int btrfs_map_bio(struct btrfs_fs_info *fs_info, struct bio *bio,
&map_length, &bbio, mirror_num, 1);
if (ret) {
btrfs_bio_counter_dec(fs_info);
return ret;
return errno_to_blk_status(ret);
}

total_devs = bbio->num_stripes;
Expand All @@ -6256,7 +6256,7 @@ int btrfs_map_bio(struct btrfs_fs_info *fs_info, struct bio *bio,
}

btrfs_bio_counter_dec(fs_info);
return ret;
return errno_to_blk_status(ret);
}

if (map_length < length) {
Expand All @@ -6283,7 +6283,7 @@ int btrfs_map_bio(struct btrfs_fs_info *fs_info, struct bio *bio,
dev_nr, async_submit);
}
btrfs_bio_counter_dec(fs_info);
return 0;
return BLK_STS_OK;
}

struct btrfs_device *btrfs_find_device(struct btrfs_fs_info *fs_info, u64 devid,
Expand Down
Loading

0 comments on commit b71a5e3

Please sign in to comment.