svn commit: r217409 - projects/graid/head/sys/geom/raid
Alexander Motin
mav at FreeBSD.org
Fri Jan 14 16:42:14 UTC 2011
Author: mav
Date: Fri Jan 14 16:42:13 2011
New Revision: 217409
URL: http://svn.freebsd.org/changeset/base/217409
Log:
Change disks, subdisks and volumes lists from LIST_ to TAILQ_. For now tail
insertion fixes volumes and subdisks reordering on every metadata parse.
Modified:
projects/graid/head/sys/geom/raid/g_raid.c
projects/graid/head/sys/geom/raid/g_raid.h
projects/graid/head/sys/geom/raid/md_intel.c
Modified: projects/graid/head/sys/geom/raid/g_raid.c
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.c Fri Jan 14 16:30:22 2011 (r217408)
+++ projects/graid/head/sys/geom/raid/g_raid.c Fri Jan 14 16:42:13 2011 (r217409)
@@ -455,7 +455,7 @@ g_raid_ndisks(struct g_raid_softc *sc, i
sx_assert(&sc->sc_lock, SX_LOCKED);
n = 0;
- LIST_FOREACH(disk, &sc->sc_disks, d_next) {
+ TAILQ_FOREACH(disk, &sc->sc_disks, d_next) {
if (disk->d_state == state || state == -1)
n++;
}
@@ -601,7 +601,7 @@ g_raid_bump_syncid(struct g_raid_softc *
sc->sc_syncid++;
G_RAID_DEBUG(1, "Device %s: syncid bumped to %u.", sc->sc_name,
sc->sc_syncid);
- LIST_FOREACH(disk, &sc->sc_disks, d_next) {
+ TAILQ_FOREACH(disk, &sc->sc_disks, d_next) {
if (disk->d_state == G_RAID_DISK_S_ACTIVE ||
disk->d_state == G_RAID_DISK_S_SYNCHRONIZING) {
// g_raid_update_metadata(disk);
@@ -625,7 +625,7 @@ g_raid_bump_genid(struct g_raid_softc *s
sc->sc_genid++;
G_RAID_DEBUG(1, "Device %s: genid bumped to %u.", sc->sc_name,
sc->sc_genid);
- LIST_FOREACH(disk, &sc->sc_disks, d_next) {
+ TAILQ_FOREACH(disk, &sc->sc_disks, d_next) {
if (disk->d_state == G_RAID_DISK_S_ACTIVE ||
disk->d_state == G_RAID_DISK_S_SYNCHRONIZING) {
disk->d_genid = sc->sc_genid;
@@ -662,7 +662,7 @@ g_raid_idle(struct g_raid_volume *vol, i
}
vol->v_idle = 1;
// ZZZ
- LIST_FOREACH(disk, &sc->sc_disks, d_next) {
+ TAILQ_FOREACH(disk, &sc->sc_disks, d_next) {
if (disk->d_state != G_RAID_DISK_S_ACTIVE)
continue;
G_RAID_DEBUG(1, "Disk %s (device %s) marked as clean.",
@@ -688,7 +688,7 @@ g_raid_unidle(struct g_raid_volume *vol)
vol->v_idle = 0;
vol->v_last_write = time_uptime;
//ZZZ
- LIST_FOREACH(disk, &sc->sc_disks, d_next) {
+ TAILQ_FOREACH(disk, &sc->sc_disks, d_next) {
if (disk->d_state != G_RAID_DISK_S_ACTIVE)
continue;
G_RAID_DEBUG(1, "Disk %s (device %s) marked as dirty.",
@@ -1120,7 +1120,7 @@ g_raid_launch_provider(struct g_raid_vol
pp->stripesize = 0;
pp->stripeoffset = 0;
#if 0
- LIST_FOREACH(disk, &sc->sc_disks, d_next) {
+ TAILQ_FOREACH(disk, &sc->sc_disks, d_next) {
if (disk->d_consumer && disk->d_consumer->provider &&
disk->d_consumer->provider->stripesize > pp->stripesize) {
pp->stripesize = disk->d_consumer->provider->stripesize;
@@ -1312,8 +1312,8 @@ g_raid_create_node(struct g_class *mp,
sc->sc_md = md;
sc->sc_geom = gp;
sc->sc_flags = 0;
- LIST_INIT(&sc->sc_volumes);
- LIST_INIT(&sc->sc_disks);
+ TAILQ_INIT(&sc->sc_volumes);
+ TAILQ_INIT(&sc->sc_disks);
sx_init(&sc->sc_lock, "gmirror:lock");
mtx_init(&sc->sc_queue_mtx, "gmirror:queue", NULL, MTX_DEF);
TAILQ_INIT(&sc->sc_events);
@@ -1361,7 +1361,7 @@ g_raid_create_volume(struct g_raid_softc
callout_reset(&vol->v_start_co, g_raid_start_timeout * hz,
g_raid_go, vol);
vol->v_starting = 1;
- LIST_INSERT_HEAD(&sc->sc_volumes, vol, v_next);
+ TAILQ_INSERT_TAIL(&sc->sc_volumes, vol, v_next);
return (vol);
}
@@ -1374,8 +1374,8 @@ g_raid_create_disk(struct g_raid_softc *
disk = malloc(sizeof(*disk), M_RAID, M_WAITOK | M_ZERO);
disk->d_softc = sc;
disk->d_state = G_RAID_DISK_S_NONE;
- LIST_INIT(&disk->d_subdisks);
- LIST_INSERT_HEAD(&sc->sc_disks, disk, d_next);
+ TAILQ_INIT(&disk->d_subdisks);
+ TAILQ_INSERT_TAIL(&sc->sc_disks, disk, d_next);
return (disk);
}
@@ -1418,13 +1418,13 @@ g_raid_destroy_node(struct g_raid_softc
int error = 0;
sc->sc_stopping = 1;
- LIST_FOREACH_SAFE(vol, &sc->sc_volumes, v_next, tmpv) {
+ TAILQ_FOREACH_SAFE(vol, &sc->sc_volumes, v_next, tmpv) {
if (g_raid_destroy_volume(vol))
error = EBUSY;
}
if (error)
return (error);
- LIST_FOREACH_SAFE(disk, &sc->sc_disks, d_next, tmpd) {
+ TAILQ_FOREACH_SAFE(disk, &sc->sc_disks, d_next, tmpd) {
if (g_raid_destroy_disk(disk))
error = EBUSY;
}
@@ -1464,6 +1464,7 @@ int
g_raid_destroy_volume(struct g_raid_volume *vol)
{
struct g_raid_softc *sc;
+ struct g_raid_disk *disk;
int i;
sc = vol->v_softc;
@@ -1490,11 +1491,12 @@ g_raid_destroy_volume(struct g_raid_volu
if (vol->v_rootmount)
root_mount_rel(vol->v_rootmount);
callout_drain(&vol->v_start_co);
- LIST_REMOVE(vol, v_next);
+ TAILQ_REMOVE(&sc->sc_volumes, vol, v_next);
for (i = 0; i < G_RAID_MAX_SUBDISKS; i++) {
- if (vol->v_subdisks[i].sd_disk == NULL)
+ disk = vol->v_subdisks[i].sd_disk;
+ if (disk == NULL)
continue;
- LIST_REMOVE(&vol->v_subdisks[i], sd_next);
+ TAILQ_REMOVE(&disk->d_subdisks, &vol->v_subdisks[i], sd_next);
}
G_RAID_DEBUG(2, "Volume %s destroyed.", vol->v_name);
free(vol, M_RAID);
@@ -1517,13 +1519,13 @@ g_raid_destroy_disk(struct g_raid_disk *
g_topology_unlock();
disk->d_consumer = NULL;
}
- LIST_FOREACH_SAFE(sd, &disk->d_subdisks, sd_next, tmp) {
+ TAILQ_FOREACH_SAFE(sd, &disk->d_subdisks, sd_next, tmp) {
g_raid_event_send(sd, G_RAID_SUBDISK_E_DISCONNECTED,
G_RAID_EVENT_SUBDISK);
- LIST_REMOVE(sd, sd_next);
+ TAILQ_REMOVE(&disk->d_subdisks, sd, sd_next);
sd->sd_disk = NULL;
}
- LIST_REMOVE(disk, d_next);
+ TAILQ_REMOVE(&sc->sc_disks, disk, d_next);
if (sc->sc_md)
G_RAID_MD_FREE_DISK(sc->sc_md, disk);
free(disk, M_RAID);
@@ -1543,7 +1545,7 @@ g_raid_destroy(struct g_raid_softc *sc,
/* Count open volumes. */
opens = 0;
- LIST_FOREACH(vol, &sc->sc_volumes, v_next) {
+ TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) {
if (vol->v_provider_open != 0)
opens++;
}
@@ -1714,12 +1716,12 @@ g_raid_dumpconf(struct sbuf *sb, const c
sx_xlock(&sc->sc_lock);
sbuf_printf(sb, "%s<State>%s", indent,
g_raid_disk_state2str(disk->d_state));
- if (!LIST_EMPTY(&disk->d_subdisks)) {
+ if (!TAILQ_EMPTY(&disk->d_subdisks)) {
sbuf_printf(sb, " (");
- LIST_FOREACH(sd, &disk->d_subdisks, sd_next) {
+ TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) {
sbuf_printf(sb, "%s",
g_raid_subdisk_state2str(sd->sd_state));
- if (LIST_NEXT(sd, sd_next))
+ if (TAILQ_NEXT(sd, sd_next))
sbuf_printf(sb, ", ");
}
sbuf_printf(sb, ")");
@@ -1734,9 +1736,9 @@ g_raid_dumpconf(struct sbuf *sb, const c
sbuf_printf(sb, "%s<Metadata>%s</Metadata>\n", indent,
sc->sc_md->mdo_class->name);
}
- if (!LIST_EMPTY(&sc->sc_volumes)) {
+ if (!TAILQ_EMPTY(&sc->sc_volumes)) {
s = 0xff;
- LIST_FOREACH(vol, &sc->sc_volumes, v_next) {
+ TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) {
if (vol->v_state < s)
s = vol->v_state;
}
Modified: projects/graid/head/sys/geom/raid/g_raid.h
==============================================================================
--- projects/graid/head/sys/geom/raid/g_raid.h Fri Jan 14 16:30:22 2011 (r217408)
+++ projects/graid/head/sys/geom/raid/g_raid.h Fri Jan 14 16:42:13 2011 (r217409)
@@ -115,8 +115,8 @@ struct g_raid_disk {
uint64_t d_flags; /* Additional flags. */
u_int d_load; /* Disk average load. */
off_t d_last_offset; /* Last head offset. */
- LIST_HEAD(, g_raid_subdisk) d_subdisks; /* List of subdisks. */
- LIST_ENTRY(g_raid_disk) d_next; /* Next disk in the node. */
+ TAILQ_HEAD(, g_raid_subdisk) d_subdisks; /* List of subdisks. */
+ TAILQ_ENTRY(g_raid_disk) d_next; /* Next disk in the node. */
};
#define G_RAID_SUBDISK_S_NONE 0x00
@@ -137,7 +137,7 @@ struct g_raid_subdisk {
u_int sd_pos; /* Position in volume. */
u_int sd_state; /* Subdisk state. */
int sd_read_errs; /* Count of the read errors */
- LIST_ENTRY(g_raid_subdisk) sd_next; /* Next subdisk on disk. */
+ TAILQ_ENTRY(g_raid_subdisk) sd_next; /* Next subdisk on disk. */
};
#define G_RAID_MAX_SUBDISKS 16
@@ -205,15 +205,15 @@ struct g_raid_volume {
int v_starting; /* STARTING state timer armed */
int v_stopping; /* Volume is stopping */
int v_provider_open; /* Number of opens. */
- LIST_ENTRY(g_raid_volume) v_next; /* List of volumes entry. */
+ TAILQ_ENTRY(g_raid_volume) v_next; /* List of volumes entry. */
};
struct g_raid_softc {
struct g_raid_md_object *sc_md; /* Metadata object. */
struct g_geom *sc_geom; /* GEOM class instance. */
uint64_t sc_flags; /* Additional flags. */
- LIST_HEAD(, g_raid_volume) sc_volumes; /* List of volumes. */
- LIST_HEAD(, g_raid_disk) sc_disks; /* List of disks. */
+ TAILQ_HEAD(, g_raid_volume) sc_volumes; /* List of volumes. */
+ TAILQ_HEAD(, g_raid_disk) sc_disks; /* List of disks. */
struct sx sc_lock; /* Main node lock. */
struct proc *sc_worker; /* Worker process. */
struct mtx sc_queue_mtx; /* Worker queues lock. */
Modified: projects/graid/head/sys/geom/raid/md_intel.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_intel.c Fri Jan 14 16:30:22 2011 (r217408)
+++ projects/graid/head/sys/geom/raid/md_intel.c Fri Jan 14 16:42:13 2011 (r217409)
@@ -452,7 +452,7 @@ g_raid_md_intel_get_disk(struct g_raid_s
struct g_raid_disk *disk;
struct g_raid_md_intel_perdisk *pd;
- LIST_FOREACH(disk, &sc->sc_disks, d_next) {
+ TAILQ_FOREACH(disk, &sc->sc_disks, d_next) {
pd = (struct g_raid_md_intel_perdisk *)disk->d_md_data;
if (pd->pd_disk_pos == id)
break;
@@ -465,7 +465,7 @@ g_raid_md_intel_get_volume(struct g_raid
{
struct g_raid_volume *mvol;
- LIST_FOREACH(mvol, &sc->sc_volumes, v_next) {
+ TAILQ_FOREACH(mvol, &sc->sc_volumes, v_next) {
if ((intptr_t)(mvol->v_md_data) == id)
break;
}
@@ -519,7 +519,7 @@ g_raid_md_intel_start_disk(struct g_raid
/* Welcome the "new" disk. */
g_raid_change_disk_state(disk, G_RAID_DISK_S_ACTIVE);
- LIST_FOREACH(sd, &disk->d_subdisks, sd_next) {
+ TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) {
g_raid_event_send(sd, G_RAID_SUBDISK_E_NEW,
G_RAID_EVENT_SUBDISK);
}
@@ -593,12 +593,12 @@ g_raid_md_intel_start(struct g_raid_soft
vol = g_raid_md_intel_get_volume(sc, i);
sd = &vol->v_subdisks[j];
sd->sd_disk = disk;
- LIST_INSERT_HEAD(&disk->d_subdisks, sd, sd_next);
+ TAILQ_INSERT_TAIL(&disk->d_subdisks, sd, sd_next);
}
}
/* Make existing disks take their places. */
- LIST_FOREACH_SAFE(disk, &sc->sc_disks, d_next, tmpdisk) {
+ TAILQ_FOREACH_SAFE(disk, &sc->sc_disks, d_next, tmpdisk) {
if (disk->d_state == G_RAID_DISK_S_NONE)
g_raid_md_intel_start_disk(disk);
}
@@ -860,7 +860,7 @@ g_raid_md_event_intel(struct g_raid_md_o
g_topology_unlock();
disk->d_consumer = NULL;
}
- LIST_FOREACH(sd, &disk->d_subdisks, sd_next) {
+ TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) {
g_raid_event_send(sd, G_RAID_SUBDISK_E_DISCONNECTED,
G_RAID_EVENT_SUBDISK);
}
@@ -1054,13 +1054,13 @@ g_raid_md_ctl_intel(struct g_raid_md_obj
g_raid_start_volume(vol);
/* , and subdisks. */
- LIST_FOREACH(disk, &sc->sc_disks, d_next) {
+ TAILQ_FOREACH(disk, &sc->sc_disks, d_next) {
pd = (struct g_raid_md_intel_perdisk *)disk->d_md_data;
sd = &vol->v_subdisks[pd->pd_disk_pos];
sd->sd_disk = disk;
sd->sd_offset = 0;
sd->sd_size = size;
- LIST_INSERT_HEAD(&disk->d_subdisks, sd, sd_next);
+ TAILQ_INSERT_TAIL(&disk->d_subdisks, sd, sd_next);
g_raid_change_disk_state(disk, G_RAID_DISK_S_ACTIVE);
g_raid_event_send(sd, G_RAID_SUBDISK_E_NEW,
G_RAID_EVENT_SUBDISK);
@@ -1086,7 +1086,7 @@ g_raid_md_ctl_intel(struct g_raid_md_obj
if (strncmp(diskname, "/dev/", 5) == 0)
diskname += 5;
- LIST_FOREACH(disk, &sc->sc_disks, d_next) {
+ TAILQ_FOREACH(disk, &sc->sc_disks, d_next) {
if (disk->d_consumer != NULL &&
disk->d_consumer->provider != NULL &&
strcmp(disk->d_consumer->provider->name,
@@ -1113,7 +1113,7 @@ g_raid_md_ctl_intel(struct g_raid_md_obj
g_topology_unlock();
disk->d_consumer = NULL;
}
- LIST_FOREACH(sd, &disk->d_subdisks, sd_next) {
+ TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) {
g_raid_event_send(sd, G_RAID_SUBDISK_E_DISCONNECTED,
G_RAID_EVENT_SUBDISK);
}
@@ -1140,7 +1140,7 @@ g_raid_md_ctl_intel(struct g_raid_md_obj
}
for (i = 1; i < *nargs; i++) {
/* Look for empty disk slot. */
- LIST_FOREACH(disk, &sc->sc_disks, d_next) {
+ TAILQ_FOREACH(disk, &sc->sc_disks, d_next) {
pd = (struct g_raid_md_intel_perdisk *)
disk->d_md_data;
if (pd->pd_disk_pos < 0)
@@ -1196,7 +1196,7 @@ g_raid_md_ctl_intel(struct g_raid_md_obj
g_topology_unlock();
/* Make sure disk is big enough. */
- LIST_FOREACH(sd, &disk->d_subdisks, sd_next) {
+ TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) {
if (sd->sd_offset + sd->sd_size + 4096 >
pp->mediasize) {
gctl_error(req,
@@ -1236,7 +1236,7 @@ g_raid_md_ctl_intel(struct g_raid_md_obj
/* Welcome the "new" disk. */
g_raid_change_disk_state(disk, G_RAID_DISK_S_ACTIVE);
- LIST_FOREACH(sd, &disk->d_subdisks, sd_next) {
+ TAILQ_FOREACH(sd, &disk->d_subdisks, sd_next) {
g_raid_event_send(sd, G_RAID_SUBDISK_E_NEW,
G_RAID_EVENT_SUBDISK);
}
@@ -1273,7 +1273,7 @@ g_raid_md_write_intel(struct g_raid_md_o
/* Count number of disks. */
numdisks = 0;
- LIST_FOREACH(disk, &sc->sc_disks, d_next) {
+ TAILQ_FOREACH(disk, &sc->sc_disks, d_next) {
pd = (struct g_raid_md_intel_perdisk *)disk->d_md_data;
if (pd->pd_disk_pos < 0)
continue;
@@ -1304,7 +1304,7 @@ g_raid_md_write_intel(struct g_raid_md_o
meta->generation = mdi->mdio_generation;
meta->attributes = INTEL_ATTR_CHECKSUM;
meta->total_disks = numdisks;
- LIST_FOREACH(disk, &sc->sc_disks, d_next) {
+ TAILQ_FOREACH(disk, &sc->sc_disks, d_next) {
pd = (struct g_raid_md_intel_perdisk *)disk->d_md_data;
if (pd->pd_disk_pos < 0)
continue;
@@ -1314,7 +1314,7 @@ g_raid_md_write_intel(struct g_raid_md_o
/* Fill volumes and maps. */
vi = 0;
version = INTEL_VERSION_1000;
- LIST_FOREACH(vol, &sc->sc_volumes, v_next) {
+ TAILQ_FOREACH(vol, &sc->sc_volumes, v_next) {
mvol = intel_get_volume(meta, vi);
mmap = intel_get_map(mvol, 0);
@@ -1405,7 +1405,7 @@ g_raid_md_write_intel(struct g_raid_md_o
if (mdi->mdio_meta != NULL)
free(mdi->mdio_meta, M_MD_INTEL);
mdi->mdio_meta = meta;
- LIST_FOREACH(disk, &sc->sc_disks, d_next) {
+ TAILQ_FOREACH(disk, &sc->sc_disks, d_next) {
pd = (struct g_raid_md_intel_perdisk *)disk->d_md_data;
if (disk->d_state != G_RAID_DISK_S_ACTIVE)
continue;
More information about the svn-src-projects
mailing list