lkml.org 
[lkml]   [2005]   [May]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    Subject[PATCH 2.6.11.7] ATA Over Ethernet Root
    Date
    From
    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 <jason.mcmullan@timesys.com>
    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 <jason.mcmullan@timesys.com>

    --- 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;[unhandled content-type:application/pgp-signature]
    \
     
     \ /
      Last update: 2005-05-13 19:27    [W:0.040 / U:62.588 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site