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:
parent
97660c1adb
commit
73c95f5476
@ -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 */
|
||||
};
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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'))
|
||||
|
||||
|
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user