diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2006-02-07 14:29:53 -0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-02-07 14:29:53 -0800 |
commit | 24e1d1b5b5ff506904493ca3bacc464f2f059866 (patch) | |
tree | ed6e38223c77bc2fa48b914e407b205a437c3a5b /driver | |
parent | 6270aa63b3ee5dcf78aa915719a0425bbee176ee (diff) | |
download | patches-24e1d1b5b5ff506904493ca3bacc464f2f059866.tar.gz |
more patches added
Diffstat (limited to 'driver')
-rw-r--r-- | driver/aoe-don-t-request-ata-device-id-on-ata-error.patch | 36 | ||||
-rw-r--r-- | driver/aoe-support-multiple-aoe-listeners.patch | 59 | ||||
-rw-r--r-- | driver/aoe-update-version-to-22.patch | 24 | ||||
-rw-r--r-- | driver/kobj_map-semaphore-to-mutex-conversion.patch | 350 |
4 files changed, 469 insertions, 0 deletions
diff --git a/driver/aoe-don-t-request-ata-device-id-on-ata-error.patch b/driver/aoe-don-t-request-ata-device-id-on-ata-error.patch new file mode 100644 index 00000000000000..48460c7b6e0ace --- /dev/null +++ b/driver/aoe-don-t-request-ata-device-id-on-ata-error.patch @@ -0,0 +1,36 @@ +From ecashin@coraid.com Tue Feb 7 08:45:58 2006 +Message-ID: <80311f892d2d2a1267fff540f00786e5@coraid.com> +From: "Ed L. Cashin" <ecashin@coraid.com> +Date: Tue, 7 Feb 2006 11:37:24 -0500 +Cc: ecashin@coraid.com, Greg K-H <greg@kroah.com> +Subject: aoe [2/3]: don't request ATA device ID on ATA error + +On an ATA error response, take the device down instead of +sending another ATA device identify command. + +Signed-off-by: "Ed L. Cashin" <ecashin@coraid.com> + + +--- + drivers/block/aoe/aoecmd.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- gregkh-2.6.orig/drivers/block/aoe/aoecmd.c ++++ gregkh-2.6/drivers/block/aoe/aoecmd.c +@@ -517,6 +517,8 @@ aoecmd_ata_rsp(struct sk_buff *skb) + ahout = (struct aoe_atahdr *) (f->data + sizeof(struct aoe_hdr)); + buf = f->buf; + ++ if (ahout->cmdstat == WIN_IDENTIFY) ++ d->flags &= ~DEVFL_PAUSE; + if (ahin->cmdstat & 0xa9) { /* these bits cleared on success */ + printk(KERN_CRIT "aoe: aoecmd_ata_rsp: ata error cmd=%2.2Xh " + "stat=%2.2Xh from e%ld.%ld\n", +@@ -549,7 +551,6 @@ aoecmd_ata_rsp(struct sk_buff *skb) + return; + } + ataid_complete(d, (char *) (ahin+1)); +- d->flags &= ~DEVFL_PAUSE; + break; + default: + printk(KERN_INFO "aoe: aoecmd_ata_rsp: unrecognized " diff --git a/driver/aoe-support-multiple-aoe-listeners.patch b/driver/aoe-support-multiple-aoe-listeners.patch new file mode 100644 index 00000000000000..9fd5a82d648546 --- /dev/null +++ b/driver/aoe-support-multiple-aoe-listeners.patch @@ -0,0 +1,59 @@ +From ecashin@coraid.com Tue Feb 7 08:35:37 2006 +Message-ID: <ec00c288a47234f512469754034c6f88@coraid.com> +From: "Ed L. Cashin" <ecashin@coraid.com> +Date: Tue, 7 Feb 2006 11:26:39 -0500 +Cc: ecashin@coraid.com, Greg K-H <greg@kroah.com> +Subject: aoe [1/3]: support multiple AoE listeners + + +Always clone incoming skbs, allowing other AoE listeners +to exist in the kernel. + +Signed-off-by: "Ed L. Cashin" <ecashin@coraid.com> +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +--- + drivers/block/aoe/aoenet.c | 22 +++++----------------- + 1 file changed, 5 insertions(+), 17 deletions(-) + +--- gregkh-2.6.orig/drivers/block/aoe/aoenet.c ++++ gregkh-2.6/drivers/block/aoe/aoenet.c +@@ -92,18 +92,6 @@ mac_addr(char addr[6]) + return __be64_to_cpu(n); + } + +-static struct sk_buff * +-skb_check(struct sk_buff *skb) +-{ +- if (skb_is_nonlinear(skb)) +- if ((skb = skb_share_check(skb, GFP_ATOMIC))) +- if (skb_linearize(skb, GFP_ATOMIC) < 0) { +- dev_kfree_skb(skb); +- return NULL; +- } +- return skb; +-} +- + void + aoenet_xmit(struct sk_buff *sl) + { +@@ -125,14 +113,14 @@ aoenet_rcv(struct sk_buff *skb, struct n + struct aoe_hdr *h; + u32 n; + +- skb = skb_check(skb); +- if (!skb) ++ skb = skb_share_check(skb, GFP_ATOMIC); ++ if (skb == NULL) + return 0; +- ++ if (skb_is_nonlinear(skb)) ++ if (skb_linearize(skb, GFP_ATOMIC) < 0) ++ goto exit; + if (!is_aoe_netif(ifp)) + goto exit; +- +- //skb->len += ETH_HLEN; /* (1) */ + skb_push(skb, ETH_HLEN); /* (1) */ + + h = (struct aoe_hdr *) skb->mac.raw; diff --git a/driver/aoe-update-version-to-22.patch b/driver/aoe-update-version-to-22.patch new file mode 100644 index 00000000000000..41fa27d71e9827 --- /dev/null +++ b/driver/aoe-update-version-to-22.patch @@ -0,0 +1,24 @@ +From ecashin@coraid.com Tue Feb 7 08:58:03 2006 +Message-ID: <90e15e828c9fdf80585f67aed54dca38@coraid.com> +Date: Tue, 7 Feb 2006 11:37:36 -0500 +From: "Ed L. Cashin" <ecashin@coraid.com> +Cc: ecashin@coraid.com, Greg K-H <greg@kroah.com> +Subject: aoe [3/3]: update version to 22 + +Increase version number to 22. + +Signed-off-by: "Ed L. Cashin" <ecashin@coraid.com> + +--- + drivers/block/aoe/aoe.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- gregkh-2.6.orig/drivers/block/aoe/aoe.h ++++ gregkh-2.6/drivers/block/aoe/aoe.h +@@ -1,5 +1,5 @@ + /* Copyright (c) 2004 Coraid, Inc. See COPYING for GPL terms. */ +-#define VERSION "21" ++#define VERSION "22" + #define AOE_MAJOR 152 + #define DEVICE_NAME "aoe" + diff --git a/driver/kobj_map-semaphore-to-mutex-conversion.patch b/driver/kobj_map-semaphore-to-mutex-conversion.patch new file mode 100644 index 00000000000000..57ca5056167c85 --- /dev/null +++ b/driver/kobj_map-semaphore-to-mutex-conversion.patch @@ -0,0 +1,350 @@ +From akpm@osdl.org Mon Feb 6 14:10:39 2006 +Message-Id: <200602062210.k16MAa5X031577@shell0.pdx.osdl.net> +Subject: kobj_map semaphore to mutex conversion +To: jes@sgi.com, greg@kroah.com, mm-commits@vger.kernel.org +From: akpm@osdl.org +Date: Mon, 6 Feb 2006 14:12:43 -0800 + +From: Jes Sorensen <jes@sgi.com> + +Convert the kobj_map code to use a mutex instead of a semaphore. It +converts the single two users as well, genhd.c and char_dev.c. + +Signed-off-by: Jes Sorensen <jes@sgi.com> +Signed-off-by: Andrew Morton <akpm@osdl.org> +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> +--- + block/genhd.c | 31 ++++++++++++++++--------------- + drivers/base/map.c | 21 +++++++++++---------- + fs/char_dev.c | 17 +++++++++-------- + include/linux/kobj_map.h | 4 ++-- + 4 files changed, 38 insertions(+), 35 deletions(-) + +--- gregkh-2.6.orig/block/genhd.c ++++ gregkh-2.6/block/genhd.c +@@ -15,12 +15,13 @@ + #include <linux/kmod.h> + #include <linux/kobj_map.h> + #include <linux/buffer_head.h> ++#include <linux/mutex.h> + + #define MAX_PROBE_HASH 255 /* random */ + + static struct subsystem block_subsys; + +-static DECLARE_MUTEX(block_subsys_sem); ++static DEFINE_MUTEX(block_subsys_lock); + + /* + * Can be deleted altogether. Later. +@@ -46,7 +47,7 @@ struct blkdev_info { + /* + * iterate over a list of blkdev_info structures. allows + * the major_names array to be iterated over from outside this file +- * must be called with the block_subsys_sem held ++ * must be called with the block_subsys_lock held + */ + void *get_next_blkdev(void *dev) + { +@@ -85,20 +86,20 @@ out: + + void *acquire_blkdev_list(void) + { +- down(&block_subsys_sem); ++ mutex_lock(&block_subsys_lock); + return get_next_blkdev(NULL); + } + + void release_blkdev_list(void *dev) + { +- up(&block_subsys_sem); ++ mutex_unlock(&block_subsys_lock); + kfree(dev); + } + + + /* + * Count the number of records in the blkdev_list. +- * must be called with the block_subsys_sem held ++ * must be called with the block_subsys_lock held + */ + int count_blkdev_list(void) + { +@@ -118,7 +119,7 @@ int count_blkdev_list(void) + /* + * extract the major and name values from a blkdev_info struct + * passed in as a void to *dev. Must be called with +- * block_subsys_sem held ++ * block_subsys_lock held + */ + int get_blkdev_info(void *dev, int *major, char **name) + { +@@ -138,7 +139,7 @@ int register_blkdev(unsigned int major, + struct blk_major_name **n, *p; + int index, ret = 0; + +- down(&block_subsys_sem); ++ mutex_lock(&block_subsys_lock); + + /* temporary */ + if (major == 0) { +@@ -183,7 +184,7 @@ int register_blkdev(unsigned int major, + kfree(p); + } + out: +- up(&block_subsys_sem); ++ mutex_unlock(&block_subsys_lock); + return ret; + } + +@@ -197,7 +198,7 @@ int unregister_blkdev(unsigned int major + int index = major_to_index(major); + int ret = 0; + +- down(&block_subsys_sem); ++ mutex_lock(&block_subsys_lock); + for (n = &major_names[index]; *n; n = &(*n)->next) + if ((*n)->major == major) + break; +@@ -207,7 +208,7 @@ int unregister_blkdev(unsigned int major + p = *n; + *n = p->next; + } +- up(&block_subsys_sem); ++ mutex_unlock(&block_subsys_lock); + kfree(p); + + return ret; +@@ -301,7 +302,7 @@ static void *part_start(struct seq_file + struct list_head *p; + loff_t l = *pos; + +- down(&block_subsys_sem); ++ mutex_lock(&block_subsys_lock); + list_for_each(p, &block_subsys.kset.list) + if (!l--) + return list_entry(p, struct gendisk, kobj.entry); +@@ -318,7 +319,7 @@ static void *part_next(struct seq_file * + + static void part_stop(struct seq_file *part, void *v) + { +- up(&block_subsys_sem); ++ mutex_unlock(&block_subsys_lock); + } + + static int show_partition(struct seq_file *part, void *v) +@@ -377,7 +378,7 @@ static struct kobject *base_probe(dev_t + + static int __init genhd_device_init(void) + { +- bdev_map = kobj_map_init(base_probe, &block_subsys_sem); ++ bdev_map = kobj_map_init(base_probe, &block_subsys_lock); + blk_dev_init(); + subsystem_register(&block_subsys); + return 0; +@@ -611,7 +612,7 @@ static void *diskstats_start(struct seq_ + loff_t k = *pos; + struct list_head *p; + +- down(&block_subsys_sem); ++ mutex_lock(&block_subsys_lock); + list_for_each(p, &block_subsys.kset.list) + if (!k--) + return list_entry(p, struct gendisk, kobj.entry); +@@ -628,7 +629,7 @@ static void *diskstats_next(struct seq_f + + static void diskstats_stop(struct seq_file *part, void *v) + { +- up(&block_subsys_sem); ++ mutex_unlock(&block_subsys_lock); + } + + static int diskstats_show(struct seq_file *s, void *v) +--- gregkh-2.6.orig/drivers/base/map.c ++++ gregkh-2.6/drivers/base/map.c +@@ -11,6 +11,7 @@ + + #include <linux/module.h> + #include <linux/slab.h> ++#include <linux/mutex.h> + #include <linux/kdev_t.h> + #include <linux/kobject.h> + #include <linux/kobj_map.h> +@@ -25,7 +26,7 @@ struct kobj_map { + int (*lock)(dev_t, void *); + void *data; + } *probes[255]; +- struct semaphore *sem; ++ struct mutex *lock; + }; + + int kobj_map(struct kobj_map *domain, dev_t dev, unsigned long range, +@@ -53,7 +54,7 @@ int kobj_map(struct kobj_map *domain, de + p->range = range; + p->data = data; + } +- down(domain->sem); ++ mutex_lock(domain->lock); + for (i = 0, p -= n; i < n; i++, p++, index++) { + struct probe **s = &domain->probes[index % 255]; + while (*s && (*s)->range < range) +@@ -61,7 +62,7 @@ int kobj_map(struct kobj_map *domain, de + p->next = *s; + *s = p; + } +- up(domain->sem); ++ mutex_unlock(domain->lock); + return 0; + } + +@@ -75,7 +76,7 @@ void kobj_unmap(struct kobj_map *domain, + if (n > 255) + n = 255; + +- down(domain->sem); ++ mutex_lock(domain->lock); + for (i = 0; i < n; i++, index++) { + struct probe **s; + for (s = &domain->probes[index % 255]; *s; s = &(*s)->next) { +@@ -88,7 +89,7 @@ void kobj_unmap(struct kobj_map *domain, + } + } + } +- up(domain->sem); ++ mutex_unlock(domain->lock); + kfree(found); + } + +@@ -99,7 +100,7 @@ struct kobject *kobj_lookup(struct kobj_ + unsigned long best = ~0UL; + + retry: +- down(domain->sem); ++ mutex_lock(domain->lock); + for (p = domain->probes[MAJOR(dev) % 255]; p; p = p->next) { + struct kobject *(*probe)(dev_t, int *, void *); + struct module *owner; +@@ -120,7 +121,7 @@ retry: + module_put(owner); + continue; + } +- up(domain->sem); ++ mutex_unlock(domain->lock); + kobj = probe(dev, index, data); + /* Currently ->owner protects _only_ ->probe() itself. */ + module_put(owner); +@@ -128,11 +129,11 @@ retry: + return kobj; + goto retry; + } +- up(domain->sem); ++ mutex_unlock(domain->lock); + return NULL; + } + +-struct kobj_map *kobj_map_init(kobj_probe_t *base_probe, struct semaphore *sem) ++struct kobj_map *kobj_map_init(kobj_probe_t *base_probe, struct mutex *lock) + { + struct kobj_map *p = kmalloc(sizeof(struct kobj_map), GFP_KERNEL); + struct probe *base = kzalloc(sizeof(*base), GFP_KERNEL); +@@ -149,6 +150,6 @@ struct kobj_map *kobj_map_init(kobj_prob + base->get = base_probe; + for (i = 0; i < 255; i++) + p->probes[i] = base; +- p->sem = sem; ++ p->lock = lock; + return p; + } +--- gregkh-2.6.orig/fs/char_dev.c ++++ gregkh-2.6/fs/char_dev.c +@@ -19,6 +19,7 @@ + #include <linux/kobject.h> + #include <linux/kobj_map.h> + #include <linux/cdev.h> ++#include <linux/mutex.h> + + #ifdef CONFIG_KMOD + #include <linux/kmod.h> +@@ -28,7 +29,7 @@ static struct kobj_map *cdev_map; + + #define MAX_PROBE_HASH 255 /* random */ + +-static DECLARE_MUTEX(chrdevs_lock); ++static DEFINE_MUTEX(chrdevs_lock); + + static struct char_device_struct { + struct char_device_struct *next; +@@ -88,13 +89,13 @@ out: + + void *acquire_chrdev_list(void) + { +- down(&chrdevs_lock); ++ mutex_lock(&chrdevs_lock); + return get_next_chrdev(NULL); + } + + void release_chrdev_list(void *dev) + { +- up(&chrdevs_lock); ++ mutex_unlock(&chrdevs_lock); + kfree(dev); + } + +@@ -151,7 +152,7 @@ __register_chrdev_region(unsigned int ma + + memset(cd, 0, sizeof(struct char_device_struct)); + +- down(&chrdevs_lock); ++ mutex_lock(&chrdevs_lock); + + /* temporary */ + if (major == 0) { +@@ -186,10 +187,10 @@ __register_chrdev_region(unsigned int ma + } + cd->next = *cp; + *cp = cd; +- up(&chrdevs_lock); ++ mutex_unlock(&chrdevs_lock); + return cd; + out: +- up(&chrdevs_lock); ++ mutex_unlock(&chrdevs_lock); + kfree(cd); + return ERR_PTR(ret); + } +@@ -200,7 +201,7 @@ __unregister_chrdev_region(unsigned majo + struct char_device_struct *cd = NULL, **cp; + int i = major_to_index(major); + +- down(&chrdevs_lock); ++ mutex_lock(&chrdevs_lock); + for (cp = &chrdevs[i]; *cp; cp = &(*cp)->next) + if ((*cp)->major == major && + (*cp)->baseminor == baseminor && +@@ -210,7 +211,7 @@ __unregister_chrdev_region(unsigned majo + cd = *cp; + *cp = cd->next; + } +- up(&chrdevs_lock); ++ mutex_unlock(&chrdevs_lock); + return cd; + } + +--- gregkh-2.6.orig/include/linux/kobj_map.h ++++ gregkh-2.6/include/linux/kobj_map.h +@@ -1,6 +1,6 @@ + #ifdef __KERNEL__ + +-#include <asm/semaphore.h> ++#include <linux/mutex.h> + + typedef struct kobject *kobj_probe_t(dev_t, int *, void *); + struct kobj_map; +@@ -9,6 +9,6 @@ int kobj_map(struct kobj_map *, dev_t, u + kobj_probe_t *, int (*)(dev_t, void *), void *); + void kobj_unmap(struct kobj_map *, dev_t, unsigned long); + struct kobject *kobj_lookup(struct kobj_map *, dev_t, int *); +-struct kobj_map *kobj_map_init(kobj_probe_t *, struct semaphore *); ++struct kobj_map *kobj_map_init(kobj_probe_t *, struct mutex *); + + #endif |