Add a new '-vc <policy>' option to raid-create to allow setting Sync Write Cache policy for vsets during raid creation. For performance reasons, if user doesn't specify any policy and adapter supports it, it will default to Writeback.
New syntax allowed: $ iprconfig -c raid-create sg1 -z -c writeback $ iprconfig -c raid-create sg1 -r 10 -c writethrough Signed-off-by: Gabriel Krisman Bertazi <kris...@linux.vnet.ibm.com> --- iprconfig.8 | 6 ++++-- iprconfig.c | 34 ++++++++++++++++++++++++++++++++-- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/iprconfig.8 b/iprconfig.8 index 682ec69..65bb1e3 100644 --- a/iprconfig.8 +++ b/iprconfig.8 @@ -474,12 +474,14 @@ specified array will be displayed. .br Show the current write cache policy for [device]. .TP -.B raid-create [-r raid_level] [-s stripe_size_in_kb] [-l label] [--skip-format] [devices...] +.B raid-create [-r raid_level] [-s stripe_size_in_kb] [-l label] [--skip-format] [-vc cache_policy] [devices...] Create a RAID array. RAID level can be any supported RAID level for the given adapter, such as 0, 10, 5, 6. Currently supported stripe sizes in kb include 16, 64, and 256. If raid_level is not specified, it will default to RAID 5. If stripe size is not specified, it will default to the recommended -stripe size for the selected RAID level. Devices are specified with their full +stripe size for the selected RAID level. Available cache policies are the +same that can be passed to set-write-cache-policy command. If none is +specified, write back is assumed. Devices are specified with their full name, either the /dev/sd name or the /dev/sg name is acceptable. On some RAID adapters, a label can also be specified. Example array creation: diff --git a/iprconfig.c b/iprconfig.c index b811bfd..8240bf7 100644 --- a/iprconfig.c +++ b/iprconfig.c @@ -59,6 +59,7 @@ struct array_cmd_data { u16 stripe_size; int qdepth; u32 do_cmd; + int vset_cache; struct ipr_ioa *ioa; struct ipr_dev *dev; struct ipr_array_query_data *qac; @@ -4013,11 +4014,14 @@ int raid_start_complete() } else retry = 0; if (ipr_get_dev_attr(dev, &attr)) { - syslog(LOG_ERR, _("Unable to read queue_depth")); + syslog(LOG_ERR, + _("Unable to read attributes when creating arrays")); } else { attr.queue_depth = cur_raid_cmd->qdepth; + attr.write_cache_policy = cur_raid_cmd->vset_cache; if (ipr_set_dev_attr(dev, &attr, 1)) - syslog(LOG_ERR, _("Unable to set queue_depth")); + syslog(LOG_ERR, + _("Unable to set attributes when creating arrays")); } } else break; @@ -13646,6 +13650,7 @@ static int raid_create(char **args, int num_args) char *raid_level = IPR_DEFAULT_RAID_LVL; char label[8]; int stripe_size, qdepth, zeroed_devs, skip_format; + int next_vcache, vcache = -1; struct ipr_dev *dev; struct sysfs_dev *sdev; struct ipr_ioa *ioa = NULL; @@ -13657,6 +13662,7 @@ static int raid_create(char **args, int num_args) next_stripe_size = 0; next_qdepth = 0; next_label = 0; + next_vcache = 0; stripe_size = 0; qdepth = 0; zeroed_devs = 0; @@ -13673,6 +13679,8 @@ static int raid_create(char **args, int num_args) next_qdepth = 1; else if (strcmp(args[i], "-l") == 0) next_label = 1; + else if (strcmp(args[i], "-vc") == 0) + next_vcache = 1; else if (strcmp(args[i], "--skip-format") == 0) skip_format = 1; else if (next_raid_level) { @@ -13684,6 +13692,17 @@ static int raid_create(char **args, int num_args) } else if (next_qdepth) { next_qdepth = 0; qdepth = strtoul(args[i], NULL, 10); + } else if (next_vcache) { + next_vcache = 0; + if (strcmp(args[i], "writethrough") == 0) + vcache = IPR_DEV_CACHE_WRITE_THROUGH; + else if (strcmp(args[i], "writeback") == 0) + vcache = IPR_DEV_CACHE_WRITE_BACK; + else { + syslog(LOG_ERR, + _("Invalid value passed to -c.")); + return -EINVAL; + } } else if (next_label) { next_label = 0; if (strlen(args[i]) > (sizeof(label) - 1)) { @@ -13768,6 +13787,16 @@ IOA write cache. Use --force to force creation.\n"); qdepth = num_devs * 4; } + if (vcache == IPR_DEV_CACHE_WRITE_BACK && !ioa->vset_write_cache) + syslog(LOG_ERR, + _("vset cache not enabled for this IOA.\n")); + else if(ioa->vset_write_cache && vcache < 0) { + /* For performance reasons Writeback is the default + Vset Cache policy. Users can override this setting + by passing option '-c writethrough' to raid create */ + vcache = IPR_DEV_CACHE_WRITE_BACK; + } + if (dev_init_head) { rc = send_dev_inits(NULL); free_devs_to_init(); @@ -13808,6 +13837,7 @@ IOA write cache. Use --force to force creation.\n"); add_raid_cmd_tail(ioa, &ioa->ioa, array_id); raid_cmd_tail->qdepth = qdepth; raid_cmd_tail->do_cmd = 1; + raid_cmd_tail->vset_cache = vcache; rc = ipr_start_array_protection(ioa, stripe_size, cap->prot_level); -- 2.1.0 ------------------------------------------------------------------------------ _______________________________________________ Iprdd-devel mailing list Iprdd-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/iprdd-devel