diff options
Diffstat (limited to 'drivers/md')
-rw-r--r-- | drivers/md/dm-snap.c | 23 | ||||
-rw-r--r-- | drivers/md/dm-snap.h | 4 |
2 files changed, 15 insertions, 12 deletions
diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c index 87727d84dbba..ad9b61f16c5e 100644 --- a/drivers/md/dm-snap.c +++ b/drivers/md/dm-snap.c | |||
@@ -373,16 +373,11 @@ static inline ulong round_up(ulong n, ulong size) | |||
373 | 373 | ||
374 | static void read_snapshot_metadata(struct dm_snapshot *s) | 374 | static void read_snapshot_metadata(struct dm_snapshot *s) |
375 | { | 375 | { |
376 | if (s->have_metadata) | ||
377 | return; | ||
378 | |||
379 | if (s->store.read_metadata(&s->store)) { | 376 | if (s->store.read_metadata(&s->store)) { |
380 | down_write(&s->lock); | 377 | down_write(&s->lock); |
381 | s->valid = 0; | 378 | s->valid = 0; |
382 | up_write(&s->lock); | 379 | up_write(&s->lock); |
383 | } | 380 | } |
384 | |||
385 | s->have_metadata = 1; | ||
386 | } | 381 | } |
387 | 382 | ||
388 | /* | 383 | /* |
@@ -471,7 +466,7 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
471 | s->chunk_shift = ffs(chunk_size) - 1; | 466 | s->chunk_shift = ffs(chunk_size) - 1; |
472 | 467 | ||
473 | s->valid = 1; | 468 | s->valid = 1; |
474 | s->have_metadata = 0; | 469 | s->active = 0; |
475 | s->last_percent = 0; | 470 | s->last_percent = 0; |
476 | init_rwsem(&s->lock); | 471 | init_rwsem(&s->lock); |
477 | s->table = ti->table; | 472 | s->table = ti->table; |
@@ -506,7 +501,11 @@ static int snapshot_ctr(struct dm_target *ti, unsigned int argc, char **argv) | |||
506 | goto bad5; | 501 | goto bad5; |
507 | } | 502 | } |
508 | 503 | ||
504 | /* Metadata must only be loaded into one table at once */ | ||
505 | read_snapshot_metadata(s); | ||
506 | |||
509 | /* Add snapshot to the list of snapshots for this origin */ | 507 | /* Add snapshot to the list of snapshots for this origin */ |
508 | /* Exceptions aren't triggered till snapshot_resume() is called */ | ||
510 | if (register_snapshot(s)) { | 509 | if (register_snapshot(s)) { |
511 | r = -EINVAL; | 510 | r = -EINVAL; |
512 | ti->error = "Cannot register snapshot origin"; | 511 | ti->error = "Cannot register snapshot origin"; |
@@ -862,7 +861,9 @@ static void snapshot_resume(struct dm_target *ti) | |||
862 | { | 861 | { |
863 | struct dm_snapshot *s = (struct dm_snapshot *) ti->private; | 862 | struct dm_snapshot *s = (struct dm_snapshot *) ti->private; |
864 | 863 | ||
865 | read_snapshot_metadata(s); | 864 | down_write(&s->lock); |
865 | s->active = 1; | ||
866 | up_write(&s->lock); | ||
866 | } | 867 | } |
867 | 868 | ||
868 | static int snapshot_status(struct dm_target *ti, status_type_t type, | 869 | static int snapshot_status(struct dm_target *ti, status_type_t type, |
@@ -932,8 +933,8 @@ static int __origin_write(struct list_head *snapshots, struct bio *bio) | |||
932 | /* Do all the snapshots on this origin */ | 933 | /* Do all the snapshots on this origin */ |
933 | list_for_each_entry (snap, snapshots, list) { | 934 | list_for_each_entry (snap, snapshots, list) { |
934 | 935 | ||
935 | /* Only deal with valid snapshots */ | 936 | /* Only deal with valid and active snapshots */ |
936 | if (!snap->valid) | 937 | if (!snap->valid || !snap->active) |
937 | continue; | 938 | continue; |
938 | 939 | ||
939 | /* Nothing to do if writing beyond end of snapshot */ | 940 | /* Nothing to do if writing beyond end of snapshot */ |
@@ -1104,7 +1105,7 @@ static int origin_status(struct dm_target *ti, status_type_t type, char *result, | |||
1104 | 1105 | ||
1105 | static struct target_type origin_target = { | 1106 | static struct target_type origin_target = { |
1106 | .name = "snapshot-origin", | 1107 | .name = "snapshot-origin", |
1107 | .version = {1, 0, 1}, | 1108 | .version = {1, 1, 0}, |
1108 | .module = THIS_MODULE, | 1109 | .module = THIS_MODULE, |
1109 | .ctr = origin_ctr, | 1110 | .ctr = origin_ctr, |
1110 | .dtr = origin_dtr, | 1111 | .dtr = origin_dtr, |
@@ -1115,7 +1116,7 @@ static struct target_type origin_target = { | |||
1115 | 1116 | ||
1116 | static struct target_type snapshot_target = { | 1117 | static struct target_type snapshot_target = { |
1117 | .name = "snapshot", | 1118 | .name = "snapshot", |
1118 | .version = {1, 0, 1}, | 1119 | .version = {1, 1, 0}, |
1119 | .module = THIS_MODULE, | 1120 | .module = THIS_MODULE, |
1120 | .ctr = snapshot_ctr, | 1121 | .ctr = snapshot_ctr, |
1121 | .dtr = snapshot_dtr, | 1122 | .dtr = snapshot_dtr, |
diff --git a/drivers/md/dm-snap.h b/drivers/md/dm-snap.h index 375aa24d4d7d..fdec1e2dc871 100644 --- a/drivers/md/dm-snap.h +++ b/drivers/md/dm-snap.h | |||
@@ -99,7 +99,9 @@ struct dm_snapshot { | |||
99 | 99 | ||
100 | /* You can't use a snapshot if this is 0 (e.g. if full) */ | 100 | /* You can't use a snapshot if this is 0 (e.g. if full) */ |
101 | int valid; | 101 | int valid; |
102 | int have_metadata; | 102 | |
103 | /* Origin writes don't trigger exceptions until this is set */ | ||
104 | int active; | ||
103 | 105 | ||
104 | /* Used for display of table */ | 106 | /* Used for display of table */ |
105 | char type; | 107 | char type; |