Commit d346b9c5 authored by Ben Walker's avatar Ben Walker Committed by Jim Harris
Browse files

nvmf: State change functions now have a return code



When the state change is known to fail immediately, use
a return code instead of calling the callback.

Most of the callbacks didn't actually check for errors,
so this patch also doesn't check for errors on return
codes. That should be done in the future.

Change-Id: I67e03f93d7f53892473dfc073f4150e7e620cad2
Signed-off-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.gerrithub.io/394281


Tested-by: default avatarSPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarDaniel Verkamp <daniel.verkamp@intel.com>
parent 6711e5a5
Loading
Loading
Loading
Loading
+20 −12
Original line number Diff line number Diff line
@@ -171,8 +171,10 @@ typedef void (*spdk_nvmf_subsystem_state_change_done)(struct spdk_nvmf_subsystem
 * \param cb_fn A function that will be called once the subsystem has changed state.
 * \param cb_arg Argument passed to cb_fn.
 *
 * \return 0 on success. Negated errno on failure. The callback provided
 *	     will only be called on success.
 */
void spdk_nvmf_subsystem_start(struct spdk_nvmf_subsystem *subsystem,
int spdk_nvmf_subsystem_start(struct spdk_nvmf_subsystem *subsystem,
			      spdk_nvmf_subsystem_state_change_done cb_fn,
			      void *cb_arg);

@@ -183,8 +185,10 @@ void spdk_nvmf_subsystem_start(struct spdk_nvmf_subsystem *subsystem,
 * \param cb_fn A function that will be called once the subsystem has changed state.
 * \param cb_arg Argument passed to cb_fn.
 *
 * \return 0 on success. Negated errno on failure. The callback provided
 *	     will only be called on success.
 */
void spdk_nvmf_subsystem_stop(struct spdk_nvmf_subsystem *subsystem,
int spdk_nvmf_subsystem_stop(struct spdk_nvmf_subsystem *subsystem,
			     spdk_nvmf_subsystem_state_change_done cb_fn,
			     void *cb_arg);

@@ -195,8 +199,10 @@ void spdk_nvmf_subsystem_stop(struct spdk_nvmf_subsystem *subsystem,
 * \param cb_fn A function that will be called once the subsystem has changed state.
 * \param cb_arg Argument passed to cb_fn.
 *
 * \return 0 on success. Negated errno on failure. The callback provided
 *	     will only be called on success.
 */
void spdk_nvmf_subsystem_pause(struct spdk_nvmf_subsystem *subsystem,
int spdk_nvmf_subsystem_pause(struct spdk_nvmf_subsystem *subsystem,
			      spdk_nvmf_subsystem_state_change_done cb_fn,
			      void *cb_arg);

@@ -207,8 +213,10 @@ void spdk_nvmf_subsystem_pause(struct spdk_nvmf_subsystem *subsystem,
 * \param cb_fn A function that will be called once the subsystem has changed state.
 * \param cb_arg Argument passed to cb_fn.
 *
 * \return 0 on success. Negated errno on failure. The callback provided
 *	     will only be called on success.
 */
void spdk_nvmf_subsystem_resume(struct spdk_nvmf_subsystem *subsystem,
int spdk_nvmf_subsystem_resume(struct spdk_nvmf_subsystem *subsystem,
			       spdk_nvmf_subsystem_state_change_done cb_fn,
			       void *cb_arg);

+17 −16
Original line number Diff line number Diff line
@@ -395,7 +395,9 @@ subsystem_state_change_done(struct spdk_io_channel_iter *i, int status)
		}
	}

	if (ctx->cb_fn) {
		ctx->cb_fn(ctx->subsystem, ctx->cb_arg, status);
	}
	free(ctx);
}

@@ -433,7 +435,7 @@ subsystem_state_change_on_pg(struct spdk_io_channel_iter *i)
	spdk_for_each_channel_continue(i, rc);
}

static void
static int
spdk_nvmf_subsystem_state_change(struct spdk_nvmf_subsystem *subsystem,
				 enum spdk_nvmf_subsystem_state requested_state,
				 spdk_nvmf_subsystem_state_change_done cb_fn,
@@ -459,21 +461,18 @@ spdk_nvmf_subsystem_state_change(struct spdk_nvmf_subsystem *subsystem,
		break;
	default:
		assert(false);
		cb_fn(subsystem, cb_arg, -EINVAL);
		return;
		return -EINVAL;
	}

	ctx = calloc(1, sizeof(*ctx));
	if (!ctx) {
		cb_fn(subsystem, cb_arg, -ENOMEM);
		return;
		return -ENOMEM;
	}

	rc = spdk_nvmf_subsystem_set_state(subsystem, intermediate_state);
	if (rc) {
		free(ctx);
		cb_fn(subsystem, cb_arg, -1);
		return;
		return rc;
	}

	ctx->subsystem = subsystem;
@@ -485,38 +484,40 @@ spdk_nvmf_subsystem_state_change(struct spdk_nvmf_subsystem *subsystem,
			      subsystem_state_change_on_pg,
			      ctx,
			      subsystem_state_change_done);

	return 0;
}

void
int
spdk_nvmf_subsystem_start(struct spdk_nvmf_subsystem *subsystem,
			  spdk_nvmf_subsystem_state_change_done cb_fn,
			  void *cb_arg)
{
	spdk_nvmf_subsystem_state_change(subsystem, SPDK_NVMF_SUBSYSTEM_ACTIVE, cb_fn, cb_arg);
	return spdk_nvmf_subsystem_state_change(subsystem, SPDK_NVMF_SUBSYSTEM_ACTIVE, cb_fn, cb_arg);
}

void
int
spdk_nvmf_subsystem_stop(struct spdk_nvmf_subsystem *subsystem,
			 spdk_nvmf_subsystem_state_change_done cb_fn,
			 void *cb_arg)
{
	spdk_nvmf_subsystem_state_change(subsystem, SPDK_NVMF_SUBSYSTEM_INACTIVE, cb_fn, cb_arg);
	return spdk_nvmf_subsystem_state_change(subsystem, SPDK_NVMF_SUBSYSTEM_INACTIVE, cb_fn, cb_arg);
}

void
int
spdk_nvmf_subsystem_pause(struct spdk_nvmf_subsystem *subsystem,
			  spdk_nvmf_subsystem_state_change_done cb_fn,
			  void *cb_arg)
{
	spdk_nvmf_subsystem_state_change(subsystem, SPDK_NVMF_SUBSYSTEM_PAUSED, cb_fn, cb_arg);
	return spdk_nvmf_subsystem_state_change(subsystem, SPDK_NVMF_SUBSYSTEM_PAUSED, cb_fn, cb_arg);
}

void
int
spdk_nvmf_subsystem_resume(struct spdk_nvmf_subsystem *subsystem,
			   spdk_nvmf_subsystem_state_change_done cb_fn,
			   void *cb_arg)
{
	spdk_nvmf_subsystem_state_change(subsystem, SPDK_NVMF_SUBSYSTEM_ACTIVE, cb_fn, cb_arg);
	return spdk_nvmf_subsystem_state_change(subsystem, SPDK_NVMF_SUBSYSTEM_ACTIVE, cb_fn, cb_arg);
}

struct spdk_nvmf_subsystem *