Skip to content

Commit ffb7025

Browse files
author
root
committed
add read only status in lvs level
1 parent d6b6373 commit ffb7025

File tree

10 files changed

+127
-0
lines changed

10 files changed

+127
-0
lines changed

include/spdk/blob.h

+1
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,7 @@ void spdk_blob_update_failed_cleanup(struct spdk_blob *blob,
388388
spdk_blob_op_complete cb_fn, void *cb_arg);
389389

390390
void spdk_bs_set_leader(struct spdk_blob_store *bs, bool state);
391+
void spdk_bs_set_read_only(struct spdk_blob_store *bs, bool state);
391392
/**
392393
* update a blobstore according to bit array synced.
393394
* Can be used on loaded blobstore, even with opened blobs.

include/spdk/lvol.h

+1
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,7 @@ void spdk_lvs_change_leader_state(uint64_t groupid);
313313
bool spdk_lvs_trigger_leadership_switch(uint64_t *groupid);
314314
bool spdk_lvs_queued_rsp(struct spdk_lvol_store *lvs, struct spdk_bdev_io *bdev_io);
315315
void spdk_lvs_set_op(struct spdk_lvol_store *lvs, uint64_t groupid, uint64_t port);
316+
void spdk_lvs_set_read_only(struct spdk_lvol_store *lvs, bool status);
316317
void spdk_lvs_set_failed_on_update(struct spdk_lvol_store *lvs, bool state);
317318
/**
318319
* Get the lvol that has a particular UUID.

include/spdk_internal/lvolstore.h

+1
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,7 @@ struct spdk_lvol_store {
140140
uint64_t leadership_timeout;
141141
uint64_t timeout_trigger;
142142
bool trigger_leader_sent;
143+
bool read_only;
143144
int subsystem_port;
144145
};
145146

lib/blob/blobstore.c

+18
Original file line numberDiff line numberDiff line change
@@ -3811,6 +3811,12 @@ blob_request_submit_op(struct spdk_blob *blob, struct spdk_io_channel *_channel,
38113811
return;
38123812
}
38133813

3814+
if (blob->bs->read_only &&
3815+
(op_type == SPDK_BLOB_WRITE || op_type == SPDK_BLOB_WRITE_ZEROES)) {
3816+
// SPDK_NOTICELOG("FAILED IO on update filed condition.\n");
3817+
cb_fn(cb_arg, -EIO);
3818+
}
3819+
38143820
if (blob->failed_on_update) {
38153821
SPDK_NOTICELOG("FAILED IO on update filed condition.\n");
38163822
cb_fn(cb_arg, -EIO);
@@ -3952,6 +3958,11 @@ blob_request_submit_rw_iov(struct spdk_blob *blob, struct spdk_io_channel *_chan
39523958
return;
39533959
}
39543960

3961+
if (blob->bs->read_only && !read) {
3962+
// SPDK_NOTICELOG("FAILED IO on update filed condition.\n");
3963+
cb_fn(cb_arg, -EIO);
3964+
}
3965+
39553966
if (blob->failed_on_update) {
39563967
SPDK_NOTICELOG("FAILED IO on update filed condition \n");
39573968
cb_fn(cb_arg, -EIO);
@@ -4472,6 +4483,7 @@ bs_alloc(struct spdk_bs_dev *dev, struct spdk_bs_opts *opts, struct spdk_blob_st
44724483

44734484
bs->priority_class = 0;
44744485
bs->is_leader = true;
4486+
bs->read_only = false;
44754487
/*
44764488
* Do not use bs_lba_to_cluster() here since blockcnt may not be an
44774489
* even multiple of the cluster size.
@@ -7351,6 +7363,12 @@ spdk_bs_set_leader(struct spdk_blob_store *bs, bool state)
73517363
bs->is_leader = state;
73527364
}
73537365

7366+
void
7367+
spdk_bs_set_read_only(struct spdk_blob_store *bs, bool state)
7368+
{
7369+
bs->read_only = state;
7370+
}
7371+
73547372
uint64_t
73557373
spdk_bs_get_cluster_size(struct spdk_blob_store *bs)
73567374
{

lib/blob/blobstore.h

+1
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ struct spdk_blob_store {
212212
* Only when the distrib internal force state changes, it will be set to false.
213213
*/
214214
bool is_leader;
215+
bool read_only;
215216

216217
spdk_bs_esnap_dev_create esnap_bs_dev_create;
217218
void *esnap_ctx;

lib/lvol/lvol.c

