From: Greg KH <gregkh@suse.de>
To: linux-kernel@vger.kernel.org, stable@kernel.org
Cc: stable-review@kernel.org, torvalds@linux-foundation.org,
akpm@linux-foundation.org, alan@lxorguk.ukuu.org.uk,
Mikulas Patocka <mpatocka@redhat.com>,
Alasdair G Kergon <agk@redhat.com>
Subject: [patch 22/22] dm snapshot: fix on disk chunk size validation
Date: Thu, 10 Sep 2009 17:23:08 -0700 [thread overview]
Message-ID: <20090911002412.397568158@mini.kroah.org> (raw)
In-Reply-To: <20090911002616.GA12087@kroah.com>
[-- Attachment #1: dm-snapshot-fix-on-disk-chunk-size-validation.patch --]
[-- Type: text/plain, Size: 3206 bytes --]
2.6.30-stable review patch. If anyone has any objections, please let us know.
------------------
From: Mikulas Patocka <mpatocka@redhat.com>
commit ae0b7448e91353ea5f821601a055aca6b58042cd upstream.
Fix some problems seen in the chunk size processing when activating a
pre-existing snapshot.
For a new snapshot, the chunk size can either be supplied by the creator
or a default value can be used. For an existing snapshot, the
chunk size in the snapshot header on disk should always be used.
If someone attempts to load an existing snapshot and has the 'default
chunk size' option set, the kernel uses its default value even when it
is incorrect for the snapshot being loaded. This patch ensures the
correct on-disk value is always used.
Secondly, when the code does use the chunk size stored on the disk it is
prudent to revalidate it, so the code can exit cleanly if it got
corrupted as happened in
https://bugzilla.redhat.com/show_bug.cgi?id=461506 .
Signed-off-by: Mikulas Patocka <mpatocka@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 | 5 +++++
drivers/md/dm-snap-persistent.c | 22 ++++++++++++++--------
2 files changed, 19 insertions(+), 8 deletions(-)
--- a/drivers/md/dm-exception-store.c
+++ b/drivers/md/dm-exception-store.c
@@ -191,6 +191,11 @@ int dm_exception_store_set_chunk_size(st
return -EINVAL;
}
+ if (chunk_size_ulong > INT_MAX >> SECTOR_SHIFT) {
+ *error = "Chunk size is too high";
+ return -EINVAL;
+ }
+
store->chunk_size = chunk_size_ulong;
store->chunk_mask = chunk_size_ulong - 1;
store->chunk_shift = ffs(chunk_size_ulong) - 1;
--- a/drivers/md/dm-snap-persistent.c
+++ b/drivers/md/dm-snap-persistent.c
@@ -286,6 +286,7 @@ static int read_header(struct pstore *ps
struct disk_header *dh;
chunk_t chunk_size;
int chunk_size_supplied = 1;
+ char *chunk_err;
/*
* Use default chunk size (or hardsect_size, if larger) if none supplied
@@ -329,20 +330,25 @@ static int read_header(struct pstore *ps
ps->version = le32_to_cpu(dh->version);
chunk_size = le32_to_cpu(dh->chunk_size);
- if (!chunk_size_supplied || ps->store->chunk_size == chunk_size)
+ if (ps->store->chunk_size == chunk_size)
return 0;
- DMWARN("chunk size %llu in device metadata overrides "
- "table chunk size of %llu.",
- (unsigned long long)chunk_size,
- (unsigned long long)ps->store->chunk_size);
+ if (chunk_size_supplied)
+ DMWARN("chunk size %llu in device metadata overrides "
+ "table chunk size of %llu.",
+ (unsigned long long)chunk_size,
+ (unsigned long long)ps->store->chunk_size);
/* We had a bogus chunk_size. Fix stuff up. */
free_area(ps);
- ps->store->chunk_size = chunk_size;
- ps->store->chunk_mask = chunk_size - 1;
- ps->store->chunk_shift = ffs(chunk_size) - 1;
+ r = dm_exception_store_set_chunk_size(ps->store, chunk_size,
+ &chunk_err);
+ if (r) {
+ DMERR("invalid on-disk chunk size %llu: %s.",
+ (unsigned long long)chunk_size, chunk_err);
+ return r;
+ }
r = dm_io_client_resize(sectors_to_pages(ps->store->chunk_size),
ps->io_client);
next prev parent reply other threads:[~2009-09-11 0:29 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20090911002246.666327880@mini.kroah.org>
2009-09-11 0:26 ` [patch 00/22] 2.6.30.7-stable review Greg KH
2009-09-11 0:22 ` [patch 01/22] dccp: missing destroy of percpu counter variable while unload module Greg KH
2009-09-11 0:22 ` [patch 02/22] E100: fix interaction with swiotlb on X86 Greg KH
2009-09-11 0:22 ` [patch 03/22] gre: Fix MTU calculation for bound GRE tunnels Greg KH
2009-09-11 0:22 ` [patch 04/22] ppp: fix lost fragments in ppp_mp_explode() (resubmit) Greg KH
2009-09-11 0:22 ` [patch 05/22] pppol2tp: calls unregister_pernet_gen_device() at unload time Greg KH
2009-09-11 0:22 ` [patch 06/22] net: net_assign_generic() fix Greg KH
2009-09-11 0:22 ` [patch 07/22] sparc64: Kill spurious NMI watchdog triggers by increasing limit to 30 seconds Greg KH
2009-09-11 0:22 ` [patch 08/22] sparc64: Validate linear D-TLB misses Greg KH
2009-09-11 0:22 ` [patch 09/22] sparc64: Fix bootup with mcount in some configs Greg KH
2009-09-11 0:22 ` [patch 10/22] sparc: sys32.S incorrect compat-layer splice() system call Greg KH
2009-09-11 0:22 ` [patch 11/22] JFFS2: add missing verify buffer allocation/deallocation Greg KH
2009-09-11 0:22 ` [patch 12/22] slub: Fix kmem_cache_destroy() with SLAB_DESTROY_BY_RCU Greg KH
2009-09-11 0:22 ` [patch 13/22] nilfs2: fix preempt count underflow in nilfs_btnode_prepare_change_key Greg KH
2009-09-11 0:23 ` [patch 14/22] PCI SR-IOV: correct broken resource alignment calculations Greg KH
2009-09-11 0:23 ` [patch 15/22] SCSI: sd: fix bug in SCSI async probing Greg KH
2009-09-11 0:23 ` [patch 16/22] sound: oxygen: handle cards with missing EEPROM Greg KH
2009-09-11 0:23 ` [patch 17/22] sound: oxygen: fix MCLK rate for 192 kHz playback Greg KH
2009-09-11 0:23 ` [patch 18/22] dm raid1: do not allow log_failure variable to unset after being set Greg KH
2009-09-11 0:23 ` [patch 19/22] dm snapshot: refactor zero_disk_area to use chunk_io Greg KH
2009-09-11 0:23 ` [patch 20/22] dm snapshot: fix header corruption race on invalidation Greg KH
2009-09-11 0:23 ` [patch 21/22] dm exception store: split set_chunk_size Greg KH
2009-09-11 0:23 ` Greg KH [this message]
2009-09-11 5:19 ` [patch 00/22] 2.6.30.7-stable review Dmitry Torokhov
2009-09-11 15:31 ` [stable] " Greg KH
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090911002412.397568158@mini.kroah.org \
--to=gregkh@suse.de \
--cc=agk@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=linux-kernel@vger.kernel.org \
--cc=mpatocka@redhat.com \
--cc=stable-review@kernel.org \
--cc=stable@kernel.org \
--cc=torvalds@linux-foundation.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox