Second revision of my ATA Over Ethernet root device patch, now with white space correction and removed debugging crud. Any more comment, suggestions? -- Jason McMullan <[email protected]> TimeSys Corporation
#### Auto-generated patch #### Date: Fri, 13 May 2005 15:15:04 -0400 Signed-Off-By: Jason McMullan <[email protected]> Description: ATA Over Ethernet root device ie 'root=/dev/etherd/e0.0/disc' on the kernel command line Depends: linux-2.6.11.7 ############################### Index of changes: Kconfig | 15 +++++++++++++++ aoe/aoe.h | 1 + aoe/aoeblk.c | 1 + aoe/aoedev.c | 16 ++++++++++++++++ aoe/aoemain.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 83 insertions(+) --- linux-orig/drivers/block/Kconfig +++ linux/drivers/block/Kconfig @@ -506,4 +506,19 @@ This driver provides Support for ATA over Ethernet block devices like the Coraid EtherDrive (R) Storage Blade. +config ATA_OVER_ETH_ROOT + bool "ATA over Ethernet root device" + depends on ATA_OVER_ETH=y + help + If you want to use ATA Over Ethernet as the root device, + set this to 'y' + +config ATA_OVER_ETH_ROOT_SHELF + int "Shelf ID" + depends on ATA_OVER_ETH_ROOT + +config ATA_OVER_ETH_ROOT_SLOT + int "Slot ID" + depends on ATA_OVER_ETH_ROOT + endmenu --- linux-orig/drivers/block/aoe/aoe.h +++ linux/drivers/block/aoe/aoe.h @@ -153,6 +153,7 @@ int aoedev_init(void); void aoedev_exit(void); struct aoedev *aoedev_bymac(unsigned char *); +struct aoedev *aoedev_bymajor_minor(ulong major, ulong minor); void aoedev_downdev(struct aoedev *d); struct aoedev *aoedev_set(ulong, unsigned char *, struct net_device *, ulong); int aoedev_busy(void); --- linux-orig/drivers/block/aoe/aoeblk.c +++ linux/drivers/block/aoe/aoeblk.c @@ -229,6 +229,7 @@ gd->capacity = d->ssize; snprintf(gd->disk_name, sizeof gd->disk_name, "etherd/e%ld.%ld", d->aoemajor, d->aoeminor); + strncpy(gd->devfs_name, gd->disk_name, sizeof gd->devfs_name); gd->queue = &d->blkq; d->gd = gd; --- linux-orig/drivers/block/aoe/aoedev.c +++ linux/drivers/block/aoe/aoedev.c @@ -28,6 +28,22 @@ return d; } +struct aoedev *aoedev_bymajor_minor(ulong major, ulong minor) +{ + struct aoedev *d; + ulong flags; + + spin_lock_irqsave(&devlist_lock, flags); + + for (d = devlist; d; d = d->next) + if (d->aoemajor == major && d->aoeminor == minor) + break; + + spin_unlock_irqrestore(&devlist_lock, flags); + return d; +} + + /* called with devlist lock held */ static struct aoedev * aoedev_newdev(ulong nframes) --- linux-orig/drivers/block/aoe/aoemain.c +++ linux/drivers/block/aoe/aoemain.c @@ -7,6 +7,14 @@ #include <linux/hdreg.h> #include <linux/blkdev.h> #include <linux/module.h> +#include <linux/devfs_fs_kernel.h> + +/* AOE Root device includes */ +#include <linux/delay.h> +#include <linux/rtnetlink.h> +#include <linux/netdevice.h> +#include <net/sock.h> + #include "aoe.h" MODULE_LICENSE("GPL"); @@ -53,6 +61,41 @@ } } +#ifdef CONFIG_ATA_OVER_ETH_ROOT +void aoe_root(unsigned long major, unsigned long minor) +{ + struct net_device *dev; + + printk(KERN_INFO + "aoe: Waiting for root AOE device e%ld.%ld\n", major, minor); + + /* Give hardware a chance to settle */ + msleep(500); + + rtnl_shlock(); + /* bring loopback device up first */ + if (dev_change_flags(&loopback_dev, loopback_dev.flags | IFF_UP) < 0) + printk(KERN_ERR "AOE Root: Failed to open %s\n", loopback_dev.name); + + /* Setup all network devices */ + for (dev = dev_base; dev ; dev = dev->next) { + if (dev == &loopback_dev) + continue; + dev_change_flags(dev, dev->flags | IFF_UP); + } + rtnl_shunlock(); + + /* Give drivers a chance to settle */ + ssleep(1); + + do { + aoecmd_cfg(major, minor); + msleep(1); + } while (!aoedev_bymajor_minor(CONFIG_ATA_OVER_ETH_ROOT_SHELF,CONFIG_ATA_OVER_ETH_ROOT_SLOT)); + +} +#endif + static void aoe_exit(void) { @@ -63,6 +106,7 @@ aoechr_exit(); aoedev_exit(); aoeblk_exit(); /* free cache after de-allocating bufs */ + devfs_remove("etherd"); } static int __init @@ -70,6 +114,8 @@ { int ret; + devfs_mk_dir("etherd"); + ret = aoedev_init(); if (ret) return ret; @@ -91,6 +137,9 @@ printk(KERN_INFO "aoe: aoe_init: AoE v2.6-%s initialised.\n", VERSION); +#ifdef CONFIG_ATA_OVER_ETH_ROOT + aoe_root(CONFIG_ATA_OVER_ETH_ROOT_SHELF,CONFIG_ATA_OVER_ETH_ROOT_SLOT); +#endif discover_timer(TINIT); return 0; @@ -102,6 +151,7 @@ aoechr_exit(); chr_fail: aoedev_exit(); + devfs_remove("etherd"); printk(KERN_INFO "aoe: aoe_init: initialisation failure.\n"); return ret;
Attachment:
signature.asc
Description: This is a digitally signed message part
- Follow-Ups:
- Re: [PATCH 2.6.11.7] ATA Over Ethernet Root, Mark 2
- From: Greg KH <[email protected]>
- Re: [PATCH 2.6.11.7] ATA Over Ethernet Root, Mark 2
- Prev by Date: Re: tickle nmi watchdog whilst doing serial writes.
- Next by Date: [patch 2.6.12-rc3] dell_rbu: Resubmitting patch for new Dell BIOS update driver
- Previous by thread: [try2] [PATCH] Silicon Image SATA 3124 driver preview
- Next by thread: Re: [PATCH 2.6.11.7] ATA Over Ethernet Root, Mark 2
- Index(es):