+12
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ lvs_alloc(void)
8282

8383
lvs->load_esnaps = false;
8484
lvs->leader = false;
85+
lvs->read_only = false;
8586
RB_INIT(&lvs->degraded_lvol_sets_tree);
8687
lvs->thread = spdk_get_thread();
8788

@@ -2972,6 +2973,17 @@ spdk_lvs_set_op(struct spdk_lvol_store *lvs, uint64_t groupid, uint64_t port)
29722973
return;
29732974
}
29742975

2976+
void
2977+
spdk_lvs_set_read_only(struct spdk_lvol_store *lvs, bool status)
2978+
{
2979+
SPDK_NOTICELOG("Set lvostore read_only %s.\n", status ? "true" : "false");
2980+
pthread_mutex_lock(&g_lvol_stores_mutex);
2981+
lvs->read_only = status;
2982+
spdk_bs_set_read_only(lvs->blobstore, status);
2983+
pthread_mutex_unlock(&g_lvol_stores_mutex);
2984+
return;
2985+
}
2986+
29752987
void
29762988
spdk_lvs_check_active_process(struct spdk_lvol_store *lvs, struct spdk_lvol *lvol, uint8_t type)
29772989
{

module/bdev/lvol/vbdev_lvol.c

+8
Original file line numberDiff line numberDiff line change
@@ -1260,6 +1260,10 @@ vbdev_lvol_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_
12601260
bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen);
12611261
break;
12621262
case SPDK_BDEV_IO_TYPE_WRITE:
1263+
if (lvs->read_only) {
1264+
spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED);
1265+
return;
1266+
}
12631267
lvol_write(lvol, ch, bdev_io);
12641268
break;
12651269
case SPDK_BDEV_IO_TYPE_RESET:
@@ -1269,6 +1273,10 @@ vbdev_lvol_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_
12691273
lvol_unmap(lvol, ch, bdev_io);
12701274
break;
12711275
case SPDK_BDEV_IO_TYPE_WRITE_ZEROES:
1276+
if (lvs->read_only) {
1277+
spdk_bdev_io_complete(bdev_io, SPDK_BDEV_IO_STATUS_FAILED);
1278+
return;
1279+
}
12721280
lvol_write_zeroes(lvol, ch, bdev_io);
12731281
break;
12741282
case SPDK_BDEV_IO_TYPE_SEEK_DATA:

module/bdev/lvol/vbdev_lvol_rpc.c

