Date: Sun, 9 Jan 2011 13:23:45 +0000 (UTC) From: Alexander Motin <mav@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r217193 - in projects/graid/head: sbin/geom/class/raid sys/geom/raid Message-ID: <201101091323.p09DNjMh044096@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: mav Date: Sun Jan 9 13:23:45 2011 New Revision: 217193 URL: http://svn.freebsd.org/changeset/base/217193 Log: Add options to specify volume and strip sizes. Modified: projects/graid/head/sbin/geom/class/raid/geom_raid.c projects/graid/head/sys/geom/raid/md_intel.c Modified: projects/graid/head/sbin/geom/class/raid/geom_raid.c ============================================================================== --- projects/graid/head/sbin/geom/class/raid/geom_raid.c Sun Jan 9 12:50:44 2011 (r217192) +++ projects/graid/head/sbin/geom/class/raid/geom_raid.c Sun Jan 9 13:23:45 2011 (r217193) @@ -51,8 +51,13 @@ uint32_t version = G_RAID_VERSION; //static void raid_main(struct gctl_req *req, unsigned flags); struct g_command class_commands[] = { - { "label", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, - "format name level prov ..." + { "label", G_FLAG_VERBOSE, NULL, + { + { 'S', "size", G_VAL_OPTIONAL, G_TYPE_NUMBER }, + { 's', "strip", G_VAL_OPTIONAL, G_TYPE_NUMBER }, + G_OPT_SENTINEL + }, + "[-S size] [-s stripsize] format name level prov ..." }, { "stop", G_FLAG_VERBOSE, NULL, { Modified: projects/graid/head/sys/geom/raid/md_intel.c ============================================================================== --- projects/graid/head/sys/geom/raid/md_intel.c Sun Jan 9 12:50:44 2011 (r217192) +++ projects/graid/head/sys/geom/raid/md_intel.c Sun Jan 9 13:23:45 2011 (r217193) @@ -793,8 +793,9 @@ g_raid_md_ctl_intel(struct g_raid_md_obj char arg[16]; const char *verb, *volname, *levelname, *diskname; int *nargs; - uint64_t size, sectorsize; - int numdisks, i, level, qual; + uint64_t size, sectorsize, strip; + intmax_t *sizearg, *striparg; + int numdisks, i, len, level, qual; int error; sc = md->mdo_softc; @@ -912,7 +913,36 @@ g_raid_md_ctl_intel(struct g_raid_md_obj /* Reserve some space for metadata. */ size -= (4096 + sectorsize - 1) / sectorsize + 1; - size &= ~127; /* Assume stripe size 64K */ + len = sizeof(*sizearg); + sizearg = gctl_get_param(req, "size", &len); + if (sizearg != NULL && len == sizeof(*sizearg)) { + if (*sizearg / sectorsize > size) { + gctl_error(req, "Size too big."); + return (-9); + } + size = *sizearg / sectorsize; + } + + strip = 256; + len = sizeof(*striparg); + striparg = gctl_get_param(req, "strip", &len); + if (striparg != NULL && len == sizeof(*striparg)) { + if (*striparg < sectorsize) { + gctl_error(req, "Strip size too small."); + return (-10); + } + if (*striparg % sectorsize != 0) { + gctl_error(req, "Incorrect strip size."); + return (-11); + } + strip = *striparg / sectorsize; + if (strip >= 65536) { + gctl_error(req, "Strip size too big."); + return (-12); + } + } + + size -= (size % strip); mvol = intel_get_volume(meta, 0); strlcpy(&mvol->name[0], volname, sizeof(mvol->name)); if (level == G_RAID_VOLUME_RL_RAID0) @@ -924,8 +954,8 @@ g_raid_md_ctl_intel(struct g_raid_md_obj mmap = intel_get_map(mvol, 0); mmap->offset = 0; mmap->disk_sectors = size; - mmap->stripe_count = size / 128; - mmap->stripe_sectors = 128; + mmap->stripe_count = size / strip; + mmap->stripe_sectors = strip; mmap->status = INTEL_S_READY; if (level == G_RAID_VOLUME_RL_RAID0) mmap->type = INTEL_T_RAID0;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201101091323.p09DNjMh044096>