--- /dev/null
+From 5806f07cd2c32920d5105e0f9ff3117338f34eec Mon Sep 17 00:00:00 2001
+From: Jeff Mahoney <jeffm@suse.com>
+Date: Mon, 26 Jun 2006 00:27:19 -0700
+Subject: [PATCH 1/1] [PATCH] lib: add idr_replace
+
+This patch adds idr_replace() to replace an existing pointer in a single
+operation.
+
+Device-mapper will use this to update the pointer it stored against a given
+id.
+
+Signed-off-by: Jeff Mahoney <jeffm@suse.com>
+Signed-off-by: Alasdair G Kergon <agk@redhat.com>
+Signed-off-by: Andrew Morton <akpm@osdl.org>
+Signed-off-by: Linus Torvalds <torvalds@osdl.org>
+---
+ include/linux/idr.h | 1 +
+ lib/idr.c | 43 +++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 44 insertions(+), 0 deletions(-)
+
+diff --git a/include/linux/idr.h b/include/linux/idr.h
+index d37c8d8..f559a71 100644
+--- a/include/linux/idr.h
++++ b/include/linux/idr.h
+@@ -78,6 +78,7 @@ void *idr_find(struct idr *idp, int id);
+ int idr_pre_get(struct idr *idp, gfp_t gfp_mask);
+ int idr_get_new(struct idr *idp, void *ptr, int *id);
+ int idr_get_new_above(struct idr *idp, void *ptr, int starting_id, int *id);
++void *idr_replace(struct idr *idp, void *ptr, int id);
+ void idr_remove(struct idr *idp, int id);
+ void idr_destroy(struct idr *idp);
+ void idr_init(struct idr *idp);
+diff --git a/lib/idr.c b/lib/idr.c
+index de19030..4d09681 100644
+--- a/lib/idr.c
++++ b/lib/idr.c
+@@ -29,6 +29,7 @@ #include <linux/slab.h>
+ #include <linux/init.h>
+ #include <linux/module.h>
+ #endif
++#include <linux/err.h>
+ #include <linux/string.h>
+ #include <linux/idr.h>
+
+@@ -398,6 +399,48 @@ void *idr_find(struct idr *idp, int id)
+ }
+ EXPORT_SYMBOL(idr_find);
+
++/**
++ * idr_replace - replace pointer for given id
++ * @idp: idr handle
++ * @ptr: pointer you want associated with the id
++ * @id: lookup key
++ *
++ * Replace the pointer registered with an id and return the old value.
++ * A -ENOENT return indicates that @id was not found.
++ * A -EINVAL return indicates that @id was not within valid constraints.
++ *
++ * The caller must serialize vs idr_find(), idr_get_new(), and idr_remove().
++ */
++void *idr_replace(struct idr *idp, void *ptr, int id)
++{
++ int n;
++ struct idr_layer *p, *old_p;
++
++ n = idp->layers * IDR_BITS;
++ p = idp->top;
++
++ id &= MAX_ID_MASK;
++
++ if (id >= (1 << n))
++ return ERR_PTR(-EINVAL);
++
++ n -= IDR_BITS;
++ while ((n > 0) && p) {
++ p = p->ary[(id >> n) & IDR_MASK];
++ n -= IDR_BITS;
++ }
++
++ n = id & IDR_MASK;
++ if (unlikely(p == NULL || !test_bit(n, &p->bitmap)))
++ return ERR_PTR(-ENOENT);
++
++ old_p = p->ary[n];
++ p->ary[n] = ptr;
++
++ return old_p;
++}
++EXPORT_SYMBOL(idr_replace);
++
+ static void idr_cache_ctor(void * idr_layer, kmem_cache_t *idr_layer_cache,
+ unsigned long flags)
+ {
+--
+1.4.2
+
--- /dev/null
+From stable-bounces@linux.kernel.org Fri Sep 8 17:13:17 2006
+Date: Thu, 7 Sep 2006 01:33:03 +0200
+From: Adrian Bunk <bunk@stusta.de>
+To: Greg KH <gregkh@suse.de>
+Cc: linux-kernel@vger.kernel.org, stable@kernel.org
+Subject: pci_ids.h: add some VIA IDE identifiers
+Message-ID: <20060906233303.GA25473@stusta.de>
+
+From: Alan Cox <alan@redhat.com>
+
+pci_ids.h: add some VIA IDE identifiers
+
+Signed-off-by: Alan Cox <alan@redhat.com>
+Signed-off-by: Adrian Bunk <bunk@stusta.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+--- a/include/linux/pci_ids.h
++++ b/include/linux/pci_ids.h
+@@ -1235,6 +1235,7 @@ #define PCI_DEVICE_ID_VIA_PT880ULTRA 0x0
+ #define PCI_DEVICE_ID_VIA_PX8X0_0 0x0259
+ #define PCI_DEVICE_ID_VIA_3269_0 0x0269
+ #define PCI_DEVICE_ID_VIA_K8T800PRO_0 0x0282
++#define PCI_DEVICE_ID_VIA_3296_0 0x0296
+ #define PCI_DEVICE_ID_VIA_8363_0 0x0305
+ #define PCI_DEVICE_ID_VIA_P4M800CE 0x0314
+ #define PCI_DEVICE_ID_VIA_8371_0 0x0391
+@@ -1242,6 +1243,7 @@ #define PCI_DEVICE_ID_VIA_8501_0 0x0501
+ #define PCI_DEVICE_ID_VIA_82C561 0x0561
+ #define PCI_DEVICE_ID_VIA_82C586_1 0x0571
+ #define PCI_DEVICE_ID_VIA_82C576 0x0576
++#define PCI_DEVICE_ID_VIA_SATA_EIDE 0x0581
+ #define PCI_DEVICE_ID_VIA_82C586_0 0x0586
+ #define PCI_DEVICE_ID_VIA_82C596 0x0596
+ #define PCI_DEVICE_ID_VIA_82C597_0 0x0597
+@@ -1282,10 +1284,11 @@ #define PCI_DEVICE_ID_VIA_8378_0 0x3205
+ #define PCI_DEVICE_ID_VIA_8783_0 0x3208
+ #define PCI_DEVICE_ID_VIA_8237 0x3227
+ #define PCI_DEVICE_ID_VIA_8251 0x3287
+-#define PCI_DEVICE_ID_VIA_3296_0 0x0296
++#define PCI_DEVICE_ID_VIA_8237A 0x3337
+ #define PCI_DEVICE_ID_VIA_8231 0x8231
+ #define PCI_DEVICE_ID_VIA_8231_4 0x8235
+ #define PCI_DEVICE_ID_VIA_8365_1 0x8305
++#define PCI_DEVICE_ID_VIA_CX700 0x8324
+ #define PCI_DEVICE_ID_VIA_8371_1 0x8391
+ #define PCI_DEVICE_ID_VIA_82C598_1 0x8598
+ #define PCI_DEVICE_ID_VIA_838X_1 0xB188