+54
Original file line numberDiff line numberDiff line change
@@ -1575,6 +1575,59 @@ rpc_bdev_lvol_set_read_only(struct spdk_jsonrpc_request *request,
15751575

15761576
SPDK_RPC_REGISTER("bdev_lvol_set_read_only", rpc_bdev_lvol_set_read_only, SPDK_RPC_RUNTIME)
15771577

1578+
struct rpc_set_ro_lvs_bdev {
1579+
char *lvs_name;
1580+
char *uuid;
1581+
bool read_only;
1582+
1583+
};
1584+
1585+
static void
1586+
free_rpc_set_ro_lvs_bdev(struct rpc_set_ro_lvs_bdev *req)
1587+
{
1588+
free(req->lvs_name);
1589+
free(req->uuid);
1590+
}
1591+
1592+
static const struct spdk_json_object_decoder rpc_set_ro_lvs_bdev_decoders[] = {
1593+
{"lvs_name", offsetof(struct rpc_set_ro_lvs_bdev, lvs_name), spdk_json_decode_string, true},
1594+
{"uuid", offsetof(struct rpc_set_ro_lvs_bdev, uuid), spdk_json_decode_string, true},
1595+
{"read_only", offsetof(struct rpc_set_ro_lvs_bdev, read_only), spdk_json_decode_bool},
1596+
};
1597+
1598+
static void
1599+
rpc_bdev_lvol_set_lvs_read_only(struct spdk_jsonrpc_request *request,
1600+
const struct spdk_json_val *params)
1601+
{
1602+
struct rpc_set_ro_lvs_bdev req = {};
1603+
struct spdk_lvol_store *lvs = NULL;
1604+
int rc;
1605+
1606+
SPDK_INFOLOG(lvol_rpc, "Setting lvol as read only\n");
1607+
1608+
if (spdk_json_decode_object(params, rpc_set_ro_lvs_bdev_decoders,
1609+
SPDK_COUNTOF(rpc_set_ro_lvs_bdev_decoders),
1610+
&req)) {
1611+
SPDK_INFOLOG(lvol_rpc, "spdk_json_decode_object failed\n");
1612+
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
1613+
"spdk_json_decode_object failed");
1614+
goto cleanup;
1615+
}
1616+
1617+
rc = vbdev_get_lvol_store_by_uuid_xor_name(req.uuid, req.lvs_name, &lvs);
1618+
if (rc != 0) {
1619+
spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc));
1620+
goto cleanup;
1621+
}
1622+
1623+
spdk_lvs_set_read_only(lvs, req.read_only);
1624+
spdk_jsonrpc_send_bool_response(request, true);
1625+
cleanup:
1626+
free_rpc_set_ro_lvs_bdev(&req);
1627+
}
1628+
1629+
SPDK_RPC_REGISTER("bdev_lvol_set_lvs_read_only", rpc_bdev_lvol_set_lvs_read_only, SPDK_RPC_RUNTIME)
1630+
15781631
struct rpc_bdev_lvol_delete {
15791632
char *name;
15801633
bool sync;
@@ -1699,6 +1752,7 @@ rpc_dump_lvol_store_info(struct spdk_json_write_ctx *w, struct lvol_store_bdev *
16991752
spdk_json_write_named_uuid(w, "uuid", &lvs_bdev->lvs->uuid);
17001753
spdk_json_write_named_string(w, "name", lvs_bdev->lvs->name);
17011754
spdk_json_write_named_bool(w, "lvs leadership", lvs_bdev->lvs->leader);
1755+
spdk_json_write_named_bool(w, "lvs_read_only", lvs_bdev->lvs->read_only);
17021756
spdk_json_write_named_string(w, "base_bdev", spdk_bdev_get_name(lvs_bdev->bdev));
17031757
spdk_json_write_named_uint64(w, "total_data_clusters", spdk_bs_total_data_cluster_count(bs));
17041758
spdk_json_write_named_uint64(w, "free_clusters", spdk_bs_free_cluster_count(bs));

python/spdk/rpc/lvol.py

+18
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,24 @@ def bdev_lvol_set_leader_all(client, uuid=None, lvs_name=None, leadership=False)
9595
params['lvs_name'] = lvs_name
9696
return client.call('bdev_lvol_set_leader_all', params)
9797

98+
def bdev_lvol_set_lvs_read_only(client, uuid=None, lvs_name=None, read_only=False):
99+
"""Change state of the read only
100+
101+
Args:
102+
uuid: UUID of the lvolstore
103+
lvs_name: lvolstore name
104+
read_only: Read only state for lvolstore (default: False)
105+
"""
106+
params = {'read_only': read_only}
107+
108+
if (uuid and lvs_name):
109+
raise ValueError("Exactly one of uuid or lvs_name may be specified")
110+
if uuid:
111+
params['uuid'] = uuid
112+
if lvs_name:
113+
params['lvs_name'] = lvs_name
114+
return client.call('bdev_lvol_set_lvs_read_only', params)
115+
98116
def bdev_lvol_create(client, lvol_name, size_in_mib, thin_provision=False, uuid=None, lvs_name=None, clear_method=None, lvol_priority_class=0):
99117
"""Create a logical volume on a logical volume store.
100118

scripts/rpc.py

+13
Original file line numberDiff line numberDiff line change
@@ -2067,6 +2067,19 @@ def bdev_lvol_set_leader_all(args):
20672067
p.add_argument('-u', '--uuid', help='lvol store UUID')
20682068
p.add_argument('-s', '--lvs-name', help='lvol store name')
20692069
p.set_defaults(func=bdev_lvol_set_leader_all)
2070+
2071+
def bdev_lvol_set_lvs_read_only(args):
2072+
print_dict(rpc.lvol.bdev_lvol_set_lvs_read_only(args.client,
2073+
uuid=args.uuid,
2074+
lvs_name=args.lvs_name,
2075+
read_only=args.read_only))
2076+
2077+
p = subparsers.add_parser('bdev_lvol_set_lvs_read_only',
2078+
help='Change read only state for lvstore')
2079+
p.add_argument('-r', '--read-only', action='store_true', help='read only state for lvolstore level, default False')
2080+
p.add_argument('-u', '--uuid', help='lvol store UUID')
2081+
p.add_argument('-s', '--lvs-name', help='lvol store name')
2082+
p.set_defaults(func=bdev_lvol_set_lvs_read_only)
20702083

20712084
def bdev_lvol_create(args):
20722085
print_json(rpc.lvol.bdev_lvol_create(args.client,

0 commit comments

Comments
 (0)