Commit 9d493fa8 authored by Alasdair G Kergon's avatar Alasdair G Kergon Committed by Linus Torvalds

[PATCH] dm snapshot: tidy pending_complete

This patch rearranges the pending_complete() code so that the functional
changes in subsequent patches are clearer.

By consolidating the error and the non-error paths, we can move
error_snapshot_bios() and __flush_bios() in line.
Signed-off-by: default avatarAlasdair G Kergon <agk@redhat.com>
Signed-off-by: default avatarMark McLoughlin <markmc@redhat.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent ba40a2aa
...@@ -609,26 +609,6 @@ static void error_bios(struct bio *bio) ...@@ -609,26 +609,6 @@ static void error_bios(struct bio *bio)
} }
} }
static inline void error_snapshot_bios(struct pending_exception *pe)
{
error_bios(bio_list_get(&pe->snapshot_bios));
}
static struct bio *__flush_bios(struct pending_exception *pe)
{
/*
* If this pe is involved in a write to the origin and
* it is the last sibling to complete then release
* the bios for the original write to the origin.
*/
if (pe->primary_pe &&
atomic_dec_and_test(&pe->primary_pe->sibling_count))
return bio_list_get(&pe->primary_pe->origin_bios);
return NULL;
}
static void __invalidate_snapshot(struct dm_snapshot *s, static void __invalidate_snapshot(struct dm_snapshot *s,
struct pending_exception *pe, int err) struct pending_exception *pe, int err)
{ {
...@@ -656,16 +636,15 @@ static void pending_complete(struct pending_exception *pe, int success) ...@@ -656,16 +636,15 @@ static void pending_complete(struct pending_exception *pe, int success)
struct exception *e; struct exception *e;
struct pending_exception *primary_pe; struct pending_exception *primary_pe;
struct dm_snapshot *s = pe->snap; struct dm_snapshot *s = pe->snap;
struct bio *flush = NULL; struct bio *origin_bios = NULL;
struct bio *snapshot_bios = NULL;
int error = 0;
if (!success) { if (!success) {
/* Read/write error - snapshot is unusable */ /* Read/write error - snapshot is unusable */
down_write(&s->lock); down_write(&s->lock);
__invalidate_snapshot(s, pe, -EIO); __invalidate_snapshot(s, pe, -EIO);
flush = __flush_bios(pe); error = 1;
up_write(&s->lock);
error_snapshot_bios(pe);
goto out; goto out;
} }
...@@ -673,41 +652,39 @@ static void pending_complete(struct pending_exception *pe, int success) ...@@ -673,41 +652,39 @@ static void pending_complete(struct pending_exception *pe, int success)
if (!e) { if (!e) {
down_write(&s->lock); down_write(&s->lock);
__invalidate_snapshot(s, pe, -ENOMEM); __invalidate_snapshot(s, pe, -ENOMEM);
flush = __flush_bios(pe); error = 1;
up_write(&s->lock);
error_snapshot_bios(pe);
goto out; goto out;
} }
*e = pe->e; *e = pe->e;
/*
* Add a proper exception, and remove the
* in-flight exception from the list.
*/
down_write(&s->lock); down_write(&s->lock);
if (!s->valid) { if (!s->valid) {
flush = __flush_bios(pe);
up_write(&s->lock);
free_exception(e); free_exception(e);
error = 1;
error_snapshot_bios(pe);
goto out; goto out;
} }
/*
* Add a proper exception, and remove the
* in-flight exception from the list.
*/
insert_exception(&s->complete, e); insert_exception(&s->complete, e);
remove_exception(&pe->e); remove_exception(&pe->e);
flush = __flush_bios(pe);
up_write(&s->lock);
/* Submit any pending write bios */
flush_bios(bio_list_get(&pe->snapshot_bios));
out: out:
snapshot_bios = bio_list_get(&pe->snapshot_bios);
primary_pe = pe->primary_pe; primary_pe = pe->primary_pe;
/*
* If this pe is involved in a write to the origin and
* it is the last sibling to complete then release
* the bios for the original write to the origin.
*/
if (primary_pe &&
atomic_dec_and_test(&primary_pe->sibling_count))
origin_bios = bio_list_get(&primary_pe->origin_bios);
/* /*
* Free the pe if it's not linked to an origin write or if * Free the pe if it's not linked to an origin write or if
* it's not itself a primary pe. * it's not itself a primary pe.
...@@ -721,8 +698,15 @@ static void pending_complete(struct pending_exception *pe, int success) ...@@ -721,8 +698,15 @@ static void pending_complete(struct pending_exception *pe, int success)
if (primary_pe && !atomic_read(&primary_pe->sibling_count)) if (primary_pe && !atomic_read(&primary_pe->sibling_count))
free_pending_exception(primary_pe); free_pending_exception(primary_pe);
if (flush) up_write(&s->lock);
flush_bios(flush);
/* Submit any pending write bios */
if (error)
error_bios(snapshot_bios);
else
flush_bios(snapshot_bios);
flush_bios(origin_bios);
} }
static void commit_callback(void *context, int success) static void commit_callback(void *context, int success)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment