Merge of rsync://rsync.kernel.org/pub/scm/linux/kernel/git/gregkh/aoe-2.6.git/
This commit is contained in:
commit
a1d4ebdbb3
6 changed files with 70 additions and 17 deletions
|
@ -4,6 +4,16 @@ The EtherDrive (R) HOWTO for users of 2.6 kernels is found at ...
|
||||||
|
|
||||||
It has many tips and hints!
|
It has many tips and hints!
|
||||||
|
|
||||||
|
The aoetools are userland programs that are designed to work with this
|
||||||
|
driver. The aoetools are on sourceforge.
|
||||||
|
|
||||||
|
http://aoetools.sourceforge.net/
|
||||||
|
|
||||||
|
The scripts in this Documentation/aoe directory are intended to
|
||||||
|
document the use of the driver and are not necessary if you install
|
||||||
|
the aoetools.
|
||||||
|
|
||||||
|
|
||||||
CREATING DEVICE NODES
|
CREATING DEVICE NODES
|
||||||
|
|
||||||
Users of udev should find the block device nodes created
|
Users of udev should find the block device nodes created
|
||||||
|
@ -35,14 +45,15 @@ USING DEVICE NODES
|
||||||
|
|
||||||
"echo eth2 eth4 > /dev/etherd/interfaces" tells the aoe driver to
|
"echo eth2 eth4 > /dev/etherd/interfaces" tells the aoe driver to
|
||||||
limit ATA over Ethernet traffic to eth2 and eth4. AoE traffic from
|
limit ATA over Ethernet traffic to eth2 and eth4. AoE traffic from
|
||||||
untrusted networks should be ignored as a matter of security.
|
untrusted networks should be ignored as a matter of security. See
|
||||||
|
also the aoe_iflist driver option described below.
|
||||||
|
|
||||||
"echo > /dev/etherd/discover" tells the driver to find out what AoE
|
"echo > /dev/etherd/discover" tells the driver to find out what AoE
|
||||||
devices are available.
|
devices are available.
|
||||||
|
|
||||||
These character devices may disappear and be replaced by sysfs
|
These character devices may disappear and be replaced by sysfs
|
||||||
counterparts, so distribution maintainers are encouraged to create
|
counterparts. Using the commands in aoetools insulates users from
|
||||||
scripts that use these devices.
|
these implementation details.
|
||||||
|
|
||||||
The block devices are named like this:
|
The block devices are named like this:
|
||||||
|
|
||||||
|
@ -66,7 +77,8 @@ USING SYSFS
|
||||||
through which we are communicating with the remote AoE device.
|
through which we are communicating with the remote AoE device.
|
||||||
|
|
||||||
There is a script in this directory that formats this information
|
There is a script in this directory that formats this information
|
||||||
in a convenient way.
|
in a convenient way. Users with aoetools can use the aoe-stat
|
||||||
|
command.
|
||||||
|
|
||||||
root@makki root# sh Documentation/aoe/status.sh
|
root@makki root# sh Documentation/aoe/status.sh
|
||||||
e10.0 eth3 up
|
e10.0 eth3 up
|
||||||
|
@ -89,3 +101,23 @@ USING SYSFS
|
||||||
e4.7 eth1 up
|
e4.7 eth1 up
|
||||||
e4.8 eth1 up
|
e4.8 eth1 up
|
||||||
e4.9 eth1 up
|
e4.9 eth1 up
|
||||||
|
|
||||||
|
Use /sys/module/aoe/parameters/aoe_iflist (or better, the driver
|
||||||
|
option discussed below) instead of /dev/etherd/interfaces to limit
|
||||||
|
AoE traffic to the network interfaces in the given
|
||||||
|
whitespace-separated list. Unlike the old character device, the
|
||||||
|
sysfs entry can be read from as well as written to.
|
||||||
|
|
||||||
|
It's helpful to trigger discovery after setting the list of allowed
|
||||||
|
interfaces. The aoetools package provides an aoe-discover script
|
||||||
|
for this purpose. You can also directly use the
|
||||||
|
/dev/etherd/discover special file described above.
|
||||||
|
|
||||||
|
DRIVER OPTIONS
|
||||||
|
|
||||||
|
There is a boot option for the built-in aoe driver and a
|
||||||
|
corresponding module parameter, aoe_iflist. Without this option,
|
||||||
|
all network interfaces may be used for ATA over Ethernet. Here is a
|
||||||
|
usage example for the module parameter.
|
||||||
|
|
||||||
|
modprobe aoe_iflist="eth1 eth3"
|
||||||
|
|
|
@ -14,10 +14,6 @@ test ! -d "$sysd/block" && {
|
||||||
echo "$me Error: sysfs is not mounted" 1>&2
|
echo "$me Error: sysfs is not mounted" 1>&2
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
test -z "`lsmod | grep '^aoe'`" && {
|
|
||||||
echo "$me Error: aoe module is not loaded" 1>&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
for d in `ls -d $sysd/block/etherd* 2>/dev/null | grep -v p` end; do
|
for d in `ls -d $sysd/block/etherd* 2>/dev/null | grep -v p` end; do
|
||||||
# maybe ls comes up empty, so we use "end"
|
# maybe ls comes up empty, so we use "end"
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Copyright (c) 2004 Coraid, Inc. See COPYING for GPL terms. */
|
/* Copyright (c) 2004 Coraid, Inc. See COPYING for GPL terms. */
|
||||||
#define VERSION "6"
|
#define VERSION "10"
|
||||||
#define AOE_MAJOR 152
|
#define AOE_MAJOR 152
|
||||||
#define DEVICE_NAME "aoe"
|
#define DEVICE_NAME "aoe"
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,13 @@ static ssize_t aoedisk_show_netif(struct gendisk * disk, char *page)
|
||||||
|
|
||||||
return snprintf(page, PAGE_SIZE, "%s\n", d->ifp->name);
|
return snprintf(page, PAGE_SIZE, "%s\n", d->ifp->name);
|
||||||
}
|
}
|
||||||
|
/* firmware version */
|
||||||
|
static ssize_t aoedisk_show_fwver(struct gendisk * disk, char *page)
|
||||||
|
{
|
||||||
|
struct aoedev *d = disk->private_data;
|
||||||
|
|
||||||
|
return snprintf(page, PAGE_SIZE, "0x%04x\n", (unsigned int) d->fw_ver);
|
||||||
|
}
|
||||||
|
|
||||||
static struct disk_attribute disk_attr_state = {
|
static struct disk_attribute disk_attr_state = {
|
||||||
.attr = {.name = "state", .mode = S_IRUGO },
|
.attr = {.name = "state", .mode = S_IRUGO },
|
||||||
|
@ -50,6 +57,10 @@ static struct disk_attribute disk_attr_netif = {
|
||||||
.attr = {.name = "netif", .mode = S_IRUGO },
|
.attr = {.name = "netif", .mode = S_IRUGO },
|
||||||
.show = aoedisk_show_netif
|
.show = aoedisk_show_netif
|
||||||
};
|
};
|
||||||
|
static struct disk_attribute disk_attr_fwver = {
|
||||||
|
.attr = {.name = "firmware-version", .mode = S_IRUGO },
|
||||||
|
.show = aoedisk_show_fwver
|
||||||
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
aoedisk_add_sysfs(struct aoedev *d)
|
aoedisk_add_sysfs(struct aoedev *d)
|
||||||
|
@ -57,6 +68,7 @@ aoedisk_add_sysfs(struct aoedev *d)
|
||||||
sysfs_create_file(&d->gd->kobj, &disk_attr_state.attr);
|
sysfs_create_file(&d->gd->kobj, &disk_attr_state.attr);
|
||||||
sysfs_create_file(&d->gd->kobj, &disk_attr_mac.attr);
|
sysfs_create_file(&d->gd->kobj, &disk_attr_mac.attr);
|
||||||
sysfs_create_file(&d->gd->kobj, &disk_attr_netif.attr);
|
sysfs_create_file(&d->gd->kobj, &disk_attr_netif.attr);
|
||||||
|
sysfs_create_file(&d->gd->kobj, &disk_attr_fwver.attr);
|
||||||
}
|
}
|
||||||
void
|
void
|
||||||
aoedisk_rm_sysfs(struct aoedev *d)
|
aoedisk_rm_sysfs(struct aoedev *d)
|
||||||
|
@ -64,6 +76,7 @@ aoedisk_rm_sysfs(struct aoedev *d)
|
||||||
sysfs_remove_link(&d->gd->kobj, "state");
|
sysfs_remove_link(&d->gd->kobj, "state");
|
||||||
sysfs_remove_link(&d->gd->kobj, "mac");
|
sysfs_remove_link(&d->gd->kobj, "mac");
|
||||||
sysfs_remove_link(&d->gd->kobj, "netif");
|
sysfs_remove_link(&d->gd->kobj, "netif");
|
||||||
|
sysfs_remove_link(&d->gd->kobj, "firmware-version");
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
|
@ -109,25 +109,22 @@ aoedev_set(ulong sysminor, unsigned char *addr, struct net_device *ifp, ulong bu
|
||||||
spin_lock_irqsave(&devlist_lock, flags);
|
spin_lock_irqsave(&devlist_lock, flags);
|
||||||
|
|
||||||
for (d=devlist; d; d=d->next)
|
for (d=devlist; d; d=d->next)
|
||||||
if (d->sysminor == sysminor
|
if (d->sysminor == sysminor)
|
||||||
|| memcmp(d->addr, addr, sizeof d->addr) == 0)
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (d == NULL && (d = aoedev_newdev(bufcnt)) == NULL) {
|
if (d == NULL && (d = aoedev_newdev(bufcnt)) == NULL) {
|
||||||
spin_unlock_irqrestore(&devlist_lock, flags);
|
spin_unlock_irqrestore(&devlist_lock, flags);
|
||||||
printk(KERN_INFO "aoe: aoedev_set: aoedev_newdev failure.\n");
|
printk(KERN_INFO "aoe: aoedev_set: aoedev_newdev failure.\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
} /* if newdev, (d->flags & DEVFL_UP) == 0 for below */
|
||||||
|
|
||||||
spin_unlock_irqrestore(&devlist_lock, flags);
|
spin_unlock_irqrestore(&devlist_lock, flags);
|
||||||
spin_lock_irqsave(&d->lock, flags);
|
spin_lock_irqsave(&d->lock, flags);
|
||||||
|
|
||||||
d->ifp = ifp;
|
d->ifp = ifp;
|
||||||
|
memcpy(d->addr, addr, sizeof d->addr);
|
||||||
if (d->sysminor != sysminor
|
if ((d->flags & DEVFL_UP) == 0) {
|
||||||
|| (d->flags & DEVFL_UP) == 0) {
|
|
||||||
aoedev_downdev(d); /* flushes outstanding frames */
|
aoedev_downdev(d); /* flushes outstanding frames */
|
||||||
memcpy(d->addr, addr, sizeof d->addr);
|
|
||||||
d->sysminor = sysminor;
|
d->sysminor = sysminor;
|
||||||
d->aoemajor = AOEMAJOR(sysminor);
|
d->aoemajor = AOEMAJOR(sysminor);
|
||||||
d->aoeminor = AOEMINOR(sysminor);
|
d->aoeminor = AOEMINOR(sysminor);
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include <linux/hdreg.h>
|
#include <linux/hdreg.h>
|
||||||
#include <linux/blkdev.h>
|
#include <linux/blkdev.h>
|
||||||
#include <linux/netdevice.h>
|
#include <linux/netdevice.h>
|
||||||
|
#include <linux/moduleparam.h>
|
||||||
#include "aoe.h"
|
#include "aoe.h"
|
||||||
|
|
||||||
#define NECODES 5
|
#define NECODES 5
|
||||||
|
@ -26,6 +27,19 @@ enum {
|
||||||
};
|
};
|
||||||
|
|
||||||
static char aoe_iflist[IFLISTSZ];
|
static char aoe_iflist[IFLISTSZ];
|
||||||
|
module_param_string(aoe_iflist, aoe_iflist, IFLISTSZ, 0600);
|
||||||
|
MODULE_PARM_DESC(aoe_iflist, "aoe_iflist=\"dev1 [dev2 ...]\"\n");
|
||||||
|
|
||||||
|
#ifndef MODULE
|
||||||
|
static int __init aoe_iflist_setup(char *str)
|
||||||
|
{
|
||||||
|
strncpy(aoe_iflist, str, IFLISTSZ);
|
||||||
|
aoe_iflist[IFLISTSZ - 1] = '\0';
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
__setup("aoe_iflist=", aoe_iflist_setup);
|
||||||
|
#endif
|
||||||
|
|
||||||
int
|
int
|
||||||
is_aoe_netif(struct net_device *ifp)
|
is_aoe_netif(struct net_device *ifp)
|
||||||
|
@ -36,7 +50,8 @@ is_aoe_netif(struct net_device *ifp)
|
||||||
if (aoe_iflist[0] == '\0')
|
if (aoe_iflist[0] == '\0')
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
for (p = aoe_iflist; *p; p = q + strspn(q, WHITESPACE)) {
|
p = aoe_iflist + strspn(aoe_iflist, WHITESPACE);
|
||||||
|
for (; *p; p = q + strspn(q, WHITESPACE)) {
|
||||||
q = p + strcspn(p, WHITESPACE);
|
q = p + strcspn(p, WHITESPACE);
|
||||||
if (q != p)
|
if (q != p)
|
||||||
len = q - p;
|
len = q - p;
|
||||||
|
|
Loading…
Reference in a new issue