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: Pawel Wodkowski <pawelx.wodkowski@intel.com>
This commit is contained in:
Pawel Wodkowski 2017-03-02 18:11:56 +01:00 committed by Jim Harris
parent 97660c1adb
commit 73c95f5476
7 changed files with 32 additions and 122 deletions

View File

@ -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 */
};

View File

@ -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)

View File

@ -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;
}
}

View File

@ -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);

View File

@ -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,

View File

@ -283,15 +283,6 @@ p.add_argument('tag', help='Initiator group tag (unique, integer > 0)', type=int
p.set_defaults(func=delete_initiator_group)
def delete_lun(args):
params = {'name': args.lun_name}
jsonrpc_call('delete_lun', params)
p = subparsers.add_parser('delete_lun', help='Delete a LUN')
p.add_argument('lun_name', help='LUN name to be deleted. Example: Malloc0.')
p.set_defaults(func=delete_lun)
def get_iscsi_connections(args):
print_dict(jsonrpc_call('get_iscsi_connections'))

View File

@ -648,17 +648,25 @@ lun_construct_same_same_twice(void)
}
static void
lun_deletable(void)
lun_delete(void)
{
struct spdk_scsi_lun *lun;
int rc;
lun = lun_construct();
rc = spdk_scsi_lun_deletable(lun->name);
CU_ASSERT_EQUAL(rc, 0);
lun_destruct(lun);
rc = spdk_scsi_lun_deletable("test");
rc = spdk_scsi_lun_delete(lun->name);
CU_ASSERT_EQUAL(rc, 0);
lun = lun_construct();
rc = spdk_scsi_lun_claim(lun);
CU_ASSERT_EQUAL(rc, 0);
rc = spdk_scsi_lun_delete(lun->name);
CU_ASSERT_EQUAL(rc, 0);
rc = spdk_scsi_lun_delete("test");
CU_ASSERT_EQUAL(rc, -1);
}
@ -710,7 +718,7 @@ main(int argc, char **argv)
|| CU_add_test(suite, "construct - null ctx", lun_construct_null_ctx) == NULL
|| CU_add_test(suite, "construct - success", lun_construct_success) == NULL
|| CU_add_test(suite, "construct - same lun twice", lun_construct_same_same_twice) == NULL
|| CU_add_test(suite, "deletable", lun_deletable) == NULL
|| CU_add_test(suite, "lun_delete", lun_delete) == NULL
) {
CU_cleanup_registry();
return CU_get_error();