[dm-devel] [PATCH] multipath: rport tmo cleanup
Christophe Varoqui
christophe.varoqui at gmail.com
Sat Aug 17 11:42:53 UTC 2013
On jeu., 2013-07-25 at 16:32 -0500, Benjamin Marzinski wrote:
> The current code to set fast_io_fail_tmo and dev_loss_tmo fails
> if you want to set fast_io_fail_tmo from "off" to 600. Also,
> it often unnecessarily sets dev_loss_tmo to itself before setting
> it to the final value. This patch cleans up these issues.
>
Hannes, do you ack this patch over your work on this topic ?
Benjamin, do you want to rebase the patchset you sent on June 29th
before I release 0.5.0 ?
Best regards,
Christophe Varoqui
www.opensvc.com
> Signed-off-by: Benjamin Marzinski <bmarzins at redhat.com>
> ---
> libmultipath/discovery.c | 79 ++++++++++++++++++++++++-----------------------
> 1 file changed, 42 insertions(+), 37 deletions(-)
>
> Index: multipath-tools-130724/libmultipath/discovery.c
> ===================================================================
> --- multipath-tools-130724.orig/libmultipath/discovery.c
> +++ multipath-tools-130724/libmultipath/discovery.c
> @@ -322,9 +322,12 @@ sysfs_set_rport_tmo(struct multipath *mp
> struct udev_device *rport_dev = NULL;
> char value[16];
> char rport_id[32];
> - unsigned long long tmo = 0;
> + int delay_fast_io_fail = 0;
> + int current_dev_loss = 0;
> int ret;
>
> + if (!mpp->dev_loss && mpp->fast_io_fail == MP_FAST_IO_FAIL_UNSET)
> + return;
> sprintf(rport_id, "rport-%d:%d-%d",
> pp->sg_id.host_no, pp->sg_id.channel, pp->sg_id.transport_id);
> rport_dev = udev_device_new_from_subsystem_sysname(conf->udev,
> @@ -337,22 +340,8 @@ sysfs_set_rport_tmo(struct multipath *mp
> condlog(4, "target%d:%d:%d -> %s", pp->sg_id.host_no,
> pp->sg_id.channel, pp->sg_id.scsi_id, rport_id);
>
> - /*
> - * This is tricky.
> - * dev_loss_tmo will be limited to 600 if fast_io_fail
> - * is _not_ set.
> - * fast_io_fail will be limited by the current dev_loss_tmo
> - * setting.
> - * So to get everything right we first need to increase
> - * dev_loss_tmo to the fast_io_fail setting (if present),
> - * then set fast_io_fail, and _then_ set dev_loss_tmo
> - * to the correct value.
> - */
> memset(value, 0, 16);
> - if (mpp->fast_io_fail != MP_FAST_IO_FAIL_UNSET &&
> - mpp->fast_io_fail != MP_FAST_IO_FAIL_ZERO &&
> - mpp->fast_io_fail != MP_FAST_IO_FAIL_OFF) {
> - /* Check if we need to temporarily increase dev_loss_tmo */
> + if (mpp->fast_io_fail != MP_FAST_IO_FAIL_UNSET) {
> ret = sysfs_attr_get_value(rport_dev, "dev_loss_tmo",
> value, 16);
> if (ret <= 0) {
> @@ -360,38 +349,40 @@ sysfs_set_rport_tmo(struct multipath *mp
> "error %d", rport_id, -ret);
> goto out;
> }
> - if (sscanf(value, "%llu\n", &tmo) != 1) {
> + if (sscanf(value, "%u\n", ¤t_dev_loss) != 1) {
> condlog(0, "%s: Cannot parse dev_loss_tmo "
> "attribute '%s'", rport_id, value);
> goto out;
> }
> - if (mpp->fast_io_fail >= tmo) {
> - snprintf(value, 16, "%u", mpp->fast_io_fail + 1);
> - }
> - } else if (mpp->dev_loss > 600) {
> - condlog(3, "%s: limiting dev_loss_tmo to 600, since "
> - "fast_io_fail is not set", rport_id);
> - snprintf(value, 16, "%u", 600);
> - } else {
> - snprintf(value, 16, "%u", mpp->dev_loss);
> - }
> - if (strlen(value)) {
> - ret = sysfs_attr_set_value(rport_dev, "dev_loss_tmo",
> - value, strlen(value));
> - if (ret <= 0) {
> - if (ret == -EBUSY)
> - condlog(3, "%s: rport blocked", rport_id);
> + if ((mpp->dev_loss &&
> + mpp->fast_io_fail >= (int)mpp->dev_loss) ||
> + (!mpp->dev_loss &&
> + mpp->fast_io_fail >= (int)current_dev_loss)) {
> + condlog(3, "%s: limiting fast_io_fail_tmo to %d, since "
> + "it must be less than dev_loss_tmo",
> + rport_id, mpp->dev_loss - 1);
> + if (mpp->dev_loss)
> + mpp->fast_io_fail = mpp->dev_loss - 1;
> else
> - condlog(0, "%s: failed to set dev_loss_tmo to %s, error %d",
> - rport_id, value, -ret);
> - goto out;
> + mpp->fast_io_fail = current_dev_loss - 1;
> }
> + if (mpp->fast_io_fail >= (int)current_dev_loss)
> + delay_fast_io_fail = 1;
> + }
> + if (mpp->dev_loss > 600 &&
> + (mpp->fast_io_fail == MP_FAST_IO_FAIL_OFF ||
> + mpp->fast_io_fail == MP_FAST_IO_FAIL_UNSET)) {
> + condlog(3, "%s: limiting dev_loss_tmo to 600, since "
> + "fast_io_fail is unset or off", rport_id);
> + mpp->dev_loss = 600;
> }
> if (mpp->fast_io_fail != MP_FAST_IO_FAIL_UNSET) {
> if (mpp->fast_io_fail == MP_FAST_IO_FAIL_OFF)
> sprintf(value, "off");
> else if (mpp->fast_io_fail == MP_FAST_IO_FAIL_ZERO)
> sprintf(value, "0");
> + else if (delay_fast_io_fail)
> + snprintf(value, 16, "%u", current_dev_loss - 1);
> else
> snprintf(value, 16, "%u", mpp->fast_io_fail);
> ret = sysfs_attr_set_value(rport_dev, "fast_io_fail_tmo",
> @@ -402,9 +393,10 @@ sysfs_set_rport_tmo(struct multipath *mp
> else
> condlog(0, "%s: failed to set fast_io_fail_tmo to %s, error %d",
> rport_id, value, -ret);
> + goto out;
> }
> }
> - if (tmo > 0) {
> + if (mpp->dev_loss) {
> snprintf(value, 16, "%u", mpp->dev_loss);
> ret = sysfs_attr_set_value(rport_dev, "dev_loss_tmo",
> value, strlen(value));
> @@ -414,6 +406,19 @@ sysfs_set_rport_tmo(struct multipath *mp
> else
> condlog(0, "%s: failed to set dev_loss_tmo to %s, error %d",
> rport_id, value, -ret);
> + goto out;
> + }
> + }
> + if (delay_fast_io_fail) {
> + snprintf(value, 16, "%u", mpp->fast_io_fail);
> + ret = sysfs_attr_set_value(rport_dev, "fast_io_fail_tmo",
> + value, strlen(value));
> + if (ret <= 0) {
> + if (ret == -EBUSY)
> + condlog(3, "%s: rport blocked", rport_id);
> + else
> + condlog(0, "%s: failed to set fast_io_fail_tmo to %s, error %d",
> + rport_id, value, -ret);
> }
> }
> out:
More information about the dm-devel
mailing list