This patch allows you to use ATA Over Ethernet as your root device, with 'root=/dev/etherd/eX.Y/disc' Limited testing, just for ya'lls review. -- Jason McMullan <[email protected]> TimeSys Corporation
Description: ATA Over Ethernet root device ie 'root=/dev/etherd/e0.0/disc' on the kernel command line Signed-Off-By: Jason McMullan <[email protected]> --- 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,23 @@ 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,13 @@ #include <linux/hdreg.h> #include <linux/blkdev.h> #include <linux/module.h> +#include <linux/devfs_fs_kernel.h> +#ifdef CONFIG_ATA_OVER_ETH_ROOT +#include <linux/delay.h> +#include <linux/rtnetlink.h> +#include <linux/netdevice.h> +#include <net/sock.h> +#endif #include "aoe.h" MODULE_LICENSE("GPL"); @@ -53,6 +60,43 @@ } } +#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 */ +printk("Bring up loopback...\n"); + 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; +printk("Bring up %s...\n",dev->name); + 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 +107,7 @@ aoechr_exit(); aoedev_exit(); aoeblk_exit(); /* free cache after de-allocating bufs */ + devfs_remove("etherd"); } static int __init @@ -70,6 +115,8 @@ { int ret; + devfs_mk_dir("etherd"); + ret = aoedev_init(); if (ret) return ret; @@ -91,6 +138,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 +152,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
- From: randy_dunlap <[email protected]>
- Re: [PATCH 2.6.11.7] ATA Over Ethernet Root
- Prev by Date: Re: Sync option destroys flash!
- Next by Date: Re: [PATCH] namespace.c: fix bind mount from foreign namespace
- Previous by thread: 2.6.12-rc4-kj
- Next by thread: Re: [PATCH 2.6.11.7] ATA Over Ethernet Root
- Index(es):