diff options
author | Christoph Hellwig <hch@lst.de> | 2017-04-26 10:40:36 +0300 |
---|---|---|
committer | Mike Snitzer <snitzer@redhat.com> | 2017-05-02 01:19:02 +0300 |
commit | b79f10eefd4bc450a595b93c75e3a9d159ac3885 (patch) | |
tree | a45fe6daf9bff5e95350d5be16f442d1d432bc25 /drivers/md | |
parent | 7e25a7606147bfe29a7421ff2cb332b07d3cee3a (diff) | |
download | linux-b79f10eefd4bc450a595b93c75e3a9d159ac3885.tar.xz |
dm mpath: merge do_end_io into multipath_end_io
This simplifies the I/O completion path a bit.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/dm-mpath.c | 51 |
1 files changed, 17 insertions, 34 deletions
diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c index 52cd3f1608b3..8b394a08d427 100644 --- a/drivers/md/dm-mpath.c +++ b/drivers/md/dm-mpath.c @@ -1464,12 +1464,12 @@ static int noretry_error(int error) return 0; } -/* - * end_io handling - */ -static int do_end_io(struct multipath *m, struct request *clone, - int error, struct dm_mpath_io *mpio) +static int multipath_end_io(struct dm_target *ti, struct request *clone, + int error, union map_info *map_context) { + struct dm_mpath_io *mpio = get_mpio(map_context); + struct pgpath *pgpath = mpio->pgpath; + /* * We don't queue any clone request inside the multipath target * during end I/O handling, since those clone requests don't have @@ -1481,44 +1481,27 @@ static int do_end_io(struct multipath *m, struct request *clone, * request into dm core, which will remake a clone request and * clone bios for it and resubmit it later. */ - int r = DM_ENDIO_REQUEUE; - - if (!error) - return 0; /* I/O complete */ + if (error && !noretry_error(error)) { + struct multipath *m = ti->private; - if (noretry_error(error)) - return error; - - if (mpio->pgpath) - fail_path(mpio->pgpath); + error = DM_ENDIO_REQUEUE; - if (atomic_read(&m->nr_valid_paths) == 0 && - !test_bit(MPATHF_QUEUE_IF_NO_PATH, &m->flags)) - r = dm_report_EIO(m); - - return r; -} - -static int multipath_end_io(struct dm_target *ti, struct request *clone, - int error, union map_info *map_context) -{ - struct multipath *m = ti->private; - struct dm_mpath_io *mpio = get_mpio(map_context); - struct pgpath *pgpath; - struct path_selector *ps; - int r; + if (pgpath) + fail_path(pgpath); - BUG_ON(!mpio); + if (atomic_read(&m->nr_valid_paths) == 0 && + !test_bit(MPATHF_QUEUE_IF_NO_PATH, &m->flags)) + error = dm_report_EIO(m); + } - r = do_end_io(m, clone, error, mpio); - pgpath = mpio->pgpath; if (pgpath) { - ps = &pgpath->pg->ps; + struct path_selector *ps = &pgpath->pg->ps; + if (ps->type->end_io) ps->type->end_io(ps, &pgpath->path, mpio->nr_bytes); } - return r; + return error; } static int do_end_io_bio(struct multipath *m, struct bio *clone, |