diff options
Diffstat (limited to 'drivers/md/dm-snap.c')
-rw-r--r-- | drivers/md/dm-snap.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c index ab54f99b7c3b..4b9dd8fb1e5c 100644 --- a/drivers/md/dm-snap.c +++ b/drivers/md/dm-snap.c | |||
@@ -371,6 +371,20 @@ static inline ulong round_up(ulong n, ulong size) | |||
371 | return (n + size) & ~size; | 371 | return (n + size) & ~size; |
372 | } | 372 | } |
373 | 373 | ||
374 | static void read_snapshot_metadata(struct dm_snapshot *s) | ||
375 | { | ||
376 | if (s->have_metadata) | ||
377 | return; | ||
378 | |||
379 | if (s->store.read_metadata(&s->store)) { | ||
380 | down_write(&s->lock); | ||
381 | s->valid = 0; | ||
382 | up_write(&s->lock); | ||
383 | } | ||
384 | |||
385 | s->have_metadata = 1; | ||
386 | } | ||
387 | |||
374 | /* | 388 | /* |
375 | * Construct a snapshot mapping: <origin_dev> <COW-dev> <p/n> <chunk-size> | 389 | * Construct a snapshot mapping: <origin_dev> <COW-dev> <p/n> <chunk-size> |
376 | */ | 390 | */ |
@@ -848,16 +862,7 @@ static void snapshot_resume(struct dm_target *ti) | |||
848 | { | 862 | { |
849 | struct dm_snapshot *s = (struct dm_snapshot *) ti->private; | 863 | struct dm_snapshot *s = (struct dm_snapshot *) ti->private; |
850 | 864 | ||
851 | if (s->have_metadata) | 865 | read_snapshot_metadata(s); |
852 | return; | ||
853 | |||
854 | if (s->store.read_metadata(&s->store)) { | ||
855 | down_write(&s->lock); | ||
856 | s->valid = 0; | ||
857 | up_write(&s->lock); | ||
858 | } | ||
859 | |||
860 | s->have_metadata = 1; | ||
861 | } | 866 | } |
862 | 867 | ||
863 | static int snapshot_status(struct dm_target *ti, status_type_t type, | 868 | static int snapshot_status(struct dm_target *ti, status_type_t type, |