Commit 73c95f54 authored by Pawel Wodkowski's avatar Pawel Wodkowski Committed by Jim Harris
Browse files

scsi: remove delete_lun RPC call and move claimed flag



Move claimed flag to struct spdk_scsi_lun and remove RPC call that allow
SCSI LUN to be deleted by user.

Change-Id: I0fe57d33ab017816ab4799bce259807735e0c783
Signed-off-by: default avatarPawel Wodkowski <pawelx.wodkowski@intel.com>
parent 97660c1a
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -227,6 +227,9 @@ struct spdk_scsi_lun {
	/** The LUN is removed */
	bool				removed;

	/** The LUN is clamed */
	bool claimed;

	TAILQ_HEAD(tasks, spdk_scsi_task) tasks;			/* submitted tasks */
	TAILQ_HEAD(pending_tasks, spdk_scsi_task) pending_tasks;	/* pending tasks */
};
+11 −24
Original line number Diff line number Diff line
@@ -302,7 +302,7 @@ spdk_scsi_lun_construct(const char *name, struct spdk_bdev *bdev)
		return NULL;
	}

	lun = spdk_lun_db_get_lun(name, 0);
	lun = spdk_lun_db_get_lun(name);
	if (lun) {
		SPDK_ERRLOG("LUN %s already created\n", lun->name);
		return NULL;
@@ -352,53 +352,39 @@ spdk_scsi_lun_destruct(struct spdk_scsi_lun *lun)
int
spdk_scsi_lun_claim(struct spdk_scsi_lun *lun)
{
	struct spdk_scsi_lun *tmp = spdk_lun_db_get_lun(lun->name, 1);
	assert(spdk_lun_db_get_lun(lun->name) != NULL);

	if (tmp == NULL) {
	if (lun->claimed != false) {
		return -1;
	}

	lun->claimed = true;
	return 0;
}

int
spdk_scsi_lun_unclaim(struct spdk_scsi_lun *lun)
{
	spdk_lun_db_put_lun(lun->name);
	assert(spdk_lun_db_get_lun(lun->name) != NULL);
	assert(lun->claimed == true);
	lun->claimed = false;
	lun->dev = NULL;

	return 0;
}

int
spdk_scsi_lun_deletable(const char *name)
{
	int ret = 0;
	struct spdk_scsi_lun *lun;

	pthread_mutex_lock(&g_spdk_scsi.mutex);
	lun = spdk_lun_db_get_lun(name, 0);
	if (lun == NULL) {
		ret = -1;
		goto out;
	}

out:
	pthread_mutex_unlock(&g_spdk_scsi.mutex);
	return ret;
}

void
spdk_scsi_lun_delete(const char *lun_name)
{
	struct spdk_scsi_lun *lun;
	struct spdk_scsi_dev *dev;

	pthread_mutex_lock(&g_spdk_scsi.mutex);
	lun = spdk_lun_db_get_lun(lun_name, 0);
	lun = spdk_lun_db_get_lun(lun_name);
	if (lun == NULL) {
		SPDK_ERRLOG("LUN '%s' not found", lun_name);
		pthread_mutex_unlock(&g_spdk_scsi.mutex);
		return;
		return -1;
	}

	dev = lun->dev;
@@ -411,6 +397,7 @@ spdk_scsi_lun_delete(const char *lun_name)
	/* Destroy this lun */
	spdk_scsi_lun_destruct(lun);
	pthread_mutex_unlock(&g_spdk_scsi.mutex);
	return 0;
}

int spdk_scsi_lun_allocate_io_channel(struct spdk_scsi_lun *lun)
+1 −26
Original line number Diff line number Diff line
@@ -77,7 +77,7 @@ spdk_scsi_lun_db_delete(struct spdk_scsi_lun *lun)
}

struct spdk_scsi_lun *
spdk_lun_db_get_lun(const char *lun_name, int claim_flag)
spdk_lun_db_get_lun(const char *lun_name)
{
	struct spdk_lun_db_entry *current = spdk_scsi_lun_list_head;

@@ -85,14 +85,6 @@ spdk_lun_db_get_lun(const char *lun_name, int claim_flag)
		struct spdk_scsi_lun *lun = current->lun;

		if (strncmp(lun_name, lun->name, sizeof(lun->name)) == 0) {
			if (claim_flag) {
				if (current->claimed == 1)
					return NULL;
				else {
					current->claimed = 1;
					return lun;
				}
			}
			return lun;
		}

@@ -101,20 +93,3 @@ spdk_lun_db_get_lun(const char *lun_name, int claim_flag)

	return NULL;
}

void
spdk_lun_db_put_lun(const char *lun_name)
{
	struct spdk_lun_db_entry *current = spdk_scsi_lun_list_head;

	while (current != NULL) {
		struct spdk_scsi_lun *lun = current->lun;

		if (strncmp(lun_name, lun->name, sizeof(lun->name)) == 0) {
			current->claimed = 0;
			break;
		}

		current = current->next;
	}
}
+2 −5
Original line number Diff line number Diff line
@@ -83,7 +83,6 @@ enum {

struct spdk_lun_db_entry {
	struct spdk_scsi_lun *lun;
	int claimed;
	struct spdk_lun_db_entry *next;
};

@@ -104,16 +103,14 @@ int spdk_scsi_lun_task_mgmt_execute(struct spdk_scsi_task *task);
void spdk_scsi_lun_complete_task(struct spdk_scsi_lun *lun, struct spdk_scsi_task *task);
int spdk_scsi_lun_claim(struct spdk_scsi_lun *lun);
int spdk_scsi_lun_unclaim(struct spdk_scsi_lun *lun);
int spdk_scsi_lun_deletable(const char *name);
void spdk_scsi_lun_delete(const char *lun_name);
int spdk_scsi_lun_delete(const char *lun_name);
int spdk_scsi_lun_allocate_io_channel(struct spdk_scsi_lun *lun);
void spdk_scsi_lun_free_io_channel(struct spdk_scsi_lun *lun);

int spdk_scsi_lun_db_add(struct spdk_scsi_lun *lun);
int spdk_scsi_lun_db_delete(struct spdk_scsi_lun *lun);

struct spdk_scsi_lun *spdk_lun_db_get_lun(const char *lun_name, int claim_flag);
void spdk_lun_db_put_lun(const char *lun_name);
struct spdk_scsi_lun *spdk_lun_db_get_lun(const char *lun_name);

struct spdk_scsi_dev *spdk_scsi_dev_get_list(void);

+1 −52
Original line number Diff line number Diff line
@@ -64,7 +64,7 @@ spdk_rpc_get_luns(struct spdk_jsonrpc_server_conn *conn,

		spdk_json_write_object_begin(w);
		spdk_json_write_name(w, "claimed");
		spdk_json_write_bool(w, current->claimed);
		spdk_json_write_bool(w, lun->claimed);
		spdk_json_write_name(w, "name");
		spdk_json_write_string(w, lun->name);
		spdk_json_write_object_end(w);
@@ -78,57 +78,6 @@ spdk_rpc_get_luns(struct spdk_jsonrpc_server_conn *conn,
}
SPDK_RPC_REGISTER("get_luns", spdk_rpc_get_luns)

struct rpc_delete_lun {
	char *name;
};

static void
free_rpc_delete_lun(struct rpc_delete_lun *r)
{
	free(r->name);
}

static const struct spdk_json_object_decoder rpc_delete_lun_decoders[] = {
	{"name", offsetof(struct rpc_delete_lun, name), spdk_json_decode_string},
};

static void
spdk_rpc_delete_lun(struct spdk_jsonrpc_server_conn *conn,
		    const struct spdk_json_val *params,
		    const struct spdk_json_val *id)
{
	struct rpc_delete_lun req = {};
	struct spdk_json_write_ctx *w;

	if (spdk_json_decode_object(params, rpc_delete_lun_decoders,
				    SPDK_COUNTOF(rpc_delete_lun_decoders),
				    &req)) {
		SPDK_TRACELOG(SPDK_TRACE_DEBUG, "spdk_json_decode_object failed\n");
		goto invalid;
	}

	if (spdk_scsi_lun_deletable(req.name)) {
		goto invalid;
	}

	spdk_scsi_lun_delete(req.name);
	free_rpc_delete_lun(&req);

	if (id == NULL) {
		return;
	}

	w = spdk_jsonrpc_begin_result(conn, id);
	spdk_json_write_bool(w, true);
	spdk_jsonrpc_end_result(conn, w);
	return;

invalid:
	spdk_jsonrpc_send_error_response(conn, id, SPDK_JSONRPC_ERROR_INVALID_PARAMS, "Invalid parameters");
	free_rpc_delete_lun(&req);
}
SPDK_RPC_REGISTER("delete_lun", spdk_rpc_delete_lun)

static void
spdk_rpc_get_scsi_devices(struct spdk_jsonrpc_server_conn *conn,
			  const struct spdk_json_val *params,
Loading