svn commit: r218727 - projects/graid/head/sys/geom/raid
Alexander Motin
mav at FreeBSD.org
Wed Feb 16 08:12:54 UTC 2011
Author: mav
Date: Wed Feb 16 08:12:54 2011
New Revision: 218727
URL: http://svn.freebsd.org/changeset/base/218727
Log:
Set of random improvements to JMicron module.
Modified:
projects/graid/head/sys/geom/raid/md_jmicron.c
Modified: projects/graid/head/sys/geom/raid/md_jmicron.c
==============================================================================
--- projects/graid/head/sys/geom/raid/md_jmicron.c Wed Feb 16 06:00:27 2011 (r218726)
+++ projects/graid/head/sys/geom/raid/md_jmicron.c Wed Feb 16 08:12:54 2011 (r218727)
@@ -91,6 +91,7 @@ struct g_raid_md_jmicron_perdisk {
struct jmicron_raid_conf *pd_meta;
int pd_disk_pos;
int pd_disk_id;
+ off_t pd_disk_size;
};
struct g_raid_md_jmicron_object {
@@ -154,7 +155,7 @@ g_raid_md_jmicron_print(struct jmicron_r
printf("stripe_shift %d\n", meta->stripe_shift);
printf("flags %04x\n", meta->flags);
printf("spare ");
- for (k = 0; k < 2; k++)
+ for (k = 0; k < JMICRON_MAX_SPARE; k++)
printf(" 0x%08x", meta->spare[k]);
printf("\n");
printf("disks ");
@@ -247,7 +248,7 @@ jmicron_meta_find_disk(struct jmicron_ra
if ((meta->disks[pos] & JMICRON_DISK_MASK) == id)
return (pos);
}
- for (pos = 0; pos < 2; pos++) {
+ for (pos = 0; pos < JMICRON_MAX_SPARE; pos++) {
if ((meta->spare[pos] & JMICRON_DISK_MASK) == id)
return (-3);
}
@@ -442,23 +443,19 @@ g_raid_md_jmicron_start_disk(struct g_ra
if (tmpdisk->d_state != G_RAID_DISK_S_OFFLINE &&
tmpdisk->d_state != G_RAID_DISK_S_FAILED)
continue;
-#if 0
/* Make sure this disk is big enough. */
TAILQ_FOREACH(sd, &tmpdisk->d_subdisks, sd_next) {
- if (sd->sd_offset + sd->sd_size + 4096 >
- (off_t)pd->pd_disk_meta.sectors * 512) {
+ if (sd->sd_offset + sd->sd_size + 512 >
+ pd->pd_disk_size) {
G_RAID_DEBUG1(1, sc,
- "Disk too small (%llu < %llu)",
- ((unsigned long long)
- pd->pd_disk_meta.sectors) * 512,
- (unsigned long long)
- sd->sd_offset + sd->sd_size + 4096);
+ "Disk too small (%ju < %ju)",
+ pd->pd_disk_size,
+ sd->sd_offset + sd->sd_size + 512);
break;
}
}
if (sd != NULL)
continue;
-#endif
if (tmpdisk->d_state == G_RAID_DISK_S_OFFLINE) {
olddisk = tmpdisk;
break;
@@ -746,23 +743,26 @@ g_raid_md_jmicron_new_disk(struct g_raid
if (g_raid_md_jmicron_start_disk(disk))
g_raid_md_write_jmicron(md, NULL, NULL, NULL);
} else {
- /* If we haven't started yet - check metadata freshness. */
- if (mdi->mdio_meta == NULL) {
- G_RAID_DEBUG1(1, sc, "Newer disk");
+ /*
+ * If we haven't started yet - update common metadata
+ * to get subdisks details, avoiding data from spare disks.
+ */
+ if (mdi->mdio_meta == NULL ||
+ jmicron_meta_find_disk(mdi->mdio_meta,
+ mdi->mdio_meta->disk_id) == -3) {
if (mdi->mdio_meta != NULL)
free(mdi->mdio_meta, M_MD_JMICRON);
mdi->mdio_meta = jmicron_meta_copy(pdmeta);
mdi->mdio_total_disks = jmicron_meta_total_disks(pdmeta);
- mdi->mdio_disks_present = 1;
- } else {
- mdi->mdio_disks_present++;
- G_RAID_DEBUG1(1, sc, "Matching disk (%d of %d+%d up)",
- mdi->mdio_disks_present,
- mdi->mdio_total_disks,
- jmicron_meta_total_spare(mdi->mdio_meta));
- mdi->mdio_meta->flags |=
- pdmeta->flags & JMICRON_F_BADSEC;
}
+ mdi->mdio_meta->flags |= pdmeta->flags & JMICRON_F_BADSEC;
+
+ mdi->mdio_disks_present++;
+ G_RAID_DEBUG1(1, sc, "Matching disk (%d of %d+%d up)",
+ mdi->mdio_disks_present,
+ mdi->mdio_total_disks,
+ jmicron_meta_total_spare(mdi->mdio_meta));
+
/* If we collected all needed disks - start array. */
if (mdi->mdio_disks_present == mdi->mdio_total_disks +
jmicron_meta_total_spare(mdi->mdio_meta))
@@ -928,13 +928,13 @@ search:
pd = malloc(sizeof(*pd), M_MD_JMICRON, M_WAITOK | M_ZERO);
pd->pd_meta = meta;
if (spare == 2) {
-// pd->pd_disk_meta.sectors = pp->mediasize / pp->sectorsize;
pd->pd_disk_pos = -3;
pd->pd_disk_id = arc4random() & JMICRON_DISK_MASK;
} else {
pd->pd_disk_pos = -1;
pd->pd_disk_id = meta->disk_id;
}
+ pd->pd_disk_size = pp->mediasize;
disk = g_raid_create_disk(sc);
disk->d_md_data = (void *)pd;
disk->d_consumer = rcp;
@@ -1141,7 +1141,7 @@ makedisk:
"Dumping not supported by %s.",
cp->provider->name);
-// pd->pd_disk_meta.sectors = pp->mediasize / pp->sectorsize;
+ pd->pd_disk_size = pp->mediasize;
if (size > pp->mediasize)
size = pp->mediasize;
if (sectorsize < pp->sectorsize)
@@ -1199,7 +1199,7 @@ makedisk:
gctl_error(req, "Size too small.");
return (-13);
}
- if (size > 0xffffffffllu * sectorsize) {
+ if (size > 0xffffffffffffllu * sectorsize) {
gctl_error(req, "Size too big.");
return (-14);
}
@@ -1399,6 +1399,7 @@ makedisk:
pd = malloc(sizeof(*pd), M_MD_JMICRON, M_WAITOK | M_ZERO);
pd->pd_disk_pos = -3;
pd->pd_disk_id = arc4random() & JMICRON_DISK_MASK;
+ pd->pd_disk_size = pp->mediasize;
disk = g_raid_create_disk(sc);
disk->d_consumer = cp;
More information about the svn-src-projects
mailing list