Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b79f10ee authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Mike Snitzer
Browse files

dm mpath: merge do_end_io into multipath_end_io



This simplifies the I/O completion path a bit.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarMike Snitzer <snitzer@redhat.com>
parent 7e25a760
Loading
Loading
Loading
Loading
+17 −34
Original line number Diff line number Diff line
@@ -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;
		error = DM_ENDIO_REQUEUE;

	if (mpio->pgpath)
		fail_path(mpio->pgpath);
		if (pgpath)
			fail_path(pgpath);

		if (atomic_read(&m->nr_valid_paths) == 0 &&
		    !test_bit(MPATHF_QUEUE_IF_NO_PATH, &m->flags))
		r = dm_report_EIO(m);

	return r;
			error = dm_report_EIO(m);
	}

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;

	BUG_ON(!mpio);

	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,