| From stable-bounces@linux.kernel.org Thu Jul 12 09:28:21 2007 |
| From: Milan Broz <mbroz@redhat.com> |
| Date: Thu, 12 Jul 2007 17:28:13 +0100 |
| Subject: dm snapshot: permit invalid activation |
| To: Linus Torvalds <torvalds@linux-foundation.org> |
| Cc: stable@kernel.org, Milan Broz <mbroz@redhat.com> |
| Message-ID: <20070712162813.GR24114@agk.fab.redhat.com> |
| Content-Disposition: inline |
| |
| |
| From: Milan Broz <mbroz@redhat.com> |
| |
| Allow invalid snapshots to be activated instead of failing. |
| |
| This allows userspace to reinstate any given snapshot state - for |
| example after an unscheduled reboot - and clean up the invalid snapshot |
| at its leisure. |
| |
| Signed-off-by: Milan Broz <mbroz@redhat.com> |
| Signed-off-by: Alasdair G Kergon <agk@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| |
| --- |
| drivers/md/dm-exception-store.c | 11 ++++++----- |
| drivers/md/dm-snap.c | 5 ++++- |
| 2 files changed, 10 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/md/dm-exception-store.c |
| +++ b/drivers/md/dm-exception-store.c |
| @@ -457,11 +457,6 @@ static int persistent_read_metadata(stru |
| /* |
| * Sanity checks. |
| */ |
| - if (!ps->valid) { |
| - DMWARN("snapshot is marked invalid"); |
| - return -EINVAL; |
| - } |
| - |
| if (ps->version != SNAPSHOT_DISK_VERSION) { |
| DMWARN("unable to handle snapshot disk version %d", |
| ps->version); |
| @@ -469,6 +464,12 @@ static int persistent_read_metadata(stru |
| } |
| |
| /* |
| + * Metadata are valid, but snapshot is invalidated |
| + */ |
| + if (!ps->valid) |
| + return 1; |
| + |
| + /* |
| * Read the metadata. |
| */ |
| r = read_exceptions(ps); |
| --- a/drivers/md/dm-snap.c |
| +++ b/drivers/md/dm-snap.c |
| @@ -522,9 +522,12 @@ static int snapshot_ctr(struct dm_target |
| |
| /* Metadata must only be loaded into one table at once */ |
| r = s->store.read_metadata(&s->store); |
| - if (r) { |
| + if (r < 0) { |
| ti->error = "Failed to read snapshot metadata"; |
| goto bad6; |
| + } else if (r > 0) { |
| + s->valid = 0; |
| + DMWARN("Snapshot is marked invalid."); |
| } |
| |
| bio_list_init(&s->queued_bios); |