dm: abstract clone_rq
This patch factors out the request cloning code in dm_prep_fn() as clone_rq(). No functional change. This patch is a preparation for a later patch in this series which needs to make clones from an original barrier request. Signed-off-by: Kiyoshi Ueda <k-ueda@ct.jp.nec.com> Signed-off-by: Jun'ichi Nomura <j-nomura@ce.jp.nec.com> Signed-off-by: Alasdair G Kergon <agk@redhat.com>
This commit is contained in:
parent
0888564393
commit
6facdaff22
@ -1445,6 +1445,32 @@ static int setup_clone(struct request *clone, struct request *rq,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct request *clone_rq(struct request *rq, struct mapped_device *md,
|
||||||
|
gfp_t gfp_mask)
|
||||||
|
{
|
||||||
|
struct request *clone;
|
||||||
|
struct dm_rq_target_io *tio;
|
||||||
|
|
||||||
|
tio = alloc_rq_tio(md, gfp_mask);
|
||||||
|
if (!tio)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
tio->md = md;
|
||||||
|
tio->ti = NULL;
|
||||||
|
tio->orig = rq;
|
||||||
|
tio->error = 0;
|
||||||
|
memset(&tio->info, 0, sizeof(tio->info));
|
||||||
|
|
||||||
|
clone = &tio->clone;
|
||||||
|
if (setup_clone(clone, rq, tio)) {
|
||||||
|
/* -ENOMEM */
|
||||||
|
free_rq_tio(tio);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return clone;
|
||||||
|
}
|
||||||
|
|
||||||
static int dm_rq_flush_suspending(struct mapped_device *md)
|
static int dm_rq_flush_suspending(struct mapped_device *md)
|
||||||
{
|
{
|
||||||
return !md->suspend_rq.special;
|
return !md->suspend_rq.special;
|
||||||
@ -1456,7 +1482,6 @@ static int dm_rq_flush_suspending(struct mapped_device *md)
|
|||||||
static int dm_prep_fn(struct request_queue *q, struct request *rq)
|
static int dm_prep_fn(struct request_queue *q, struct request *rq)
|
||||||
{
|
{
|
||||||
struct mapped_device *md = q->queuedata;
|
struct mapped_device *md = q->queuedata;
|
||||||
struct dm_rq_target_io *tio;
|
|
||||||
struct request *clone;
|
struct request *clone;
|
||||||
|
|
||||||
if (unlikely(rq == &md->suspend_rq)) {
|
if (unlikely(rq == &md->suspend_rq)) {
|
||||||
@ -1472,24 +1497,10 @@ static int dm_prep_fn(struct request_queue *q, struct request *rq)
|
|||||||
return BLKPREP_KILL;
|
return BLKPREP_KILL;
|
||||||
}
|
}
|
||||||
|
|
||||||
tio = alloc_rq_tio(md, GFP_ATOMIC);
|
clone = clone_rq(rq, md, GFP_ATOMIC);
|
||||||
if (!tio)
|
if (!clone)
|
||||||
/* -ENOMEM */
|
|
||||||
return BLKPREP_DEFER;
|
return BLKPREP_DEFER;
|
||||||
|
|
||||||
tio->md = md;
|
|
||||||
tio->ti = NULL;
|
|
||||||
tio->orig = rq;
|
|
||||||
tio->error = 0;
|
|
||||||
memset(&tio->info, 0, sizeof(tio->info));
|
|
||||||
|
|
||||||
clone = &tio->clone;
|
|
||||||
if (setup_clone(clone, rq, tio)) {
|
|
||||||
/* -ENOMEM */
|
|
||||||
free_rq_tio(tio);
|
|
||||||
return BLKPREP_DEFER;
|
|
||||||
}
|
|
||||||
|
|
||||||
rq->special = clone;
|
rq->special = clone;
|
||||||
rq->cmd_flags |= REQ_DONTPREP;
|
rq->cmd_flags |= REQ_DONTPREP;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user