xref: /spdk/doc/jsonrpc.md (revision 60982c759db49b4f4579f16e3b24df0725ba4b94)
1# JSON-RPC {#jsonrpc}
2
3## Overview {#jsonrpc_overview}
4
5SPDK implements a [JSON-RPC 2.0](http://www.jsonrpc.org/specification) server
6to allow external management tools to dynamically configure SPDK components.
7
8## Parameters
9
10Most of the commands can take parameters. If present, parameter is validated against its domain. If this check fail
11whole command will fail with response error message [Invalid params](@ref jsonrpc_error_message).
12
13### Required parameters
14
15These parameters are mandatory. If any required parameter is missing RPC command will fail with proper error response.
16
17### Optional parameters
18
19Those parameters might be omitted. If an optional parameter is present it must be valid otherwise command will fail
20proper error response.
21
22## Error response message {#jsonrpc_error_message}
23
24Each error response will contain proper message. As much as possible the message should indicate what went wrong during
25command processing.
26
27There is ongoing effort to customize this messages but some RPC methods just return "Invalid parameters" as message body
28for any kind of error.
29
30Code   | Description
31------ | -----------
32-1     | Invalid state - given method exists but it is not callable in [current runtime state](@ref rpc_framework_start_init)
33-32600 | Invalid request - not compliant with JSON-RPC 2.0 Specification
34-32601 | Method not found
35-32602 | @ref jsonrpc_invalid_params
36-32603 | Internal error for e.g.: errors like out of memory
37-32700 | @ref jsonrpc_parser_error
38
39### Parser error {#jsonrpc_parser_error}
40
41Encountered some error during parsing request like:
42
43- the JSON object is malformed
44- parameter is too long
45- request is too long
46
47### Invalid params {#jsonrpc_invalid_params}
48
49This type of error is most common one. It mean that there is an error while processing the request like:
50
51- Parameters decoding in RPC method handler failed because required parameter is missing.
52- Unknown parameter present encountered.
53- Parameter type doesn't match expected type e.g.: given number when expected a string.
54- Parameter domain check failed.
55- Request is valid but some other error occurred during processing request. If possible message explains the error reason nature.
56
57## rpc.py {#rpc_py}
58
59SPDK provides a set of Python scripts which can invoke the JSON-RPC methods described in this document.  'rpc.py' in the scripts
60directory is the main script that users will invoke to execute a JSON-RPC method. The scripts/rpc directory contains modules
61that 'rpc.py' imports for definitions of each SPDK library's or module's methods.
62
63Example:
64
65~~~bash
66scripts/rpc.py bdev_nvme_attach_controller -b nvme0 -a 00:02.0 -t pcie
67~~~
68
69A brief description of each of the RPC methods and optional 'rpc.py' arguments can be viewed with:
70
71~~~bash
72scripts/rpc.py --help
73~~~
74
75A detailed description of each RPC method and its parameters is also available.  For example:
76
77~~~bash
78scripts/rpc.py bdev_nvme_attach_controller --help
79~~~
80
81### Generate JSON-RPC methods for current configuration {#jsonrpc_generate}
82
83An initial configuration can be specified for an SPDK application via the '-c' command line parameter.
84The configuration file is a JSON file containing all of the JSON-RPC method invocations necessary
85for the desired configuration. Writing these files by hand is extremely tedious however, so 'rpc.py'
86provides a mechanism to generate a JSON-RPC file based on the current configuration.
87
88~~~bash
89scripts/rpc.py save_config > config.json
90~~~
91
92'config.json' can then be passed to a new SPDK application using the '-c' command line parameter
93to reproduce the same configuration.
94
95### JSON-RPC batching
96
97'rpc.py' also supports batching of multiple JSON-RPC methods with one invocation.  So instead of
98calling 'rpc.py' once for each JSON-RPC method, such as:
99
100~~~bash
101scripts/rpc.py bdev_malloc_create -b malloc0 64 512
102scripts/rpc.py nvmf_create_subsystem nqn.2016-06.io.spdk:cnode1 -a
103scripts/rpc.py nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 malloc0
104scripts/rpc.py nvmf_create_transport -t tcp
105scripts/rpc.py nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t tcp -a 127.0.0.1 -s 4420
106~~~
107
108you can put the following into a text file:
109
110~~~bash
111bdev_malloc_create -b malloc0 64 512
112nvmf_create_subsystem nqn.2016-06.io.spdk:cnode1 -a
113nvmf_subsystem_add_ns nqn.2016-06.io.spdk:cnode1 malloc0
114nvmf_create_transport -t tcp
115nvmf_subsystem_add_listener nqn.2016-06.io.spdk:cnode1 -t tcp -a 127.0.0.1 -s 4420
116~~~
117
118and then just do:
119
120~~~bash
121scripts/rpc.py < rpc.txt
122~~~
123
124### Adding external RPC methods
125
126SPDK includes both in-tree modules as well as the ability to use external modules.  The in-tree modules include some python
127scripts to ease the process of sending RPCs to in-tree modules.  External modules can utilize this same framework to add new RPC
128methods as follows:
129
130If PYTHONPATH doesn't include the location of the external RPC python script, it should be updated:
131
132~~~bash
133export PYTHONPATH=/home/user/plugin_example/
134~~~
135
136In provided location, create python module file (e.g. rpc_plugin.py) with new RPC methods.  The file should contain
137spdk_rpc_plugin_initialize() method that will be called when the plugin is loaded to define new parsers for provided subparsers
138argument that adds new RPC calls (subparsers.add_parser()).  The new parsers should use the client.call() method to call RPC
139functions registered within the external module using the SPDK_RPC_REGISTER() macro.  Example:
140
141~~~python
142from spdk.rpc.client import print_json
143
144
145def example_create(client, num_blocks, block_size, name=None, uuid=None):
146    """Construct an example block device.
147
148    Args:
149        num_blocks: size of block device in blocks
150        block_size: block size of device; must be a power of 2 and at least 512
151        name: name of block device (optional)
152        uuid: UUID of block device (optional)
153
154    Returns:
155        Name of created block device.
156    """
157    params = {'num_blocks': num_blocks, 'block_size': block_size}
158    if name:
159        params['name'] = name
160    if uuid:
161        params['uuid'] = uuid
162    return client.call('bdev_example_create', params)
163
164
165def example_delete(client, name):
166    """Delete example block device.
167
168    Args:
169        bdev_name: name of bdev to delete
170    """
171    params = {'name': name}
172    return client.call('bdev_example_delete', params)
173
174
175def spdk_rpc_plugin_initialize(subparsers):
176    def bdev_example_create(args):
177        num_blocks = (args.total_size * 1024 * 1024) // args.block_size
178        print_json(example_create(args.client,
179                                  num_blocks=int(num_blocks),
180                                  block_size=args.block_size,
181                                  name=args.name,
182                                  uuid=args.uuid))
183
184    p = subparsers.add_parser('bdev_example_create',
185                              help='Create an example bdev')
186    p.add_argument('-b', '--name', help="Name of the bdev")
187    p.add_argument('-u', '--uuid', help="UUID of the bdev")
188    p.add_argument(
189        'total_size', help='Size of bdev in MB (float > 0)', type=float)
190    p.add_argument('block_size', help='Block size for this bdev', type=int)
191    p.set_defaults(func=bdev_example_create)
192
193    def bdev_example_delete(args):
194        example_delete(args.client,
195                      name=args.name)
196
197    p = subparsers.add_parser('bdev_example_delete',
198                              help='Delete an example disk')
199    p.add_argument('name', help='example bdev name')
200    p.set_defaults(func=bdev_example_delete)
201~~~
202
203Finally, call the rpc.py script with '--plugin' parameter to provide above python module name:
204
205~~~bash
206./scripts/rpc.py --plugin rpc_plugin bdev_example_create 10 4096
207~~~
208
209### Converting from legacy configuration {#jsonrpc_convert}
210
211Starting with SPDK 20.10, legacy configuration file support has been removed.
212Users with extensive configuration files already running in SPDK application,
213can [generate JSON-RPC for current configuration](@ref jsonrpc_generate).
214
215If binary for deploying the application is unavailable, the legacy configuration
216file can be converted to JSON-RPC using python tool:
217
218~~~bash
219./scripts/config_converter.py < config.ini > config.json
220~~~
221
222## App Framework {#jsonrpc_components_app}
223
224### spdk_kill_instance {#rpc_spdk_kill_instance}
225
226Send a signal to the application.
227
228#### Parameters
229
230Name                    | Optional | Type        | Description
231----------------------- | -------- | ----------- | -----------
232sig_name                | Required | string      | Signal to send (SIGINT, SIGTERM, SIGQUIT, SIGHUP, or SIGKILL)
233
234#### Example
235
236Example request:
237
238~~~json
239{
240  "jsonrpc": "2.0",
241  "id": 1,
242  "method": "spdk_kill_instance",
243  "params": {
244    "sig_name": "SIGINT"
245  }
246}
247~~~
248
249Example response:
250
251~~~json
252{
253  "jsonrpc": "2.0",
254  "id": 1,
255  "result": true
256}
257~~~
258
259### framework_monitor_context_switch {#rpc_framework_monitor_context_switch}
260
261Query, enable, or disable the context switch monitoring functionality.
262
263#### Parameters
264
265Name                    | Optional | Type        | Description
266----------------------- | -------- | ----------- | -----------
267enabled                 | Optional | boolean     | Enable (`true`) or disable (`false`) monitoring (omit this parameter to query the current state)
268
269#### Response
270
271Name                    | Type        | Description
272----------------------- | ----------- | -----------
273enabled                 | boolean     | The current state of context switch monitoring
274
275#### Example
276
277Example request:
278
279~~~json
280{
281  "jsonrpc": "2.0",
282  "id": 1,
283  "method": "framework_monitor_context_switch",
284  "params": {
285    "enabled": false
286  }
287}
288~~~
289
290Example response:
291
292~~~json
293{
294  "jsonrpc": "2.0",
295  "id": 1,
296  "result": {
297    "enabled": false
298  }
299}
300~~~
301
302### framework_start_init {#rpc_framework_start_init}
303
304Start initialization of SPDK subsystems when it is deferred by starting SPDK application with option -w.
305During its deferral some RPCs can be used to set global parameters for SPDK subsystems.
306This RPC can be called only once.
307
308#### Parameters
309
310This method has no parameters.
311
312#### Response
313
314Completion status of SPDK subsystem initialization is returned as a boolean.
315
316#### Example
317
318Example request:
319
320~~~json
321{
322  "jsonrpc": "2.0",
323  "id": 1,
324  "method": "framework_start_init"
325}
326~~~
327
328Example response:
329
330~~~json
331{
332  "jsonrpc": "2.0",
333  "id": 1,
334  "result": true
335}
336~~~
337
338### framework_wait_init {#rpc_framework_wait_init}
339
340Do not return until all subsystems have been initialized and the RPC system state is running.
341If the application is already running, this call will return immediately. This RPC can be called at any time.
342
343#### Parameters
344
345This method has no parameters.
346
347#### Response
348
349Returns True when subsystems have been initialized.
350
351#### Example
352
353Example request:
354
355~~~json
356{
357  "jsonrpc": "2.0",
358  "id": 1,
359  "method": "framework_wait_init"
360}
361~~~
362
363Example response:
364
365~~~json
366{
367  "jsonrpc": "2.0",
368  "id": 1,
369  "result": true
370}
371~~~
372
373### rpc_get_methods {#rpc_rpc_get_methods}
374
375Get an array of supported RPC methods.
376
377#### Parameters
378
379Name                    | Optional | Type        | Description
380----------------------- | -------- | ----------- | -----------
381current                 | Optional | boolean     | Get an array of RPC methods only callable in the current state.
382
383#### Response
384
385The response is an array of supported RPC methods.
386
387#### Example
388
389Example request:
390
391~~~json
392{
393  "jsonrpc": "2.0",
394  "id": 1,
395  "method": "rpc_get_methods"
396}
397~~~
398
399Example response:
400
401~~~json
402{
403  "jsonrpc": "2.0",
404  "id": 1,
405  "result": [
406    "framework_start_init",
407    "rpc_get_methods",
408    "scsi_get_devices",
409    "nbd_get_disks",
410    "nbd_stop_disk",
411    "nbd_start_disk",
412    "log_get_flags",
413    "log_clear_flag",
414    "log_set_flag",
415    "log_get_level",
416    "log_set_level",
417    "log_get_print_level",
418    "log_set_print_level",
419    "iscsi_get_options",
420    "iscsi_target_node_add_lun",
421    "iscsi_get_connections",
422    "iscsi_delete_portal_group",
423    "iscsi_create_portal_group",
424    "iscsi_get_portal_groups",
425    "iscsi_delete_target_node",
426    "iscsi_target_node_remove_pg_ig_maps",
427    "iscsi_target_node_add_pg_ig_maps",
428    "iscsi_create_target_node",
429    "iscsi_get_target_nodes",
430    "iscsi_delete_initiator_group",
431    "iscsi_initiator_group_remove_initiators",
432    "iscsi_initiator_group_add_initiators",
433    "iscsi_create_initiator_group",
434    "iscsi_get_initiator_groups",
435    "iscsi_set_options",
436    "bdev_set_options",
437    "bdev_set_qos_limit",
438    "bdev_get_bdevs",
439    "bdev_get_iostat",
440    "framework_get_config",
441    "framework_get_subsystems",
442    "framework_monitor_context_switch",
443    "spdk_kill_instance",
444    "accel_set_options",
445    "accel_set_driver",
446    "accel_crypto_key_create",
447    "accel_crypto_key_destroy",
448    "accel_crypto_keys_get",
449    "accel_assign_opc",
450    "accel_get_module_info",
451    "accel_get_opc_assignments",
452    "ioat_scan_accel_module",
453    "dsa_scan_accel_module",
454    "dpdk_cryptodev_scan_accel_module",
455    "dpdk_cryptodev_set_driver",
456    "dpdk_cryptodev_get_driver",
457    "mlx5_scan_accel_module",
458    "bdev_virtio_attach_controller",
459    "bdev_virtio_scsi_get_devices",
460    "bdev_virtio_detach_controller",
461    "bdev_virtio_blk_set_hotplug",
462    "bdev_aio_delete",
463    "bdev_aio_create",
464    "bdev_split_delete",
465    "bdev_split_create",
466    "bdev_error_inject_error",
467    "bdev_error_delete",
468    "bdev_error_create",
469    "bdev_passthru_create",
470    "bdev_passthru_delete"
471    "bdev_nvme_apply_firmware",
472    "bdev_nvme_get_transport_statistics",
473    "bdev_nvme_get_controller_health_info",
474    "bdev_nvme_detach_controller",
475    "bdev_nvme_attach_controller",
476    "bdev_null_create",
477    "bdev_malloc_delete",
478    "bdev_malloc_create",
479    "bdev_ftl_delete",
480    "bdev_ftl_unload",
481    "bdev_ftl_create",
482    "bdev_ftl_load",
483    "bdev_ftl_unmap",
484    "bdev_ftl_get_stats",
485    "bdev_lvol_get_lvstores",
486    "bdev_lvol_delete",
487    "bdev_lvol_resize",
488    "bdev_lvol_set_read_only",
489    "bdev_lvol_decouple_parent",
490    "bdev_lvol_inflate",
491    "bdev_lvol_rename",
492    "bdev_lvol_clone",
493    "bdev_lvol_snapshot",
494    "bdev_lvol_create",
495    "bdev_lvol_delete_lvstore",
496    "bdev_lvol_rename_lvstore",
497    "bdev_lvol_create_lvstore",
498    "bdev_daos_delete",
499    "bdev_daos_create",
500    "bdev_daos_resize"
501  ]
502}
503~~~
504
505### framework_get_subsystems {#rpc_framework_get_subsystems}
506
507Get an array of name and dependency relationship of SPDK subsystems in initialization order.
508
509#### Parameters
510
511None
512
513#### Response
514
515The response is an array of name and dependency relationship of SPDK subsystems in initialization order.
516
517#### Example
518
519Example request:
520
521~~~json
522{
523  "jsonrpc": "2.0",
524  "id": 1,
525  "method": "framework_get_subsystems"
526}
527~~~
528
529Example response:
530
531~~~json
532{
533  "jsonrpc": "2.0",
534  "id": 1,
535  "result": [
536    {
537      "subsystem": "accel",
538      "depends_on": []
539    },
540    {
541      "subsystem": "interface",
542      "depends_on": []
543    },
544    {
545      "subsystem": "net_framework",
546      "depends_on": [
547        "interface"
548      ]
549    },
550    {
551      "subsystem": "bdev",
552      "depends_on": [
553        "accel"
554      ]
555    },
556    {
557      "subsystem": "nbd",
558      "depends_on": [
559        "bdev"
560      ]
561    },
562    {
563      "subsystem": "nvmf",
564      "depends_on": [
565        "bdev"
566      ]
567    },
568    {
569      "subsystem": "scsi",
570      "depends_on": [
571        "bdev"
572      ]
573    },
574    {
575      "subsystem": "vhost",
576      "depends_on": [
577        "scsi"
578      ]
579    },
580    {
581      "subsystem": "iscsi",
582      "depends_on": [
583        "scsi"
584      ]
585    }
586  ]
587}
588~~~
589
590### framework_get_config {#rpc_framework_get_config}
591
592Get current configuration of the specified SPDK framework
593
594#### Parameters
595
596Name                    | Optional | Type        | Description
597----------------------- | -------- | ----------- | -----------
598name                    | Required | string      | SPDK subsystem name
599
600#### Response
601
602The response is current configuration of the specified SPDK subsystem.
603Null is returned if it is not retrievable by the framework_get_config method and empty array is returned if it is empty.
604
605#### Example
606
607Example request:
608
609~~~json
610{
611  "jsonrpc": "2.0",
612  "id": 1,
613  "method": "framework_get_config",
614  "params": {
615    "name": "bdev"
616  }
617}
618~~~
619
620Example response:
621
622~~~json
623{
624  "jsonrpc": "2.0",
625  "id": 1,
626  "result": [
627    {
628      "params": {
629        "base_bdev": "Malloc2",
630        "split_size_mb": 0,
631        "split_count": 2
632      },
633      "method": "bdev_split_create"
634    },
635    {
636      "params": {
637        "trtype": "PCIe",
638        "name": "Nvme1",
639        "traddr": "0000:01:00.0"
640      },
641      "method": "bdev_nvme_attach_controller"
642    },
643    {
644      "params": {
645        "trtype": "PCIe",
646        "name": "Nvme2",
647        "traddr": "0000:03:00.0"
648      },
649      "method": "bdev_nvme_attach_controller"
650    },
651    {
652      "params": {
653        "block_size": 512,
654        "num_blocks": 131072,
655        "name": "Malloc0",
656        "uuid": "913fc008-79a7-447f-b2c4-c73543638c31"
657      },
658      "method": "bdev_malloc_create"
659    },
660    {
661      "params": {
662        "block_size": 512,
663        "num_blocks": 131072,
664        "name": "Malloc1",
665        "uuid": "dd5b8f6e-b67a-4506-b606-7fff5a859920"
666      },
667      "method": "bdev_malloc_create"
668    }
669  ]
670}
671~~~
672
673### framework_get_reactors {#rpc_framework_get_reactors}
674
675Retrieve an array of all reactors.
676
677#### Parameters
678
679This method has no parameters.
680
681#### Response
682
683The response is an array of all reactors.
684
685#### Example
686
687Example request:
688
689~~~json
690{
691  "jsonrpc": "2.0",
692  "method": "framework_get_reactors",
693  "id": 1
694}
695~~~
696
697Example response:
698
699~~~json
700{
701  "jsonrpc": "2.0",
702  "id": 1,
703  "result": {
704    "tick_rate": 2400000000,
705    "reactors": [
706      {
707        "lcore": 0,
708        "busy": 41289723495,
709        "idle": 3624832946,
710        "lw_threads": [
711          {
712            "name": "app_thread",
713            "id", 1,
714            "cpumask": "1",
715            "elapsed": 44910853363
716          }
717        ]
718      }
719    ]
720  }
721}
722~~~
723
724### framework_set_scheduler {#rpc_framework_set_scheduler}
725
726Select thread scheduler that will be activated.
727This feature is considered as experimental.
728
729#### Parameters
730
731Name                    | Optional | Type        | Description
732----------------------- | -------- | ----------- | -----------
733name                    | Required | string      | Name of a scheduler
734period                  | Optional | number      | Scheduler period
735load_limit              | Optional | number      | Thread load limit in % (dynamic only)
736core_limit              | Optional | number      | Load limit on the core to be considered full (dynamic only)
737core_busy               | Optional | number      | Indicates at what load on core scheduler should move threads to a different core (dynamic only)
738
739#### Response
740
741Completion status of the operation is returned as a boolean.
742
743#### Example
744
745Example request:
746
747~~~json
748{
749  "jsonrpc": "2.0",
750  "method": "framework_set_scheduler",
751  "id": 1,
752  "params": {
753    "name": "static",
754    "period": "1000000"
755  }
756}
757~~~
758
759Example response:
760
761~~~json
762{
763  "jsonrpc": "2.0",
764  "id": 1,
765  "result": true
766}
767~~~
768
769### framework_get_scheduler {#rpc_framework_get_scheduler}
770
771Retrieve currently set scheduler name and period, along with current governor name.
772
773#### Parameters
774
775This method has no parameters.
776
777#### Response
778
779Name                    | Description
780------------------------| -----------
781scheduler_name          | Current scheduler name
782scheduler_period        | Currently set scheduler period in microseconds
783governor_name           | Governor name
784
785#### Example
786
787Example request:
788
789~~~json
790{
791  "jsonrpc": "2.0",
792  "method": "framework_set_scheduler",
793  "id": 1,
794}
795~~~
796
797Example response:
798
799~~~json
800{
801  "jsonrpc": "2.0",
802  "id": 1,
803  "result": {
804    "scheduler_name": "static",
805    "scheduler_period": 2800000000,
806    "governor_name": "default"
807  }
808}
809~~~
810
811### framework_enable_cpumask_locks
812
813Enable CPU core lock files to block multiple SPDK applications from running on the same cpumask.
814The CPU core locks are enabled by default, unless user specified `--disable-cpumask-locks` command
815line option when launching SPDK.
816
817This RPC may be called after locks have already been enabled, with no effect and no error response.
818
819#### Parameters
820
821This method has no parameters.
822
823#### Response
824
825true on success
826
827#### Example
828
829Example request:
830
831~~~json
832{
833  "jsonrpc": "2.0",
834  "id": 1,
835  "method": "framework_enable_cpumask_locks"
836}
837~~~
838
839Example response:
840
841~~~json
842{
843  "jsonrpc": "2.0",
844  "id": 1,
845  "result": true
846}
847~~~
848
849### framework_disable_cpumask_locks
850
851Disable CPU core lock files. The locks can also be disabled during startup, when
852user specifies `--disable-cpumask-locks` command line option during SPDK launch.
853
854This RPC may be called after locks have already been disabled, with no effect and no error
855response.
856
857#### Parameters
858
859This method has no parameters.
860
861#### Response
862
863true on success
864
865#### Example
866
867Example request:
868
869~~~json
870{
871  "jsonrpc": "2.0",
872  "id": 1,
873  "method": "framework_disable_cpumask_locks"
874}
875~~~
876
877Example response:
878
879~~~json
880{
881  "jsonrpc": "2.0",
882  "id": 1,
883  "result": true
884}
885~~~
886
887### thread_get_stats {#rpc_thread_get_stats}
888
889Retrieve current statistics of all the threads.
890
891#### Parameters
892
893This method has no parameters.
894
895#### Response
896
897The response is an array of objects containing threads statistics.
898
899#### Example
900
901Example request:
902
903~~~json
904{
905  "jsonrpc": "2.0",
906  "method": "thread_get_stats",
907  "id": 1
908}
909~~~
910
911Example response:
912
913~~~json
914{
915  "jsonrpc": "2.0",
916  "id": 1,
917  "result": {
918    "tick_rate": 2400000000,
919    "threads": [
920      {
921        "name": "app_thread",
922        "id": 1,
923	"cpumask": "1",
924        "busy": 139223208,
925        "idle": 8641080608,
926        "in_interrupt": false,
927        "active_pollers_count": 1,
928        "timed_pollers_count": 2,
929        "paused_pollers_count": 0
930      }
931    ]
932  }
933}
934~~~
935
936### thread_set_cpumask {#rpc_thread_set_cpumask}
937
938Set the cpumask of the thread to the specified value. The thread may be migrated
939to one of the specified CPUs.
940
941#### Parameters
942
943Name                    | Optional | Type        | Description
944----------------------- | -------- | ----------- | -----------
945id                      | Required | string      | Thread ID
946cpumask                 | Required | string      | Cpumask for this thread
947
948#### Response
949
950Completion status of the operation is returned as a boolean.
951
952#### Example
953
954Example request:
955
956~~~json
957{
958  "jsonrpc": "2.0",
959  "method": "thread_set_cpumask",
960  "id": 1,
961  "params": {
962    "id": "1",
963    "cpumask": "1"
964  }
965}
966~~~
967
968Example response:
969
970~~~json
971{
972  "jsonrpc": "2.0",
973  "id": 1,
974  "result": true
975}
976~~~
977
978### trace_enable_tpoint_group {#rpc_trace_enable_tpoint_group}
979
980Enable trace on a specific tpoint group. For example "bdev" for bdev trace group,
981"all" for all trace groups.
982
983#### Parameters
984
985Name                    | Optional | Type        | Description
986----------------------- | -------- | ----------- | -----------
987name                    | Required | string      | bdev, nvmf_rdma, nvmf_tcp, blobfs, scsi, iscsi_conn, ftl, all
988
989#### Example
990
991Example request:
992
993~~~json
994{
995  "jsonrpc": "2.0",
996  "method": "trace_enable_tpoint_group",
997  "id": 1,
998  "params": {
999    "name": "bdev"
1000  }
1001}
1002~~~
1003
1004Example response:
1005
1006~~~json
1007{
1008  "jsonrpc": "2.0",
1009  "id": 1,
1010  "result": true
1011}
1012~~~
1013
1014### trace_disable_tpoint_group {#rpc_trace_disable_tpoint_group}
1015
1016Disable trace on a specific tpoint group. For example "bdev" for bdev trace group,
1017"all" for all trace groups.
1018
1019#### Parameters
1020
1021Name                    | Optional | Type        | Description
1022----------------------- | -------- | ----------- | -----------
1023name                    | Required | string      | bdev, nvmf_rdma, nvmf_tcp, blobfs, all
1024
1025#### Example
1026
1027Example request:
1028
1029~~~json
1030{
1031  "jsonrpc": "2.0",
1032  "method": "trace_disable_tpoint_group",
1033  "id": 1,
1034  "params": {
1035    "name": "bdev"
1036  }
1037}
1038~~~
1039
1040Example response:
1041
1042~~~json
1043{
1044  "jsonrpc": "2.0",
1045  "id": 1,
1046  "result": true
1047}
1048~~~
1049
1050### trace_set_tpoint_mask {#rpc_trace_set_tpoint_mask}
1051
1052Enable tracepoint mask on a specific tpoint group. For example "bdev" for bdev trace group,
1053and 0x1 to enable the first tracepoint inside the group (BDEV_IO_START). This command will not
1054disable already active tracepoints or those not specified in the mask. For a full description
1055of all available trace groups, see
1056[tracepoint documentation](https://spdk.io/doc/nvmf_tgt_tracepoints.html).
1057
1058#### Parameters
1059
1060Name                    | Optional | Type        | Description
1061----------------------- | -------- | ----------- | -----------
1062name                    | Required | string      | bdev, nvmf_rdma, nvmf_tcp, blobfs, scsi, iscsi_conn, ftl
1063tpoint_mask             | Required | number      | mask to enable tracepoints inside a group
1064
1065#### Example
1066
1067Example request:
1068
1069~~~json
1070{
1071  "jsonrpc": "2.0",
1072  "method": "trace_set_tpoint_mask",
1073  "id": 1,
1074  "params": {
1075    "name": "bdev",
1076    "tpoint_mask": 0x1
1077  }
1078}
1079~~~
1080
1081Example response:
1082
1083~~~json
1084{
1085  "jsonrpc": "2.0",
1086  "id": 1,
1087  "result": true
1088}
1089~~~
1090
1091### trace_clear_tpoint_mask {#rpc_trace_clear_tpoint_mask}
1092
1093Disable tracepoint mask on a specific tpoint group. For example "bdev" for bdev trace group,
1094and 0x1 to disable the first tracepoint inside the group (BDEV_IO_START). For a full description
1095of all available trace groups, see
1096[tracepoint documentation](https://spdk.io/doc/nvmf_tgt_tracepoints.html).
1097
1098#### Parameters
1099
1100Name                    | Optional | Type        | Description
1101----------------------- | -------- | ----------- | -----------
1102name                    | Required | string      | bdev, nvmf_rdma, nvmf_tcp, blobfs, scsi, iscsi_conn, ftl
1103tpoint_mask             | Required | number      | mask to diesable tracepoints inside a group
1104
1105#### Example
1106
1107Example request:
1108
1109~~~json
1110{
1111  "jsonrpc": "2.0",
1112  "method": "trace_clear_tpoint_mask",
1113  "id": 1,
1114  "params": {
1115    "name": "bdev",
1116    "tpoint_mask": 0x1
1117  }
1118}
1119~~~
1120
1121Example response:
1122
1123~~~json
1124{
1125  "jsonrpc": "2.0",
1126  "id": 1,
1127  "result": true
1128}
1129~~~
1130
1131### trace_get_tpoint_group_mask {#rpc_trace_get_tpoint_group_mask}
1132
1133Display mask info for every group.
1134
1135#### Parameters
1136
1137No parameters required
1138
1139#### Example
1140
1141Example request:
1142
1143~~~json
1144{
1145  "jsonrpc": "2.0",
1146  "method": "trace_get_tpoint_group_mask",
1147  "id": 1
1148}
1149~~~
1150
1151Example response:
1152
1153~~~json
1154{
1155  "jsonrpc": "2.0",
1156  "id": 1,
1157  "result": {
1158    "tpoint_group_mask": "0x0",
1159  "iscsi_conn": {
1160    "enabled": false,
1161    "mask": "0x2"
1162  },
1163  "scsi": {
1164    "enabled": false,
1165    "mask": "0x4"
1166  },
1167  "bdev": {
1168    "enabled": false,
1169    "mask": "0x8"
1170  },
1171  "nvmf_tcp": {
1172    "enabled": false,
1173    "mask": "0x20"
1174  },
1175  "ftl": {
1176    "enabled": false,
1177    "mask": "0x40"
1178  },
1179  "blobfs": {
1180    "enabled": false,
1181    "mask": "0x80"
1182    }
1183  }
1184}
1185~~~
1186
1187### trace_get_info {#rpc_trace_get_info}
1188
1189Get name of shared memory file, list of the available trace point groups
1190and mask of the available trace points for each group
1191
1192#### Parameters
1193
1194No parameters required
1195
1196#### Example
1197
1198Example request:
1199
1200~~~json
1201{
1202  "jsonrpc": "2.0",
1203  "method": "trace_get_info",
1204  "id": 1
1205}
1206~~~
1207
1208Example response:
1209
1210~~~json
1211{
1212  "jsonrpc": "2.0",
1213  "id": 1,
1214  "result": {
1215    "tpoint_shm_path": "/dev/shm/spdk_tgt_trace.pid3071944",
1216    "tpoint_group_mask": "0x8",
1217    "iscsi_conn": {
1218      "mask": "0x2",
1219      "tpoint_mask": "0x0"
1220    },
1221    "scsi": {
1222      "mask": "0x4",
1223      "tpoint_mask": "0x0"
1224    },
1225    "bdev": {
1226      "mask": "0x8",
1227      "tpoint_mask": "0xffffffffffffffff"
1228    },
1229    "nvmf_tcp": {
1230      "mask": "0x20",
1231      "tpoint_mask": "0x0"
1232    },
1233    "blobfs": {
1234      "mask": "0x80",
1235      "tpoint_mask": "0x0"
1236    },
1237    "thread": {
1238      "mask": "0x400",
1239      "tpoint_mask": "0x0"
1240    },
1241    "nvme_pcie": {
1242      "mask": "0x800",
1243      "tpoint_mask": "0x0"
1244    },
1245    "nvme_tcp": {
1246      "mask": "0x2000",
1247      "tpoint_mask": "0x0"
1248    },
1249    "bdev_nvme": {
1250      "mask": "0x4000",
1251      "tpoint_mask": "0x0"
1252    }
1253  }
1254}
1255~~~
1256
1257### log_set_print_level {#rpc_log_set_print_level}
1258
1259Set the current level at which output will additionally be
1260sent to the current console.
1261
1262#### Parameters
1263
1264Name                    | Optional | Type        | Description
1265----------------------- | -------- | ----------- | -----------
1266level                   | Required | string      | ERROR, WARNING, NOTICE, INFO, DEBUG
1267
1268#### Example
1269
1270Example request:
1271
1272~~~json
1273{
1274  "jsonrpc": "2.0",
1275  "method": "log_set_print_level",
1276  "id": 1,
1277  "params": {
1278    "level": "ERROR"
1279  }
1280}
1281~~~
1282
1283Example response:
1284
1285~~~json
1286{
1287  "jsonrpc": "2.0",
1288  "id": 1,
1289  "result": true
1290}
1291~~~
1292
1293### log_get_print_level {#rpc_log_get_print_level}
1294
1295Get the current level at which output will additionally be
1296sent to the current console.
1297
1298#### Example
1299
1300Example request:
1301
1302~~~json
1303{
1304  "jsonrpc": "2.0",
1305  "method": "log_get_print_level",
1306  "id": 1,
1307}
1308~~~
1309
1310Example response:
1311
1312~~~json
1313{
1314  "jsonrpc": "2.0",
1315  "id": 1,
1316  "result": "NOTICE"
1317}
1318~~~
1319
1320### log_set_level {#rpc_log_set_level}
1321
1322Set the current logging level output by the `log` module.
1323
1324#### Parameters
1325
1326Name                    | Optional | Type        | Description
1327----------------------- | -------- | ----------- | -----------
1328level                   | Required | string      | ERROR, WARNING, NOTICE, INFO, DEBUG
1329
1330#### Example
1331
1332Example request:
1333
1334~~~json
1335{
1336  "jsonrpc": "2.0",
1337  "method": "log_set_level",
1338  "id": 1,
1339  "params": {
1340    "level": "ERROR"
1341  }
1342}
1343~~~
1344
1345Example response:
1346
1347~~~json
1348{
1349  "jsonrpc": "2.0",
1350  "id": 1,
1351  "result": true
1352}
1353~~~
1354
1355### log_get_level {#rpc_log_get_level}
1356
1357Get the current logging level output by the `log` module.
1358
1359#### Example
1360
1361Example request:
1362
1363~~~json
1364{
1365  "jsonrpc": "2.0",
1366  "method": "log_get_level",
1367  "id": 1,
1368}
1369~~~
1370
1371Example response:
1372
1373~~~json
1374{
1375  "jsonrpc": "2.0",
1376  "id": 1,
1377  "result": "NOTICE"
1378}
1379~~~
1380
1381### log_set_flag {#rpc_log_set_flag}
1382
1383Enable logging for specific portions of the application. The list of possible
1384log flags can be obtained using the `log_get_flags` RPC and may be different
1385for each application.
1386
1387#### Parameters
1388
1389Name                    | Optional | Type        | Description
1390----------------------- | -------- | ----------- | -----------
1391flag                    | Required | string      | A log flag, or 'all'
1392
1393#### Example
1394
1395Example request:
1396
1397~~~json
1398{
1399  "jsonrpc": "2.0",
1400  "method": "log_set_flag",
1401  "id": 1,
1402  "params": {
1403    "flag": "all"
1404  }
1405}
1406~~~
1407
1408Example response:
1409
1410~~~json
1411{
1412  "jsonrpc": "2.0",
1413  "id": 1,
1414  "result": true
1415}
1416~~~
1417
1418### log_clear_flag {#rpc_log_clear_flag}
1419
1420Disable logging for specific portions of the application. The list of possible
1421log flags can be obtained using the `log_get_flags` RPC and may be different
1422for each application.
1423
1424#### Parameters
1425
1426Name                    | Optional | Type        | Description
1427----------------------- | -------- | ----------- | -----------
1428flag                    | Required | string      | A log flag, or 'all'
1429
1430#### Example
1431
1432Example request:
1433
1434~~~json
1435{
1436  "jsonrpc": "2.0",
1437  "method": "log_clear_flag",
1438  "id": 1,
1439  "params": {
1440    "flag": "all"
1441  }
1442}
1443~~~
1444
1445Example response:
1446
1447~~~json
1448{
1449  "jsonrpc": "2.0",
1450  "id": 1,
1451  "result": true
1452}
1453~~~
1454
1455### log_get_flags {#rpc_log_get_flags}
1456
1457Get the list of valid flags for this application and whether
1458they are currently enabled.
1459
1460#### Example
1461
1462Example request:
1463
1464~~~json
1465{
1466  "jsonrpc": "2.0",
1467  "method": "log_get_flags",
1468  "id": 1,
1469}
1470~~~
1471
1472Example response:
1473
1474~~~json
1475{
1476  "jsonrpc": "2.0",
1477  "id": 1,
1478  "result": {
1479    "nvmf": true,
1480    "nvme": true,
1481    "aio": false,
1482    "bdev" false
1483  }
1484}
1485~~~
1486
1487### log_enable_timestamps {#rpc_log_enable_timestamps}
1488
1489Enable or disable timestamps.
1490
1491#### Parameters
1492
1493Name                    | Optional | Type        | Description
1494----------------------- | -------- | ----------- | -----------
1495enabled                 | Required | boolean     | on or off
1496
1497#### Example
1498
1499Example request:
1500
1501~~~json
1502{
1503  "jsonrpc": "2.0",
1504  "method": "log_enable_timestamps",
1505  "id": 1,
1506  "params": {
1507    "enabled": true
1508  }
1509}
1510~~~
1511
1512Example response:
1513
1514~~~json
1515{
1516  "jsonrpc": "2.0",
1517  "id": 1,
1518  "result": true
1519}
1520~~~
1521
1522### thread_get_pollers {#rpc_thread_get_pollers}
1523
1524Retrieve current pollers of all the threads.
1525
1526#### Parameters
1527
1528This method has no parameters.
1529
1530### Response
1531
1532The response is an array of objects containing pollers of all the threads.
1533
1534#### Example
1535
1536Example request:
1537
1538~~~json
1539{
1540  "jsonrpc": "2.0",
1541  "method": "thread_get_pollers",
1542  "id": 1
1543}
1544~~~
1545
1546Example response:
1547
1548~~~json
1549{
1550  "jsonrpc": "2.0",
1551  "id": 1,
1552  "result": {
1553    "tick_rate": 2500000000,
1554    "threads": [
1555      {
1556        "name": "app_thread",
1557        "id": 1,
1558        "active_pollers": [],
1559        "timed_pollers": [
1560          {
1561            "name": "spdk_rpc_subsystem_poll",
1562            "id": 1,
1563            "state": "waiting",
1564            "run_count": 12345,
1565            "busy_count": 10000,
1566            "period_ticks": 10000000
1567          }
1568        ],
1569        "paused_pollers": []
1570      }
1571    ]
1572  }
1573}
1574~~~
1575
1576### thread_get_io_channels {#rpc_thread_get_io_channels}
1577
1578Retrieve current IO channels of all the threads.
1579
1580#### Parameters
1581
1582This method has no parameters.
1583
1584#### Response
1585
1586The response is an array of objects containing IO channels of all the threads.
1587
1588#### Example
1589
1590Example request:
1591
1592~~~json
1593{
1594  "jsonrpc": "2.0",
1595  "method": "thread_get_io_channels",
1596  "id": 1
1597}
1598~~~
1599
1600Example response:
1601
1602~~~json
1603{
1604  "jsonrpc": "2.0",
1605  "id": 1,
1606  "result": {
1607    "tick_rate": 2500000000,
1608    "threads": [
1609      {
1610        "name": "app_thread",
1611        "io_channels": [
1612          {
1613            "name": "nvmf_tgt",
1614            "ref": 1
1615          }
1616        ]
1617      }
1618    ]
1619  }
1620}
1621~~~
1622
1623### env_dpdk_get_mem_stats {#rpc_env_dpdk_get_mem_stats}
1624
1625Write the dpdk memory stats to a file.
1626
1627#### Parameters
1628
1629This method has no parameters.
1630
1631#### Response
1632
1633The response is a pathname to a text file containing the memory stats.
1634
1635#### Example
1636
1637Example request:
1638
1639~~~json
1640{
1641  "jsonrpc": "2.0",
1642  "method": "env_dpdk_get_mem_stats",
1643  "id": 1
1644}
1645~~~
1646
1647Example response:
1648
1649~~~json
1650{
1651  "jsonrpc": "2.0",
1652  "id": 1,
1653  "result": {
1654    "filename": "/tmp/spdk_mem_dump.txt"
1655  }
1656}
1657~~~
1658
1659## Acceleration Framework Layer {#jsonrpc_components_accel_fw}
1660
1661### accel_get_module_info {#accel_get_module_info}
1662
1663Get a list of valid module names and their supported operations.
1664
1665#### Parameters
1666
1667None
1668
1669#### Example
1670
1671Example request:
1672
1673~~~json
1674{
1675  "jsonrpc": "2.0",
1676  "method": "accel_get_module_info",
1677  "id": 1
1678}
1679~~~
1680
1681Example response:
1682
1683~~~json
1684[
1685  {
1686    "module": "software",
1687    "supported ops": [
1688      "copy",
1689      "fill",
1690      "dualcast",
1691      "compare",
1692      "crc32c",
1693      "copy_crc32c",
1694      "compress",
1695      "decompress"
1696    ]
1697  },
1698  {
1699    "module": "dsa",
1700    "supported ops": [
1701      "copy",
1702      "fill",
1703      "dualcast",
1704      "compare",
1705      "crc32c",
1706      "copy_crc32c"
1707    ]
1708  }
1709]
1710~~~
1711
1712### accel_get_opc_assignments {#rpc_accel_get_opc_assignments}
1713
1714Get a list of opcode names and their assigned accel_fw modules.
1715
1716#### Parameters
1717
1718None
1719
1720#### Example
1721
1722Example request:
1723
1724~~~json
1725{
1726  "jsonrpc": "2.0",
1727  "method": "accel_get_opc_assignments",
1728  "id": 1
1729}
1730~~~
1731
1732Example response:
1733
1734~~~json
1735{
1736  "jsonrpc": "2.0",
1737  "id": 1,
1738  "result": [
1739    {
1740      "copy": "software",
1741      "fill": "software",
1742      "dualcast": "software",
1743      "compare": "software",
1744      "crc32c": "software",
1745      "copy_crc32c": "software",
1746      "compress": "software",
1747      "decompress": "software"
1748    }
1749  ]
1750}
1751~~~
1752
1753### accel_assign_opc {#rpc_accel_assign_opc}
1754
1755Manually assign an operation to a module.
1756
1757#### Parameters
1758
1759Name                    | Optional | Type        | Description
1760----------------------- | -------- | ----------- | -----------------
1761opname                  | Required | string      | name of operation
1762module                  | Required | string      | name of module
1763
1764#### Example
1765
1766Example request:
1767
1768~~~json
1769{
1770  "jsonrpc": "2.0",
1771  "method": "accel_assign_opc",
1772  "id": 1,
1773  "params": {
1774    "opname": "copy",
1775    "module": "software"
1776  }
1777}
1778~~~
1779
1780Example response:
1781
1782~~~json
1783{
1784  "jsonrpc": "2.0",
1785  "id": 1,
1786  "result": true
1787}
1788~~~
1789
1790### accel_crypto_key_create {#rpc_accel_crypto_key_create}
1791
1792Create a crypto key which will be used in accel framework
1793
1794#### Parameters
1795
1796Name       | Optional | Type        | Description
1797-----------|----------| ----------- | -----------------
1798cipher     | Required | string      | crypto cipher to use
1799key        | Required | string      | Key in **hex** form
1800key2       | Optional | string      | Optional 2nd part of the key or a tweak in **hex** form
1801name       | Required | string      | The key name
1802
1803#### Example
1804
1805Example request:
1806
1807~~~json
1808{
1809  "jsonrpc": "2.0",
1810  "method": "accel_crypto_key_create",
1811  "id": 1,
1812  "params": {
1813    "cipher": "AES_XTS",
1814    "key": "00112233445566778899001122334455",
1815    "key2": "00112233445566778899001122334455",
1816    "name": "super_key"
1817  }
1818}
1819~~~
1820
1821Example response:
1822
1823~~~json
1824{
1825  "jsonrpc": "2.0",
1826  "id": 1,
1827  "result": true
1828}
1829~~~
1830
1831### accel_crypto_key_destroy {#rpc_accel_crypto_key_destroy}
1832
1833Destroy a crypto key. The user is responsible for ensuring that the deleted key is not used by acceleration modules.
1834
1835#### Parameters
1836
1837Name       | Optional | Type        | Description
1838-----------|----------| ----------- | -----------------
1839name       | Required | string      | The key name
1840
1841#### Example
1842
1843Example request:
1844
1845~~~json
1846{
1847  "jsonrpc": "2.0",
1848  "method": "accel_crypto_key_destroy",
1849  "id": 1,
1850  "params": {
1851    "name": "super_key"
1852  }
1853}
1854~~~
1855
1856Example response:
1857
1858~~~json
1859{
1860  "jsonrpc": "2.0",
1861  "id": 1,
1862  "result": true
1863}
1864~~~
1865
1866### accel_crypto_keys_get {#rpc_accel_crypto_keys_get}
1867
1868Get information about existing crypto keys
1869
1870#### Parameters
1871
1872Name                    | Optional | Type        | Description
1873----------------------- |----------| ----------- | -----------------
1874key_name                | Optional | string      | If specified, return info about a specific key
1875
1876#### Example
1877
1878Example request:
1879
1880~~~json
1881{
1882  "jsonrpc": "2.0",
1883  "method": "accel_crypto_keys_get",
1884  "id": 1
1885}
1886~~~
1887
1888Example response:
1889
1890~~~json
1891{
1892  "jsonrpc": "2.0",
1893  "id": 1,
1894  "result": [
1895    {
1896      "name": "test_dek",
1897      "cipher": "AES_XTS",
1898      "key": "00112233445566778899001122334455",
1899      "key2": "11223344556677889900112233445500"
1900    },
1901    {
1902      "name": "test_dek2",
1903      "cipher": "AES_XTS",
1904      "key": "11223344556677889900112233445500",
1905      "key2": "22334455667788990011223344550011"
1906    }
1907  ]
1908}
1909~~~
1910
1911### accel_set_driver {#rpc_accel_set_driver}
1912
1913Select platform driver to execute operation chains.  Until a driver is selected, all operations are
1914executed through accel modules.
1915
1916#### Parameters
1917
1918Name                    | Optional | Type        | Description
1919----------------------- |----------| ----------- | -----------------
1920name                    | Required | string      | Name of the platform driver
1921
1922#### Example
1923
1924Example request:
1925
1926~~~json
1927{
1928  "jsonrpc": "2.0",
1929  "method": "accel_set_driver",
1930  "id": 1
1931  "params": {
1932    "name": "xeon"
1933  }
1934}
1935~~~
1936
1937Example response:
1938
1939~~~json
1940{
1941  "jsonrpc": "2.0",
1942  "id": 1,
1943  "result": true
1944}
1945~~~
1946
1947### accel_set_options {#rpc_accel_set_options}
1948
1949Set accel framework's options.
1950
1951#### Parameters
1952
1953Name                    | Optional | Type        | Description
1954----------------------- |----------| ----------- | -----------------
1955small_cache_size        | Optional | number      | Size of the small iobuf cache
1956large_cache_size        | Optional | number      | Size of the large iobuf cache
1957task_count              | Optional | number      | Maximum number of tasks per IO channel
1958sequence_count          | Optional | number      | Maximum number of sequences per IO channel
1959buf_count               | Optional | number      | Maximum number of accel buffers per IO channel
1960
1961#### Example
1962
1963Example request:
1964
1965~~~json
1966{
1967  "jsonrpc": "2.0",
1968  "method": "accel_set_options",
1969  "id": 1,
1970  "params": {
1971    "small_cache_size": 128,
1972    "large_cache_size": 32
1973  }
1974}
1975~~~
1976
1977Example response:
1978
1979~~~json
1980{
1981  "jsonrpc": "2.0",
1982  "id": 1,
1983  "result": true
1984}
1985~~~
1986
1987### accel_get_stats {#rpc_accel_get_stats}
1988
1989Retrieve accel framework's statistics.  Statistics for opcodes that have never been executed (i.e.
1990all their stats are at 0) aren't included in the `operations` array.
1991
1992#### Parameters
1993
1994None.
1995
1996#### Example
1997
1998Example request:
1999
2000~~~json
2001{
2002  "jsonrpc": "2.0",
2003  "method": "accel_get_stats",
2004  "id": 1
2005}
2006~~~
2007
2008Example response:
2009
2010~~~json
2011{
2012  "jsonrpc": "2.0",
2013  "id": 1,
2014  "result": {
2015    "sequence_executed": 256,
2016    "sequence_failed": 0,
2017    "operations": [
2018      {
2019        "opcode": "copy",
2020        "executed": 256,
2021        "failed": 0
2022      },
2023      {
2024        "opcode": "encrypt",
2025        "executed": 128,
2026        "failed": 0
2027      },
2028      {
2029        "opcode": "decrypt",
2030        "executed": 128,
2031        "failed": 0
2032      }
2033    ]
2034  }
2035}
2036~~~
2037
2038### compressdev_scan_accel_module {#rpc_compressdev_scan_accel_module}
2039
2040Set config and enable compressdev accel module offload.
2041Select the DPDK polled mode driver (pmd) for the accel compress module,
20420 = auto-select, 1= QAT only, 2 = mlx5_pci only.
2043
2044#### Parameters
2045
2046Name                    | Optional | Type        | Description
2047----------------------- | -------- | ----------- | -----------
2048pmd                     | Required | int         | pmd selection
2049
2050#### Example
2051
2052Example request:
2053
2054~~~json
2055{
2056  "params": {
2057    "pmd": 1
2058  },
2059  "jsonrpc": "2.0",
2060  "method": "compressdev_scan_accel_module",
2061  "id": 1
2062}
2063~~~
2064
2065Example response:
2066
2067~~~json
2068{
2069  "jsonrpc": "2.0",
2070  "id": 1,
2071  "result": true
2072}
2073~~~
2074
2075### dsa_scan_accel_module {#rpc_dsa_scan_accel_module}
2076
2077Set config and enable dsa accel module offload.
2078This feature is considered as experimental.
2079
2080#### Parameters
2081
2082Name                    | Optional | Type        | Description
2083----------------------- | -------- | ----------- | -----------
2084config_kernel_mode      | Optional | Boolean     | If set, will use kernel idxd driver.
2085
2086#### Example
2087
2088Example request:
2089
2090~~~json
2091{
2092  "params": {
2093    "config_kernel_mode": false
2094  },
2095  "jsonrpc": "2.0",
2096  "method": "dsa_scan_accel_module",
2097  "id": 1
2098}
2099~~~
2100
2101Example response:
2102
2103~~~json
2104{
2105  "jsonrpc": "2.0",
2106  "id": 1,
2107  "result": true
2108}
2109~~~
2110
2111### iaa_scan_accel_module {#rpc_iaa_scan_accel_module}
2112
2113Enable IAA accel module offload.
2114This feature is considered as experimental.
2115
2116#### Parameters
2117
2118None
2119
2120#### Example
2121
2122Example request:
2123
2124~~~json
2125{
2126  "jsonrpc": "2.0",
2127  "method": "iaa_scan_accel_module",
2128  "id": 1
2129}
2130~~~
2131
2132Example response:
2133
2134~~~json
2135{
2136  "jsonrpc": "2.0",
2137  "id": 1,
2138  "result": true
2139}
2140~~~
2141
2142### ioat_scan_accel_module {#rpc_ioat_scan_accel_module}
2143
2144Enable ioat accel module offload.
2145
2146#### Parameters
2147
2148None
2149
2150#### Example
2151
2152Example request:
2153
2154~~~json
2155{
2156  "jsonrpc": "2.0",
2157  "method": "ioat_scan_accel_module",
2158  "id": 1
2159}
2160~~~
2161
2162Example response:
2163
2164~~~json
2165{
2166  "jsonrpc": "2.0",
2167  "id": 1,
2168  "result": true
2169}
2170~~~
2171
2172### dpdk_cryptodev_scan_accel_module {#rpc_dpdk_cryptodev_scan_accel_module}
2173
2174Enable dpdk_cryptodev accel offload
2175
2176#### Parameters
2177
2178None
2179
2180#### Example
2181
2182Example request:
2183
2184~~~json
2185{
2186  "jsonrpc": "2.0",
2187  "method": "dpdk_cryptodev_scan_accel_module",
2188  "id": 1
2189}
2190~~~
2191
2192Example response:
2193
2194~~~json
2195{
2196  "jsonrpc": "2.0",
2197  "id": 1,
2198  "result": true
2199}
2200~~~
2201
2202### dpdk_cryptodev_set_driver {#rpc_dpdk_cryptodev_set_driver}
2203
2204Set the DPDK cryptodev driver
2205
2206#### Parameters
2207
2208Name                    | Optional | Type   | Description
2209----------------------- |----------|--------| -----------
2210crypto_pmd              | Required | string | The driver, can be one of crypto_aesni_mb, crypto_qat or mlx5_pci
2211
2212#### Example
2213
2214Example request:
2215
2216~~~json
2217{
2218  "jsonrpc": "2.0",
2219  "method": "dpdk_cryptodev_set_driver",
2220  "id": 1,
2221  "params": {
2222    "crypto_pmd": "crypto_aesni_mb"
2223  }
2224}
2225~~~
2226
2227Example response:
2228
2229~~~json
2230{
2231  "jsonrpc": "2.0",
2232  "id": 1,
2233  "result": true
2234}
2235~~~
2236
2237### dpdk_cryptodev_get_driver {#rpc_dpdk_cryptodev_get_driver}
2238
2239Get the DPDK cryptodev driver
2240
2241#### Parameters
2242
2243None
2244
2245#### Example
2246
2247Example request:
2248
2249~~~json
2250{
2251  "jsonrpc": "2.0",
2252  "method": "dpdk_cryptodev_get_driver",
2253  "id": 1
2254}
2255~~~
2256
2257Example response:
2258
2259~~~json
2260{
2261  "jsonrpc": "2.0",
2262  "id": 1,
2263  "result": "crypto_aesni_mb"
2264}
2265~~~
2266
2267### mlx5_scan_accel_module {#rpc_mlx5_scan_accel_module}
2268
2269Enable mlx5 accel offload
2270
2271#### Parameters
2272
2273Name                    | Optional | Type   | Description
2274----------------------- | -------- |--------| -----------
2275qp_size                 | Optional | number | qpair size
2276num_requests            | Optional | number | Size of the shared requests pool
2277
2278#### Example
2279
2280Example request:
2281
2282~~~json
2283{
2284  "jsonrpc": "2.0",
2285  "method": "mlx5_scan_accel_module",
2286  "id": 1,
2287  "params": {
2288    "qp_size": 256,
2289    "num_requests": 2047
2290  }
2291}
2292~~~
2293
2294Example response:
2295
2296~~~json
2297{
2298  "jsonrpc": "2.0",
2299  "id": 1,
2300  "result": true
2301}
2302~~~
2303
2304## Block Device Abstraction Layer {#jsonrpc_components_bdev}
2305
2306### bdev_set_options {#rpc_bdev_set_options}
2307
2308Set global parameters for the block device (bdev) subsystem.  This RPC may only be called
2309before SPDK subsystems have been initialized.
2310
2311#### Parameters
2312
2313Name                    | Optional | Type        | Description
2314----------------------- | -------- | ----------- | -----------
2315bdev_io_pool_size       | Optional | number      | Number of spdk_bdev_io structures in shared buffer pool
2316bdev_io_cache_size      | Optional | number      | Maximum number of spdk_bdev_io structures cached per thread
2317bdev_auto_examine       | Optional | boolean     | If set to false, the bdev layer will not examine every disks automatically
2318
2319#### Example
2320
2321Example request:
2322
2323~~~json
2324{
2325  "jsonrpc": "2.0",
2326  "id": 1,
2327  "method": "bdev_set_options",
2328  "params": {
2329    "bdev_io_pool_size": 65536,
2330    "bdev_io_cache_size": 256
2331  }
2332}
2333~~~
2334
2335Example response:
2336
2337~~~json
2338{
2339  "jsonrpc": "2.0",
2340  "id": 1,
2341  "result": true
2342}
2343~~~
2344
2345### bdev_get_bdevs {#rpc_bdev_get_bdevs}
2346
2347Get information about block devices (bdevs).
2348
2349#### Parameters
2350
2351The user may specify no parameters in order to list all block devices, or a block device may be
2352specified by name.  If a timeout is specified, the method will block until a bdev with a specified
2353name appears or the timeout expires.  By default, the timeout is zero, meaning the method returns
2354immediately whether the bdev exists or not.
2355
2356Name                    | Optional | Type        | Description
2357----------------------- | -------- | ----------- | -----------
2358name                    | Optional | string      | Block device name
2359timeout                 | Optional | number      | Time (ms) to wait for a bdev with specified name to appear
2360
2361#### Response
2362
2363The response is an array of objects containing information about the requested block devices.
2364
2365#### Example
2366
2367Example request:
2368
2369~~~json
2370{
2371  "jsonrpc": "2.0",
2372  "id": 1,
2373  "method": "bdev_get_bdevs",
2374  "params": {
2375    "name": "Malloc0"
2376  }
2377}
2378~~~
2379
2380Example response:
2381
2382~~~json
2383{
2384  "jsonrpc": "2.0",
2385  "id": 1,
2386  "result": [
2387    {
2388      "name": "Malloc0",
2389      "product_name": "Malloc disk",
2390      "block_size": 512,
2391      "num_blocks": 20480,
2392      "claimed": false,
2393      "zoned": false,
2394      "supported_io_types": {
2395        "read": true,
2396        "write": true,
2397        "unmap": true,
2398        "write_zeroes": true,
2399        "flush": true,
2400        "reset": true,
2401        "nvme_admin": false,
2402        "nvme_io": false
2403      },
2404      "driver_specific": {}
2405    }
2406  ]
2407}
2408~~~
2409
2410### bdev_examine {#rpc_bdev_examine}
2411
2412Request that the bdev layer examines the given bdev for metadata and creates
2413new bdevs if metadata is found. This is only necessary if `auto_examine` has
2414been set to false using `bdev_set_options`. By default, `auto_examine` is true
2415and bdev examination is automatic.
2416
2417#### Parameters
2418
2419Name                    | Optional | Type        | Description
2420----------------------- | -------- | ----------- | -----------
2421name                    | Required | string      | Block device name
2422
2423#### Response
2424
2425The response is an array of objects containing I/O statistics of the requested block devices.
2426
2427#### Example
2428
2429Example request:
2430
2431~~~json
2432{
2433  "jsonrpc": "2.0",
2434  "id": 1,
2435  "method": "bdev_examine",
2436  "params": {
2437    "name": "Nvme0n1"
2438  }
2439}
2440~~~
2441
2442Example response:
2443
2444~~~json
2445{
2446  "jsonrpc": "2.0",
2447  "id": 1,
2448  "result": true
2449}
2450~~~
2451
2452### bdev_wait_for_examine {#rpc_bdev_wait_for_examine}
2453
2454Report when all bdevs have been examined by every bdev module.
2455
2456#### Parameters
2457
2458None
2459
2460#### Response
2461
2462The response is sent when all bdev modules had a chance to examine every bdev.
2463
2464#### Example
2465
2466Example request:
2467
2468~~~json
2469{
2470  "jsonrpc": "2.0",
2471  "method": "bdev_wait_for_examine",
2472  "id": 1
2473}
2474~~~
2475
2476Example response:
2477
2478~~~json
2479{
2480  "jsonrpc": "2.0",
2481  "id": 1,
2482  "result": true
2483}
2484~~~
2485
2486### bdev_get_iostat {#rpc_bdev_get_iostat}
2487
2488Get I/O statistics of block devices (bdevs).
2489
2490#### Parameters
2491
2492The user may specify no parameters in order to list all block devices, or a block device may be
2493specified by name.
2494
2495Name                    | Optional | Type        | Description
2496----------------------- | -------- | ----------- | -----------
2497name                    | Optional | string      | Block device name
2498per_channel             | Optional | bool        | Display per channel data for specified block device.
2499
2500#### Response
2501
2502The response is an array of objects containing I/O statistics of the requested block devices.
2503
2504#### Example
2505
2506Example request:
2507
2508~~~json
2509{
2510  "jsonrpc": "2.0",
2511  "id": 1,
2512  "method": "bdev_get_iostat",
2513  "params": {
2514    "name": "Nvme0n1",
2515    "per_channel": false
2516  }
2517}
2518~~~
2519
2520Example response:
2521
2522~~~json
2523{
2524  "jsonrpc": "2.0",
2525  "id": 1,
2526  "result": {
2527    "tick_rate": 2200000000,
2528    "bdevs" : [
2529      {
2530        "name": "Nvme0n1",
2531        "bytes_read": 36864,
2532        "num_read_ops": 2,
2533        "bytes_written": 0,
2534        "num_write_ops": 0,
2535        "bytes_unmapped": 0,
2536        "num_unmap_ops": 0,
2537        "read_latency_ticks": 178904,
2538        "write_latency_ticks": 0,
2539        "unmap_latency_ticks": 0,
2540        "queue_depth_polling_period": 2,
2541        "queue_depth": 0,
2542        "io_time": 0,
2543        "weighted_io_time": 0
2544      }
2545    ]
2546  }
2547}
2548~~~
2549
2550### bdev_reset_iostat {#rpc_bdev_reset_iostat}
2551
2552Reset I/O statistics of block devices (bdevs). Note that if one consumer resets I/O statistics,
2553it affects all other consumers.
2554
2555#### Parameters
2556
2557The user may specify no parameters in order to reset I/O statistics for all block devices, or
2558a block device may be specified by name.
2559
2560Name                    | Optional | Type        | Description
2561----------------------- | -------- | ----------- | -----------
2562name                    | Optional | string      | Block device name
2563mode                    | Optional | string      | Mode to reset I/O statistics: all, maxmin (default: all)
2564
2565#### Example
2566
2567Example request:
2568
2569~~~json
2570{
2571  "jsonrpc": "2.0",
2572  "id": 1,
2573  "method": "bdev_reset_iostat",
2574  "params": {
2575    "name": "Nvme0n1"
2576  }
2577}
2578~~~
2579
2580Example response:
2581
2582~~~json
2583{
2584  "jsonrpc": "2.0",
2585  "id": 1,
2586  "result": true
2587}
2588~~~
2589
2590### bdev_enable_histogram {#rpc_bdev_enable_histogram}
2591
2592Control whether collecting data for histogram is enabled for specified bdev.
2593
2594#### Parameters
2595
2596Name                    | Optional | Type        | Description
2597----------------------- | -------- | ----------- | -----------
2598name                    | Required | string      | Block device name
2599enable                  | Required | boolean     | Enable or disable histogram on specified device
2600
2601#### Example
2602
2603Example request:
2604
2605~~~json
2606{
2607  "jsonrpc": "2.0",
2608  "id": 1,
2609  "method": "bdev_enable_histogram",
2610  "params": {
2611    "name": "Nvme0n1"
2612    "enable": true
2613  }
2614}
2615~~~
2616
2617Example response:
2618
2619~~~json
2620{
2621  "jsonrpc": "2.0",
2622  "id": 1,
2623  "result": true
2624}
2625~~~
2626
2627### bdev_get_histogram {#rpc_bdev_get_histogram}
2628
2629Get latency histogram for specified bdev.
2630
2631#### Parameters
2632
2633Name                    | Optional | Type        | Description
2634----------------------- | -------- | ----------- | -----------
2635name                    | Required | string      | Block device name
2636
2637#### Result
2638
2639Name                    | Description
2640------------------------| -----------
2641histogram               | Base64 encoded histogram
2642bucket_shift            | Granularity of the histogram buckets
2643tsc_rate                | Ticks per second
2644
2645#### Example
2646
2647Example request:
2648
2649~~~json
2650{
2651  "jsonrpc": "2.0",
2652  "id": 1,
2653  "method": "bdev_get_histogram",
2654  "params": {
2655    "name": "Nvme0n1"
2656  }
2657}
2658~~~
2659
2660Example response:
2661Note that histogram field is trimmed, actual encoded histogram length is ~80kb.
2662
2663~~~json
2664{
2665  "jsonrpc": "2.0",
2666  "id": 1,
2667  "result": {
2668    "histogram": "AAAAAAAAAAAAAA...AAAAAAAAA==",
2669    "tsc_rate": 2300000000,
2670    "bucket_shift": 7
2671  }
2672}
2673~~~
2674
2675### bdev_set_qos_limit {#rpc_bdev_set_qos_limit}
2676
2677Set the quality of service rate limit on a bdev.
2678
2679#### Parameters
2680
2681Name                    | Optional | Type        | Description
2682----------------------- | -------- | ----------- | -----------
2683name                    | Required | string      | Block device name
2684rw_ios_per_sec          | Optional | number      | Number of R/W I/Os per second to allow. 0 means unlimited.
2685rw_mbytes_per_sec       | Optional | number      | Number of R/W megabytes per second to allow. 0 means unlimited.
2686r_mbytes_per_sec        | Optional | number      | Number of Read megabytes per second to allow. 0 means unlimited.
2687w_mbytes_per_sec        | Optional | number      | Number of Write megabytes per second to allow. 0 means unlimited.
2688
2689#### Example
2690
2691Example request:
2692
2693~~~json
2694{
2695  "jsonrpc": "2.0",
2696  "id": 1,
2697  "method": "bdev_set_qos_limit",
2698  "params": {
2699    "name": "Malloc0"
2700    "rw_ios_per_sec": 20000
2701    "rw_mbytes_per_sec": 100
2702    "r_mbytes_per_sec": 50
2703    "w_mbytes_per_sec": 50
2704  }
2705}
2706~~~
2707
2708Example response:
2709
2710~~~json
2711{
2712  "jsonrpc": "2.0",
2713  "id": 1,
2714  "result": true
2715}
2716~~~
2717
2718### bdev_set_qd_sampling_period {#rpc_bdev_set_qd_sampling_period}
2719
2720Enable queue depth tracking on a specified bdev.
2721
2722#### Parameters
2723
2724Name                    | Optional | Type        | Description
2725----------------------- | -------- | ----------- | -----------
2726name                    | Required | string      | Block device name
2727period                  | Required | int         | period (in microseconds).If set to 0, polling will be disabled.
2728
2729#### Example
2730
2731Example request:
2732
2733~~~json
2734{
2735  "jsonrpc": "2.0",
2736  "method": "bdev_set_qd_sampling_period",
2737  "id": 1,
2738  "params": {
2739    "name": "Malloc0",
2740    "period": 20
2741  }
2742}
2743~~~
2744
2745Example response:
2746
2747~~~json
2748{
2749  "jsonrpc": "2.0",
2750  "id": 1,
2751  "result": true
2752}
2753~~~
2754
2755### bdev_compress_create {#rpc_bdev_compress_create}
2756
2757Create a new compress bdev on a given base bdev.
2758
2759#### Parameters
2760
2761Name                    | Optional | Type        | Description
2762----------------------- | -------- | ----------- | -----------
2763base_bdev_name          | Required | string      | Name of the base bdev
2764pm_path                 | Required | string      | Path to persistent memory
2765lb_size                 | Optional | int         | Compressed vol logical block size (512 or 4096)
2766
2767#### Result
2768
2769Name of newly created bdev.
2770
2771#### Example
2772
2773Example request:
2774
2775~~~json
2776{
2777  "params": {
2778    "base_bdev_name": "Nvme0n1",
2779    "pm_path": "/pm_files",
2780    "lb_size": 4096
2781  },
2782  "jsonrpc": "2.0",
2783  "method": "bdev_compress_create",
2784  "id": 1
2785}
2786~~~
2787
2788### bdev_compress_delete {#rpc_bdev_compress_delete}
2789
2790Delete a compressed bdev.
2791
2792#### Parameters
2793
2794Name                    | Optional | Type        | Description
2795----------------------- | -------- | ----------- | -----------
2796name                    | Required | string      | Name of the compress bdev
2797
2798#### Example
2799
2800Example request:
2801
2802~~~json
2803{
2804  "params": {
2805    "name": "COMP_Nvme0n1"
2806  },
2807  "jsonrpc": "2.0",
2808  "method": "bdev_compress_delete",
2809  "id": 1
2810}
2811~~~
2812
2813Example response:
2814
2815~~~json
2816{
2817  "jsonrpc": "2.0",
2818  "id": 1,
2819  "result": true
2820}
2821~~~
2822
2823### bdev_compress_get_orphans {#rpc_bdev_compress_get_orphans}
2824
2825Get a list of compressed volumes that are missing their pmem metadata.
2826
2827#### Parameters
2828
2829Name                    | Optional | Type        | Description
2830----------------------- | -------- | ----------- | -----------
2831name                    | Required | string      | Name of the compress bdev
2832
2833#### Example
2834
2835Example request:
2836
2837~~~json
2838{
2839  "params": {
2840    "name": "COMP_Nvme0n1"
2841  },
2842  "jsonrpc": "2.0",
2843  "method": "bdev_compress_get_orphans",
2844  "id": 1
2845}
2846~~~
2847
2848Example response:
2849
2850~~~json
2851{
2852  "jsonrpc": "2.0",
2853  "id": 1,
2854  "name": "COMP_Nvme0n1"
2855}
2856~~~
2857
2858### bdev_crypto_create {#rpc_bdev_crypto_create}
2859
2860Create a new crypto bdev on a given base bdev.
2861
2862#### Parameters
2863
2864Name                    | Optional | Type        | Description
2865----------------------- |----------| ----------- | -----------
2866base_bdev_name          | Required | string      | Name of the base bdev
2867name                    | Required | string      | Name of the crypto vbdev to create
2868crypto_pmd              | Optional | string      | Name of the crypto device driver. Obsolete, see accel_crypto_key_create
2869key                     | Optional | string      | Key in hex form. Obsolete, see accel_crypto_key_create
2870cipher                  | Optional | string      | Cipher to use, AES_CBC or AES_XTS (QAT and MLX5). Obsolete, see accel_crypto_key_create
2871key2                    | Optional | string      | 2nd key in hex form only required for cipher AET_XTS. Obsolete, see accel_crypto_key_create
2872key_name                | Optional | string      | Name of the key created with accel_crypto_key_create
2873module                  | Optional | string      | Name of the accel module which is used to create a key (if no key_name specified)
2874
2875Both key and key2 must be passed in the hexlified form. For example, 256bit AES key may look like this:
2876afd9477abf50254219ccb75965fbe39f23ebead5676e292582a0a67f66b88215
2877
2878#### Result
2879
2880Name of newly created bdev.
2881
2882#### Example
2883
2884Example request:
2885
2886~~~json
2887{
2888  "params": {
2889    "base_bdev_name": "Nvme0n1",
2890    "name": "my_crypto_bdev",
2891    "crypto_pmd": "crypto_aesni_mb",
2892    "key": "12345678901234561234567890123456",
2893    "cipher": "AES_CBC"
2894  },
2895  "jsonrpc": "2.0",
2896  "method": "bdev_crypto_create",
2897  "id": 1
2898}
2899~~~
2900
2901Example response:
2902
2903~~~json
2904{
2905
2906  "jsonrpc": "2.0",
2907  "id": 1,
2908  "result": "my_crypto_bdev"
2909}
2910~~~
2911
2912### bdev_crypto_delete {#rpc_bdev_crypto_delete}
2913
2914Delete a crypto bdev.
2915
2916#### Parameters
2917
2918Name                    | Optional | Type        | Description
2919----------------------- | -------- | ----------- | -----------
2920name                    | Required | string      | Name of the crypto bdev
2921
2922#### Example
2923
2924Example request:
2925
2926~~~json
2927{
2928  "params": {
2929    "name": "my_crypto_bdev"
2930  },
2931  "jsonrpc": "2.0",
2932  "method": "bdev_crypto_delete",
2933  "id": 1
2934}
2935~~~
2936
2937Example response:
2938
2939~~~json
2940{
2941  "jsonrpc": "2.0",
2942  "id": 1,
2943  "result": true
2944}
2945~~~
2946
2947### bdev_ocf_create {#rpc_bdev_ocf_create}
2948
2949Construct new OCF bdev.
2950Command accepts cache mode that is going to be used.
2951You can find more details about supported cache modes in the [OCF documentation](https://open-cas.github.io/cache_configuration.html#cache-mode)
2952
2953#### Parameters
2954
2955Name                    | Optional | Type        | Description
2956----------------------- | -------- | ----------- | -----------
2957name                    | Required | string      | Bdev name to use
2958mode                    | Required | string      | OCF cache mode: wb, wt, pt, wa, wi, wo
2959cache_line_size         | Optional | int         | OCF cache line size in KiB: 4, 8, 16, 32, 64
2960cache_bdev_name         | Required | string      | Name of underlying cache bdev
2961core_bdev_name          | Required | string      | Name of underlying core bdev
2962
2963#### Result
2964
2965Name of newly created bdev.
2966
2967#### Example
2968
2969Example request:
2970
2971~~~json
2972{
2973  "params": {
2974    "name": "ocf0",
2975    "mode": "wt",
2976    "cache_line_size": 64,
2977    "cache_bdev_name": "Nvme0n1",
2978    "core_bdev_name": "aio0"
2979  },
2980  "jsonrpc": "2.0",
2981  "method": "bdev_ocf_create",
2982  "id": 1
2983}
2984~~~
2985
2986Example response:
2987
2988~~~json
2989{
2990  "jsonrpc": "2.0",
2991  "id": 1,
2992  "result": "ocf0"
2993}
2994~~~
2995
2996### bdev_ocf_delete {#rpc_bdev_ocf_delete}
2997
2998Delete the OCF bdev
2999
3000#### Parameters
3001
3002Name                    | Optional | Type        | Description
3003----------------------- | -------- | ----------- | -----------
3004name                    | Required | string      | Bdev name
3005
3006#### Example
3007
3008Example request:
3009
3010~~~json
3011{
3012  "params": {
3013    "name": "ocf0"
3014  },
3015  "jsonrpc": "2.0",
3016  "method": "bdev_ocf_delete",
3017  "id": 1
3018}
3019~~~
3020
3021Example response:
3022
3023~~~json
3024{
3025  "jsonrpc": "2.0",
3026  "id": 1,
3027  "result": true
3028}
3029~~~
3030
3031### bdev_ocf_get_stats {#rpc_bdev_ocf_get_stats}
3032
3033Get statistics of chosen OCF block device.
3034
3035#### Parameters
3036
3037Name                    | Optional | Type        | Description
3038----------------------- | -------- | ----------- | -----------
3039name                    | Required | string      | Block device name
3040
3041#### Response
3042
3043Statistics as json object.
3044
3045#### Example
3046
3047Example request:
3048
3049~~~json
3050{
3051  "params": {
3052    "name": "ocf0"
3053  },
3054  "jsonrpc": "2.0",
3055  "method": "bdev_ocf_get_stats",
3056  "id": 1
3057}
3058~~~
3059
3060Example response:
3061
3062~~~json
3063{
3064  "jsonrpc": "2.0",
3065  "id": 1,
3066  "result": [
3067  "usage": {
3068    "clean": {
3069      "count": 76033,
3070      "units": "4KiB blocks",
3071      "percentage": "100.0"
3072    },
3073    "free": {
3074      "count": 767,
3075      "units": "4KiB blocks",
3076      "percentage": "0.9"
3077    },
3078    "occupancy": {
3079      "count": 76033,
3080      "units": "4KiB blocks",
3081      "percentage": "99.0"
3082    },
3083    "dirty": {
3084      "count": 0,
3085      "units": "4KiB blocks",
3086      "percentage": "0.0"
3087    }
3088  },
3089  "requests": {
3090    "rd_total": {
3091      "count": 2,
3092      "units": "Requests",
3093      "percentage": "0.0"
3094    },
3095    "wr_full_misses": {
3096      "count": 76280,
3097      "units": "Requests",
3098      "percentage": "35.6"
3099    },
3100    "rd_full_misses": {
3101      "count": 1,
3102      "units": "Requests",
3103      "percentage": "0.0"
3104    },
3105    "rd_partial_misses": {
3106      "count": 0,
3107      "units": "Requests",
3108      "percentage": "0.0"
3109    },
3110    "wr_total": {
3111      "count": 212416,
3112      "units": "Requests",
3113      "percentage": "99.2"
3114    },
3115    "wr_pt": {
3116      "count": 1535,
3117      "units": "Requests",
3118      "percentage": "0.7"
3119    },
3120    "wr_partial_misses": {
3121      "count": 0,
3122      "units": "Requests",
3123      "percentage": "0.0"
3124    },
3125    "serviced": {
3126      "count": 212418,
3127      "units": "Requests",
3128      "percentage": "99.2"
3129    },
3130    "rd_pt": {
3131      "count": 0,
3132      "units": "Requests",
3133      "percentage": "0.0"
3134    },
3135    "total": {
3136      "count": 213953,
3137      "units": "Requests",
3138      "percentage": "100.0"
3139    },
3140    "rd_hits": {
3141      "count": 1,
3142      "units": "Requests",
3143      "percentage": "0.0"
3144    },
3145    "wr_hits": {
3146      "count": 136136,
3147      "units": "Requests",
3148      "percentage": "63.6"
3149    }
3150  },
3151  "errors": {
3152    "total": {
3153      "count": 0,
3154      "units": "Requests",
3155      "percentage": "0.0"
3156    },
3157    "cache_obj_total": {
3158      "count": 0,
3159      "units": "Requests",
3160      "percentage": "0.0"
3161    },
3162    "core_obj_total": {
3163      "count": 0,
3164      "units": "Requests",
3165      "percentage": "0.0"
3166    },
3167    "cache_obj_rd": {
3168      "count": 0,
3169      "units": "Requests",
3170      "percentage": "0.0"
3171    },
3172    "core_obj_wr": {
3173      "count": 0,
3174      "units": "Requests",
3175      "percentage": "0.0"
3176    },
3177    "core_obj_rd": {
3178      "count": 0,
3179      "units": "Requests",
3180      "percentage": "0.0"
3181    },
3182    "cache_obj_wr": {
3183      "count": 0,
3184      "units": "Requests",
3185      "percentage": "0.0"
3186    }
3187  },
3188  "blocks": {
3189    "volume_rd": {
3190      "count": 9,
3191      "units": "4KiB blocks",
3192      "percentage": "0.0"
3193    },
3194    "volume_wr": {
3195      "count": 213951,
3196      "units": "4KiB blocks",
3197      "percentage": "99.9"
3198    },
3199    "cache_obj_total": {
3200      "count": 212425,
3201      "units": "4KiB blocks",
3202      "percentage": "100.0"
3203    },
3204    "core_obj_total": {
3205      "count": 213959,
3206      "units": "4KiB blocks",
3207      "percentage": "100.0"
3208    },
3209    "cache_obj_rd": {
3210      "count": 1,
3211      "units": "4KiB blocks",
3212      "percentage": "0.0"
3213    },
3214    "core_obj_wr": {
3215      "count": 213951,
3216      "units": "4KiB blocks",
3217      "percentage": "99.9"
3218    },
3219    "volume_total": {
3220      "count": 213960,
3221      "units": "4KiB blocks",
3222      "percentage": "100.0"
3223    },
3224    "core_obj_rd": {
3225      "count": 8,
3226      "units": "4KiB blocks",
3227      "percentage": "0.0"
3228    },
3229    "cache_obj_wr": {
3230      "count": 212424,
3231      "units": "4KiB blocks",
3232      "percentage": "99.9"
3233    }
3234  ]
3235}
3236~~~
3237
3238### bdev_ocf_reset_stats {#rpc_bdev_ocf_reset_stats}
3239
3240Reset statistics of chosen OCF block device.
3241
3242#### Parameters
3243
3244Name                    | Optional | Type        | Description
3245----------------------- | -------- | ----------- | -----------
3246name                    | Required | string      | Block device name
3247
3248#### Response
3249
3250Completion status of reset statistics operation returned as a boolean.
3251
3252#### Example
3253
3254Example request:
3255
3256~~~json
3257{
3258  "params": {
3259    "name": "ocf0"
3260  },
3261  "jsonrpc": "2.0",
3262  "method": "bdev_ocf_reset_stats",
3263  "id": 1
3264}
3265~~~
3266
3267Example response:
3268
3269~~~json
3270{
3271  "jsonrpc": "2.0",
3272  "id": 1,
3273  "result": true
3274}
3275~~~
3276
3277### bdev_ocf_get_bdevs {#rpc_bdev_ocf_get_bdevs}
3278
3279Get list of OCF devices including unregistered ones.
3280
3281#### Parameters
3282
3283Name                    | Optional | Type        | Description
3284----------------------- | -------- | ----------- | -----------
3285name                    | Optional | string      | Name of OCF vbdev or name of cache device or name of core device
3286
3287#### Response
3288
3289Array of OCF devices with their current status, along with core and cache bdevs.
3290
3291#### Example
3292
3293Example request:
3294
3295~~~json
3296{
3297  "jsonrpc": "2.0",
3298  "method": "bdev_ocf_get_bdevs",
3299  "id": 1
3300}
3301~~~
3302
3303Example response:
3304
3305~~~json
3306{
3307  "jsonrpc": "2.0",
3308  "id": 1,
3309  "result": [
3310    {
3311      "name": "PartCache",
3312      "started": false,
3313      "cache": {
3314        "name": "Malloc0",
3315        "attached": true
3316      },
3317      "core": {
3318        "name": "Malloc1",
3319        "attached": false
3320      }
3321    }
3322  ]
3323}
3324~~~
3325
3326### bdev_ocf_set_cache_mode {#rpc_bdev_ocf_set_cache_mode}
3327
3328Set new cache mode on OCF bdev.
3329
3330#### Parameters
3331
3332Name                    | Optional | Type        | Description
3333----------------------- | -------- | ----------- | -----------
3334name                    | Required | string      | Bdev name
3335mode                    | Required | string      | OCF cache mode: wb, wt, pt, wa, wi, wo
3336
3337#### Response
3338
3339New cache mode name.
3340
3341#### Example
3342
3343Example request:
3344
3345~~~json
3346{
3347  "params": {
3348    "name": "ocf0",
3349    "mode": "pt",
3350  },
3351  "jsonrpc": "2.0",
3352  "method": "bdev_ocf_set_cache_mode",
3353  "id": 1
3354}
3355~~~
3356
3357Example response:
3358
3359~~~json
3360{
3361  "jsonrpc": "2.0",
3362  "id": 1,
3363  "result": "pt"
3364}
3365~~~
3366
3367### bdev_ocf_set_seqcutoff {#rpc_bdev_ocf_set_seqcutoff}
3368
3369Set sequential cutoff parameters on all cores for the given OCF cache device.
3370A brief description of this functionality can be found in [OpenCAS documentation](https://open-cas.github.io/guide_tool_details.html#seq-cutoff).
3371
3372#### Parameters
3373
3374Name                    | Optional | Type        | Description
3375----------------------- | -------- | ----------- | -----------
3376name                    | Required | string      | Bdev name
3377policy                  | Required | string      | Sequential cutoff policy: always, full, never
3378threshold               | Optional | int         | Activation threshold in KiB
3379promotion_count         | Optional | int         | Promotion request count
3380
3381#### Example
3382
3383Example request:
3384
3385~~~json
3386{
3387  "params": {
3388    "name": "ocf0",
3389    "policy": "full",
3390    "threshold": 4,
3391    "promotion_count": 2
3392  },
3393  "jsonrpc": "2.0",
3394  "method": "bdev_ocf_set_seqcutoff",
3395  "id": 1
3396}
3397~~~
3398
3399Example response:
3400
3401~~~json
3402{
3403  "jsonrpc": "2.0",
3404  "id": 1,
3405  "result": true
3406}
3407~~~
3408
3409### bdev_ocf_flush_start {#rpc_bdev_ocf_flush_start}
3410
3411Start flushing OCF cache device.
3412
3413Automatic flushes of dirty data are managed by OCF cleaning policy settings.
3414In addition to that, all dirty data is flushed to core device when there is
3415an attempt to stop caching.
3416On the other hand, this RPC call gives a possibility to flush dirty data manually
3417when there is a need for it, e.g. to speed up the shutdown process when data
3418hasn't been flushed for a long time.
3419This RPC returns immediately, and flush is then being performed in the
3420background. To see the status of flushing operation use bdev_ocf_flush_status.
3421
3422#### Parameters
3423
3424Name                    | Optional | Type        | Description
3425----------------------- | -------- | ----------- | -----------
3426name                    | Required | string      | Bdev name
3427
3428#### Example
3429
3430Example request:
3431
3432~~~json
3433{
3434  "params": {
3435    "name": "ocf0"
3436  },
3437  "jsonrpc": "2.0",
3438  "method": "bdev_ocf_flush_start",
3439  "id": 1
3440}
3441~~~
3442
3443Example response:
3444
3445~~~json
3446{
3447  "jsonrpc": "2.0",
3448  "id": 1,
3449  "result": true
3450}
3451~~~
3452
3453### bdev_ocf_flush_status {#rpc_bdev_ocf_flush_status}
3454
3455Get flush status of OCF cache device.
3456
3457Automatic flushes of dirty data are managed by OCF cleaning policy settings.
3458In addition to that, all dirty data is flushed to core device when there is
3459an attempt to stop caching.
3460On the other hand, there is a possibility to flush dirty data manually
3461when there is a need for it, e.g. to speed up the shutdown process when data
3462hasn't been flushed for a long time.
3463This RPC reports if such manual flush is still in progress and if the operation
3464was successful. To start manual flush use bdev_ocf_flush_start.
3465
3466#### Parameters
3467
3468Name                    | Optional | Type        | Description
3469----------------------- | -------- | ----------- | -----------
3470name                    | Required | string      | Bdev name
3471
3472#### Response
3473
3474Status of OCF cache device flush.
3475
3476#### Example
3477
3478Example request:
3479
3480~~~json
3481{
3482  "params": {
3483    "name": "ocf0"
3484  },
3485  "jsonrpc": "2.0",
3486  "method": "bdev_ocf_flush_status",
3487  "id": 1
3488}
3489~~~
3490
3491Example response:
3492
3493~~~json
3494{
3495  "jsonrpc": "2.0",
3496  "id": 1,
3497  "result": {
3498    "in_progress": false,
3499    "status": 0
3500  }
3501}
3502~~~
3503
3504### bdev_malloc_create {#rpc_bdev_malloc_create}
3505
3506Construct @ref bdev_config_malloc
3507
3508The `dif_type` parameter can have 0, 1, 2, or 3, and controls the check of the guard tag and the reference tag.
3509If the `dif_type` is 1, 2, or 3, the malloc bdev compares the guard tag to the CRC-16 computed over the block data.
3510If the `dif_type` is 1 or 2, the malloc bdev compares the reference tag to the computed reference tag.
3511The computed reference tag for the first block of the I/O is the `init_ref_tag` of the DIF context, and
3512the computed reference tag is incremented for each subsequent block.
3513If the `dif_type` is 3, the malloc bdev does not check the reference tag.
3514The application tag is not checked by the malloc bdev because the current block device API does not expose
3515it to the upper layer yet.
3516
3517#### Parameters
3518
3519Name                    | Optional | Type        | Description
3520----------------------- | -------- | ----------- | -----------
3521name                    | Optional | string      | Bdev name to use
3522block_size              | Required | number      | Data block size in bytes -must be multiple of 512
3523num_blocks              | Required | number      | Number of blocks
3524uuid                    | Optional | string      | UUID of new bdev
3525optimal_io_boundary     | Optional | number      | Split on optimal IO boundary, in number of blocks, default 0
3526md_size                 | Optional | number      | Metadata size for this bdev (0, 8, 16, 32, 64, or 128). Default is 0.
3527md_interleave           | Optional | boolean     | Metadata location, interleaved if true, and separated if false. Default is false.
3528dif_type                | Optional | number      | Protection information type. Parameter --md-size needs to be set along --dif-type. Default=0 - no protection.
3529dif_is_head_of_md       | Optional | boolean     | Protection information is in the first 8 bytes of metadata. Default=false.
3530
3531#### Result
3532
3533Name of newly created bdev.
3534
3535#### Example
3536
3537Example request:
3538
3539~~~json
3540{
3541  "params": {
3542    "block_size": 4096,
3543    "num_blocks": 16384,
3544    "name": "Malloc0",
3545    "uuid": "2b6601ba-eada-44fb-9a83-a20eb9eb9e90",
3546    "optimal_io_boundary": 16
3547  },
3548  "jsonrpc": "2.0",
3549  "method": "bdev_malloc_create",
3550  "id": 1
3551}
3552~~~
3553
3554Example response:
3555
3556~~~json
3557{
3558  "jsonrpc": "2.0",
3559  "id": 1,
3560  "result": "Malloc0"
3561}
3562~~~
3563
3564### bdev_malloc_delete {#rpc_bdev_malloc_delete}
3565
3566Delete @ref bdev_config_malloc
3567
3568#### Parameters
3569
3570Name                    | Optional | Type        | Description
3571----------------------- | -------- | ----------- | -----------
3572name                    | Required | string      | Bdev name
3573
3574#### Example
3575
3576Example request:
3577
3578~~~json
3579{
3580  "params": {
3581    "name": "Malloc0"
3582  },
3583  "jsonrpc": "2.0",
3584  "method": "bdev_malloc_delete",
3585  "id": 1
3586}
3587~~~
3588
3589Example response:
3590
3591~~~json
3592{
3593  "jsonrpc": "2.0",
3594  "id": 1,
3595  "result": true
3596}
3597~~~
3598
3599### bdev_null_create {#rpc_bdev_null_create}
3600
3601Construct @ref bdev_config_null
3602
3603#### Parameters
3604
3605Name                    | Optional | Type        | Description
3606----------------------- | -------- | ----------- | -----------
3607name                    | Optional | string      | Bdev name to use
3608block_size              | Required | number      | Block size in bytes
3609num_blocks              | Required | number      | Number of blocks
3610uuid                    | Optional | string      | UUID of new bdev
3611md_size                 | Optional | number      | Metadata size for this bdev. Default=0.
3612dif_type                | Optional | number      | Protection information type. Parameter --md-size needs to be set along --dif-type. Default=0 - no protection.
3613dif_is_head_of_md       | Optional | boolean     | Protection information is in the first 8 bytes of metadata. Default=false.
3614
3615#### Result
3616
3617Name of newly created bdev.
3618
3619#### Example
3620
3621Example request:
3622
3623~~~json
3624{
3625  "params": {
3626    "block_size": 4104,
3627    "num_blocks": 16384,
3628    "name": "Null0",
3629    "uuid": "2b6601ba-eada-44fb-9a83-a20eb9eb9e90",
3630    "md_size": 8,
3631    "dif_type": 1,
3632    "dif_is_head_of_md": true
3633  },
3634  "jsonrpc": "2.0",
3635  "method": "bdev_null_create",
3636  "id": 1
3637}
3638~~~
3639
3640Example response:
3641
3642~~~json
3643{
3644  "jsonrpc": "2.0",
3645  "id": 1,
3646  "result": "Null0"
3647}
3648~~~
3649
3650### bdev_null_delete {#rpc_bdev_null_delete}
3651
3652Delete @ref bdev_config_null.
3653
3654#### Parameters
3655
3656Name                    | Optional | Type        | Description
3657----------------------- | -------- | ----------- | -----------
3658name                    | Required | string      | Bdev name
3659
3660#### Example
3661
3662Example request:
3663
3664~~~json
3665{
3666  "params": {
3667    "name": "Null0"
3668  },
3669  "jsonrpc": "2.0",
3670  "method": "bdev_null_delete",
3671  "id": 1
3672}
3673~~~
3674
3675Example response:
3676
3677~~~json
3678{
3679  "jsonrpc": "2.0",
3680  "id": 1,
3681  "result": true
3682}
3683~~~
3684
3685### bdev_null_resize {#rpc_bdev_null_resize}
3686
3687Resize @ref bdev_config_null.
3688
3689#### Parameters
3690
3691Name                    | Optional | Type        | Description
3692----------------------- | -------- | ----------- | -----------
3693name                    | Required | string      | Bdev name
3694new_size                | Required | number      | Bdev new capacity in MiB
3695
3696#### Example
3697
3698Example request:
3699
3700~~~json
3701{
3702  "params": {
3703    "name": "Null0",
3704    "new_size": 4096
3705  },
3706  "jsonrpc": "2.0",
3707  "method": "bdev_null_resize",
3708  "id": 1
3709}
3710~~~
3711
3712Example response:
3713
3714~~~json
3715{
3716  "jsonrpc": "2.0",
3717  "id": 1,
3718  "result": true
3719}
3720~~~
3721
3722### bdev_aio_create {#rpc_bdev_aio_create}
3723
3724Construct @ref bdev_config_aio.
3725
3726#### Parameters
3727
3728Name                    | Optional | Type        | Description
3729----------------------- | -------- | ----------- | -----------
3730name                    | Required | string      | Bdev name to use
3731filename                | Required | number      | Path to device or file
3732block_size              | Optional | number      | Block size in bytes
3733
3734#### Result
3735
3736Name of newly created bdev.
3737
3738#### Example
3739
3740Example request:
3741
3742~~~json
3743{
3744  "params": {
3745    "block_size": 4096,
3746    "name": "Aio0",
3747    "filename": "/tmp/aio_bdev_file"
3748  },
3749  "jsonrpc": "2.0",
3750  "method": "bdev_aio_create",
3751  "id": 1
3752}
3753~~~
3754
3755Example response:
3756
3757~~~json
3758{
3759  "jsonrpc": "2.0",
3760  "id": 1,
3761  "result": "Aio0"
3762}
3763~~~
3764
3765### bdev_aio_rescan {#rpc_bdev_aio_rescan}
3766
3767Rescan the size of @ref bdev_config_aio.
3768
3769#### Parameters
3770
3771Name                    | Optional | Type        | Description
3772----------------------- | -------- | ----------- | -----------
3773name                    | Required | string      | Bdev name
3774
3775#### Example
3776
3777Example request:
3778
3779~~~json
3780{
3781  "params": {
3782    "name": "Aio0"
3783  },
3784  "jsonrpc": "2.0",
3785  "method": "bdev_aio_rescan",
3786  "id": 1
3787}
3788~~~
3789
3790Example response:
3791
3792~~~json
3793{
3794  "jsonrpc": "2.0",
3795  "id": 1,
3796  "result": true
3797}
3798~~~
3799
3800### bdev_aio_delete {#rpc_bdev_aio_delete}
3801
3802Delete @ref bdev_config_aio.
3803
3804#### Parameters
3805
3806Name                    | Optional | Type        | Description
3807----------------------- | -------- | ----------- | -----------
3808name                    | Required | string      | Bdev name
3809
3810#### Example
3811
3812Example request:
3813
3814~~~json
3815{
3816  "params": {
3817    "name": "Aio0"
3818  },
3819  "jsonrpc": "2.0",
3820  "method": "bdev_aio_delete",
3821  "id": 1
3822}
3823~~~
3824
3825Example response:
3826
3827~~~json
3828{
3829  "jsonrpc": "2.0",
3830  "id": 1,
3831  "result": true
3832}
3833~~~
3834
3835### bdev_nvme_set_options {#rpc_bdev_nvme_set_options}
3836
3837Set global parameters for all bdev NVMe. This RPC may only be called before SPDK subsystems have been initialized
3838or any bdev NVMe has been created.
3839
3840Parameters, ctrlr_loss_timeout_sec, reconnect_delay_sec, and fast_io_fail_timeout_sec, are for I/O error resiliency.
3841They can be overridden if they are given by the RPC bdev_nvme_attach_controller.
3842
3843#### Parameters
3844
3845Name                       | Optional | Type        | Description
3846-------------------------- | -------- | ----------- | -----------
3847action_on_timeout          | Optional | string      | Action to take on command time out: none, reset or abort
3848timeout_us                 | Optional | number      | Timeout for each command, in microseconds. If 0, don't track timeouts
3849timeout_admin_us           | Optional | number      | Timeout for each admin command, in microseconds. If 0, treat same as io timeouts ('timeout_us')
3850keep_alive_timeout_ms      | Optional | number      | Keep alive timeout period in milliseconds, default is 10s
3851retry_count                | Optional | number      | The number of attempts per I/O before an I/O fails. (Deprecated. Please use transport_retry_count instead.)
3852arbitration_burst          | Optional | number      | The value is expressed as a power of two, a value of 111b indicates no limit
3853low_priority_weight        | Optional | number      | The maximum number of commands that the controller may launch at one time from a low priority queue
3854medium_priority_weight     | Optional | number      | The maximum number of commands that the controller may launch at one time from a medium priority queue
3855high_priority_weight       | Optional | number      | The maximum number of commands that the controller may launch at one time from a high priority queue
3856nvme_adminq_poll_period_us | Optional | number      | How often the admin queue is polled for asynchronous events in microseconds
3857nvme_ioq_poll_period_us    | Optional | number      | How often I/O queues are polled for completions, in microseconds. Default: 0 (as fast as possible).
3858io_queue_requests          | Optional | number      | The number of requests allocated for each NVMe I/O queue. Default: 512.
3859delay_cmd_submit           | Optional | boolean     | Enable delaying NVMe command submission to allow batching of multiple commands. Default: `true`.
3860transport_retry_count      | Optional | number      | The number of attempts per I/O in the transport layer before an I/O fails.
3861bdev_retry_count           | Optional | number      | The number of attempts per I/O in the bdev layer before an I/O fails. -1 means infinite retries.
3862transport_ack_timeout      | Optional | number      | Time to wait ack until retransmission for RDMA or connection close for TCP. Range 0-31 where 0 means use default.
3863ctrlr_loss_timeout_sec     | Optional | number      | Time to wait until ctrlr is reconnected before deleting ctrlr.  -1 means infinite reconnects. 0 means no reconnect.
3864reconnect_delay_sec        | Optional | number      | Time to delay a reconnect trial. 0 means no reconnect.
3865fast_io_fail_timeout_sec   | Optional | number      | Time to wait until ctrlr is reconnected before failing I/O to ctrlr. 0 means no such timeout.
3866disable_auto_failback      | Optional | boolean     | Disable automatic failback. The RPC bdev_nvme_set_preferred_path can be used to do manual failback.
3867generate_uuids             | Optional | boolean     | Enable generation of UUIDs for NVMe bdevs that do not provide this value themselves.
3868transport_tos              | Optional | number      | IPv4 Type of Service value. Only applicable for RDMA transport. Default: 0 (no TOS is applied).
3869nvme_error_stat            | Optional | boolean     | Enable collecting NVMe error counts.
3870rdma_srq_size              | Optional | number      | Set the size of a shared rdma receive queue. Default: 0 (disabled).
3871io_path_stat               | Optional | boolean     | Enable collecting I/O stat of each nvme bdev io path. Default: `false`.
3872
3873#### Example
3874
3875Example request:
3876
3877~~~json
3878request:
3879{
3880  "params": {
3881    "transport_retry_count": 5,
3882    "arbitration_burst": 3,
3883    "low_priority_weight": 8,
3884    "medium_priority_weight":8,
3885    "high_priority_weight": 8,
3886    "nvme_adminq_poll_period_us": 2000,
3887    "timeout_us": 10000000,
3888    "timeout_admin_us": 20000000,
3889    "keep_alive_timeout_ms": 600000,
3890    "action_on_timeout": "reset",
3891    "io_queue_requests" : 2048,
3892    "delay_cmd_submit": true
3893  },
3894  "jsonrpc": "2.0",
3895  "method": "bdev_nvme_set_options",
3896  "id": 1
3897}
3898~~~
3899
3900Example response:
3901
3902~~~json
3903{
3904  "jsonrpc": "2.0",
3905  "id": 1,
3906  "result": true
3907}
3908~~~
3909
3910### bdev_nvme_set_hotplug {#rpc_bdev_nvme_set_hotplug}
3911
3912Change settings of the NVMe hotplug feature. If enabled, PCIe NVMe bdevs will be automatically discovered on insertion
3913and deleted on removal.
3914
3915#### Parameters
3916
3917Name                    | Optional | Type        | Description
3918----------------------- | -------- | ----------- | -----------
3919enabled                 | Required | string      | True to enable, false to disable
3920period_us               | Optional | number      | How often to poll for hot-insert and hot-remove events. Values: 0 - reset/use default or 1 to 10000000.
3921
3922#### Example
3923
3924Example request:
3925
3926~~~json
3927request:
3928{
3929  "params": {
3930    "enabled": true,
3931    "period_us": 2000
3932  },
3933  "jsonrpc": "2.0",
3934  "method": "bdev_nvme_set_hotplug",
3935  "id": 1
3936}
3937~~~
3938
3939Example response:
3940
3941~~~json
3942{
3943  "jsonrpc": "2.0",
3944  "id": 1,
3945  "result": true
3946}
3947~~~
3948
3949### bdev_nvme_attach_controller {#rpc_bdev_nvme_attach_controller}
3950
3951Construct @ref bdev_config_nvme. This RPC can also be used to add additional paths to an existing controller to enable
3952multipathing. This is done by specifying the `name` parameter as an existing controller. When adding an additional
3953path, the hostnqn, hostsvcid, hostaddr, prchk_reftag, and prchk_guard_arguments must not be specified and are assumed
3954to have the same value as the existing path.
3955
3956The parameters, `ctrlr_loss_timeout_sec`, `reconnect_delay_sec`, and `fast_io_fail_timeout_sec`, are mutually dependent.
3957If `reconnect_delay_sec` is non-zero, `ctrlr_loss_timeout_sec` has to be -1 or not less than `reconnect_delay_sec`.
3958If `reconnect_delay_sec` is zero, `ctrlr_loss_timeout_sec` has to be zero.
3959If `fast_io_fail_timeout_sec` is not zero, it has to be not less than `reconnect_delay_sec` and less than `ctrlr_loss_timeout_sec` if `ctrlr_loss_timeout_sec` is not -1.
3960
3961#### Result
3962
3963Array of names of newly created bdevs.
3964
3965#### Parameters
3966
3967Name                       | Optional | Type        | Description
3968-------------------------- | -------- | ----------- | -----------
3969name                       | Required | string      | Name of the NVMe controller, prefix for each bdev name
3970trtype                     | Required | string      | NVMe-oF target trtype: rdma or pcie
3971traddr                     | Required | string      | NVMe-oF target address: ip or BDF
3972adrfam                     | Optional | string      | NVMe-oF target adrfam: ipv4, ipv6, ib, fc, intra_host
3973trsvcid                    | Optional | string      | NVMe-oF target trsvcid: port number
3974subnqn                     | Optional | string      | NVMe-oF target subnqn
3975hostnqn                    | Optional | string      | NVMe-oF target hostnqn
3976hostaddr                   | Optional | string      | NVMe-oF host address: ip address
3977hostsvcid                  | Optional | string      | NVMe-oF host trsvcid: port number
3978prchk_reftag               | Optional | bool        | Enable checking of PI reference tag for I/O processing
3979prchk_guard                | Optional | bool        | Enable checking of PI guard for I/O processing
3980hdgst                      | Optional | bool        | Enable TCP header digest
3981ddgst                      | Optional | bool        | Enable TCP data digest
3982fabrics_connect_timeout_us | Optional | bool        | Timeout for fabrics connect (in microseconds)
3983multipath                  | Optional | string      | Multipathing behavior: disable, failover, multipath. Default is failover.
3984num_io_queues              | Optional | number      | The number of IO queues to request during initialization. Range: (0, UINT16_MAX + 1], Default is 1024.
3985ctrlr_loss_timeout_sec     | Optional | number      | Time to wait until ctrlr is reconnected before deleting ctrlr.  -1 means infinite reconnects. 0 means no reconnect.
3986reconnect_delay_sec        | Optional | number      | Time to delay a reconnect trial. 0 means no reconnect.
3987fast_io_fail_timeout_sec   | Optional | number      | Time to wait until ctrlr is reconnected before failing I/O to ctrlr. 0 means no such timeout.
3988psk                        | Optional | string      | Path to a file contatining PSK for TLS (Enables SSL socket implementation for TCP)
3989max_bdevs                  | Optional | number      | The size of the name array for newly created bdevs. Default is 128.
3990
3991#### Example
3992
3993Example request:
3994
3995~~~json
3996{
3997  "params": {
3998    "trtype": "pcie",
3999    "name": "Nvme0",
4000    "traddr": "0000:0a:00.0"
4001  },
4002  "jsonrpc": "2.0",
4003  "method": "bdev_nvme_attach_controller",
4004  "id": 1
4005}
4006~~~
4007
4008Example response:
4009
4010~~~json
4011{
4012  "jsonrpc": "2.0",
4013  "id": 1,
4014  "result": [
4015    "Nvme0n1"
4016  ]
4017}
4018~~~
4019
4020### bdev_nvme_get_controllers {#rpc_bdev_nvme_get_controllers}
4021
4022Get information about NVMe controllers.
4023
4024#### Parameters
4025
4026The user may specify no parameters in order to list all NVMe controllers, or one NVMe controller may be
4027specified by name.
4028
4029Name                    | Optional | Type        | Description
4030----------------------- | -------- | ----------- | -----------
4031name                    | Optional | string      | NVMe controller name
4032
4033#### Response
4034
4035The response is an array of objects containing information about the requested NVMe controllers.
4036
4037#### Example
4038
4039Example request:
4040
4041~~~json
4042{
4043  "jsonrpc": "2.0",
4044  "id": 1,
4045  "method": "bdev_nvme_get_controllers",
4046  "params": {
4047    "name": "Nvme0"
4048  }
4049}
4050~~~
4051
4052Example response:
4053
4054~~~json
4055{
4056  "jsonrpc": "2.0",
4057  "id": 1,
4058  "result": [
4059    {
4060      "name": "Nvme0",
4061      "trid": {
4062        "trtype": "PCIe",
4063        "traddr": "0000:05:00.0"
4064      },
4065      "cntlid": 0
4066    }
4067  ]
4068}
4069~~~
4070
4071### bdev_nvme_detach_controller {#rpc_bdev_nvme_detach_controller}
4072
4073Detach NVMe controller and delete any associated bdevs. Optionally,
4074If all of the transport ID options are specified, only remove that
4075transport path from the specified controller. If that is the only
4076available path for the controller, this will also result in the
4077controller being detached and the associated bdevs being deleted.
4078
4079returns true if the controller and bdevs were successfully destroyed
4080or the address was properly removed, false otherwise.
4081
4082#### Parameters
4083
4084Name                    | Optional | Type        | Description
4085----------------------- | -------- | ----------- | -----------
4086name                    | Required | string      | Controller name
4087trtype                  | Optional | string      | NVMe-oF target trtype: rdma or tcp
4088traddr                  | Optional | string      | NVMe-oF target address: ip or BDF
4089adrfam                  | Optional | string      | NVMe-oF target adrfam: ipv4, ipv6, ib, fc, intra_host
4090trsvcid                 | Optional | string      | NVMe-oF target trsvcid: port number
4091subnqn                  | Optional | string      | NVMe-oF target subnqn
4092hostaddr                | Optional | string      | NVMe-oF host address: ip
4093hostsvcid               | Optional | string      | NVMe-oF host svcid: port number
4094
4095#### Example
4096
4097Example requests:
4098
4099~~~json
4100{
4101  "params": {
4102    "name": "Nvme0"
4103  },
4104  "jsonrpc": "2.0",
4105  "method": "bdev_nvme_detach_controller",
4106  "id": 1
4107}
4108~~~
4109
4110Example response:
4111
4112~~~json
4113{
4114  "jsonrpc": "2.0",
4115  "id": 1,
4116  "result": true
4117}
4118~~~
4119
4120### bdev_nvme_reset_controller {#rpc_bdev_nvme_reset_controller}
4121
4122For non NVMe multipath, reset an NVMe controller whose name is given by the `name` parameter.
4123
4124For NVMe multipath, an NVMe bdev controller is created and it aggregates multiple NVMe controllers.
4125The `name` parameter is an NVMe bdev controller name and the `cntlid` parameter is used to identify
4126an NVMe controller in the NVMe bdev controller. Reset only one NVMe-oF controller if the `cntlid`
4127parameter is specified, or all NVMe-oF controllers in an NVMe bdev controller if it is omitted.
4128
4129Returns true if the controller reset was successful, false otherwise.
4130
4131#### Parameters
4132
4133Name                    | Optional | Type        | Description
4134----------------------- | -------- | ----------- | -----------
4135name                    | Required | string      | NVMe controller name (or NVMe bdev controller name for multipath)
4136cntlid                  | Optional | number      | NVMe controller ID (used as NVMe controller name for multipath)
4137
4138#### Example
4139
4140Example request:
4141
4142~~~json
4143{
4144  "jsonrpc": "2.0",
4145  "id": 1,
4146  "method": "bdev_nvme_reset_controller",
4147  "params": {
4148    "name": "Nvme0"
4149  }
4150}
4151~~~
4152
4153Example response:
4154
4155~~~json
4156{
4157  "jsonrpc": "2.0",
4158  "id": 1,
4159  "result": true
4160}
4161~~~
4162
4163### bdev_nvme_enable_controller {#rpc_bdev_nvme_enable_controller}
4164
4165For non NVMe multipath, enable an NVMe controller whose name is given by the `name` parameter.
4166
4167For NVMe multipath, an NVMe bdev controller is created and it aggregates multiple NVMe controllers.
4168The `name` parameter is an NVMe bdev controller name and the `cntlid` parameter is used to identify
4169an NVMe controller in the NVMe bdev controller. Enable only one NVMe-oF controller if the `cntlid`
4170parameter is specified, or all NVMe-oF controllers in an NVMe bdev controller if it is omitted.
4171
4172Returns true if the controller enablement was successful or a controller was already enabled, false otherwise.
4173
4174#### Parameters
4175
4176Name                    | Optional | Type        | Description
4177----------------------- | -------- | ----------- | -----------
4178name                    | Required | string      | NVMe controller name (or NVMe bdev controller name for multipath)
4179cntlid                  | Optional | number      | NVMe controller ID (used as NVMe controller name for multipath)
4180
4181#### Example
4182
4183Example request:
4184
4185~~~json
4186{
4187  "jsonrpc": "2.0",
4188  "id": 1,
4189  "method": "bdev_nvme_enable_controller",
4190  "params": {
4191    "name": "Nvme0"
4192  }
4193}
4194~~~
4195
4196Example response:
4197
4198~~~json
4199{
4200  "jsonrpc": "2.0",
4201  "id": 1,
4202  "result": true
4203}
4204~~~
4205
4206### bdev_nvme_disable_controller {#rpc_bdev_nvme_disable_controller}
4207
4208For non NVMe multipath, disable an NVMe controller whose name is given by the `name` parameter.
4209
4210For NVMe multipath, an NVMe bdev controller is created and it aggregates multiple NVMe controllers.
4211The `name` parameter is an NVMe bdev controller name and the `cntlid` parameter is used to identify
4212an NVMe controller in the NVMe bdev controller. Disable only one NVMe-oF controller if the `cntlid`
4213parameter is specified, or all NVMe-oF controllers in an NVMe bdev controller if it is omitted.
4214
4215Returns true if the controller disablement was successful or a controller was already disabled, false otherwise.
4216
4217#### Parameters
4218
4219Name                    | Optional | Type        | Description
4220----------------------- | -------- | ----------- | -----------
4221name                    | Required | string      | NVMe controller name (or NVMe bdev controller name for multipath)
4222cntlid                  | Optional | number      | NVMe controller ID (used as NVMe controller name for multipath)
4223
4224#### Example
4225
4226Example request:
4227
4228~~~json
4229{
4230  "jsonrpc": "2.0",
4231  "id": 1,
4232  "method": "bdev_nvme_disable_controller",
4233  "params": {
4234    "name": "Nvme0"
4235  }
4236}
4237~~~
4238
4239Example response:
4240
4241~~~json
4242{
4243  "jsonrpc": "2.0",
4244  "id": 1,
4245  "result": true
4246}
4247~~~
4248
4249### bdev_nvme_start_discovery {#rpc_bdev_nvme_start_discovery}
4250
4251Start a discovery service for the discovery subsystem of the specified transport ID.
4252
4253The discovery service will read the discovery log page for the specified
4254discovery subsystem, and automatically attach to any subsystems found in the
4255log page. When determining a controller name to use when attaching, it will use
4256the 'name' parameter as a prefix, followed by a unique integer for that discovery
4257service. If the discovery service identifies a subsystem that has been previously
4258attached but is listed with a different path, it will use the same controller name
4259as the previous entry, and connect as a multipath.
4260
4261When the discovery service sees that a subsystem entry has been removed
4262from the log page, it will automatically detach from that controller as well.
4263
4264The 'name' is also used to later stop the discovery service.
4265
4266#### Parameters
4267
4268Name                       | Optional | Type        | Description
4269-------------------------- | -------- | ----------- | -----------
4270name                       | Required | string      | Prefix for NVMe controllers
4271trtype                     | Required | string      | NVMe-oF target trtype: rdma or tcp
4272traddr                     | Required | string      | NVMe-oF target address: ip
4273adrfam                     | Optional | string      | NVMe-oF target adrfam: ipv4, ipv6
4274trsvcid                    | Optional | string      | NVMe-oF target trsvcid: port number
4275hostnqn                    | Optional | string      | NVMe-oF target hostnqn
4276wait_for_attach            | Optional | bool        | Wait to complete until all discovered NVM subsystems are attached
4277attach_timeout_ms          | Optional | number      | Time to wait until the discovery and all discovered NVM subsystems are attached
4278ctrlr_loss_timeout_sec     | Optional | number      | Time to wait until ctrlr is reconnected before deleting ctrlr.  -1 means infinite reconnects. 0 means no reconnect.
4279reconnect_delay_sec        | Optional | number      | Time to delay a reconnect trial. 0 means no reconnect.
4280fast_io_fail_timeout_sec   | Optional | number      | Time to wait until ctrlr is reconnected before failing I/O to ctrlr. 0 means no such timeout.
4281
4282#### Example
4283
4284Example request:
4285
4286~~~json
4287{
4288  "jsonrpc": "2.0",
4289  "method": "bdev_nvme_start_discovery",
4290  "id": 1,
4291  "params": {
4292    "name": "nvme_auto",
4293    "trtype": "tcp",
4294    "traddr": "127.0.0.1",
4295    "hostnqn": "nqn.2021-12.io.spdk:host1",
4296    "adrfam": "ipv4",
4297    "trsvcid": "4420"
4298  }
4299}
4300~~~
4301
4302Example response:
4303
4304~~~json
4305{
4306  "jsonrpc": "2.0",
4307  "id": 1,
4308  "result": true
4309}
4310~~~
4311
4312### bdev_nvme_stop_discovery {#rpc_bdev_nvme_stop_discovery}
4313
4314Stop a discovery service. This includes detaching any controllers that were
4315discovered via the service that is being stopped.
4316
4317#### Parameters
4318
4319Name                       | Optional | Type        | Description
4320-------------------------- | -------- | ----------- | -----------
4321name                       | Required | string      | Name of service to stop
4322
4323#### Example
4324
4325Example request:
4326
4327~~~json
4328{
4329  "jsonrpc": "2.0",
4330  "method": "bdev_nvme_stop_discovery",
4331  "id": 1,
4332  "params": {
4333    "name": "nvme_auto"
4334  }
4335}
4336~~~
4337
4338Example response:
4339
4340~~~json
4341{
4342  "jsonrpc": "2.0",
4343  "id": 1,
4344  "result": true
4345}
4346~~~
4347
4348### bdev_nvme_get_discovery_info {#rpc_bdev_nvme_get_discovery_info}
4349
4350Get information about the discovery service.
4351
4352#### Example
4353
4354Example request:
4355~~~json
4356{
4357  "jsonrpc": "2.0",
4358  "method": "bdev_nvme_get_discovery_info",
4359  "id": 1
4360}
4361~~~
4362
4363Example response:
4364
4365~~~json
4366{
4367  "jsonrpc": "2.0",
4368  "id": 1,
4369  "result": [
4370    {
4371      "name": "nvme-disc",
4372      "trid": {
4373        "trtype": "TCP",
4374        "adrfam": "IPv4",
4375        "traddr": "127.0.0.1",
4376        "trsvcid": "8009",
4377        "subnqn": "nqn.2014-08.org.nvmexpress.discovery"
4378      },
4379      "referrals": []
4380    }
4381  ]
4382}
4383~~~
4384
4385### bdev_nvme_get_io_paths {#rpc_bdev_nvme_get_io_paths}
4386
4387Display all or the specified NVMe bdev's active I/O paths.
4388
4389#### Parameters
4390
4391Name                    | Optional | Type        | Description
4392----------------------- | -------- | ----------- | -----------
4393name                    | Optional | string      | Name of the NVMe bdev
4394
4395#### Example
4396
4397Example request:
4398
4399~~~json
4400{
4401  "jsonrpc": "2.0",
4402  "method": "bdev_nvme_get_io_paths",
4403  "id": 1,
4404  "params": {
4405    "name": "Nvme0n1"
4406  }
4407}
4408~~~
4409
4410Example response:
4411
4412~~~json
4413{
4414  "jsonrpc": "2.0",
4415  "id": 1,
4416  "result": {
4417    "poll_groups": [
4418      {
4419        "thread": "app_thread",
4420        "io_paths": [
4421          {
4422            "bdev_name": "Nvme0n1",
4423            "cntlid": 0,
4424            "current": true,
4425            "connected": true,
4426            "accessible": true,
4427            "transport": {
4428              "trtype": "RDMA",
4429              "traddr": "1.2.3.4",
4430              "trsvcid": "4420",
4431              "adrfam": "IPv4"
4432            }
4433          }
4434        ]
4435      }
4436    ]
4437  }
4438}
4439~~~
4440
4441### bdev_nvme_set_preferred_path {#rpc_bdev_nvme_set_preferred_path}
4442
4443Set the preferred I/O path for an NVMe bdev in multipath mode.
4444
4445NOTE: This RPC does not support NVMe bdevs in failover mode.
4446
4447#### Parameters
4448
4449Name                    | Optional | Type        | Description
4450----------------------- | -------- | ----------- | -----------
4451name                    | Required | string      | Name of the NVMe bdev
4452cntlid                  | Required | number      | NVMe-oF controller ID
4453
4454#### Example
4455
4456Example request:
4457
4458~~~json
4459{
4460  "jsonrpc": "2.0",
4461  "method": "bdev_nvme_set_preferred_path",
4462  "id": 1,
4463  "params": {
4464    "name": "Nvme0n1",
4465    "cntlid": 0
4466  }
4467}
4468~~~
4469
4470Example response:
4471
4472~~~json
4473{
4474  "jsonrpc": "2.0",
4475  "id": 1,
4476  "result": true
4477}
4478~~~
4479
4480### bdev_nvme_set_multipath_policy {#rpc_bdev_nvme_set_multipath_policy}
4481
4482Set multipath policy of the NVMe bdev in multipath mode or set multipath
4483selector for active-active multipath policy.
4484
4485#### Parameters
4486
4487Name                    | Optional | Type        | Description
4488----------------------- | -------- | ----------- | -----------
4489name                    | Required | string      | Name of the NVMe bdev
4490policy                  | Required | string      | Multipath policy: active_active or active_passive
4491selector                | Optional | string      | Multipath selector: round_robin or queue_depth, used in active-active mode. Default is round_robin
4492rr_min_io               | Optional | number      | Number of I/Os routed to current io path before switching to another for round-robin selector. The min value is 1.
4493
4494#### Example
4495
4496Example request:
4497
4498~~~json
4499{
4500  "jsonrpc": "2.0",
4501  "method": "bdev_nvme_set_multipath_policy",
4502  "id": 1,
4503  "params": {
4504    "name": "Nvme0n1",
4505    "policy": "active_passive"
4506  }
4507}
4508~~~
4509
4510Example response:
4511
4512~~~json
4513{
4514  "jsonrpc": "2.0",
4515  "id": 1,
4516  "result": true
4517}
4518~~~
4519
4520### bdev_nvme_get_path_iostat {#rpc_bdev_nvme_get_path_iostat}
4521
4522Get I/O statistics for IO paths of the block device. Call RPC bdev_nvme_set_options to set enable_io_path_stat
4523true before using this RPC.
4524
4525#### Parameters
4526
4527Name                    | Optional | Type        | Description
4528----------------------- | -------- | ----------- | -----------
4529name                    | Required | string      | Name of the NVMe bdev
4530
4531#### Example
4532
4533Example request:
4534
4535~~~json
4536{
4537  "jsonrpc": "2.0",
4538  "method": "bdev_nvme_get_path_iostat",
4539  "id": 1,
4540  "params": {
4541    "name": "NVMe0n1"
4542  }
4543}
4544~~~
4545
4546Example response:
4547
4548~~~json
4549{
4550  "jsonrpc": "2.0",
4551  "id": 1,
4552  "result": {
4553    "name": "NVMe0n1",
4554    "stats": [
4555      {
4556        "trid": {
4557          "trtype": "TCP",
4558          "adrfam": "IPv4",
4559          "traddr": "10.169.204.201",
4560          "trsvcid": "4420",
4561          "subnqn": "nqn.2016-06.io.spdk:cnode1"
4562        },
4563        "stat": {
4564          "bytes_read": 676691968,
4565          "num_read_ops": 165201,
4566          "bytes_written": 0,
4567          "num_write_ops": 0,
4568          "bytes_unmapped": 0,
4569          "num_unmap_ops": 0,
4570          "max_read_latency_ticks": 521487,
4571          "min_read_latency_ticks": 0,
4572          "write_latency_ticks": 0,
4573          "max_write_latency_ticks": 0,
4574          "min_write_latency_ticks": 0,
4575          "unmap_latency_ticks": 0,
4576          "max_unmap_latency_ticks": 0,
4577          "min_unmap_latency_ticks": 0,
4578          "copy_latency_ticks": 0,
4579          "max_copy_latency_ticks": 0,
4580          "min_copy_latency_ticks": 0
4581        }
4582      },
4583      {
4584        "trid": {
4585          "trtype": "TCP",
4586          "adrfam": "IPv4",
4587          "traddr": "8.8.8.6",
4588          "trsvcid": "4420",
4589          "subnqn": "nqn.2016-06.io.spdk:cnode1"
4590        },
4591        "stat": {
4592          "bytes_read": 677138432,
4593          "num_read_ops": 165317,
4594          "bytes_written": 0,
4595          "num_write_ops": 0,
4596          "bytes_unmapped": 0,
4597          "num_unmap_ops": 0,
4598          "max_read_latency_ticks": 108525,
4599          "min_read_latency_ticks": 0,
4600          "write_latency_ticks": 0,
4601          "max_write_latency_ticks": 0,
4602          "min_write_latency_ticks": 0,
4603          "unmap_latency_ticks": 0,
4604          "max_unmap_latency_ticks": 0,
4605          "min_unmap_latency_ticks": 0,
4606          "copy_latency_ticks": 0,
4607          "max_copy_latency_ticks": 0,
4608          "min_copy_latency_ticks": 0
4609        }
4610      }
4611    ]
4612  }
4613}
4614~~~
4615
4616### bdev_nvme_cuse_register {#rpc_bdev_nvme_cuse_register}
4617
4618Register CUSE device on NVMe controller.
4619This feature is considered as experimental.
4620
4621#### Parameters
4622
4623Name                    | Optional | Type        | Description
4624----------------------- | -------- | ----------- | -----------
4625name                    | Required | string      | Name of the NVMe controller
4626dev_path                | Required | string      | Path to the CUSE controller device, e.g. spdk/nvme0
4627
4628#### Example
4629
4630Example request:
4631
4632~~~json
4633{
4634  "params": {
4635    "dev_path": "spdk/nvme0",
4636    "name": "Nvme0"
4637  },
4638  "jsonrpc": "2.0",
4639  "method": "bdev_nvme_cuse_register",
4640  "id": 1
4641}
4642~~~
4643
4644Example response:
4645
4646~~~json
4647{
4648  "jsonrpc": "2.0",
4649  "id": 1,
4650  "result": true
4651}
4652~~~
4653
4654### bdev_nvme_cuse_unregister {#rpc_bdev_nvme_cuse_unregister}
4655
4656Unregister CUSE device on NVMe controller.
4657This feature is considered as experimental.
4658
4659#### Parameters
4660
4661Name                    | Optional | Type        | Description
4662----------------------- | -------- | ----------- | -----------
4663name                    | Required | string      | Name of the NVMe controller
4664
4665#### Example
4666
4667Example request:
4668
4669~~~json
4670{
4671  "params": {
4672    "name": "Nvme0"
4673  },
4674  "jsonrpc": "2.0",
4675  "method": "bdev_nvme_cuse_unregister",
4676  "id": 1
4677}
4678~~~
4679
4680Example response:
4681
4682~~~json
4683{
4684  "jsonrpc": "2.0",
4685  "id": 1,
4686  "result": true
4687}
4688~~~
4689
4690### bdev_zone_block_create {#rpc_bdev_zone_block_create}
4691
4692Creates a virtual zone device on top of existing non-zoned bdev.
4693
4694#### Parameters
4695
4696Name                    | Optional | Type        | Description
4697----------------------- | -------- | ----------- | -----------
4698name                    | Required | string      | Name of the Zone device
4699base_bdev               | Required | string      | Name of the Base bdev
4700zone_capacity           | Required | number      | Zone capacity in blocks
4701optimal_open_zones      | Required | number      | Number of zones required to reach optimal write speed
4702
4703#### Example
4704
4705Example request:
4706
4707~~~json
4708{
4709  "jsonrpc": "2.0",
4710  "method": "bdev_zone_block_create",
4711  "id": 1,
4712  "params": {
4713    "name": "zone1",
4714    "base_bdev": "NVMe0n1",
4715    "zone_capacity": 4096,
4716    "optimal_open_zones": 32
4717  }
4718}
4719~~~
4720
4721Example response:
4722
4723~~~json
4724{
4725  "jsonrpc": "2.0",
4726  "id": 1,
4727  "result": "zone1"
4728}
4729~~~
4730
4731### bdev_zone_block_delete {#rpc_bdev_zone_block_delete}
4732
4733Deletes a virtual zone device.
4734
4735#### Parameters
4736
4737Name                    | Optional | Type        | Description
4738----------------------- | -------- | ----------- | -----------
4739name                    | Required | string      | Name of the Zone device
4740
4741#### Example
4742
4743Example request:
4744
4745~~~json
4746{
4747  "jsonrpc": "2.0",
4748  "method": "bdev_zone_block_delete",
4749  "id": 1,
4750  "params": {
4751    "name": "zone1"
4752  }
4753}
4754~~~
4755
4756Example response:
4757
4758~~~json
4759{
4760  "jsonrpc": "2.0",
4761  "id": 1,
4762  "result": true
4763}
4764~~~
4765
4766### bdev_nvme_apply_firmware {#rpc_bdev_nvme_apply_firmware}
4767
4768Download and commit firmware to NVMe device.
4769
4770#### Parameters
4771
4772Name                    | Optional | Type        | Description
4773----------------------- | -------- | ----------- | -----------
4774filename                | Required | string      | filename of the firmware to download
4775bdev_name               | Required | string      | Name of the NVMe block device
4776
4777#### Example
4778
4779Example request:
4780
4781~~~json
4782{
4783  "jsonrpc": "2.0",
4784  "method": "bdev_nvme_apply_firmware",
4785  "id": 1,
4786  "params": {
4787    "filename": "firmware_file",
4788    "bdev_name": "NVMe0n1"
4789  }
4790}
4791~~~
4792
4793### bdev_nvme_get_transport_statistics {#rpc_bdev_nvme_get_transport_statistics}
4794
4795Get bdev_nvme poll group transport statistics.
4796
4797#### Parameters
4798
4799This RPC method accepts no parameters
4800
4801#### Response
4802
4803The response is an array of objects containing information about transport statistics per NVME poll group.
4804
4805#### Example
4806
4807Example request:
4808
4809~~~json
4810{
4811  "jsonrpc": "2.0",
4812  "id": 1,
4813  "method": "bdev_nvme_get_transport_statistics",
4814}
4815~~~
4816
4817Example response:
4818
4819~~~json
4820{
4821  "jsonrpc": "2.0",
4822  "id": 1,
4823	"result": {
4824	  "poll_groups": [
4825		{
4826		  "thread": "nvmf_tgt_poll_group_0",
4827		  "transports": [
4828			{
4829			  "trname": "RDMA",
4830			  "devices": [
4831				{
4832				  "dev_name": "mlx5_1",
4833				  "polls": 137492169,
4834				  "idle_polls": 137492169,
4835				  "completions": 0,
4836				  "queued_requests": 0,
4837				  "total_send_wrs": 0,
4838				  "send_sq_doorbell_updates": 0,
4839				  "total_recv_wrs": 0,
4840				  "recv_sq_doorbell_updates": 0
4841				},
4842				{
4843				  "dev_name": "mlx5_0",
4844				  "polls": 137985185,
4845				  "idle_polls": 137492169,
4846				  "completions": 1474593,
4847				  "queued_requests": 0,
4848				  "total_send_wrs": 1474593,
4849				  "send_sq_doorbell_updates": 426147,
4850				  "total_recv_wrs": 1474721,
4851				  "recv_sq_doorbell_updates": 348445
4852				}
4853			  ]
4854			},
4855			{
4856			  "trname": "PCIE",
4857			  "polls": 435419831,
4858			  "idle_polls": 434901004,
4859			  "completions": 1485543,
4860			  "cq_doorbell_updates": 518827,
4861			  "queued_requests": 0,
4862			  "submitted_requests": 1485543,
4863			  "sq_doorbell_updates": 516081
4864			}
4865		  ]
4866		},
4867		{
4868		  "thread": "nvmf_tgt_poll_group_1",
4869		  "transports": [
4870			{
4871			  "trname": "RDMA",
4872			  "devices": [
4873				{
4874				  "dev_name": "mlx5_1",
4875				  "polls": 140245630,
4876				  "idle_polls": 140245630,
4877				  "completions": 0,
4878				  "queued_requests": 0,
4879				  "total_send_wrs": 0,
4880				  "send_sq_doorbell_updates": 0,
4881				  "total_recv_wrs": 0,
4882				  "recv_sq_doorbell_updates": 0
4883				},
4884				{
4885				  "dev_name": "mlx5_0",
4886				  "polls": 140751844,
4887				  "idle_polls": 140245630,
4888				  "completions": 1489298,
4889				  "queued_requests": 0,
4890				  "total_send_wrs": 1489298,
4891				  "send_sq_doorbell_updates": 433510,
4892				  "total_recv_wrs": 1489426,
4893				  "recv_sq_doorbell_updates": 357956
4894				}
4895			  ]
4896			},
4897			{
4898			  "trname": "PCIE",
4899			  "polls": 429044294,
4900			  "idle_polls": 428525658,
4901			  "completions": 1478730,
4902			  "cq_doorbell_updates": 518636,
4903			  "queued_requests": 0,
4904			  "submitted_requests": 1478730,
4905			  "sq_doorbell_updates": 511658
4906			}
4907		  ]
4908		}
4909	  ]
4910	}
4911}
4912~~~
4913
4914### bdev_nvme_get_controller_health_info {#rpc_bdev_nvme_get_controller_health_info}
4915
4916Display health log of the required NVMe bdev device.
4917
4918#### Parameters
4919
4920Name                    | Optional | Type        | Description
4921----------------------- | -------- | ----------- | -----------
4922name                    | Required | string      | Name of the NVMe bdev controller
4923
4924#### Response
4925
4926The response is the object containing information about health log of the NVMe controller.
4927
4928#### Example
4929
4930Example request:
4931
4932~~~json
4933{
4934  "jsonrpc": "2.0",
4935  "method": "bdev_nvme_get_controller_health_info",
4936  "id": 1,
4937  "params": {
4938    "name": "Nvme0"
4939  }
4940}
4941~~~
4942
4943Example response:
4944
4945~~~json
4946{
4947  "model_number": "INTEL SSDPE2KX020T8",
4948  "serial_number": "BTLJ72430ARH2P0BGN",
4949  "firmware_revision": "VDV10110",
4950  "traddr": "0000:08:00.0",
4951  "temperature_celsius": 32,
4952  "available_spare_percentage": 99,
4953  "available_spare_threshold_percentage": 10,
4954  "percentage_used": 2,
4955  "data_units_read": 1013408619,
4956  "data_units_written": 346792685,
4957  "host_read_commands": 30457773282,
4958  "host_write_commands": 18949677715,
4959  "controller_busy_time": 4979,
4960  "power_cycles": 49,
4961  "power_on_hours": 31118,
4962  "unsafe_shutdowns": 18,
4963  "media_errors": 17,
4964  "num_err_log_entries": 19,
4965  "warning_temperature_time_minutes": 0,
4966  "critical_composite_temperature_time_minutes": 0
4967}
4968~~~
4969
4970### bdev_rbd_register_cluster {#rpc_bdev_rbd_register_cluster}
4971
4972This method is available only if SPDK was build with Ceph RBD support.
4973
4974#### Parameters
4975
4976Name                    | Optional | Type        | Description
4977----------------------- | -------- | ----------- | -----------
4978name                    | Required | string      | Registered Rados cluster object name
4979user_id                 | Optional | string      | Ceph ID (i.e. admin, not client.admin)
4980config_param            | Optional | string map  | Explicit librados configuration
4981config_file             | Optional | string      | File path of libraodos configuration file
4982key_file                | Optional | string      | File path of libraodos key file
4983
4984This RPC registers a Rados Cluster object handle which is only known
4985to rbd module, it uses user_id + config_param or user_id + config_file +
4986key_file or user_id + config_param + config_file + key_file to identify
4987a Rados cluster object.
4988
4989When accessing the Ceph cluster as some user other than "admin" (the
4990default), the "user_id" has to be set.
4991
4992The configuration items and secret key can be specified by setting config_param,
4993config_file and key_file, all of them, or none of them. If only config_param is
4994passed, all key/value pairs are passed to rados_conf_set to configure cluster access.
4995In practice, "mon_host" (= list of monitor address+port) and "key" (= the secret key
4996stored in Ceph keyrings) are enough. If config_file and key_file are specified, they must
4997exist with all relevant settings for accessing the Ceph cluster. If config_param, config_file
4998and key_file are specified, get the key/value pairs from config_file first and set to
4999rados_conf_set function, then set pairs in config_param and keyring in key_file. If nothing
5000is specified, it will get configuration file and key file from the default location
5001/etc/ceph/ceph.conf and /etc/ceph/ceph.client.user_id.keyring.
5002
5003#### Result
5004
5005Name of newly created Rados cluster object.
5006
5007#### Example
5008
5009Example request:
5010
5011~~
5012{
5013  "params": {
5014    "name": "rbd_cluster",
5015    "user_id": cinder,
5016    "config_file": "/root/ceph_conf/ceph.conf",
5017    "key_file": "/root/ceph_conf/ceph.client.cinder.keyring"
5018  },
5019  "jsonrpc": "2.0",
5020  "method": "bdev_rbd_register_cluster",
5021  "id": 1
5022}
5023~~
5024
5025Example response:
5026
5027~~
5028response:
5029{
5030  "jsonrpc": "2.0",
5031  "id": 1,
5032  "result": "rbd_cluster"
5033}
5034~~
5035
5036### bdev_rbd_unregister_cluster {#rpc_bdev_rbd_unregister_cluster}
5037
5038This method is available only if SPDK was build with Ceph RBD support.
5039If there is still rbd bdev using this cluster, the unregisteration operation
5040will fail.
5041
5042#### Result
5043
5044`true` if Rados cluster object with provided name was deleted or `false` otherwise.
5045
5046#### Parameters
5047
5048Name                    | Optional | Type        | Description
5049----------------------- | -------- | ----------- | -------------------------
5050name                    | Required | string      | Rados cluster object name
5051
5052#### Example
5053
5054Example request:
5055
5056~~
5057{
5058  "params": {
5059    "name": "rbd_cluster"
5060  },
5061  "jsonrpc": "2.0",
5062  "method": "bdev_rbd_unregister_cluster",
5063  "id": 1
5064}
5065~~
5066
5067Example response:
5068
5069~~
5070{
5071  "jsonrpc": "2.0",
5072  "id": 1,
5073  "result": true
5074}
5075~~
5076
5077### bdev_rbd_get_clusters_info {#rpc_bdev_rbd_get_clusters_info}
5078
5079This method is available only if SPDK was build with Ceph RBD support.
5080
5081#### Result
5082
5083Returns the cluster info of the Rados Cluster name if provided. Otherwise, it
5084returns the cluster info of every registered Raods Cluster name.
5085
5086#### Parameters
5087
5088Name                    | Optional | Type        | Description
5089----------------------- | -------- | ----------- | -------------------------
5090name                    | Optional | string      | Rados cluster object name
5091
5092#### Example
5093
5094Example request:
5095
5096~~
5097{
5098  "params": {
5099    "name": "rbd_cluster"
5100  },
5101  "jsonrpc": "2.0",
5102  "method": "bdev_rbd_get_clusters_info",
5103  "id": 1
5104}
5105~~
5106
5107Example response:
5108
5109~~
5110{
5111  "jsonrpc": "2.0",
5112  "cluster_name": "rbd_cluster"
5113}
5114~~
5115
5116### bdev_rbd_create {#rpc_bdev_rbd_create}
5117
5118Create @ref bdev_config_rbd bdev
5119
5120This method is available only if SPDK was build with Ceph RBD support.
5121
5122#### Parameters
5123
5124Name                    | Optional | Type        | Description
5125----------------------- | -------- | ----------- | -----------
5126name                    | Optional | string      | Bdev name
5127user_id                 | Optional | string      | Ceph ID (i.e. admin, not client.admin)
5128pool_name               | Required | string      | Pool name
5129rbd_name                | Required | string      | Image name
5130block_size              | Required | number      | Block size
5131config                  | Optional | string map  | Explicit librados configuration
5132cluster_name            | Optional | string      | Rados cluster object name created in this module.
5133uuid                    | Optional | string      | UUID of new bdev
5134
5135If no config is specified, Ceph configuration files must exist with
5136all relevant settings for accessing the pool. If a config map is
5137passed, the configuration files are ignored and instead all key/value
5138pairs are passed to rados_conf_set to configure cluster access. In
5139practice, "mon_host" (= list of monitor address+port) and "key" (= the
5140secret key stored in Ceph keyrings) are enough.
5141
5142When accessing the image as some user other than "admin" (the
5143default), the "user_id" has to be set.
5144
5145If provided with cluster_name option, it will use the Rados cluster object
5146referenced by the name (created by bdev_rbd_register_cluster RPC) and ignores
5147"user_id + config" combination to create its own Rados cluster. In this scenario,
5148all the bdevs will share the same cluster with one connection of Ceph in librbd module.
5149Performance tuning on the I/O workload could be done by estimating how many io_contxt
5150threads and messager threads in Ceph side and how many cores would be reasonable to provide
5151for SPDK to get up to your projections.
5152
5153#### Result
5154
5155Name of newly created bdev.
5156
5157#### Example
5158
5159Example request with `key` from `/etc/ceph/ceph.client.admin.keyring`:
5160
5161~~~json
5162{
5163  "params": {
5164    "pool_name": "rbd",
5165    "rbd_name": "foo",
5166    "config": {
5167      "mon_host": "192.168.7.1:6789,192.168.7.2:6789",
5168      "key": "AQDwf8db7zR1GRAA5k7NKXjS5S5V4mntwUDnGQ==",
5169    }
5170    "block_size": 4096,
5171    "uuid": "76210ea4-7920-40a0-a07b-8992a7443c76"
5172  },
5173  "jsonrpc": "2.0",
5174  "method": "bdev_rbd_create",
5175  "id": 1
5176}
5177~~~
5178
5179Example response:
5180
5181~~~json
5182response:
5183{
5184  "jsonrpc": "2.0",
5185  "id": 1,
5186  "result": "Ceph0"
5187}
5188~~~
5189
5190Example request with `cluster_name`:
5191
5192~~
5193{
5194  "params": {
5195    "pool_name": "rbd",
5196    "rbd_name": "foo",
5197    "block_size": 4096,
5198    "cluster_name": "rbd_cluster"
5199  },
5200  "jsonrpc": "2.0",
5201  "method": "bdev_rbd_create",
5202  "id": 1
5203}
5204~~
5205
5206Example response:
5207
5208~~
5209response:
5210{
5211  "jsonrpc": "2.0",
5212  "id": 1,
5213  "result": "Ceph0"
5214}
5215~~
5216
5217### bdev_rbd_delete {#rpc_bdev_rbd_delete}
5218
5219Delete @ref bdev_config_rbd bdev
5220
5221This method is available only if SPDK was build with Ceph RBD support.
5222
5223#### Result
5224
5225`true` if bdev with provided name was deleted or `false` otherwise.
5226
5227#### Parameters
5228
5229Name                    | Optional | Type        | Description
5230----------------------- | -------- | ----------- | -----------
5231name                    | Required | string      | Bdev name
5232
5233#### Example
5234
5235Example request:
5236
5237~~~json
5238{
5239  "params": {
5240    "name": "Rbd0"
5241  },
5242  "jsonrpc": "2.0",
5243  "method": "bdev_rbd_delete",
5244  "id": 1
5245}
5246~~~
5247
5248Example response:
5249
5250~~~json
5251{
5252  "jsonrpc": "2.0",
5253  "id": 1,
5254  "result": true
5255}
5256~~~
5257
5258### bdev_rbd_resize {#rpc_bdev_rbd_resize}
5259
5260Resize @ref bdev_config_rbd bdev
5261
5262This method is available only if SPDK was build with Ceph RBD support.
5263
5264#### Result
5265
5266`true` if bdev with provided name was resized or `false` otherwise.
5267
5268#### Parameters
5269
5270Name                    | Optional | Type        | Description
5271----------------------- | -------- | ----------- | -----------
5272name                    | Required | string      | Bdev name
5273new_size                | Required | int         | New bdev size for resize operation in MiB
5274
5275#### Example
5276
5277Example request:
5278
5279~~~json
5280{
5281  "params": {
5282    "name": "Rbd0"
5283    "new_size": "4096"
5284  },
5285  "jsonrpc": "2.0",
5286  "method": "bdev_rbd_resize",
5287  "id": 1
5288}
5289~~~
5290
5291Example response:
5292
5293~~~json
5294{
5295  "jsonrpc": "2.0",
5296  "id": 1,
5297  "result": true
5298}
5299~~~
5300
5301### bdev_delay_create {#rpc_bdev_delay_create}
5302
5303Create delay bdev. This bdev type redirects all IO to it's base bdev and inserts a delay on the completion
5304path to create an artificial drive latency. All latency values supplied to this bdev should be in microseconds.
5305
5306#### Parameters
5307
5308Name                    | Optional | Type        | Description
5309----------------------- | -------- | ----------- | -----------
5310name                    | Required | string      | Bdev name
5311base_bdev_name          | Required | string      | Base bdev name
5312avg_read_latency        | Required | number      | average read latency (us)
5313p99_read_latency        | Required | number      | p99 read latency (us)
5314avg_write_latency       | Required | number      | average write latency (us)
5315p99_write_latency       | Required | number      | p99 write latency (us)
5316
5317#### Result
5318
5319Name of newly created bdev.
5320
5321#### Example
5322
5323Example request:
5324
5325~~~json
5326{
5327  "params": {
5328    "base_bdev_name": "Null0",
5329    "name": "Delay0",
5330    "avg_read_latency": "15",
5331    "p99_read_latency": "50",
5332    "avg_write_latency": "40",
5333    "p99_write_latency": "110",
5334  },
5335  "jsonrpc": "2.0",
5336  "method": "bdev_delay_create",
5337  "id": 1
5338}
5339~~~
5340
5341Example response:
5342
5343~~~json
5344{
5345  "jsonrpc": "2.0",
5346  "id": 1,
5347  "result": "Delay0"
5348}
5349~~~
5350
5351### bdev_delay_delete {#rpc_bdev_delay_delete}
5352
5353Delete delay bdev.
5354
5355#### Parameters
5356
5357Name                    | Optional | Type        | Description
5358----------------------- | -------- | ----------- | -----------
5359name                    | Required | string      | Bdev name
5360
5361#### Example
5362
5363Example request:
5364
5365~~~json
5366{
5367  "params": {
5368    "name": "Delay0"
5369  },
5370  "jsonrpc": "2.0",
5371  "method": "bdev_delay_delete",
5372  "id": 1
5373}
5374
5375~~~
5376
5377Example response:
5378
5379~~~json
5380{
5381  "jsonrpc": "2.0",
5382  "id": 1,
5383  "result": true
5384}
5385~~~
5386
5387### bdev_delay_update_latency {#rpc_bdev_delay_update_latency}
5388
5389Update a target latency value associated with a given delay bdev. Any currently
5390outstanding I/O will be completed with the old latency.
5391
5392#### Parameters
5393
5394Name                    | Optional | Type        | Description
5395----------------------- | -------- | ----------- | -----------
5396delay_bdev_name         | Required | string      | Name of the delay bdev
5397latency_type            | Required | string      | One of: avg_read, avg_write, p99_read, p99_write
5398latency_us              | Required | number      | The new latency value in microseconds
5399
5400#### Result
5401
5402Name of newly created bdev.
5403
5404#### Example
5405
5406Example request:
5407
5408~~~json
5409{
5410  "params": {
5411    "delay_bdev_name": "Delay0",
5412    "latency_type": "avg_read",
5413    "latency_us": "100",
5414  },
5415  "jsonrpc": "2.0",
5416  "method": "bdev_delay_update_latency",
5417  "id": 1
5418}
5419~~~
5420
5421Example response:
5422
5423~~~json
5424{
5425  "result": "true"
5426}
5427~~~
5428
5429### bdev_error_create {#rpc_bdev_error_create}
5430
5431Construct error bdev.
5432
5433#### Parameters
5434
5435Name                    | Optional | Type        | Description
5436----------------------- | -------- | ----------- | -----------
5437base_name               | Required | string      | Base bdev name
5438uuid                    | Optional | string      | UUID for this bdev
5439
5440#### Example
5441
5442Example request:
5443
5444~~~json
5445{
5446  "params": {
5447    "base_name": "Malloc0"
5448  },
5449  "jsonrpc": "2.0",
5450  "method": "bdev_error_create",
5451  "id": 1
5452}
5453~~~
5454
5455Example response:
5456
5457~~~json
5458{
5459  "jsonrpc": "2.0",
5460  "id": 1,
5461  "result": true
5462}
5463~~~
5464
5465### bdev_error_delete {#rpc_bdev_error_delete}
5466
5467Delete error bdev
5468
5469#### Result
5470
5471`true` if bdev with provided name was deleted or `false` otherwise.
5472
5473#### Parameters
5474
5475Name                    | Optional | Type        | Description
5476----------------------- | -------- | ----------- | -----------
5477name                    | Required | string      | Error bdev name
5478
5479#### Example
5480
5481Example request:
5482
5483~~~json
5484{
5485  "params": {
5486    "name": "EE_Malloc0"
5487  },
5488  "jsonrpc": "2.0",
5489  "method": "bdev_error_delete",
5490  "id": 1
5491}
5492~~~
5493
5494Example response:
5495
5496~~~json
5497{
5498  "jsonrpc": "2.0",
5499  "id": 1,
5500  "result": true
5501}
5502~~~
5503
5504### bdev_error_inject_error {#rpc_bdev_error_inject_error}
5505
5506Inject an error via an error bdev. Create an error bdev on base bdev first. Default 'num'
5507value is 1 and if 'num' is set to zero, the specified injection is disabled.
5508
5509#### Parameters
5510
5511Name                    | Optional | Type        | Description
5512----------------------- | -------- | ----------- | -----------
5513name                    | Required | string      | Name of the error injection bdev
5514io_type                 | Required | string      | io type 'clear' 'read' 'write' 'unmap' 'flush' 'all'
5515error_type              | Required | string      | error type 'failure' 'pending' 'corrupt_data'
5516num                     | Optional | int         | the number of commands you want to fail.(default:1)
5517corrupt_offset          | Optional | int         | the offset in bytes to xor with corrupt_value
5518corrupt_value           | Optional | int         | the value for xor (1-255, 0 is invalid)
5519
5520#### Example
5521
5522Example request:
5523
5524~~~json
5525{
5526  "jsonrpc": "2.0",
5527  "method": "bdev_error_inject_error",
5528  "id": 1,
5529  "params": {
5530    "name": "EE_Malloc0",
5531    "io_type": "write",
5532    "error_type": "pending",
5533    "num": 1
5534  }
5535}
5536~~~
5537
5538Example response:
5539
5540~~~json
5541{
5542  "jsonrpc": "2.0",
5543  "id": 1,
5544  "result": true
5545}
5546~~~
5547
5548### bdev_iscsi_set_options {#rpc_bdev_iscsi_set_options}
5549
5550This RPC can be called at any time, but the new value will only take effect for new iSCSI bdevs.
5551
5552#### Parameters
5553
5554Name                       | Optional | Type        | Description
5555-------------------------- | -------- | ----------- | -----------
5556timeout_sec                | Optional | number      | Timeout for command, in seconds, if 0, don't track timeout
5557
5558#### Example
5559
5560Example request:
5561
5562~~~json
5563request:
5564{
5565  "params": {
5566    "timeout_sec": 30
5567  },
5568  "jsonrpc": "2.0",
5569  "method": "bdev_iscsi_set_options",
5570  "id": 1
5571}
5572~~~
5573
5574Example response:
5575
5576~~~json
5577{
5578  "jsonrpc": "2.0",
5579  "id": 1,
5580  "result": true
5581}
5582~~~
5583
5584### bdev_iscsi_create {#rpc_bdev_iscsi_create}
5585
5586Connect to iSCSI target and create bdev backed by this connection.
5587
5588This method is available only if SPDK was build with iSCSI initiator support.
5589
5590#### Parameters
5591
5592Name                    | Optional | Type        | Description
5593----------------------- | -------- | ----------- | -----------
5594name                    | Required | string      | Bdev name
5595initiator_iqn           | Required | string      | IQN name used during connection
5596url                     | Required | string      | iSCSI resource URI
5597
5598#### Result
5599
5600Name of newly created bdev.
5601
5602#### Example
5603
5604Example request:
5605
5606~~~json
5607{
5608  "params": {
5609    "url": "iscsi://127.0.0.1/iqn.2016-06.io.spdk:disk1/0",
5610    "initiator_iqn": "iqn.2016-06.io.spdk:init",
5611    "name": "iSCSI0"
5612  },
5613  "jsonrpc": "2.0",
5614  "method": "bdev_iscsi_create",
5615  "id": 1
5616}
5617~~~
5618
5619Example response:
5620
5621~~~json
5622{
5623  "jsonrpc": "2.0",
5624  "id": 1,
5625  "result": "iSCSI0"
5626}
5627~~~
5628
5629### bdev_iscsi_delete {#rpc_bdev_iscsi_delete}
5630
5631Delete iSCSI bdev and terminate connection to target.
5632
5633This method is available only if SPDK was built with iSCSI initiator support.
5634
5635#### Parameters
5636
5637Name                    | Optional | Type        | Description
5638----------------------- | -------- | ----------- | -----------
5639name                    | Required | string      | Bdev name
5640
5641#### Example
5642
5643Example request:
5644
5645~~~json
5646{
5647  "params": {
5648    "name": "iSCSI0"
5649  },
5650  "jsonrpc": "2.0",
5651  "method": "bdev_iscsi_delete",
5652  "id": 1
5653}
5654~~~
5655
5656Example response:
5657
5658~~~json
5659{
5660  "jsonrpc": "2.0",
5661  "id": 1,
5662  "result": true
5663}
5664~~~
5665
5666### bdev_ftl_create {#rpc_bdev_ftl_create}
5667
5668Create FTL bdev.
5669
5670This RPC is subject to change.
5671
5672#### Parameters
5673
5674Name                    | Optional | Type        | Description
5675----------------------- | -------- | ----------- | -----------
5676name                    | Required | string      | Bdev name
5677base_bdev               | Required | string      | Name of the base device
5678cache                   | Required | string      | Name of the cache device
5679uuid                    | Optional | string      | UUID of restored bdev (not applicable when creating new instance)
5680core_mask               | Optional | string      | CPU core(s) possible for placement of the ftl core thread, application main thread by default
5681overprovisioning        | Optional | int         | Percentage of base device used for relocation, 20% by default
5682fast_shutdown           | Optional | bool        | When set FTL will minimize persisted data on target application shutdown and rely on shared memory during next load
5683
5684#### Result
5685
5686Name of newly created bdev.
5687
5688#### Example
5689
5690Example request:
5691
5692~~~json
5693{
5694  "params": {
5695    "name": "ftl0",
5696    "base_bdev": "nvme0n1",
5697    "cache": "nvme1n1",
5698    "uuid": "4a7481ce-786f-41a0-9b86-8f7465c8f4d3",
5699    "core_mask": "[0]",
5700    "overprovisioning": 10
5701  },
5702  "jsonrpc": "2.0",
5703  "method": "bdev_ftl_create",
5704  "id": 1
5705}
5706~~~
5707
5708Example response:
5709
5710~~~json
5711{
5712  "jsonrpc": "2.0",
5713  "id": 1,
5714  "result": {
5715      "name" : "ftl0"
5716      "uuid" : "4a7481ce-786f-41a0-9b86-8f7465c8f4d3"
5717  }
5718}
5719~~~
5720
5721### bdev_ftl_load {#rpc_bdev_ftl_load}
5722
5723Loads FTL bdev.
5724
5725This RPC is subject to change.
5726
5727#### Parameters
5728
5729Name                    | Optional | Type        | Description
5730----------------------- | -------- | ----------- | -----------
5731name                    | Required | string      | Bdev name
5732base_bdev               | Required | string      | Name of the base device
5733cache                   | Required | string      | Name of the cache device
5734uuid                    | Required | string      | UUID of restored bdev
5735core_mask               | Optional | string      | CPU core(s) possible for placement of the ftl core thread, application main thread by default
5736overprovisioning        | Optional | int         | Percentage of base device used for relocation, 20% by default
5737fast_shutdown           | Optional | bool        | When set FTL will minimize persisted data on target application shutdown and rely on shared memory during next load
5738
5739#### Result
5740
5741Name of loaded bdev.
5742
5743#### Example
5744
5745Example request:
5746
5747~~~json
5748{
5749  "params": {
5750    "name": "ftl0",
5751    "base_bdev": "nvme0n1",
5752    "cache": "nvme1n1",
5753    "uuid": "4a7481ce-786f-41a0-9b86-8f7465c8f4d3",
5754    "core_mask": "[0]",
5755    "overprovisioning": 10
5756  },
5757  "jsonrpc": "2.0",
5758  "method": "bdev_ftl_load",
5759  "id": 1
5760}
5761~~~
5762
5763Example response:
5764
5765~~~json
5766{
5767  "jsonrpc": "2.0",
5768  "id": 1,
5769  "result": {
5770      "name" : "ftl0"
5771      "uuid" : "4a7481ce-786f-41a0-9b86-8f7465c8f4d3"
5772  }
5773}
5774~~~
5775
5776### bdev_ftl_delete {#rpc_bdev_ftl_delete}
5777
5778Delete FTL bdev.
5779
5780This RPC is subject to change.
5781
5782#### Parameters
5783
5784Name                    | Optional | Type        | Description
5785----------------------- | -------- | ----------- | -----------
5786name                    | Required | string      | Bdev name
5787fast_shutdown           | Optional | bool        | When set FTL will minimize persisted data during deletion and rely on shared memory during next load
5788
5789#### Example
5790
5791Example request:
5792
5793~~~json
5794{
5795  "params": {
5796    "name": "ftl0"
5797  },
5798  "jsonrpc": "2.0",
5799  "method": "bdev_ftl_delete",
5800  "id": 1
5801}
5802~~~
5803
5804Example response:
5805
5806~~~json
5807{
5808  "jsonrpc": "2.0",
5809  "id": 1,
5810  "result": true
5811}
5812~~~
5813
5814### bdev_ftl_unload {#rpc_bdev_ftl_unload}
5815
5816Unloads FTL bdev.
5817
5818This RPC is subject to change.
5819
5820#### Parameters
5821
5822Name                    | Optional | Type        | Description
5823----------------------- | -------- | ----------- | -----------
5824name                    | Required | string      | Bdev name
5825fast_shutdown           | Optional | bool        | When set FTL will minimize persisted data during deletion and rely on shared memory during next load
5826
5827#### Example
5828
5829Example request:
5830
5831~~~json
5832{
5833  "params": {
5834    "name": "ftl0"
5835  },
5836  "jsonrpc": "2.0",
5837  "method": "bdev_ftl_unload",
5838  "id": 1
5839}
5840~~~
5841
5842Example response:
5843
5844~~~json
5845{
5846  "jsonrpc": "2.0",
5847  "id": 1,
5848  "result": true
5849}
5850~~~
5851
5852### bdev_ftl_unmap {#rpc_bdev_ftl_unmap}
5853
5854Unmap range of LBAs.
5855
5856This RPC is subject to change.
5857
5858#### Parameters
5859
5860Name                    | Optional | Type        | Description
5861----------------------- | -------- | ----------- | -----------
5862name                    | Required | string      | Bdev name
5863lba                     | Required | number      | start lba, aligned to 1024
5864num_blocks              | Required | number      | number of blocks, aligned to 1024
5865
5866#### Example
5867
5868Example request:
5869
5870~~~json
5871{
5872  "params": {
5873    "name": "ftl0"
5874    "lba": "0"
5875    "num_blocks": "1024"
5876  },
5877  "jsonrpc": "2.0",
5878  "method": "bdev_ftl_unmap",
5879  "id": 1
5880}
5881~~~
5882
5883Example response:
5884
5885~~~json
5886{
5887  "jsonrpc": "2.0",
5888  "id": 1,
5889  "result": true
5890}
5891~~~
5892
5893### bdev_ftl_get_stats {#rpc_bdev_ftl_get_stats}
5894
5895Get IO statistics for FTL bdev
5896
5897This RPC is subject to change.
5898
5899#### Parameters
5900
5901Name                    | Optional | Type        | Description
5902----------------------- | -------- | ----------- | -----------
5903name                    | Required | string      | Bdev name
5904
5905#### Response
5906
5907The response is an object containing IO statistics for an FTL instance, split into multiple subobjects:
5908
5909- `user` - contains information about number of IOs, and errors for any incoming requests,
5910- `cmp` - information about IO for the compaction process,
5911- `gc` - information about IO for the garbage collection process,
5912- `md_base` - internal metadata requests to the base FTL device,
5913- `md_nv_cache` - internal metadata requests to the cache device,
5914- `l2p` - requests done on the L2P cache region.
5915
5916Each subobject contains the following information:
5917
5918- `ios` - describes the total number of IOs requested,
5919- `blocks` - the total number of requested blocks,
5920- `errors` - describes the number of detected errors for a given operation, with the following distinctions:
5921  - `media` - media errors,
5922  - `crc` - mismatch in calculated CRC versus saved checksum in the metadata,
5923  - `other` - any other errors.
5924
5925#### Example
5926
5927Example request:
5928
5929~~~json
5930{
5931  "params": {
5932    "name": "ftl0"
5933  },
5934  "jsonrpc": "2.0",
5935  "method": "bdev_ftl_get_stats",
5936  "id": 1
5937}
5938~~~
5939
5940Example response:
5941
5942~~~json
5943{
5944  "jsonrpc": "2.0",
5945  "id": 1,
5946  "result": {
5947      "name": "ftl0",
5948      "user": {
5949        "read": {
5950          "ios": 0,
5951          "blocks": 0,
5952          "errors": {
5953            "media": 0,
5954            "crc": 0,
5955            "other": 0
5956          }
5957        },
5958        "write": {
5959          "ios": 318707,
5960          "blocks": 318707,
5961          "errors": {
5962            "media": 0,
5963            "other": 0
5964          }
5965        }
5966      },
5967      "cmp": {
5968        "read": {
5969          "ios": 0,
5970          "blocks": 0,
5971          "errors": {
5972            "media": 0,
5973            "crc": 0,
5974            "other": 0
5975          }
5976        },
5977        "write": {
5978          "ios": 0,
5979          "blocks": 0,
5980          "errors": {
5981            "media": 0,
5982            "other": 0
5983          }
5984        }
5985      },
5986      "gc": {
5987        "read": {
5988          "ios": 0,
5989          "blocks": 0,
5990          "errors": {
5991            "media": 0,
5992            "crc": 0,
5993            "other": 0
5994          }
5995        },
5996        "write": {
5997          "ios": 0,
5998          "blocks": 0,
5999          "errors": {
6000            "media": 0,
6001            "other": 0
6002          }
6003        }
6004      },
6005      "md_base": {
6006        "read": {
6007          "ios": 0,
6008          "blocks": 0,
6009          "errors": {
6010            "media": 0,
6011            "crc": 0,
6012            "other": 0
6013          }
6014        },
6015        "write": {
6016          "ios": 1,
6017          "blocks": 32,
6018          "errors": {
6019            "media": 0,
6020            "other": 0
6021          }
6022        }
6023      },
6024      "md_nv_cache": {
6025        "read": {
6026          "ios": 0,
6027          "blocks": 0,
6028          "errors": {
6029            "media": 0,
6030            "crc": 0,
6031            "other": 0
6032          }
6033        },
6034        "write": {
6035          "ios": 1064,
6036          "blocks": 1073896,
6037          "errors": {
6038            "media": 0,
6039            "other": 0
6040          }
6041        }
6042      },
6043      "l2p": {
6044        "read": {
6045          "ios": 240659,
6046          "blocks": 240659,
6047          "errors": {
6048            "media": 0,
6049            "crc": 0,
6050            "other": 0
6051          }
6052        },
6053        "write": {
6054          "ios": 235745,
6055          "blocks": 235745,
6056          "errors": {
6057            "media": 0,
6058            "other": 0
6059          }
6060        }
6061      }
6062    }
6063}
6064~~~
6065
6066### bdev_passthru_create {#rpc_bdev_passthru_create}
6067
6068Create passthru bdev. This bdev type redirects all IO to it's base bdev. It has no other purpose than being an example
6069and a starting point in development of new bdev type.
6070
6071#### Parameters
6072
6073Name                    | Optional | Type        | Description
6074----------------------- | -------- | ----------- | -----------
6075name                    | Required | string      | Bdev name
6076base_bdev_name          | Required | string      | Base bdev name
6077
6078#### Result
6079
6080Name of newly created bdev.
6081
6082#### Example
6083
6084Example request:
6085
6086~~~json
6087{
6088  "params": {
6089    "base_bdev_name": "Malloc0",
6090    "name": "Passsthru0"
6091  },
6092  "jsonrpc": "2.0",
6093  "method": "bdev_passthru_create",
6094  "id": 1
6095}
6096~~~
6097
6098Example response:
6099
6100~~~json
6101{
6102  "jsonrpc": "2.0",
6103  "id": 1,
6104  "result": "Passsthru0"
6105}
6106~~~
6107
6108### bdev_passthru_delete {#rpc_bdev_passthru_delete}
6109
6110Delete passthru bdev.
6111
6112#### Parameters
6113
6114Name                    | Optional | Type        | Description
6115----------------------- | -------- | ----------- | -----------
6116name                    | Required | string      | Bdev name
6117
6118#### Example
6119
6120Example request:
6121
6122~~~json
6123{
6124  "params": {
6125    "name": "Passsthru0"
6126  },
6127  "jsonrpc": "2.0",
6128  "method": "bdev_passthru_delete",
6129  "id": 1
6130}
6131
6132~~~
6133
6134Example response:
6135
6136~~~json
6137{
6138  "jsonrpc": "2.0",
6139  "id": 1,
6140  "result": true
6141}
6142~~~
6143
6144### bdev_xnvme_create {#rpc_bdev_xnvme_create}
6145
6146Create xnvme bdev. This bdev type redirects all IO to its underlying backend.
6147
6148#### Parameters
6149
6150Name                    | Optional | Type        | Description
6151----------------------- | -------- | ----------- | -----------
6152name                    | Required | string      | name of xNVMe bdev to create
6153filename                | Required | string      | path to device or file (ex: /dev/nvme0n1)
6154io_mechanism            | Required | string      | IO mechanism to use (ex: libaio, io_uring, io_uring_cmd, etc.)
6155conserve_cpu            | Optional | boolean     | Whether or not to conserve CPU when polling (default: false)
6156
6157#### Result
6158
6159Name of newly created bdev.
6160
6161#### Example
6162
6163Example request:
6164
6165~~~json
6166{
6167  "jsonrpc": "2.0",
6168  "method": "bdev_xnvme_create",
6169  "id": 1,
6170  "params": {
6171    "name": "bdev_ng0n1",
6172    "filename": "/dev/ng0n1",
6173    "io_mechanism": "io_uring_cmd",
6174    "conserve_cpu": false,
6175  }
6176}
6177~~~
6178
6179Example response:
6180
6181~~~json
6182{
6183  "jsonrpc": "2.0",
6184  "id": 1,
6185  "result": "bdev_ng0n1"
6186}
6187~~~
6188
6189### bdev_xnvme_delete {#rpc_bdev_xnvme_delete}
6190
6191Delete xnvme bdev.
6192
6193#### Parameters
6194
6195Name                    | Optional | Type        | Description
6196----------------------- | -------- | ----------- | -----------
6197name                    | Required | string      | name of xnvme bdev to delete
6198
6199#### Example
6200
6201Example request:
6202
6203~~~json
6204{
6205  "params": {
6206    "name": "bdev_ng0n1"
6207  },
6208  "jsonrpc": "2.0",
6209  "method": "bdev_xnvme_delete",
6210  "id": 1
6211}
6212
6213~~~
6214
6215Example response:
6216
6217~~~json
6218{
6219  "jsonrpc": "2.0",
6220  "id": 1,
6221  "result": true
6222}
6223~~~
6224
6225### bdev_virtio_attach_controller {#rpc_bdev_virtio_attach_controller}
6226
6227Create new initiator @ref bdev_config_virtio_scsi or @ref bdev_config_virtio_blk and expose all found bdevs.
6228
6229#### Parameters
6230
6231Name                    | Optional | Type        | Description
6232----------------------- | -------- | ----------- | -----------
6233name                    | Required | string      | Virtio SCSI base bdev name or Virtio Blk bdev name
6234trtype                  | Required | string      | Virtio target trtype: pci or user
6235traddr                  | Required | string      | target address: BDF or UNIX socket file path
6236dev_type                | Required | string      | Virtio device type: blk or scsi
6237vq_count                | Optional | number      | Number of queues this controller will utilize (default: 1)
6238vq_size                 | Optional | number      | Size of each queue. Must be power of 2. (default: 512)
6239
6240In case of Virtio SCSI the `name` parameter will be base name for new created bdevs. For Virtio Blk `name` will be the
6241name of created bdev.
6242
6243`vq_count` and `vq_size` parameters are valid only if `trtype` is `user`.
6244
6245#### Result
6246
6247Array of names of newly created bdevs.
6248
6249#### Example
6250
6251Example request:
6252
6253~~~json
6254{
6255  "params": {
6256    "name": "VirtioScsi0",
6257    "trtype": "user",
6258    "vq_size": 128,
6259    "dev_type": "scsi",
6260    "traddr": "/tmp/VhostScsi0",
6261    "vq_count": 4
6262  },
6263  "jsonrpc": "2.0",
6264  "method": "bdev_virtio_attach_controller",
6265  "id": 1
6266}
6267~~~
6268
6269Example response:
6270
6271~~~json
6272{
6273  "jsonrpc": "2.0",
6274  "id": 1,
6275  "result": ["VirtioScsi0t2", "VirtioScsi0t4"]
6276}
6277~~~
6278
6279### bdev_virtio_scsi_get_devices {#rpc_bdev_virtio_scsi_get_devices}
6280
6281Show information about all available Virtio SCSI devices.
6282
6283#### Parameters
6284
6285This method has no parameters.
6286
6287#### Result
6288
6289Array of Virtio SCSI information objects.
6290
6291#### Example
6292
6293Example request:
6294
6295~~~json
6296{
6297  "jsonrpc": "2.0",
6298  "method": "bdev_virtio_scsi_get_devices",
6299  "id": 1
6300}
6301~~~
6302
6303Example response:
6304
6305~~~json
6306{
6307  "jsonrpc": "2.0",
6308  "id": 1,
6309  "result": [
6310    {
6311      "name": "VirtioScsi0",
6312      "virtio": {
6313          "vq_size": 128,
6314          "vq_count": 4,
6315          "type": "user",
6316          "socket": "/tmp/VhostScsi0"
6317      }
6318    }
6319  ]
6320}
6321~~~
6322
6323### bdev_virtio_detach_controller {#rpc_bdev_virtio_detach_controller}
6324
6325Remove a Virtio device. This command can be used to remove any type of virtio device.
6326
6327#### Parameters
6328
6329Name                    | Optional | Type        | Description
6330----------------------- | -------- | ----------- | -----------
6331name                    | Required | string      | Virtio name
6332
6333#### Example
6334
6335Example request:
6336
6337~~~json
6338{
6339  "params": {
6340    "name": "VirtioUser0"
6341  },
6342  "jsonrpc": "2.0",
6343  "method": "bdev_virtio_detach_controller",
6344  "id": 1
6345}
6346
6347~~~
6348
6349Example response:
6350
6351~~~json
6352{
6353  "jsonrpc": "2.0",
6354  "id": 1,
6355  "result": true
6356}
6357~~~
6358
6359### bdev_virtio_blk_set_hotplug {#rpc_bdev_virtio_blk_set_hotplug}
6360
6361Enable/Disable the virtio blk hotplug monitor or change the monitor period time
6362
6363#### Parameters
6364
6365Name                    | Optional | Type        | Description
6366----------------------- | -------- | ----------- | -----------
6367enable                  | Required | bool        | Enable or disable the virtio blk hotplug monitor
6368period-us               | Optional | number      | The period time of the monitor
6369
6370When the enable is true then the period-us is optional. If user don't set the period time then use the default
6371value. When the enable is false then the period-us is not required.
6372
6373#### Result
6374
6375True the rpc is successful otherwise false
6376
6377#### Example
6378
6379Example request:
6380
6381~~~json
6382{
6383  "params": {
6384    "enable": "true",
6385    "period-us": "1000000"
6386  },
6387  "jsonrpc": "2.0",
6388  "method": "bdev_virtio_blk_set_hotplug",
6389  "id": 1
6390}
6391~~~
6392
6393Example response:
6394
6395~~~json
6396{
6397  "jsonrpc": "2.0",
6398  "id": 1,
6399  "result": true
6400}
6401~~~
6402
6403## iSCSI Target {#jsonrpc_components_iscsi_tgt}
6404
6405### iscsi_set_options method {#rpc_iscsi_set_options}
6406
6407Set global parameters for iSCSI targets.
6408
6409This RPC may only be called before SPDK subsystems have been initialized. This RPC can be called only once.
6410
6411#### Parameters
6412
6413Name                            | Optional | Type    | Description
6414------------------------------- | -------- | ------- | -----------
6415auth_file                       | Optional | string  | Path to CHAP shared secret file (default: "")
6416node_base                       | Optional | string  | Prefix of the name of iSCSI target node (default: "iqn.2016-06.io.spdk")
6417nop_timeout                     | Optional | number  | Timeout in seconds to nop-in request to the initiator (default: 60)
6418nop_in_interval                 | Optional | number  | Time interval in secs between nop-in requests by the target (default: 30)
6419disable_chap                    | Optional | boolean | CHAP for discovery session should be disabled (default: `false`)
6420require_chap                    | Optional | boolean | CHAP for discovery session should be required (default: `false`)
6421mutual_chap                     | Optional | boolean | CHAP for discovery session should be unidirectional (`false`) or bidirectional (`true`) (default: `false`)
6422chap_group                      | Optional | number  | CHAP group ID for discovery session (default: 0)
6423max_sessions                    | Optional | number  | Maximum number of sessions in the host (default: 128)
6424max_queue_depth                 | Optional | number  | Maximum number of outstanding I/Os per queue (default: 64)
6425max_connections_per_session     | Optional | number  | Session specific parameter, MaxConnections (default: 2)
6426default_time2wait               | Optional | number  | Session specific parameter, DefaultTime2Wait (default: 2)
6427default_time2retain             | Optional | number  | Session specific parameter, DefaultTime2Retain (default: 20)
6428first_burst_length              | Optional | number  | Session specific parameter, FirstBurstLength (default: 8192)
6429immediate_data                  | Optional | boolean | Session specific parameter, ImmediateData (default: `true`)
6430error_recovery_level            | Optional | number  | Session specific parameter, ErrorRecoveryLevel (default: 0)
6431allow_duplicated_isid           | Optional | boolean | Allow duplicated initiator session ID (default: `false`)
6432max_large_datain_per_connection | Optional | number  | Max number of outstanding split read I/Os per connection (default: 64)
6433max_r2t_per_connection          | Optional | number  | Max number of outstanding R2Ts per connection (default: 4)
6434pdu_pool_size                   | Optional | number  | Number of PDUs in the pool (default: approximately 2 * max_sessions * (max_queue_depth + max_connections_per_session))
6435immediate_data_pool_size        | Optional | number  | Number of immediate data buffers in the pool (default: 128 * max_sessions)
6436data_out_pool_size              | Optional | number  | Number of data out buffers in the pool (default: 16 * max_sessions)
6437
6438To load CHAP shared secret file, its path is required to specify explicitly in the parameter `auth_file`.
6439
6440Parameters `disable_chap` and `require_chap` are mutually exclusive. Parameters `no_discovery_auth`, `req_discovery_auth`,
6441`req_discovery_auth_mutual`, and `discovery_auth_group` are still available instead of `disable_chap`, `require_chap`,
6442`mutual_chap`, and `chap_group`, respectivey but will be removed in future releases.
6443
6444#### Example
6445
6446Example request:
6447
6448~~~json
6449{
6450  "params": {
6451    "allow_duplicated_isid": true,
6452    "default_time2retain": 60,
6453    "first_burst_length": 8192,
6454    "immediate_data": true,
6455    "node_base": "iqn.2016-06.io.spdk",
6456    "max_sessions": 128,
6457    "nop_timeout": 30,
6458    "nop_in_interval": 30,
6459    "auth_file": "/usr/local/etc/spdk/auth.conf",
6460    "disable_chap": true,
6461    "default_time2wait": 2
6462  },
6463  "jsonrpc": "2.0",
6464  "method": "iscsi_set_options",
6465  "id": 1
6466}
6467~~~
6468
6469Example response:
6470
6471~~~json
6472{
6473  "jsonrpc": "2.0",
6474  "id": 1,
6475  "result": true
6476}
6477~~~
6478
6479### iscsi_get_options method {#rpc_iscsi_get_options}
6480
6481Show global parameters of iSCSI targets.
6482
6483#### Parameters
6484
6485This method has no parameters.
6486
6487#### Example
6488
6489Example request:
6490
6491~~~json
6492request:
6493{
6494  "jsonrpc": "2.0",
6495  "method": "iscsi_get_options",
6496  "id": 1
6497}
6498~~~
6499
6500Example response:
6501
6502~~~json
6503{
6504  "jsonrpc": "2.0",
6505  "id": 1,
6506  "result": {
6507    "allow_duplicated_isid": true,
6508    "default_time2retain": 60,
6509    "first_burst_length": 8192,
6510    "immediate_data": true,
6511    "node_base": "iqn.2016-06.io.spdk",
6512    "mutual_chap": false,
6513    "nop_in_interval": 30,
6514    "chap_group": 0,
6515    "max_connections_per_session": 2,
6516    "max_queue_depth": 64,
6517    "nop_timeout": 30,
6518    "max_sessions": 128,
6519    "error_recovery_level": 0,
6520    "auth_file": "/usr/local/etc/spdk/auth.conf",
6521    "disable_chap": true,
6522    "default_time2wait": 2,
6523    "require_chap": false,
6524    "max_large_datain_per_connection": 64,
6525    "max_r2t_per_connection": 4
6526  }
6527}
6528~~~
6529
6530### scsi_get_devices {#rpc_scsi_get_devices}
6531
6532Display SCSI devices
6533
6534#### Parameters
6535
6536This method has no parameters.
6537
6538#### Example
6539
6540Example request:
6541
6542~~~json
6543{
6544  "jsonrpc": "2.0",
6545  "method": "scsi_get_devices",
6546  "id": 1
6547}
6548~~~
6549
6550Example response:
6551
6552~~~json
6553{
6554  "jsonrpc": "2.0",
6555  "id": 1,
6556  "result": [
6557    {
6558      "id": 0,
6559      "device_name": "iqn.2016-06.io.spdk:Target3"
6560    }
6561  ]
6562}
6563~~~
6564
6565### iscsi_set_discovery_auth method {#rpc_iscsi_set_discovery_auth}
6566
6567Set CHAP authentication for sessions dynamically.
6568
6569#### Parameters
6570
6571Name                        | Optional | Type    | Description
6572--------------------------- | -------- | --------| -----------
6573disable_chap                | Optional | boolean | CHAP for discovery session should be disabled (default: `false`)
6574require_chap                | Optional | boolean | CHAP for discovery session should be required (default: `false`)
6575mutual_chap                 | Optional | boolean | CHAP for discovery session should be unidirectional (`false`) or bidirectional (`true`) (default: `false`)
6576chap_group                  | Optional | number  | CHAP group ID for discovery session (default: 0)
6577
6578Parameters `disable_chap` and `require_chap` are mutually exclusive.
6579
6580#### Example
6581
6582Example request:
6583
6584~~~json
6585request:
6586{
6587  "params": {
6588    "chap_group": 1,
6589    "require_chap": true,
6590    "mutual_chap": true
6591  },
6592  "jsonrpc": "2.0",
6593  "method": "iscsi_set_discovery_auth",
6594  "id": 1
6595}
6596~~~
6597
6598Example response:
6599
6600~~~json
6601{
6602  "jsonrpc": "2.0",
6603  "id": 1,
6604  "result": true
6605}
6606~~~
6607
6608### iscsi_create_auth_group method {#rpc_iscsi_create_auth_group}
6609
6610Create an authentication group for CHAP authentication.
6611
6612#### Parameters
6613
6614Name                        | Optional | Type    | Description
6615--------------------------- | -------- | --------| -----------
6616tag                         | Required | number  | Authentication group tag (unique, integer > 0)
6617secrets                     | Optional | array   | Array of @ref rpc_iscsi_create_auth_group_secret objects
6618
6619#### secret {#rpc_iscsi_create_auth_group_secret}
6620
6621Name                        | Optional | Type    | Description
6622--------------------------- | ---------| --------| -----------
6623user                        | Required | string  | Unidirectional CHAP name
6624secret                      | Required | string  | Unidirectional CHAP secret
6625muser                       | Optional | string  | Bidirectional CHAP name
6626msecret                     | Optional | string  | Bidirectional CHAP secret
6627
6628#### Example
6629
6630Example request:
6631
6632~~~json
6633{
6634  "params": {
6635    "secrets": [
6636      {
6637        "muser": "mu1",
6638        "secret": "s1",
6639        "user": "u1",
6640        "msecret": "ms1"
6641      }
6642    ],
6643    "tag": 2
6644  },
6645  "jsonrpc": "2.0",
6646  "method": "iscsi_create_auth_group",
6647  "id": 1
6648}
6649~~~
6650
6651Example response:
6652
6653~~~json
6654{
6655  "jsonrpc": "2.0",
6656  "id": 1,
6657  "result": true
6658}
6659~~~
6660
6661### iscsi_delete_auth_group method {#rpc_iscsi_delete_auth_group}
6662
6663Delete an existing authentication group for CHAP authentication.
6664
6665#### Parameters
6666
6667Name                        | Optional | Type    | Description
6668--------------------------- | -------- | --------| -----------
6669tag                         | Required | number  | Authentication group tag (unique, integer > 0)
6670
6671#### Example
6672
6673Example request:
6674
6675~~~json
6676{
6677  "params": {
6678    "tag": 2
6679  },
6680  "jsonrpc": "2.0",
6681  "method": "iscsi_delete_auth_group",
6682  "id": 1
6683}
6684~~~
6685
6686Example response:
6687
6688~~~json
6689{
6690  "jsonrpc": "2.0",
6691  "id": 1,
6692  "result": true
6693}
6694~~~
6695
6696### iscsi_get_auth_groups {#rpc_iscsi_get_auth_groups}
6697
6698Show information about all existing authentication group for CHAP authentication.
6699
6700#### Parameters
6701
6702This method has no parameters.
6703
6704#### Result
6705
6706Array of objects describing authentication group.
6707
6708Name                        | Type    | Description
6709--------------------------- | --------| -----------
6710tag                         | number  | Authentication group tag
6711secrets                     | array   | Array of @ref rpc_iscsi_create_auth_group_secret objects
6712
6713#### Example
6714
6715Example request:
6716
6717~~~json
6718{
6719  "jsonrpc": "2.0",
6720  "method": "iscsi_get_auth_groups",
6721  "id": 1
6722}
6723~~~
6724
6725Example response:
6726
6727~~~json
6728{
6729  "jsonrpc": "2.0",
6730  "id": 1,
6731  "result": [
6732    {
6733      "secrets": [
6734        {
6735          "muser": "mu1",
6736          "secret": "s1",
6737          "user": "u1",
6738          "msecret": "ms1"
6739        }
6740      ],
6741      "tag": 1
6742    },
6743    {
6744      "secrets": [
6745        {
6746          "secret": "s2",
6747          "user": "u2"
6748        }
6749      ],
6750      "tag": 2
6751    }
6752  ]
6753}
6754~~~
6755
6756### iscsi_auth_group_add_secret {#rpc_iscsi_auth_group_add_secret}
6757
6758Add a secret to an existing authentication group for CHAP authentication.
6759
6760#### Parameters
6761
6762Name                        | Optional | Type    | Description
6763--------------------------- | -------- | --------| -----------
6764tag                         | Required | number  | Authentication group tag (unique, integer > 0)
6765user                        | Required | string  | Unidirectional CHAP name
6766secret                      | Required | string  | Unidirectional CHAP secret
6767muser                       | Optional | string  | Bidirectional CHAP name
6768msecret                     | Optional | string  | Bidirectional CHAP secret
6769
6770#### Example
6771
6772Example request:
6773
6774~~~json
6775{
6776  "params": {
6777    "muser": "mu3",
6778    "secret": "s3",
6779    "tag": 2,
6780    "user": "u3",
6781    "msecret": "ms3"
6782  },
6783  "jsonrpc": "2.0",
6784  "method": "iscsi_auth_group_add_secret",
6785  "id": 1
6786}
6787~~~json
6788
6789Example response:
6790
6791~~~json
6792{
6793  "jsonrpc": "2.0",
6794  "id": 1,
6795  "result": true
6796}
6797~~~
6798
6799### iscsi_auth_group_remove_secret {#rpc_iscsi_auth_group_remove_secret}
6800
6801Remove a secret from an existing authentication group for CHAP authentication.
6802
6803#### Parameters
6804
6805Name                        | Optional | Type    | Description
6806--------------------------- | -------- | --------| -----------
6807tag                         | Required | number  | Authentication group tag (unique, integer > 0)
6808user                        | Required | string  | Unidirectional CHAP name
6809
6810#### Example
6811
6812Example request:
6813
6814~~~json
6815{
6816  "params": {
6817    "tag": 2,
6818    "user": "u3"
6819  },
6820  "jsonrpc": "2.0",
6821  "method": "iscsi_auth_group_remove_secret",
6822  "id": 1
6823}
6824~~~
6825
6826Example response:
6827
6828~~~json
6829{
6830  "jsonrpc": "2.0",
6831  "id": 1,
6832  "result": true
6833}
6834~~~
6835
6836### iscsi_get_initiator_groups method {#rpc_iscsi_get_initiator_groups}
6837
6838Show information about all available initiator groups.
6839
6840#### Parameters
6841
6842This method has no parameters.
6843
6844#### Result
6845
6846Array of objects describing initiator groups.
6847
6848Name                        | Type    | Description
6849--------------------------- | --------| -----------
6850tag                         | number  | Initiator group tag
6851initiators                  | array   | Array of initiator hostnames or IP addresses
6852netmasks                    | array   | Array of initiator netmasks
6853
6854#### Example
6855
6856Example request:
6857
6858~~~json
6859{
6860  "jsonrpc": "2.0",
6861  "method": "iscsi_get_initiator_groups",
6862  "id": 1
6863}
6864~~~
6865
6866Example response:
6867
6868~~~json
6869{
6870  "jsonrpc": "2.0",
6871  "id": 1,
6872  "result": [
6873    {
6874      "initiators": [
6875        "iqn.2016-06.io.spdk:host1",
6876        "iqn.2016-06.io.spdk:host2"
6877      ],
6878      "tag": 1,
6879      "netmasks": [
6880        "192.168.1.0/24"
6881      ]
6882    }
6883  ]
6884}
6885~~~
6886
6887### iscsi_create_initiator_group method {#rpc_iscsi_create_initiator_group}
6888
6889Add an initiator group.
6890
6891#### Parameters
6892
6893Name                        | Optional | Type    | Description
6894--------------------------- | -------- | --------| -----------
6895tag                         | Required | number  | Initiator group tag (unique, integer > 0)
6896initiators                  | Required | array   | Not empty array of initiator hostnames or IP addresses
6897netmasks                    | Required | array   | Not empty array of initiator netmasks
6898
6899#### Example
6900
6901Example request:
6902
6903~~~json
6904{
6905  "params": {
6906    "initiators": [
6907      "iqn.2016-06.io.spdk:host1",
6908      "iqn.2016-06.io.spdk:host2"
6909    ],
6910    "tag": 1,
6911    "netmasks": [
6912      "192.168.1.0/24"
6913    ]
6914  },
6915  "jsonrpc": "2.0",
6916  "method": "iscsi_create_initiator_group",
6917  "id": 1
6918}
6919~~~
6920
6921Example response:
6922
6923~~~json
6924response:
6925{
6926  "jsonrpc": "2.0",
6927  "id": 1,
6928  "result": true
6929}
6930~~~
6931
6932### iscsi_delete_initiator_group method {#rpc_iscsi_delete_initiator_group}
6933
6934Delete an existing initiator group.
6935
6936#### Parameters
6937
6938Name                        | Optional | Type    | Description
6939--------------------------- | -------- | --------| -----------
6940tag                         | Required | number  | Initiator group tag (unique, integer > 0)
6941
6942#### Example
6943
6944Example request:
6945
6946~~~json
6947{
6948  "params": {
6949    "tag": 1
6950  },
6951  "jsonrpc": "2.0",
6952  "method": "iscsi_delete_initiator_group",
6953  "id": 1
6954}
6955~~~
6956
6957Example response:
6958
6959~~~json
6960{
6961  "jsonrpc": "2.0",
6962  "id": 1,
6963  "result": true
6964}
6965~~~
6966
6967### iscsi_initiator_group_add_initiators method {#rpc_iscsi_initiator_group_add_initiators}
6968
6969Add initiators to an existing initiator group.
6970
6971#### Parameters
6972
6973Name                        | Optional | Type    | Description
6974--------------------------- | -------- | --------| -----------
6975tag                         | Required | number  | Existing initiator group tag.
6976initiators                  | Optional | array   | Array of initiator hostnames or IP addresses
6977netmasks                    | Optional | array   | Array of initiator netmasks
6978
6979#### Example
6980
6981Example request:
6982
6983~~~json
6984request:
6985{
6986  "params": {
6987    "initiators": [
6988      "iqn.2016-06.io.spdk:host3"
6989    ],
6990    "tag": 1,
6991    "netmasks": [
6992      "255.255.255.1"
6993    ]
6994  },
6995  "jsonrpc": "2.0",
6996  "method": "iscsi_initiator_group_add_initiators",
6997  "id": 1
6998}
6999~~~
7000
7001Example response:
7002
7003~~~json
7004response:
7005{
7006  "jsonrpc": "2.0",
7007  "id": 1,
7008  "result": true
7009}
7010~~~
7011
7012### iscsi_initiator_group_remove_initiators method {#rpc_iscsi_initiator_group_remove_initiators}
7013
7014Remove initiators from an initiator group.
7015
7016#### Parameters
7017
7018Name                        | Optional | Type    | Description
7019--------------------------- | -------- | --------| -----------
7020tag                         | Required | number  | Existing initiator group tag.
7021initiators                  | Optional | array   | Array of initiator hostnames or IP addresses
7022netmasks                    | Optional | array   | Array of initiator netmasks
7023
7024#### Example
7025
7026Example request:
7027
7028~~~json
7029request:
7030{
7031  "params": {
7032    "initiators": [
7033      "iqn.2016-06.io.spdk:host3"
7034    ],
7035    "tag": 1,
7036    "netmasks": [
7037      "255.255.255.1"
7038    ]
7039  },
7040  "jsonrpc": "2.0",
7041  "method": "iscsi_initiator_group_remove_initiators",
7042  "id": 1
7043}
7044~~~
7045
7046Example response:
7047
7048~~~json
7049response:
7050{
7051  "jsonrpc": "2.0",
7052  "id": 1,
7053  "result": true
7054}
7055~~~
7056
7057### iscsi_get_target_nodes method {#rpc_iscsi_get_target_nodes}
7058
7059Show information about all available iSCSI target nodes.
7060
7061#### Parameters
7062
7063This method has no parameters.
7064
7065#### Result
7066
7067Array of objects describing target node.
7068
7069Name                        | Type    | Description
7070--------------------------- | --------| -----------
7071name                        | string  | Target node name (ASCII)
7072alias_name                  | string  | Target node alias name (ASCII)
7073pg_ig_maps                  | array   | Array of Portal_Group_Tag:Initiator_Group_Tag mappings
7074luns                        | array   | Array of Bdev names to LUN ID mappings
7075queue_depth                 | number  | Target queue depth
7076disable_chap                | boolean | CHAP authentication should be disabled for this target
7077require_chap                | boolean | CHAP authentication should be required for this target
7078mutual_chap                 | boolean | CHAP authentication should be bidirectional (`true`) or unidirectional (`false`)
7079chap_group                  | number  | Authentication group ID for this target node
7080header_digest               | boolean | Header Digest should be required for this target node
7081data_digest                 | boolean | Data Digest should be required for this target node
7082
7083#### Example
7084
7085Example request:
7086
7087~~~json
7088{
7089  "jsonrpc": "2.0",
7090  "method": "iscsi_get_target_nodes",
7091  "id": 1
7092}
7093~~~
7094
7095Example response:
7096
7097~~~json
7098{
7099  "jsonrpc": "2.0",
7100  "id": 1,
7101  "result": [
7102    {
7103      "luns": [
7104        {
7105          "lun_id": 0,
7106          "bdev_name": "Nvme0n1"
7107        }
7108      ],
7109      "mutual_chap": false,
7110      "name": "iqn.2016-06.io.spdk:target1",
7111      "alias_name": "iscsi-target1-alias",
7112      "require_chap": false,
7113      "chap_group": 0,
7114      "pg_ig_maps": [
7115        {
7116          "ig_tag": 1,
7117          "pg_tag": 1
7118        }
7119      ],
7120      "data_digest": false,
7121      "disable_chap": false,
7122      "header_digest": false,
7123      "queue_depth": 64
7124    }
7125  ]
7126}
7127~~~
7128
7129### iscsi_create_target_node method {#rpc_iscsi_create_target_node}
7130
7131Add an iSCSI target node.
7132
7133#### Parameters
7134
7135Name                        | Optional | Type    | Description
7136--------------------------- | -------- | --------| -----------
7137name                        | Required | string  | Target node name (ASCII)
7138alias_name                  | Required | string  | Target node alias name (ASCII)
7139pg_ig_maps                  | Required | array   | Array of (Portal_Group_Tag:Initiator_Group_Tag) mappings
7140luns                        | Required | array   | Array of Bdev names to LUN ID mappings
7141queue_depth                 | Required | number  | Target queue depth
7142disable_chap                | Optional | boolean | CHAP authentication should be disabled for this target
7143require_chap                | Optional | boolean | CHAP authentication should be required for this target
7144mutual_chap                 | Optional | boolean | CHAP authentication should be bidirectional (`true`) or unidirectional (`false`)
7145chap_group                  | Optional | number  | Authentication group ID for this target node
7146header_digest               | Optional | boolean | Header Digest should be required for this target node
7147data_digest                 | Optional | boolean | Data Digest should be required for this target node
7148
7149Parameters `disable_chap` and `require_chap` are mutually exclusive.
7150
7151#### Example
7152
7153Example request:
7154
7155~~~json
7156{
7157  "params": {
7158    "luns": [
7159      {
7160        "lun_id": 0,
7161        "bdev_name": "Nvme0n1"
7162      }
7163    ],
7164    "mutual_chap": true,
7165    "name": "target2",
7166    "alias_name": "iscsi-target2-alias",
7167    "pg_ig_maps": [
7168      {
7169        "ig_tag": 1,
7170        "pg_tag": 1
7171      },
7172      {
7173        "ig_tag": 2,
7174        "pg_tag": 2
7175      }
7176    ],
7177    "data_digest": true,
7178    "disable_chap": true,
7179    "header_digest": true,
7180    "queue_depth": 24
7181  },
7182  "jsonrpc": "2.0",
7183  "method": "iscsi_create_target_node",
7184  "id": 1
7185}
7186~~~
7187
7188Example response:
7189
7190~~~json
7191{
7192  "jsonrpc": "2.0",
7193  "id": 1,
7194  "result": true
7195}
7196~~~
7197
7198### iscsi_target_node_set_auth method {#rpc_iscsi_target_node_set_auth}
7199
7200Set CHAP authentication to an existing iSCSI target node.
7201
7202#### Parameters
7203
7204Name                        | Optional | Type    | Description
7205--------------------------- | -------- | --------| -----------
7206name                        | Required | string  | Target node name (ASCII)
7207disable_chap                | Optional | boolean | CHAP authentication should be disabled for this target
7208require_chap                | Optional | boolean | CHAP authentication should be required for this target
7209mutual_chap                 | Optional | boolean | CHAP authentication should be bidirectional (`true`) or unidirectional (`false`)
7210chap_group                  | Optional | number  | Authentication group ID for this target node
7211
7212Parameters `disable_chap` and `require_chap` are mutually exclusive.
7213
7214#### Example
7215
7216Example request:
7217
7218~~~json
7219{
7220  "params": {
7221    "chap_group": 1,
7222    "require_chap": true,
7223    "name": "iqn.2016-06.io.spdk:target1",
7224    "mutual_chap": true
7225  },
7226  "jsonrpc": "2.0",
7227  "method": "iscsi_target_node_set_auth",
7228  "id": 1
7229}
7230~~~
7231
7232Example response:
7233
7234~~~json
7235{
7236  "jsonrpc": "2.0",
7237  "id": 1,
7238  "result": true
7239}
7240~~~
7241
7242### iscsi_target_node_add_pg_ig_maps method {#rpc_iscsi_target_node_add_pg_ig_maps}
7243
7244Add initiator group to portal group mappings to an existing iSCSI target node.
7245
7246#### Parameters
7247
7248Name                        | Optional | Type    | Description
7249--------------------------- | -------- | --------| -----------
7250name                        | Required | string  | Target node name (ASCII)
7251pg_ig_maps                  | Required | array   | Not empty array of initiator to portal group mappings objects
7252
7253Portal to Initiator group mappings object:
7254
7255Name                        | Optional | Type    | Description
7256--------------------------- | -------- | --------| -----------
7257ig_tag                      | Required | number  | Existing initiator group tag
7258pg_tag                      | Required | number  | Existing portal group tag
7259
7260#### Example
7261
7262Example request:
7263
7264~~~json
7265{
7266  "params": {
7267    "pg_ig_maps": [
7268      {
7269        "ig_tag": 1,
7270        "pg_tag": 1
7271      },
7272      {
7273        "ig_tag": 2,
7274        "pg_tag": 2
7275      },
7276      {
7277        "ig_tag": 3,
7278        "pg_tag": 3
7279      }
7280    ],
7281    "name": "iqn.2016-06.io.spdk:target3"
7282  },
7283  "jsonrpc": "2.0",
7284  "method": "iscsi_target_node_add_pg_ig_maps",
7285  "id": 1
7286}
7287~~~
7288
7289Example response:
7290
7291~~~json
7292{
7293  "jsonrpc": "2.0",
7294  "id": 1,
7295  "result": true
7296}
7297~~~
7298
7299### iscsi_target_node_remove_pg_ig_maps method {#rpc_iscsi_target_node_remove_pg_ig_maps}
7300
7301Delete initiator group to portal group mappings from an existing iSCSI target node.
7302
7303#### Parameters
7304
7305Name                        | Optional | Type    | Description
7306--------------------------- | -------- | --------| -----------
7307name                        | Required | string  | Target node name (ASCII)
7308pg_ig_maps                  | Required | array   | Not empty array of Portal to Initiator group mappings objects
7309
7310Portal to Initiator group mappings object:
7311
7312Name                        | Optional | Type    | Description
7313--------------------------- | -------- | --------| -----------
7314ig_tag                      | Required | number  | Existing initiator group tag
7315pg_tag                      | Required | number  | Existing portal group tag
7316
7317#### Example
7318
7319Example request:
7320
7321~~~json
7322{
7323  "params": {
7324    "pg_ig_maps": [
7325      {
7326        "ig_tag": 1,
7327        "pg_tag": 1
7328      },
7329      {
7330        "ig_tag": 2,
7331        "pg_tag": 2
7332      },
7333      {
7334        "ig_tag": 3,
7335        "pg_tag": 3
7336      }
7337    ],
7338    "name": "iqn.2016-06.io.spdk:target3"
7339  },
7340  "jsonrpc": "2.0",
7341  "method": "iscsi_target_node_remove_pg_ig_maps",
7342  "id": 1
7343}
7344~~~
7345
7346Example response:
7347
7348~~~json
7349{
7350  "jsonrpc": "2.0",
7351  "id": 1,
7352  "result": true
7353}
7354~~~
7355
7356### iscsi_delete_target_node method {#rpc_iscsi_delete_target_node}
7357
7358Delete an iSCSI target node.
7359
7360#### Parameters
7361
7362Name                        | Optional | Type    | Description
7363--------------------------- | -------- | --------| -----------
7364name                        | Required | string  | Target node name (ASCII)
7365
7366#### Example
7367
7368Example request:
7369
7370~~~json
7371{
7372  "params": {
7373    "name": "iqn.2016-06.io.spdk:target1"
7374  },
7375  "jsonrpc": "2.0",
7376  "method": "iscsi_delete_target_node",
7377  "id": 1
7378}
7379~~~
7380
7381Example response:
7382
7383~~~json
7384{
7385  "jsonrpc": "2.0",
7386  "id": 1,
7387  "result": true
7388}
7389~~~
7390
7391### iscsi_get_portal_groups method {#rpc_iscsi_get_portal_groups}
7392
7393Show information about all available portal groups.
7394
7395#### Parameters
7396
7397This method has no parameters.
7398
7399#### Example
7400
7401Example request:
7402
7403~~~json
7404request:
7405{
7406  "jsonrpc": "2.0",
7407  "method": "iscsi_get_portal_groups",
7408  "id": 1
7409}
7410~~~
7411
7412Example response:
7413
7414~~~json
7415{
7416  "jsonrpc": "2.0",
7417  "id": 1,
7418  "result": [
7419    {
7420      "portals": [
7421        {
7422          "host": "127.0.0.1",
7423          "port": "3260"
7424        }
7425      ],
7426      "tag": 1,
7427      "private": false
7428    }
7429  ]
7430}
7431~~~
7432
7433### iscsi_create_portal_group method {#rpc_iscsi_create_portal_group}
7434
7435Add a portal group.
7436
7437#### Parameters
7438
7439Name                        | Optional | Type    | Description
7440--------------------------- | -------- | --------| -----------
7441tag                         | Required | number  | Portal group tag
7442portals                     | Required | array   | Not empty array of portals
7443private                     | Optional | boolean | When true, portals in this group are not returned by a discovery session. Used for login redirection. (default: `false`)
7444wait                        | Optional | boolean | When true, do not listen on portals until it is started explicitly. (default: `false`)
7445
7446Portal object
7447
7448Name                        | Optional | Type    | Description
7449--------------------------- | -------- | --------| -----------
7450host                        | Required | string  | Hostname or IP address
7451port                        | Required | string  | Port number
7452
7453#### Example
7454
7455Example request:
7456
7457~~~json
7458{
7459  "params": {
7460    "portals": [
7461      {
7462        "host": "127.0.0.1",
7463        "port": "3260"
7464      }
7465    ],
7466    "tag": 1
7467  },
7468  "jsonrpc": "2.0",
7469  "method": "iscsi_create_portal_group",
7470  "id": 1
7471}
7472~~~
7473
7474Example response:
7475
7476~~~json
7477{
7478  "jsonrpc": "2.0",
7479  "id": 1,
7480  "result": true
7481}
7482~~~
7483
7484### iscsi_start_portal_group method {#rpc_iscsi_start_portal_group}
7485
7486Start listening on portals if the portal group is not started yet, or do nothing
7487if the portal group already started. Return a success response for both cases.
7488
7489#### Parameters
7490
7491Name                        | Optional | Type    | Description
7492--------------------------- | -------- | --------| -----------
7493tag                         | Required | number  | Existing portal group tag
7494
7495#### Example
7496
7497Example request:
7498
7499~~~json
7500{
7501  "params": {
7502    "tag": 1
7503  },
7504  "jsonrpc": "2.0",
7505  "method": "iscsi_start_portal_group",
7506  "id": 1
7507}
7508~~~
7509
7510Example response:
7511
7512~~~json
7513{
7514  "jsonrpc": "2.0",
7515  "id": 1,
7516  "result": true
7517}
7518~~~
7519
7520### iscsi_delete_portal_group method {#rpc_iscsi_delete_portal_group}
7521
7522Delete an existing portal group.
7523
7524#### Parameters
7525
7526Name                        | Optional | Type    | Description
7527--------------------------- | -------- | --------| -----------
7528tag                         | Required | number  | Existing portal group tag
7529
7530#### Example
7531
7532Example request:
7533
7534~~~json
7535{
7536  "params": {
7537    "tag": 1
7538  },
7539  "jsonrpc": "2.0",
7540  "method": "iscsi_delete_portal_group",
7541  "id": 1
7542}
7543~~~
7544
7545Example response:
7546
7547~~~json
7548{
7549  "jsonrpc": "2.0",
7550  "id": 1,
7551  "result": true
7552}
7553~~~
7554
7555### iscsi_portal_group_set_auth method {#rpc_iscsi_portal_group_set_auth}
7556
7557Set CHAP authentication for discovery sessions specific for the existing iSCSI portal group.
7558This RPC overwrites the setting by the global parameters for the iSCSI portal group.
7559
7560#### Parameters
7561
7562Name                        | Optional | Type    | Description
7563--------------------------- | -------- | --------| -----------
7564disable_chap                | Optional | boolean | CHAP for discovery session should be disabled (default: `false`)
7565require_chap                | Optional | boolean | CHAP for discovery session should be required (default: `false`)
7566mutual_chap                 | Optional | boolean | CHAP for discovery session should be unidirectional (`false`) or bidirectional (`true`) (default: `false`)
7567chap_group                  | Optional | number  | CHAP group ID for discovery session (default: 0)
7568
7569Parameters `disable_chap` and `require_chap` are mutually exclusive.
7570
7571#### Example
7572
7573Example request:
7574
7575~~~json
7576request:
7577{
7578  "params": {
7579    "tag": 1,
7580    "chap_group": 1,
7581    "require_chap": true,
7582    "mutual_chap": true
7583  },
7584  "jsonrpc": "2.0",
7585  "method": "iscsi_portal_group_set_auth",
7586  "id": 1
7587}
7588~~~
7589
7590Example response:
7591
7592~~~json
7593{
7594  "jsonrpc": "2.0",
7595  "id": 1,
7596  "result": true
7597}
7598~~~
7599
7600### iscsi_get_connections method {#rpc_iscsi_get_connections}
7601
7602Show information about all active connections.
7603
7604#### Parameters
7605
7606This method has no parameters.
7607
7608#### Results
7609
7610Array of objects describing iSCSI connection.
7611
7612Name                        | Type    | Description
7613--------------------------- | --------| -----------
7614id                          | number  | Index (used for TTT - Target Transfer Tag)
7615cid                         | number  | CID (Connection ID)
7616tsih                        | number  | TSIH (Target Session Identifying Handle)
7617lcore_id                    | number  | Core number on which the iSCSI connection runs
7618initiator_addr              | string  | Initiator address
7619target_addr                 | string  | Target address
7620target_node_name            | string  | Target node name (ASCII) without prefix
7621
7622#### Example
7623
7624Example request:
7625
7626~~~json
7627{
7628  "jsonrpc": "2.0",
7629  "method": "iscsi_get_connections",
7630  "id": 1
7631}
7632~~~
7633
7634Example response:
7635
7636~~~json
7637{
7638  "jsonrpc": "2.0",
7639  "id": 1,
7640  "result": [
7641    {
7642      "tsih": 4,
7643      "cid": 0,
7644      "target_node_name": "target1",
7645      "lcore_id": 0,
7646      "initiator_addr": "10.0.0.2",
7647      "target_addr": "10.0.0.1",
7648      "id": 0
7649    }
7650  ]
7651}
7652~~~
7653
7654### iscsi_target_node_add_lun method {#rpc_iscsi_target_node_add_lun}
7655
7656Add an LUN to an existing iSCSI target node.
7657
7658#### Parameters
7659
7660Name                        | Optional | Type    | Description
7661--------------------------- | -------- | --------| -----------
7662name                        | Required | string  | Target node name (ASCII)
7663bdev_name                   | Required | string  | bdev name to be added as a LUN
7664lun_id                      | Optional | number  | LUN ID (default: first free ID)
7665
7666#### Example
7667
7668Example request:
7669
7670~~~json
7671{
7672  "params": {
7673    "lun_id": 2,
7674    "name": "iqn.2016-06.io.spdk:target1",
7675    "bdev_name": "Malloc0"
7676  },
7677  "jsonrpc": "2.0",
7678  "method": "iscsi_target_node_add_lun",
7679  "id": 1
7680}
7681~~~
7682
7683Example response:
7684
7685~~~json
7686{
7687  "jsonrpc": "2.0",
7688  "id": 1,
7689  "result": true
7690}
7691~~~
7692
7693### iscsi_target_node_set_redirect method {#rpc_iscsi_target_node_set_redirect}
7694
7695Update redirect portal of the primary portal group for the target node,
7696
7697#### Parameters
7698
7699Name                        | Optional | Type    | Description
7700--------------------------- | -------- | --------| -----------
7701name                        | Required | string  | Target node name (ASCII)
7702pg_tag                      | Required | number  | Existing portal group tag
7703redirect_host               | Optional | string  | Numeric IP address to which the target node is redirected
7704redirect_port               | Optional | string  | Numeric TCP port to which the target node is redirected
7705
7706If both redirect_host and redirect_port are omitted, clear the redirect portal.
7707
7708#### Example
7709
7710Example request:
7711
7712~~~json
7713{
7714  "params": {
7715    "name": "iqn.2016-06.io.spdk:target1",
7716    "pg_tag": 1,
7717    "redirect_host": "10.0.0.3",
7718    "redirect_port": "3260"
7719  },
7720  "jsonrpc": "2.0",
7721  "method": "iscsi_target_node_set_redirect",
7722  "id": 1
7723}
7724~~~
7725
7726Example response:
7727
7728~~~json
7729{
7730  "jsonrpc": "2.0",
7731  "id": 1,
7732  "result": true
7733}
7734~~~
7735
7736### iscsi_target_node_request_logout method {#rpc_iscsi_target_node_request_logout}
7737
7738For the target node, request connections whose portal group tag match to logout,
7739or request all connections to logout if portal group tag is omitted.
7740
7741#### Parameters
7742
7743Name                        | Optional | Type    | Description
7744--------------------------- | -------- | --------| -----------
7745name                        | Required | string  | Target node name (ASCII)
7746pg_tag                      | Optional | number  | Existing portal group tag
7747
7748#### Example
7749
7750Example request:
7751
7752~~~json
7753{
7754  "params": {
7755    "name": "iqn.2016-06.io.spdk:target1",
7756    "pg_tag": 1
7757  },
7758  "jsonrpc": "2.0",
7759  "method": "iscsi_target_node_request_logout",
7760  "id": 1
7761}
7762~~~
7763
7764Example response:
7765
7766~~~json
7767{
7768  "jsonrpc": "2.0",
7769  "id": 1,
7770  "result": true
7771}
7772~~~
7773
7774## NVMe-oF Target {#jsonrpc_components_nvmf_tgt}
7775
7776### nvmf_create_transport method {#rpc_nvmf_create_transport}
7777
7778Initialize an NVMe-oF transport with the given options.
7779
7780#### Parameters
7781
7782Name                        | Optional | Type    | Description
7783--------------------------- | -------- | --------| -----------
7784trtype                      | Required | string  | Transport type (ex. RDMA)
7785tgt_name                    | Optional | string  | Parent NVMe-oF target name.
7786max_queue_depth             | Optional | number  | Max number of outstanding I/O per queue
7787max_io_qpairs_per_ctrlr     | Optional | number  | Max number of IO qpairs per controller
7788in_capsule_data_size        | Optional | number  | Max number of in-capsule data size
7789max_io_size                 | Optional | number  | Max I/O size (bytes)
7790io_unit_size                | Optional | number  | I/O unit size (bytes)
7791max_aq_depth                | Optional | number  | Max number of admin cmds per AQ
7792num_shared_buffers          | Optional | number  | The number of pooled data buffers available to the transport
7793buf_cache_size              | Optional | number  | The number of shared buffers to reserve for each poll group
7794num_cqe                     | Optional | number  | The number of CQ entries. Only used when no_srq=true (RDMA only)
7795max_srq_depth               | Optional | number  | The number of elements in a per-thread shared receive queue (RDMA only)
7796no_srq                      | Optional | boolean | Disable shared receive queue even for devices that support it. (RDMA only)
7797c2h_success                 | Optional | boolean | Disable C2H success optimization (TCP only)
7798dif_insert_or_strip         | Optional | boolean | Enable DIF insert for write I/O and DIF strip for read I/O DIF
7799sock_priority               | Optional | number  | The socket priority of the connection owned by this transport (TCP only)
7800acceptor_backlog            | Optional | number  | The number of pending connections allowed in backlog before failing new connection attempts (RDMA only)
7801abort_timeout_sec           | Optional | number  | Abort execution timeout value, in seconds
7802no_wr_batching              | Optional | boolean | Disable work requests batching (RDMA only)
7803control_msg_num             | Optional | number  | The number of control messages per poll group (TCP only)
7804disable_mappable_bar0       | Optional | boolean | disable client mmap() of BAR0 (VFIO-USER only)
7805disable_adaptive_irq        | Optional | boolean | Disable adaptive interrupt feature (VFIO-USER only)
7806disable_shadow_doorbells    | Optional | boolean | disable shadow doorbell support (VFIO-USER only)
7807zcopy                       | Optional | boolean | Use zero-copy operations if the underlying bdev supports them
7808
7809#### Example
7810
7811Example request:
7812
7813~~~json
7814{
7815  "jsonrpc": "2.0",
7816  "method": "nvmf_create_transport",
7817  "id": 1,
7818  "params": {
7819    "trtype": "RDMA",
7820    "max_queue_depth": 32
7821  }
7822}
7823~~~
7824
7825Example response:
7826
7827~~~json
7828{
7829  "jsonrpc": "2.0",
7830  "id": 1,
7831  "result": true
7832}
7833~~~
7834
7835### nvmf_get_subsystems method {#rpc_nvmf_get_subsystems}
7836
7837#### Parameters
7838
7839Name                        | Optional | Type        | Description
7840--------------------------- | -------- | ------------| -----------
7841tgt_name                    | Optional | string      | Parent NVMe-oF target name.
7842
7843#### Example
7844
7845Example request:
7846
7847~~~json
7848{
7849  "jsonrpc": "2.0",
7850  "id": 1,
7851  "method": "nvmf_get_subsystems"
7852}
7853~~~
7854
7855Example response:
7856
7857~~~json
7858{
7859  "jsonrpc": "2.0",
7860  "id": 1,
7861  "result": [
7862    {
7863      "nqn": "nqn.2014-08.org.nvmexpress.discovery",
7864      "subtype": "Discovery"
7865      "listen_addresses": [],
7866      "hosts": [],
7867      "allow_any_host": true
7868    },
7869    {
7870      "nqn": "nqn.2016-06.io.spdk:cnode1",
7871      "subtype": "NVMe",
7872      "listen_addresses": [
7873        {
7874          "trtype": "RDMA",
7875          "adrfam": "IPv4",
7876          "traddr": "192.168.0.123",
7877          "trsvcid": "4420"
7878        }
7879      ],
7880      "hosts": [
7881        {"nqn": "nqn.2016-06.io.spdk:host1"}
7882      ],
7883      "allow_any_host": false,
7884      "serial_number": "abcdef",
7885      "model_number": "ghijklmnop",
7886      "namespaces": [
7887        {"nsid": 1, "name": "Malloc2"},
7888        {"nsid": 2, "name": "Nvme0n1"}
7889      ]
7890    }
7891  ]
7892}
7893~~~
7894
7895### nvmf_create_subsystem method {#rpc_nvmf_create_subsystem}
7896
7897Construct an NVMe over Fabrics target subsystem.
7898
7899#### Parameters
7900
7901Name                    | Optional | Type        | Description
7902----------------------- | -------- | ----------- | -----------
7903nqn                     | Required | string      | Subsystem NQN
7904tgt_name                | Optional | string      | Parent NVMe-oF target name.
7905serial_number           | Optional | string      | Serial number of virtual controller
7906model_number            | Optional | string      | Model number of virtual controller
7907max_namespaces          | Optional | number      | Maximum number of namespaces that can be attached to the subsystem. Default: 0 (Unlimited)
7908allow_any_host          | Optional | boolean     | Allow any host (`true`) or enforce allowed host list (`false`). Default: `false`.
7909ana_reporting           | Optional | boolean     | Enable ANA reporting feature (default: `false`).
7910min_cntlid              | Optional | number      | Minimum controller ID. Default: 1
7911max_cntlid              | Optional | number      | Maximum controller ID. Default: 0xffef
7912
7913#### Example
7914
7915Example request:
7916
7917~~~json
7918{
7919  "jsonrpc": "2.0",
7920  "id": 1,
7921  "method": "nvmf_create_subsystem",
7922  "params": {
7923    "nqn": "nqn.2016-06.io.spdk:cnode1",
7924    "allow_any_host": false,
7925    "serial_number": "abcdef",
7926    "model_number": "ghijklmnop"
7927  }
7928}
7929~~~
7930
7931Example response:
7932
7933~~~json
7934{
7935  "jsonrpc": "2.0",
7936  "id": 1,
7937  "result": true
7938}
7939~~~
7940
7941### nvmf_delete_subsystem method {#rpc_nvmf_delete_subsystem}
7942
7943Delete an existing NVMe-oF subsystem.
7944
7945#### Parameters
7946
7947Parameter              | Optional | Type        | Description
7948---------------------- | -------- | ----------- | -----------
7949nqn                    | Required | string      | Subsystem NQN to delete.
7950tgt_name               | Optional | string      | Parent NVMe-oF target name.
7951
7952#### Example
7953
7954Example request:
7955
7956~~~json
7957{
7958  "jsonrpc": "2.0",
7959  "id": 1,
7960  "method": "nvmf_delete_subsystem",
7961  "params": {
7962    "nqn": "nqn.2016-06.io.spdk:cnode1"
7963  }
7964}
7965~~~
7966
7967Example response:
7968
7969~~~json
7970{
7971  "jsonrpc": "2.0",
7972  "id": 1,
7973  "result": true
7974}
7975~~~
7976
7977### nvmf_subsystem_add_listener  method {#rpc_nvmf_subsystem_add_listener}
7978
7979Add a new listen address to an NVMe-oF subsystem.
7980
7981#### Parameters
7982
7983Name                    | Optional | Type        | Description
7984----------------------- | -------- | ----------- | -----------
7985nqn                     | Required | string      | Subsystem NQN
7986tgt_name                | Optional | string      | Parent NVMe-oF target name.
7987listen_address          | Required | object      | @ref rpc_nvmf_listen_address object
7988secure_channel          | Optional | bool        | Whether all connections immediately attempt to establish a secure channel
7989
7990#### listen_address {#rpc_nvmf_listen_address}
7991
7992Name                    | Optional | Type        | Description
7993----------------------- | -------- | ----------- | -----------
7994trtype                  | Required | string      | Transport type ("RDMA")
7995adrfam                  | Required | string      | Address family ("IPv4", "IPv6", "IB", or "FC")
7996traddr                  | Required | string      | Transport address
7997trsvcid                 | Optional | string      | Transport service ID (required for RDMA or TCP)
7998
7999#### Example
8000
8001Example request:
8002
8003~~~json
8004{
8005  "jsonrpc": "2.0",
8006  "id": 1,
8007  "method": "nvmf_subsystem_add_listener",
8008  "params": {
8009    "nqn": "nqn.2016-06.io.spdk:cnode1",
8010    "listen_address": {
8011      "trtype": "RDMA",
8012      "adrfam": "IPv4",
8013      "traddr": "192.168.0.123",
8014      "trsvcid": "4420"
8015    }
8016  }
8017}
8018~~~
8019
8020Example response:
8021
8022~~~json
8023{
8024  "jsonrpc": "2.0",
8025  "id": 1,
8026  "result": true
8027}
8028~~~
8029
8030### nvmf_subsystem_remove_listener  method {#rpc_nvmf_subsystem_remove_listener}
8031
8032Remove a listen address from an NVMe-oF subsystem.
8033
8034#### Parameters
8035
8036Name                    | Optional | Type        | Description
8037----------------------- | -------- | ----------- | -----------
8038nqn                     | Required | string      | Subsystem NQN
8039tgt_name                | Optional | string      | Parent NVMe-oF target name.
8040listen_address          | Required | object      | @ref rpc_nvmf_listen_address object
8041
8042#### Example
8043
8044Example request:
8045
8046~~~json
8047{
8048  "jsonrpc": "2.0",
8049  "id": 1,
8050  "method": "nvmf_subsystem_remove_listener",
8051  "params": {
8052    "nqn": "nqn.2016-06.io.spdk:cnode1",
8053    "listen_address": {
8054      "trtype": "RDMA",
8055      "adrfam": "IPv4",
8056      "traddr": "192.168.0.123",
8057      "trsvcid": "4420"
8058    }
8059  }
8060}
8061~~~
8062
8063Example response:
8064
8065~~~json
8066{
8067  "jsonrpc": "2.0",
8068  "id": 1,
8069  "result": true
8070}
8071~~~
8072
8073### nvmf_subsystem_listener_set_ana_state  method {#rpc_nvmf_subsystem_listener_set_ana_state}
8074
8075Set ANA state of a listener for an NVMe-oF subsystem. Only the ANA state of the specified ANA
8076group is updated, or ANA states of all ANA groups if ANA group is not specified.
8077
8078#### Parameters
8079
8080Name                    | Optional | Type        | Description
8081----------------------- | -------- | ----------- | -----------
8082nqn                     | Required | string      | Subsystem NQN
8083tgt_name                | Optional | string      | Parent NVMe-oF target name.
8084listen_address          | Required | object      | @ref rpc_nvmf_listen_address object
8085ana_state               | Required | string      | ANA state to set ("optimized", "non_optimized", or "inaccessible")
8086anagrpid                | Optional | number      | ANA group ID
8087
8088#### Example
8089
8090Example request:
8091
8092~~~json
8093{
8094  "jsonrpc": "2.0",
8095  "id": 1,
8096  "method": "nvmf_subsystem_listener_set_ana_state",
8097  "params": {
8098    "nqn": "nqn.2016-06.io.spdk:cnode1",
8099    "listen_address": {
8100      "trtype": "RDMA",
8101      "adrfam": "IPv4",
8102      "traddr": "192.168.0.123",
8103      "trsvcid": "4420"
8104    },
8105    "ana_state", "inaccessible"
8106  }
8107}
8108~~~
8109
8110Example response:
8111
8112~~~json
8113{
8114  "jsonrpc": "2.0",
8115  "id": 1,
8116  "result": true
8117}
8118~~~
8119
8120### nvmf_subsystem_add_ns method {#rpc_nvmf_subsystem_add_ns}
8121
8122Add a namespace to a subsystem. The namespace ID is returned as the result.
8123
8124### Parameters
8125
8126Name                    | Optional | Type        | Description
8127----------------------- | -------- | ----------- | -----------
8128nqn                     | Required | string      | Subsystem NQN
8129namespace               | Required | object      | @ref rpc_nvmf_namespace object
8130tgt_name                | Optional | string      | Parent NVMe-oF target name.
8131
8132#### namespace {#rpc_nvmf_namespace}
8133
8134Name                    | Optional | Type        | Description
8135----------------------- | -------- | ----------- | -----------
8136nsid                    | Optional | number      | Namespace ID between 1 and 4294967294, inclusive. Default: Automatically assign NSID.
8137bdev_name               | Required | string      | Name of bdev to expose as a namespace.
8138nguid                   | Optional | string      | 16-byte namespace globally unique identifier in hexadecimal (e.g. "ABCDEF0123456789ABCDEF0123456789")
8139eui64                   | Optional | string      | 8-byte namespace EUI-64 in hexadecimal (e.g. "ABCDEF0123456789")
8140uuid                    | Optional | string      | RFC 4122 UUID (e.g. "ceccf520-691e-4b46-9546-34af789907c5")
8141ptpl_file               | Optional | string      | File path to save/restore persistent reservation information
8142anagrpid                | Optional | number      | ANA group ID. Default: Namespace ID.
8143
8144#### Example
8145
8146Example request:
8147
8148~~~json
8149{
8150  "jsonrpc": "2.0",
8151  "id": 1,
8152  "method": "nvmf_subsystem_add_ns",
8153  "params": {
8154    "nqn": "nqn.2016-06.io.spdk:cnode1",
8155    "namespace": {
8156      "nsid": 3,
8157      "bdev_name": "Nvme0n1",
8158      "ptpl_file": "/opt/Nvme0n1PR.json"
8159    }
8160  }
8161}
8162~~~
8163
8164Example response:
8165
8166~~~json
8167{
8168  "jsonrpc": "2.0",
8169  "id": 1,
8170  "result": 3
8171}
8172~~~
8173
8174### nvmf_subsystem_remove_ns method {#rpc_nvmf_subsystem_remove_ns}
8175
8176Remove a namespace from a subsystem.
8177
8178#### Parameters
8179
8180Name                    | Optional | Type        | Description
8181----------------------- | -------- | ----------- | -----------
8182nqn                     | Required | string      | Subsystem NQN
8183nsid                    | Required | number      | Namespace ID
8184tgt_name                | Optional | string      | Parent NVMe-oF target name.
8185
8186#### Example
8187
8188Example request:
8189
8190~~~json
8191{
8192  "jsonrpc": "2.0",
8193  "id": 1,
8194  "method": "nvmf_subsystem_remove_ns",
8195  "params": {
8196    "nqn": "nqn.2016-06.io.spdk:cnode1",
8197    "nsid": 1
8198  }
8199}
8200~~~
8201
8202Example response:
8203
8204~~~json
8205{
8206  "jsonrpc": "2.0",
8207  "id": 1,
8208  "result": true
8209}
8210~~~
8211
8212### nvmf_subsystem_add_host method {#rpc_nvmf_subsystem_add_host}
8213
8214Add a host NQN to the list of allowed hosts.
8215
8216#### Parameters
8217
8218Name                    | Optional | Type        | Description
8219----------------------- | -------- | ----------- | -----------
8220nqn                     | Required | string      | Subsystem NQN
8221host                    | Required | string      | Host NQN to add to the list of allowed host NQNs
8222tgt_name                | Optional | string      | Parent NVMe-oF target name.
8223psk                     | Optional | string      | Path to a file containing PSK for TLS connection
8224
8225#### Example
8226
8227Example request:
8228
8229~~~json
8230{
8231  "jsonrpc": "2.0",
8232  "id": 1,
8233  "method": "nvmf_subsystem_add_host",
8234  "params": {
8235    "nqn": "nqn.2016-06.io.spdk:cnode1",
8236    "host": "nqn.2016-06.io.spdk:host1"
8237  }
8238}
8239~~~
8240
8241Example response:
8242
8243~~~json
8244{
8245  "jsonrpc": "2.0",
8246  "id": 1,
8247  "result": true
8248}
8249~~~
8250
8251### nvmf_subsystem_remove_host method {#rpc_nvmf_subsystem_remove_host}
8252
8253Remove a host NQN from the list of allowed hosts.
8254
8255#### Parameters
8256
8257Name                    | Optional | Type        | Description
8258----------------------- | -------- | ----------- | -----------
8259nqn                     | Required | string      | Subsystem NQN
8260host                    | Required | string      | Host NQN to remove from the list of allowed host NQNs
8261tgt_name                | Optional | string      | Parent NVMe-oF target name.
8262
8263#### Example
8264
8265Example request:
8266
8267~~~json
8268{
8269  "jsonrpc": "2.0",
8270  "id": 1,
8271  "method": "nvmf_subsystem_remove_host",
8272  "params": {
8273    "nqn": "nqn.2016-06.io.spdk:cnode1",
8274    "host": "nqn.2016-06.io.spdk:host1"
8275  }
8276}
8277~~~
8278
8279Example response:
8280
8281~~~json
8282{
8283  "jsonrpc": "2.0",
8284  "id": 1,
8285  "result": true
8286}
8287~~~
8288
8289### nvmf_subsystem_allow_any_host method {#rpc_nvmf_subsystem_allow_any_host}
8290
8291Configure a subsystem to allow any host to connect or to enforce the host NQN list.
8292
8293#### Parameters
8294
8295Name                    | Optional | Type        | Description
8296----------------------- | -------- | ----------- | -----------
8297nqn                     | Required | string      | Subsystem NQN
8298allow_any_host          | Required | boolean     | Allow any host (`true`) or enforce allowed host list (`false`).
8299tgt_name                | Optional | string      | Parent NVMe-oF target name.
8300
8301#### Example
8302
8303Example request:
8304
8305~~~json
8306{
8307  "jsonrpc": "2.0",
8308  "id": 1,
8309  "method": "nvmf_subsystem_allow_any_host",
8310  "params": {
8311    "nqn": "nqn.2016-06.io.spdk:cnode1",
8312    "allow_any_host": true
8313  }
8314}
8315~~~
8316
8317Example response:
8318
8319~~~json
8320{
8321  "jsonrpc": "2.0",
8322  "id": 1,
8323  "result": true
8324}
8325~~~
8326
8327### nvmf_subsystem_get_controllers {#rpc_nvmf_subsystem_get_controllers}
8328
8329#### Parameters
8330
8331Name                    | Optional | Type        | Description
8332----------------------- | -------- | ----------- | -----------
8333nqn                     | Required | string      | Subsystem NQN
8334tgt_name                | Optional | string      | Parent NVMe-oF target name.
8335
8336#### Example
8337
8338Example request:
8339
8340~~~json
8341{
8342  "jsonrpc": "2.0",
8343  "id": 1,
8344  "method": "nvmf_subsystem_get_controllers",
8345  "params": {
8346    "nqn": "nqn.2016-06.io.spdk:cnode1"
8347  }
8348}
8349~~~
8350
8351Example response:
8352
8353~~~json
8354{
8355  "jsonrpc": "2.0",
8356  "id": 1,
8357  "result": [
8358    {
8359      "cntlid": 1,
8360      "hostnqn": "nqn.2016-06.io.spdk:host1",
8361      "hostid": "27dad528-6368-41c3-82d3-0b956b49025d",
8362      "num_io_qpairs": 5
8363    }
8364  ]
8365}
8366~~~
8367
8368### nvmf_subsystem_get_qpairs {#rpc_nvmf_subsystem_get_qpairs}
8369
8370#### Parameters
8371
8372Name                    | Optional | Type        | Description
8373----------------------- | -------- | ----------- | -----------
8374nqn                     | Required | string      | Subsystem NQN
8375tgt_name                | Optional | string      | Parent NVMe-oF target name.
8376
8377#### Example
8378
8379Example request:
8380
8381~~~json
8382{
8383  "jsonrpc": "2.0",
8384  "id": 1,
8385  "method": "nvmf_subsystem_get_qpairs",
8386  "params": {
8387    "nqn": "nqn.2016-06.io.spdk:cnode1"
8388  }
8389}
8390~~~
8391
8392Example response:
8393
8394~~~json
8395{
8396  "jsonrpc": "2.0",
8397  "id": 1,
8398  "result": [
8399    {
8400      "cntlid": 1,
8401      "qid": 0,
8402      "state": "active",
8403      "listen_address": {
8404        "trtype": "RDMA",
8405        "adrfam": "IPv4",
8406        "traddr": "192.168.0.123",
8407        "trsvcid": "4420"
8408      }
8409    },
8410    {
8411      "cntlid": 1,
8412      "qid": 1,
8413      "state": "active",
8414      "listen_address": {
8415        "trtype": "RDMA",
8416        "adrfam": "IPv4",
8417        "traddr": "192.168.0.123",
8418        "trsvcid": "4420"
8419      }
8420    }
8421  ]
8422}
8423~~~
8424
8425### nvmf_subsystem_get_listeners {#rpc_nvmf_subsystem_get_listeners}
8426
8427#### Parameters
8428
8429Name                    | Optional | Type        | Description
8430----------------------- | -------- | ----------- | -----------
8431nqn                     | Required | string      | Subsystem NQN
8432tgt_name                | Optional | string      | Parent NVMe-oF target name.
8433
8434#### Example
8435
8436Example request:
8437
8438~~~json
8439{
8440  "jsonrpc": "2.0",
8441  "id": 1,
8442  "method": "nvmf_subsystem_get_listeners",
8443  "params": {
8444    "nqn": "nqn.2016-06.io.spdk:cnode1"
8445  }
8446}
8447~~~
8448
8449Example response:
8450
8451~~~json
8452{
8453  "jsonrpc": "2.0",
8454  "id": 1,
8455  "result": [
8456    {
8457      "address": {
8458        "trtype": "RDMA",
8459        "adrfam": "IPv4",
8460        "traddr": "192.168.0.123",
8461        "trsvcid": "4420"
8462      },
8463      "ana_state": "optimized"
8464    }
8465  ]
8466}
8467~~~
8468
8469### nvmf_set_max_subsystems {#rpc_nvmf_set_max_subsystems}
8470
8471Set the maximum allowed subsystems for the NVMe-oF target.  This RPC may only be called
8472before SPDK subsystems have been initialized.
8473
8474#### Parameters
8475
8476Name                    | Optional | Type        | Description
8477----------------------- | -------- | ----------- | -----------
8478max_subsystems          | Required | number      | Maximum number of NVMe-oF subsystems
8479
8480#### Example
8481
8482Example request:
8483
8484~~~json
8485{
8486  "jsonrpc": "2.0",
8487  "id": 1,
8488  "method": "nvmf_set_max_subsystems",
8489  "params": {
8490    "max_subsystems": 1024
8491  }
8492}
8493~~~
8494
8495Example response:
8496
8497~~~json
8498{
8499  "jsonrpc": "2.0",
8500  "id": 1,
8501  "result": true
8502}
8503~~~
8504
8505### nvmf_set_config {#rpc_nvmf_set_config}
8506
8507Set global configuration of NVMe-oF target.  This RPC may only be called before SPDK subsystems
8508have been initialized.
8509
8510#### Parameters
8511
8512Name                    | Optional | Type        | Description
8513----------------------- | -------- | ----------- | -----------
8514acceptor_poll_rate      | Optional | number      | Polling interval of the acceptor for incoming connections (microseconds)
8515admin_cmd_passthru      | Optional | object      | Admin command passthru configuration
8516poll_groups_mask        | Optional | string      | Set cpumask for NVMf poll groups
8517discovery_filter        | Optional | string      | Set discovery filter, possible values are: `match_any` (default) or comma separated values: `transport`, `address`, `svcid`
8518
8519#### admin_cmd_passthru {#spdk_nvmf_admin_passthru_conf}
8520
8521Name                    | Optional | Type        | Description
8522----------------------- | -------- | ----------- | -----------
8523identify_ctrlr          | Required | bool        | If true, enables custom identify handler that reports some identify attributes from the underlying NVMe drive
8524
8525#### Example
8526
8527Example request:
8528
8529~~~json
8530{
8531  "jsonrpc": "2.0",
8532  "id": 1,
8533  "method": "nvmf_set_config",
8534  "params": {
8535    "acceptor_poll_rate": 10000
8536  }
8537}
8538~~~
8539
8540Example response:
8541
8542~~~json
8543{
8544  "jsonrpc": "2.0",
8545  "id": 1,
8546  "result": true
8547}
8548~~~
8549
8550### nvmf_get_transports method {#rpc_nvmf_get_transports}
8551
8552#### Parameters
8553
8554The user may specify no parameters in order to list all transports, or a transport may be
8555specified by type.
8556
8557Name                        | Optional | Type        | Description
8558--------------------------- | -------- | ------------| -----------
8559tgt_name                    | Optional | string      | Parent NVMe-oF target name.
8560trtype                      | Optional | string      | Transport type.
8561
8562#### Example
8563
8564Example request:
8565
8566~~~json
8567{
8568  "jsonrpc": "2.0",
8569  "id": 1,
8570  "method": "nvmf_get_transports"
8571}
8572~~~
8573
8574Example response:
8575
8576~~~json
8577{
8578  "jsonrpc": "2.0",
8579  "id": 1,
8580  "result": [
8581    {
8582      "type": "RDMA".
8583      "max_queue_depth": 128,
8584      "max_io_qpairs_per_ctrlr": 64,
8585      "in_capsule_data_size": 4096,
8586      "max_io_size": 131072,
8587      "io_unit_size": 131072,
8588      "abort_timeout_sec": 1
8589    }
8590  ]
8591}
8592~~~
8593
8594### nvmf_get_stats method {#rpc_nvmf_get_stats}
8595
8596Retrieve current statistics of the NVMf subsystem.
8597
8598#### Parameters
8599
8600Name                        | Optional | Type        | Description
8601--------------------------- | -------- | ------------| -----------
8602tgt_name                    | Optional | string      | Parent NVMe-oF target name.
8603
8604#### Response
8605
8606The response is an object containing NVMf subsystem statistics.
8607In the response, `admin_qpairs` and `io_qpairs` are reflecting cumulative queue pair counts while
8608`current_admin_qpairs` and `current_io_qpairs` are showing the current number.
8609
8610#### Example
8611
8612Example request:
8613
8614~~~json
8615{
8616  "jsonrpc": "2.0",
8617  "method": "nvmf_get_stats",
8618  "id": 1
8619}
8620~~~
8621
8622Example response:
8623
8624~~~json
8625{
8626  "jsonrpc": "2.0",
8627  "id": 1,
8628  "result": {
8629    "tick_rate": 2400000000,
8630    "poll_groups": [
8631      {
8632        "name": "app_thread",
8633        "admin_qpairs": 1,
8634        "io_qpairs": 4,
8635        "current_admin_qpairs": 1,
8636        "current_io_qpairs": 2,
8637        "pending_bdev_io": 1721,
8638        "transports": [
8639          {
8640            "trtype": "RDMA",
8641            "pending_data_buffer": 12131888,
8642            "devices": [
8643              {
8644                "name": "mlx5_1",
8645                "polls": 72284105,
8646                "completions": 0,
8647                "requests": 0,
8648                "request_latency": 0,
8649                "pending_free_request": 0,
8650                "pending_rdma_read": 0,
8651                "pending_rdma_write": 0,
8652                "total_send_wrs": 0,
8653                "send_doorbell_updates": 0,
8654                "total_recv_wrs": 0,
8655                "recv_doorbell_updates": 1
8656              },
8657              {
8658                "name": "mlx5_0",
8659                "polls": 72284105,
8660                "completions": 15165875,
8661                "requests": 7582935,
8662                "request_latency": 1249323766184,
8663                "pending_free_request": 0,
8664                "pending_rdma_read": 337602,
8665                "pending_rdma_write": 0,
8666                "total_send_wrs": 15165875,
8667                "send_doorbell_updates": 1516587,
8668                "total_recv_wrs": 15165875,
8669                "recv_doorbell_updates": 1516587
8670              }
8671            ]
8672          }
8673        ]
8674      }
8675    ]
8676  }
8677}
8678~~~
8679
8680### nvmf_set_crdt {#rpc_nvmf_set_crdt}
8681
8682Set the 3 CRDT (Command Retry Delay Time) values. For details about
8683CRDT, please refer to the NVMe specification. Currently all the
8684SPDK nvmf subsystems share the same CRDT values. The default values
8685are 0. This rpc can only be invoked in STARTUP stage. All values are
8686in units of 100 milliseconds (same as the NVMe specification).
8687
8688#### Parameters
8689
8690Name                    | Optional | Type        | Description
8691----------------------- | -------- | ----------- | -----------
8692crdt1                   | Optional | number      | Command Retry Delay Time 1
8693crdt2                   | Optional | number      | Command Retry Delay Time 2
8694crdt3                   | Optional | number      | Command Retry Delay Time 3
8695
8696## Vfio-user Target
8697
8698### vfu_tgt_set_base_path {#rpc_vfu_tgt_set_base_path}
8699
8700Set base path of Unix Domain socket file.
8701
8702#### Parameters
8703
8704Name                    | Optional | Type        | Description
8705----------------------- | -------- | ----------- | -----------
8706path                    | Required | string      | Base path
8707
8708#### Example
8709
8710Example request:
8711
8712~~~json
8713{
8714  "params": {
8715    "path": "/var/run/vfu_tgt"
8716  },
8717  "jsonrpc": "2.0",
8718  "method": "vfu_tgt_set_base_path",
8719  "id": 1
8720}
8721~~~
8722
8723Example response:
8724
8725~~~json
8726{
8727  "jsonrpc": "2.0",
8728  "id": 1,
8729  "result": true
8730}
8731~~~
8732
8733### vfu_virtio_delete_endpoint {#rpc_vfu_virtio_delete_endpoint}
8734
8735Delete PCI device via endpoint name.
8736
8737#### Parameters
8738
8739Name                    | Optional | Type        | Description
8740----------------------- | -------- | ----------- | -----------
8741name                    | Required | string      | Endpoint name
8742
8743#### Example
8744
8745Example request:
8746
8747~~~json
8748{
8749  "params": {
8750    "name": "vfu.0"
8751  },
8752  "jsonrpc": "2.0",
8753  "method": "vfu_virtio_delete_endpoint",
8754  "id": 1
8755}
8756~~~
8757
8758Example response:
8759
8760~~~json
8761{
8762  "jsonrpc": "2.0",
8763  "id": 1,
8764  "result": true
8765}
8766~~~
8767
8768### vfu_virtio_create_blk_endpoint {#rpc_vfu_virtio_create_blk_endpoint}
8769
8770Create vfio-user virtio-blk PCI endpoint.
8771
8772#### Parameters
8773
8774Name                    | Optional | Type        | Description
8775----------------------- | -------- | ----------- | -----------
8776name                    | Required | string      | Endpoint name
8777bdev_name               | Required | string      | Block device name
8778cpumask                 | Optional | string      | CPU masks
8779num_queues              | Optional | number      | Number of queues
8780qsize                   | Optional | number      | Queue size
8781packed_ring             | Optional | boolean     | Enable packed ring
8782
8783#### Example
8784
8785Example request:
8786
8787~~~json
8788{
8789  "params": {
8790    "name": "vfu.0",
8791    "bdev_name": "Malloc0",
8792    "cpumask": "0x2",
8793    "num_queues": 4,
8794    "qsize": 256
8795  },
8796  "jsonrpc": "2.0",
8797  "method": "vfu_virtio_create_blk_endpoint",
8798  "id": 1
8799}
8800~~~
8801
8802Example response:
8803
8804~~~json
8805{
8806  "jsonrpc": "2.0",
8807  "id": 1,
8808  "result": true
8809}
8810~~~
8811
8812### vfu_virtio_scsi_add_target {#rpc_vfu_virtio_scsi_add_target}
8813
8814Add block device to specified SCSI target of vfio-user virtio-scsi PCI endpoint.
8815
8816#### Parameters
8817
8818Name                    | Optional | Type        | Description
8819----------------------- | -------- | ----------- | -----------
8820name                    | Required | string      | Endpoint name
8821scsi_target_num         | Required | number      | SCSI target number
8822bdev_name               | Required | string      | Block device name
8823
8824#### Example
8825
8826Example request:
8827
8828~~~json
8829{
8830  "params": {
8831    "name": "vfu.0",
8832    "scsi_target_num": 0,
8833    "bdev_name": "Malloc0"
8834  },
8835  "jsonrpc": "2.0",
8836  "method": "vfu_virtio_scsi_add_target",
8837  "id": 1
8838}
8839~~~
8840
8841Example response:
8842
8843~~~json
8844{
8845  "jsonrpc": "2.0",
8846  "id": 1,
8847  "result": true
8848}
8849~~~
8850
8851### vfu_virtio_scsi_remove_target {#rpc_vfu_virtio_scsi_remove_target}
8852
8853Remove a SCSI target of vfio-user virtio-scsi PCI endpoint.
8854
8855#### Parameters
8856
8857Name                    | Optional | Type        | Description
8858----------------------- | -------- | ----------- | -----------
8859name                    | Required | string      | Endpoint name
8860scsi_target_num         | Required | number      | SCSI target number
8861
8862#### Example
8863
8864Example request:
8865
8866~~~json
8867{
8868  "params": {
8869    "name": "vfu.0",
8870    "scsi_target_num": 0
8871  },
8872  "jsonrpc": "2.0",
8873  "method": "vfu_virtio_scsi_remove_target",
8874  "id": 1
8875}
8876~~~
8877
8878Example response:
8879
8880~~~json
8881{
8882  "jsonrpc": "2.0",
8883  "id": 1,
8884  "result": true
8885}
8886~~~
8887
8888### vfu_virtio_create_scsi_endpoint {#rpc_vfu_virtio_create_scsi_endpoint}
8889
8890Create vfio-user virtio-scsi PCI endpoint.
8891
8892#### Parameters
8893
8894Name                    | Optional | Type        | Description
8895----------------------- | -------- | ----------- | -----------
8896name                    | Required | string      | Endpoint name
8897cpumask                 | Optional | string      | CPU masks
8898num_io_queues           | Optional | number      | Number of IO queues
8899qsize                   | Optional | number      | Queue size
8900packed_ring             | Optional | boolean     | Enable packed ring
8901
8902#### Example
8903
8904Example request:
8905
8906~~~json
8907{
8908  "params": {
8909    "name": "vfu.0",
8910    "cpumask": "0x2",
8911    "num_io_queues": 4,
8912    "qsize": 256
8913  },
8914  "jsonrpc": "2.0",
8915  "method": "vfu_virtio_create_scsi_endpoint",
8916  "id": 1
8917}
8918~~~
8919
8920Example response:
8921
8922~~~json
8923{
8924  "jsonrpc": "2.0",
8925  "id": 1,
8926  "result": true
8927}
8928~~~
8929
8930## Vhost Target {#jsonrpc_components_vhost_tgt}
8931
8932The following common preconditions need to be met in all target types.
8933
8934Controller name will be used to create UNIX domain socket. This implies that name concatenated with vhost socket
8935directory path needs to be valid UNIX socket name.
8936
8937@ref cpu_mask parameter is used to choose CPU on which pollers will be launched when new initiator is connecting.
8938It must be a subset of application CPU mask. Default value is CPU mask of the application.
8939
8940### vhost_controller_set_coalescing {#rpc_vhost_controller_set_coalescing}
8941
8942Controls interrupt coalescing for specific target. Because `delay_base_us` is used to calculate delay in CPU ticks
8943there is no hardcoded limit for this parameter. Only limitation is that final delay in CPU ticks might not overflow
894432 bit unsigned integer (which is more than 1s @ 4GHz CPU). In real scenarios `delay_base_us` should be much lower
8945than 150us. To disable coalescing set `delay_base_us` to 0.
8946
8947#### Parameters
8948
8949Name                    | Optional | Type        | Description
8950----------------------- | -------- | ----------- | -----------
8951ctrlr                   | Required | string      | Controller name
8952delay_base_us           | Required | number      | Base (minimum) coalescing time in microseconds
8953iops_threshold          | Required | number      | Coalescing activation level greater than 0 in IO per second
8954
8955#### Example
8956
8957Example request:
8958
8959~~~json
8960{
8961  "params": {
8962    "iops_threshold": 100000,
8963    "ctrlr": "VhostScsi0",
8964    "delay_base_us": 80
8965  },
8966  "jsonrpc": "2.0",
8967  "method": "vhost_controller_set_coalescing",
8968  "id": 1
8969}
8970~~~
8971
8972Example response:
8973
8974~~~json
8975{
8976  "jsonrpc": "2.0",
8977  "id": 1,
8978  "result": true
8979}
8980~~~
8981
8982### vhost_create_scsi_controller {#rpc_vhost_create_scsi_controller}
8983
8984Construct vhost SCSI target.
8985
8986#### Parameters
8987
8988Name                    | Optional | Type        | Description
8989----------------------- | -------- | ----------- | -----------
8990ctrlr                   | Required | string      | Controller name
8991cpumask                 | Optional | string      | @ref cpu_mask for this controller
8992
8993#### Example
8994
8995Example request:
8996
8997~~~json
8998{
8999  "params": {
9000    "cpumask": "0x2",
9001    "ctrlr": "VhostScsi0"
9002  },
9003  "jsonrpc": "2.0",
9004  "method": "vhost_create_scsi_controller",
9005  "id": 1
9006}
9007~~~
9008
9009Example response:
9010
9011~~~json
9012{
9013  "jsonrpc": "2.0",
9014  "id": 1,
9015  "result": true
9016}
9017~~~
9018
9019### vhost_scsi_controller_add_target {#rpc_vhost_scsi_controller_add_target}
9020
9021In vhost target `ctrlr` create SCSI target with ID `scsi_target_num` and add `bdev_name` as LUN 0.
9022
9023#### Parameters
9024
9025Name                    | Optional | Type        | Description
9026----------------------- | -------- | ----------- | -----------
9027ctrlr                   | Required | string      | Controller name
9028scsi_target_num         | Required | number      | SCSI target ID between 0 and 7 or -1 to use first free ID.
9029bdev_name               | Required | string      | Name of bdev to expose as a LUN 0
9030
9031#### Response
9032
9033SCSI target ID.
9034
9035#### Example
9036
9037Example request:
9038
9039~~~json
9040{
9041  "params": {
9042    "scsi_target_num": 1,
9043    "bdev_name": "Malloc0",
9044    "ctrlr": "VhostScsi0"
9045  },
9046  "jsonrpc": "2.0",
9047  "method": "vhost_scsi_controller_add_target",
9048  "id": 1
9049}
9050~~~
9051
9052Example response:
9053
9054~~~json
9055response:
9056{
9057  "jsonrpc": "2.0",
9058  "id": 1,
9059  "result": 1
9060}
9061~~~
9062
9063### vhost_scsi_controller_remove_target {#rpc_vhost_scsi_controller_remove_target}
9064
9065Remove SCSI target ID `scsi_target_num` from vhost target `scsi_target_num`.
9066
9067This method will fail if initiator is connected, but doesn't support hot-remove (the `VIRTIO_SCSI_F_HOTPLUG` is not negotiated).
9068
9069#### Parameters
9070
9071Name                    | Optional | Type        | Description
9072----------------------- | -------- | ----------- | -----------
9073ctrlr                   | Required | string      | Controller name
9074scsi_target_num         | Required | number      | SCSI target ID between 0 and 7
9075
9076#### Example
9077
9078Example request:
9079
9080~~~json
9081request:
9082{
9083  "params": {
9084    "scsi_target_num": 1,
9085    "ctrlr": "VhostScsi0"
9086  },
9087  "jsonrpc": "2.0",
9088  "method": "vhost_scsi_controller_remove_target",
9089  "id": 1
9090}
9091~~~
9092
9093Example response:
9094
9095~~~json
9096{
9097  "jsonrpc": "2.0",
9098  "id": 1,
9099  "result": true
9100}
9101~~~
9102
9103### virtio_blk_create_transport {#rpc_virtio_blk_create_transport}
9104
9105Create virtio blk transport.
9106
9107#### Parameters
9108
9109Name                    | Optional | Type        | Description
9110----------------------- | -------- | ----------- | -----------
9111name                    | Required | string      | Transport name
9112
9113#### Example
9114
9115Example request:
9116
9117~~~json
9118{
9119  "params": {
9120    "name": "vhost_user_blk"
9121  },
9122  "jsonrpc": "2.0",
9123  "method": "virtio_blk_create_transport",
9124  "id": 1
9125}
9126~~~
9127
9128Example response:
9129
9130~~~json
9131{
9132  "jsonrpc": "2.0",
9133  "id": 1,
9134  "result": true
9135}
9136~~~
9137
9138### virtio_blk_get_transports {#rpc_virtio_blk_get_transports}
9139
9140#### Parameters
9141
9142The user may specify no parameters in order to list all transports,
9143or a transport name may be specified.
9144
9145Name                        | Optional | Type        | Description
9146--------------------------- | -------- | ------------| -----------
9147name                        | Optional | string      | Transport name.
9148
9149#### Example
9150
9151Example request:
9152
9153~~~json
9154{
9155  "jsonrpc": "2.0",
9156  "method": "virtio_blk_get_transports",
9157  "id": 1
9158}
9159~~~
9160
9161Example response:
9162
9163~~~json
9164{
9165  "jsonrpc": "2.0",
9166  "id": 1,
9167  "result": [
9168    {
9169      "name": "vhost_user_blk"
9170    }
9171  ]
9172}
9173~~~
9174
9175### vhost_create_blk_controller {#rpc_vhost_create_blk_controller}
9176
9177Create vhost block controller
9178
9179If `readonly` is `true` then vhost block target will be created as read only and fail any write requests.
9180The `VIRTIO_BLK_F_RO` feature flag will be offered to the initiator.
9181
9182#### Parameters
9183
9184Name                    | Optional | Type        | Description
9185----------------------- | -------- | ----------- | -----------
9186ctrlr                   | Required | string      | Controller name
9187bdev_name               | Required | string      | Name of bdev to expose block device
9188readonly                | Optional | boolean     | If true, this target will be read only (default: false)
9189cpumask                 | Optional | string      | @ref cpu_mask for this controller
9190transport               | Optional | string      | virtio blk transport name (default: vhost_user_blk)
9191
9192#### Example
9193
9194Example request:
9195
9196~~~json
9197{
9198  "params": {
9199    "dev_name": "Malloc0",
9200    "ctrlr": "VhostBlk0"
9201  },
9202  "jsonrpc": "2.0",
9203  "method": "vhost_create_blk_controller",
9204  "id": 1
9205}
9206~~~
9207
9208Example response:
9209
9210~~~json
9211{
9212  "jsonrpc": "2.0",
9213  "id": 1,
9214  "result": true
9215}
9216~~~
9217
9218### vhost_get_controllers {#rpc_vhost_get_controllers}
9219
9220Display information about all or specific vhost controller(s).
9221
9222#### Parameters
9223
9224The user may specify no parameters in order to list all controllers, or a controller may be
9225specified by name.
9226
9227Name                    | Optional | Type        | Description
9228----------------------- | -------- | ----------- | -----------
9229name                    | Optional | string      | Vhost controller name
9230
9231#### Response {#rpc_vhost_get_controllers_response}
9232
9233Response is an array of objects describing requested controller(s). Common fields are:
9234
9235Name                    | Type        | Description
9236----------------------- | ----------- | -----------
9237ctrlr                   | string      | Controller name
9238cpumask                 | string      | @ref cpu_mask of this controller
9239delay_base_us           | number      | Base (minimum) coalescing time in microseconds (0 if disabled)
9240iops_threshold          | number      | Coalescing activation level
9241backend_specific        | object      | Backend specific information
9242
9243### Vhost block {#rpc_vhost_get_controllers_blk}
9244
9245`backend_specific` contains one `block` object  of type:
9246
9247Name                    | Type        | Description
9248----------------------- | ----------- | -----------
9249bdev                    | string      | Backing bdev name or Null if bdev is hot-removed
9250readonly                | boolean     | True if controllers is readonly, false otherwise
9251
9252### Vhost SCSI {#rpc_vhost_get_controllers_scsi}
9253
9254`backend_specific` contains `scsi` array of following objects:
9255
9256Name                    | Type        | Description
9257----------------------- | ----------- | -----------
9258target_name             | string      | Name of this SCSI target
9259id                      | number      | Unique SPDK global SCSI target ID
9260scsi_dev_num            | number      | SCSI target ID initiator will see when scanning this controller
9261luns                    | array       | array of objects describing @ref rpc_vhost_get_controllers_scsi_luns
9262
9263### Vhost SCSI LUN {#rpc_vhost_get_controllers_scsi_luns}
9264
9265Object of type:
9266
9267Name                    | Type        | Description
9268----------------------- | ----------- | -----------
9269id                      | number      | SCSI LUN ID
9270bdev_name               | string      | Backing bdev name
9271
9272### Vhost NVMe {#rpc_vhost_get_controllers_nvme}
9273
9274`backend_specific` contains `namespaces` array of following objects:
9275
9276Name                    | Type        | Description
9277----------------------- | ----------- | -----------
9278nsid                    | number      | Namespace ID
9279bdev                    | string      | Backing bdev name
9280
9281#### Example
9282
9283Example request:
9284
9285~~~json
9286{
9287  "jsonrpc": "2.0",
9288  "method": "vhost_get_controllers",
9289  "id": 1
9290}
9291~~~
9292
9293Example response:
9294
9295~~~json
9296{
9297  "jsonrpc": "2.0",
9298  "id": 1,
9299  "result": [
9300    {
9301      "cpumask": "0x2",
9302      "backend_specific": {
9303        "block": {
9304          "readonly": false,
9305          "bdev": "Malloc0"
9306        }
9307      },
9308      "iops_threshold": 60000,
9309      "ctrlr": "VhostBlk0",
9310      "delay_base_us": 100
9311    },
9312    {
9313      "cpumask": "0x2",
9314      "backend_specific": {
9315        "scsi": [
9316          {
9317            "target_name": "Target 2",
9318            "luns": [
9319              {
9320                "id": 0,
9321                "bdev_name": "Malloc1"
9322              }
9323            ],
9324            "id": 0,
9325            "scsi_dev_num": 2
9326          },
9327          {
9328            "target_name": "Target 5",
9329            "luns": [
9330              {
9331                "id": 0,
9332                "bdev_name": "Malloc2"
9333              }
9334            ],
9335            "id": 1,
9336            "scsi_dev_num": 5
9337          }
9338        ]
9339      },
9340      "iops_threshold": 60000,
9341      "ctrlr": "VhostScsi0",
9342      "delay_base_us": 0
9343    },
9344    {
9345      "cpumask": "0x2",
9346      "backend_specific": {
9347        "namespaces": [
9348          {
9349            "bdev": "Malloc3",
9350            "nsid": 1
9351          },
9352          {
9353            "bdev": "Malloc4",
9354            "nsid": 2
9355          }
9356        ]
9357      },
9358      "iops_threshold": 60000,
9359      "ctrlr": "VhostNvme0",
9360      "delay_base_us": 0
9361    }
9362  ]
9363}
9364~~~
9365
9366### vhost_delete_controller {#rpc_vhost_delete_controller}
9367
9368Remove vhost target.
9369
9370This call will fail if there is an initiator connected or there is at least one SCSI target configured in case of
9371vhost SCSI target. In the later case please remove all SCSI targets first using @ref rpc_vhost_scsi_controller_remove_target.
9372
9373#### Parameters
9374
9375Name                    | Optional | Type        | Description
9376----------------------- | -------- | ----------- | -----------
9377ctrlr                   | Required | string      | Controller name
9378
9379#### Example
9380
9381Example request:
9382
9383~~~json
9384{
9385  "params": {
9386    "ctrlr": "VhostNvme0"
9387  },
9388  "jsonrpc": "2.0",
9389  "method": "vhost_delete_controller",
9390  "id": 1
9391}
9392~~~
9393
9394Example response:
9395
9396~~~json
9397{
9398  "jsonrpc": "2.0",
9399  "id": 1,
9400  "result": true
9401}
9402~~~
9403
9404## Logical Volume {#jsonrpc_components_lvol}
9405
9406Identification of logical volume store and logical volume is explained first.
9407
9408A logical volume store has a UUID and a name for its identification.
9409The UUID is generated on creation and it can be used as a unique identifier.
9410The name is specified on creation and can be renamed.
9411Either UUID or name is used to access logical volume store in RPCs.
9412
9413A logical volume has a UUID and a name for its identification.
9414The UUID of the logical volume is generated on creation and it can be unique identifier.
9415The alias of the logical volume takes the format _lvs_name/lvol_name_ where:
9416
9417* _lvs_name_ is the name of the logical volume store.
9418* _lvol_name_ is specified on creation and can be renamed.
9419
9420### bdev_lvol_create_lvstore {#rpc_bdev_lvol_create_lvstore}
9421
9422Construct a logical volume store.
9423
9424#### Parameters
9425
9426Name                          | Optional | Type        | Description
9427----------------------------- | -------- | ----------- | -----------
9428bdev_name                     | Required | string      | Bdev on which to construct logical volume store
9429lvs_name                      | Required | string      | Name of the logical volume store to create
9430cluster_sz                    | Optional | number      | Cluster size of the logical volume store in bytes (Default: 4MiB)
9431clear_method                  | Optional | string      | Change clear method for data region. Available: none, unmap (default), write_zeroes
9432num_md_pages_per_cluster_ratio| Optional | number      | Reserved metadata pages per cluster (Default: 100)
9433
9434The num_md_pages_per_cluster_ratio defines the amount of metadata to
9435allocate when the logical volume store is created. The default value
9436is '100', which translates to 1 4KiB per cluster. For the default 4MiB
9437cluster size, this equates to about 0.1% of the underlying block
9438device allocated for metadata. Logical volume stores can be grown, if
9439the size of the underlying block device grows in the future, but only
9440if enough metadata pages were allocated to support the growth. So
9441num_md_pages_per_cluster_ratio should be set to a higher value if
9442wanting to support future growth. For example,
9443num_md_pages_per_cluster_ratio = 200 would support future 2x growth of
9444the logical volume store, and would result in 0.2% of the underlying
9445block device allocated for metadata (with a default 4MiB cluster
9446size).
9447
9448#### Response
9449
9450UUID of the created logical volume store is returned.
9451
9452#### Example
9453
9454Example request:
9455
9456~~~json
9457{
9458  "jsonrpc": "2.0",
9459  "id": 1,
9460  "method": "bdev_lvol_create_lvstore",
9461  "params": {
9462    "lvs_name": "LVS0",
9463    "bdev_name": "Malloc0"
9464    "clear_method": "write_zeroes"
9465  }
9466}
9467~~~
9468
9469Example response:
9470
9471~~~json
9472{
9473  "jsonrpc": "2.0",
9474  "id": 1,
9475  "result": "a9959197-b5e2-4f2d-8095-251ffb6985a5"
9476}
9477~~~
9478
9479### bdev_lvol_delete_lvstore {#rpc_bdev_lvol_delete_lvstore}
9480
9481Destroy a logical volume store.
9482
9483#### Parameters
9484
9485Name                    | Optional | Type        | Description
9486----------------------- | -------- | ----------- | -----------
9487uuid                    | Optional | string      | UUID of the logical volume store to destroy
9488lvs_name                | Optional | string      | Name of the logical volume store to destroy
9489
9490Either uuid or lvs_name must be specified, but not both.
9491
9492#### Example
9493
9494Example request:
9495
9496~~~json
9497{
9498  "jsonrpc": "2.0",
9499  "method": "bdev_lvol_delete_lvstore",
9500  "id": 1
9501  "params": {
9502    "uuid": "a9959197-b5e2-4f2d-8095-251ffb6985a5"
9503  }
9504}
9505~~~
9506
9507Example response:
9508
9509~~~json
9510{
9511  "jsonrpc": "2.0",
9512  "id": 1,
9513  "result": true
9514}
9515~~~
9516
9517### bdev_lvol_get_lvstores {#rpc_bdev_lvol_get_lvstores}
9518
9519Get a list of logical volume stores.
9520
9521#### Parameters
9522
9523Name                    | Optional | Type        | Description
9524----------------------- | -------- | ----------- | -----------
9525uuid                    | Optional | string      | UUID of the logical volume store to retrieve information about
9526lvs_name                | Optional | string      | Name of the logical volume store to retrieve information about
9527
9528Either uuid or lvs_name may be specified, but not both.
9529If both uuid and lvs_name are omitted, information about all logical volume stores is returned.
9530
9531#### Example
9532
9533Example request:
9534
9535~~~json
9536{
9537  "jsonrpc": "2.0",
9538  "method": "bdev_lvol_get_lvstores",
9539  "id": 1,
9540  "params": {
9541    "lvs_name": "LVS0"
9542  }
9543}
9544~~~
9545
9546Example response:
9547
9548~~~json
9549{
9550  "jsonrpc": "2.0",
9551  "id": 1,
9552  "result": [
9553    {
9554      "uuid": "a9959197-b5e2-4f2d-8095-251ffb6985a5",
9555      "base_bdev": "Malloc0",
9556      "free_clusters": 31,
9557      "cluster_size": 4194304,
9558      "total_data_clusters": 31,
9559      "block_size": 4096,
9560      "name": "LVS0"
9561    }
9562  ]
9563}
9564~~~
9565
9566### bdev_lvol_rename_lvstore {#rpc_bdev_lvol_rename_lvstore}
9567
9568Rename a logical volume store.
9569
9570#### Parameters
9571
9572Name                    | Optional | Type        | Description
9573----------------------- | -------- | ----------- | -----------
9574old_name                | Required | string      | Existing logical volume store name
9575new_name                | Required | string      | New logical volume store name
9576
9577#### Example
9578
9579Example request:
9580
9581~~~json
9582{
9583  "jsonrpc": "2.0",
9584  "method": "bdev_lvol_rename_lvstore",
9585  "id": 1,
9586  "params": {
9587    "old_name": "LVS0",
9588    "new_name": "LVS2"
9589  }
9590}
9591~~~
9592
9593Example response:
9594
9595~~~json
9596{
9597  "jsonrpc": "2.0",
9598  "id": 1,
9599  "result": true
9600}
9601~~~
9602
9603### bdev_lvol_grow_lvstore {#rpc_bdev_lvol_grow_lvstore}
9604
9605Grow the logical volume store to fill the underlying bdev
9606
9607#### Parameters
9608
9609Name                    | Optional | Type        | Description
9610----------------------- | -------- | ----------- | -----------
9611uuid                    | Optional | string      | UUID of the logical volume store to grow
9612lvs_name                | Optional | string      | Name of the logical volume store to grow
9613
9614Either uuid or lvs_name must be specified, but not both.
9615
9616#### Example
9617
9618Example request:
9619
9620~~~json
9621{
9622  "jsonrpc": "2.0",
9623  "method": "bdev_lvol_grow_lvstore",
9624  "id": 1
9625  "params": {
9626    "uuid": "a9959197-b5e2-4f2d-8095-251ffb6985a5"
9627  }
9628}
9629~~~
9630
9631Example response:
9632
9633~~~json
9634{
9635  "jsonrpc": "2.0",
9636  "id": 1,
9637  "result": true
9638}
9639~~~
9640
9641### bdev_lvol_create {#rpc_bdev_lvol_create}
9642
9643Create a logical volume on a logical volume store.
9644
9645#### Parameters
9646
9647Name                    | Optional | Type        | Description
9648----------------------- | -------- | ----------- | -----------
9649lvol_name               | Required | string      | Name of logical volume to create
9650size                    | Optional | number      | Desired size of logical volume in bytes (Deprecated. Please use size_in_mib instead.)
9651size_in_mib             | Optional | number      | Desired size of logical volume in MiB
9652thin_provision          | Optional | boolean     | True to enable thin provisioning
9653uuid                    | Optional | string      | UUID of logical volume store to create logical volume on
9654lvs_name                | Optional | string      | Name of logical volume store to create logical volume on
9655clear_method            | Optional | string      | Change default data clusters clear method. Available: none, unmap, write_zeroes
9656
9657Size will be rounded up to a multiple of cluster size. Either uuid or lvs_name must be specified, but not both.
9658lvol_name will be used in the alias of the created logical volume.
9659
9660#### Response
9661
9662UUID of the created logical volume is returned.
9663
9664#### Example
9665
9666Example request:
9667
9668~~~json
9669{
9670  "jsonrpc": "2.0",
9671  "method": "bdev_lvol_create",
9672  "id": 1,
9673  "params": {
9674    "lvol_name": "LVOL0",
9675    "size_in_mib": 1,
9676    "lvs_name": "LVS0",
9677    "clear_method": "unmap",
9678    "thin_provision": true
9679  }
9680}
9681~~~
9682
9683Example response:
9684
9685~~~json
9686{
9687  "jsonrpc": "2.0",
9688  "id": 1,
9689  "result": "1b38702c-7f0c-411e-a962-92c6a5a8a602"
9690}
9691~~~
9692
9693### bdev_lvol_snapshot {#rpc_bdev_lvol_snapshot}
9694
9695Capture a snapshot of the current state of a logical volume.
9696
9697#### Parameters
9698
9699Name                    | Optional | Type        | Description
9700----------------------- | -------- | ----------- | -----------
9701lvol_name               | Required | string      | UUID or alias of the logical volume to create a snapshot from
9702snapshot_name           | Required | string      | Name for the newly created snapshot
9703
9704#### Response
9705
9706UUID of the created logical volume snapshot is returned.
9707
9708#### Example
9709
9710Example request:
9711
9712~~~json
9713{
9714  "jsonrpc": "2.0",
9715  "method": "bdev_lvol_snapshot",
9716  "id": 1,
9717  "params": {
9718    "lvol_name": "1b38702c-7f0c-411e-a962-92c6a5a8a602",
9719    "snapshot_name": "SNAP1"
9720  }
9721}
9722~~~
9723
9724Example response:
9725
9726~~~json
9727{
9728  "jsonrpc": "2.0",
9729  "id": 1,
9730  "result": "cc8d7fdf-7865-4d1f-9fc6-35da8e368670"
9731}
9732~~~
9733
9734### bdev_lvol_clone {#rpc_bdev_lvol_clone}
9735
9736Create a logical volume based on a snapshot.
9737
9738#### Parameters
9739
9740Name                    | Optional | Type        | Description
9741----------------------- | -------- | ----------- | -----------
9742snapshot_name           | Required | string      | UUID or alias of the snapshot to clone
9743clone_name              | Required | string      | Name for the logical volume to create
9744
9745#### Response
9746
9747UUID of the created logical volume clone is returned.
9748
9749#### Example
9750
9751Example request:
9752
9753~~~json
9754{
9755  "jsonrpc": "2.0"
9756  "method": "bdev_lvol_clone",
9757  "id": 1,
9758  "params": {
9759    "snapshot_name": "cc8d7fdf-7865-4d1f-9fc6-35da8e368670",
9760    "clone_name": "CLONE1"
9761  }
9762}
9763~~~
9764
9765Example response:
9766
9767~~~json
9768{
9769  "jsonrpc": "2.0",
9770  "id": 1,
9771  "result": "8d87fccc-c278-49f0-9d4c-6237951aca09"
9772}
9773~~~
9774
9775### bdev_lvol_clone_bdev {#rpc_bdev_lvol_clone_bdev}
9776
9777Create a logical volume based on an external snapshot bdev. The external snapshot bdev
9778is a bdev that will not be written to by any consumer and must not be an lvol in the
9779lvstore as the clone.
9780
9781Regardless of whether the bdev is specified by name or UUID, the bdev UUID will be stored
9782in the logical volume's metadata for use while the lvolstore is loading. For this reason,
9783it is important that the bdev chosen has a static UUID.
9784
9785#### Parameters
9786
9787Name                    | Optional | Type        | Description
9788----------------------- | -------- | ----------- | -----------
9789bdev                    | Required | string      | Name or UUID for bdev that acts as the external snapshot
9790lvs_name                | Required | string      | logical volume store name
9791clone_name              | Required | string      | Name for the logical volume to create
9792
9793#### Response
9794
9795UUID of the created logical volume clone is returned.
9796
9797#### Example
9798
9799Example request:
9800
9801~~~json
9802{
9803  "jsonrpc": "2.0",
9804  "method": "bdev_lvol_clone_bdev",
9805  "id": 1,
9806  "params": {
9807    "bdev_uuid": "e4b40d8b-f623-416d-8234-baf5a4c83cbd",
9808    "lvs_name": "lvs1",
9809    "clone_name": "clone2"
9810  }
9811}
9812~~~
9813
9814Example response:
9815
9816~~~json
9817{
9818  "jsonrpc": "2.0",
9819  "id": 1,
9820  "result": "336f662b-08e5-4006-8e06-e2023f7f9886"
9821}
9822~~~
9823
9824### bdev_lvol_rename {#rpc_bdev_lvol_rename}
9825
9826Rename a logical volume. New name will rename only the alias of the logical volume.
9827
9828#### Parameters
9829
9830Name                    | Optional | Type        | Description
9831----------------------- | -------- | ----------- | -----------
9832old_name                | Required | string      | UUID or alias of the existing logical volume
9833new_name                | Required | string      | New logical volume name
9834
9835#### Example
9836
9837Example request:
9838
9839~~~json
9840{
9841  "jsonrpc": "2.0",
9842  "method": "bdev_lvol_rename",
9843  "id": 1,
9844  "params": {
9845    "old_name": "067df606-6dbc-4143-a499-0d05855cb3b8",
9846    "new_name": "LVOL2"
9847  }
9848}
9849~~~
9850
9851Example response:
9852
9853~~~json
9854{
9855  "jsonrpc": "2.0",
9856  "id": 1,
9857  "result": true
9858}
9859~~~
9860
9861### bdev_lvol_resize {#rpc_bdev_lvol_resize}
9862
9863Resize a logical volume.
9864
9865#### Parameters
9866
9867Name                    | Optional | Type        | Description
9868----------------------- | -------- | ----------- | -----------
9869name                    | Required | string      | UUID or alias of the logical volume to resize
9870size                    | Optional | number      | Desired size of the logical volume in bytes (Deprecated. Please use size_in_mib instead.)
9871size_in_mib             | Optional | number      | Desired size of the logical volume in MiB
9872
9873#### Example
9874
9875Example request:
9876
9877~~~json
9878{
9879  "jsonrpc": "2.0",
9880  "method": "bdev_lvol_resize",
9881  "id": 1,
9882  "params": {
9883    "name": "51638754-ca16-43a7-9f8f-294a0805ab0a",
9884    "size_in_mib": 2
9885  }
9886}
9887~~~
9888
9889Example response:
9890
9891~~~json
9892{
9893  "jsonrpc": "2.0",
9894  "id": 1,
9895  "result": true
9896}
9897~~~
9898
9899### bdev_lvol_set_read_only{#rpc_bdev_lvol_set_read_only}
9900
9901Mark logical volume as read only.
9902
9903#### Parameters
9904
9905Name                    | Optional | Type        | Description
9906----------------------- | -------- | ----------- | -----------
9907name                    | Required | string      | UUID or alias of the logical volume to set as read only
9908
9909#### Example
9910
9911Example request:
9912
9913~~~json
9914{
9915  "jsonrpc": "2.0",
9916  "method": "bdev_lvol_set_read_only",
9917  "id": 1,
9918  "params": {
9919    "name": "51638754-ca16-43a7-9f8f-294a0805ab0a",
9920  }
9921}
9922~~~
9923
9924Example response:
9925
9926~~~json
9927{
9928  "jsonrpc": "2.0",
9929  "id": 1,
9930  "result": true
9931}
9932~~~
9933
9934### bdev_lvol_delete {#rpc_bdev_lvol_delete}
9935
9936Destroy a logical volume.
9937
9938#### Parameters
9939
9940Name                    | Optional | Type        | Description
9941----------------------- | -------- | ----------- | -----------
9942name                    | Required | string      | UUID or alias of the logical volume to destroy
9943
9944#### Example
9945
9946Example request:
9947
9948~~~json
9949{
9950  "jsonrpc": "2.0",
9951  "method": "bdev_lvol_delete",
9952  "id": 1,
9953  "params": {
9954    "name": "51638754-ca16-43a7-9f8f-294a0805ab0a"
9955  }
9956}
9957~~~
9958
9959Example response:
9960
9961~~~json
9962{
9963  "jsonrpc": "2.0",
9964  "id": 1,
9965  "result": true
9966}
9967~~~
9968
9969### bdev_lvol_inflate {#rpc_bdev_lvol_inflate}
9970
9971Inflate a logical volume. All unallocated clusters are allocated and copied from the parent or zero filled
9972if not allocated in the parent. Then all dependencies on the parent are removed.
9973
9974### Parameters
9975
9976Name                    | Optional | Type        | Description
9977----------------------- | -------- | ----------- | -----------
9978name                    | Required | string      | UUID or alias of the logical volume to inflate
9979
9980#### Example
9981
9982Example request:
9983
9984~~~json
9985{
9986  "jsonrpc": "2.0",
9987  "method": "bdev_lvol_inflate",
9988  "id": 1,
9989  "params": {
9990    "name": "8d87fccc-c278-49f0-9d4c-6237951aca09"
9991  }
9992}
9993~~~
9994
9995Example response:
9996
9997~~~json
9998{
9999  "jsonrpc": "2.0",
10000  "id": 1,
10001  "result": true
10002}
10003~~~
10004
10005### bdev_lvol_decouple_parent {#rpc_bdev_lvol_decouple_parent}
10006
10007Decouple the parent of a logical volume. For unallocated clusters which is allocated in the parent, they are
10008allocated and copied from the parent, but for unallocated clusters which is thin provisioned in the parent,
10009they are kept thin provisioned. Then all dependencies on the parent are removed.
10010
10011#### Parameters
10012
10013Name                    | Optional | Type        | Description
10014----------------------- | -------- | ----------- | -----------
10015name                    | Required | string      | UUID or alias of the logical volume to decouple the parent of it
10016
10017#### Example
10018
10019Example request:
10020
10021~~~json
10022{
10023  "jsonrpc": "2.0",
10024  "method": "bdev_lvol_decouple_parent",
10025  "id": 1.
10026  "params": {
10027    "name": "8d87fccc-c278-49f0-9d4c-6237951aca09"
10028  }
10029}
10030~~~
10031
10032Example response:
10033
10034~~~json
10035{
10036  "jsonrpc": "2.0",
10037  "id": 1,
10038  "result": true
10039}
10040~~~
10041
10042### bdev_lvol_get_lvols {#rpc_bdev_lvol_get_lvols}
10043
10044Get a list of logical volumes. This list can be limited by lvol store and will display volumes even if
10045they are degraded. Degraded lvols do not have an associated bdev, thus this RPC call may return lvols
10046not returned by `bdev_get_bdevs`.
10047
10048#### Parameters
10049
10050Name                    | Optional | Type        | Description
10051----------------------- | -------- | ----------- | -----------
10052lvs_uuid                | Optional | string      | Only show volumes in the logical volume store with this UUID
10053lvs_name                | Optional | string      | Only show volumes in the logical volume store with this name
10054
10055Either lvs_uuid or lvs_name may be specified, but not both.
10056If both lvs_uuid and lvs_name are omitted, information about lvols in all logical volume stores is returned.
10057
10058#### Example
10059
10060Example request:
10061
10062~~~json
10063{
10064  "jsonrpc": "2.0",
10065  "method": "bdev_lvol_get_lvols",
10066  "id": 1,
10067  "params": {
10068    "lvs_name": "lvs_test"
10069  }
10070}
10071~~~
10072
10073Example response:
10074
10075~~~json
10076[
10077  {
10078    "alias": "lvs_test/lvol1",
10079    "uuid": "b335c368-851d-4099-81e0-018cc494fdf6",
10080    "name": "lvol1",
10081    "is_thin_provisioned": false,
10082    "is_snapshot": false,
10083    "is_clone": false,
10084    "is_esnap_clone": false,
10085    "is_degraded": false,
10086    "lvs": {
10087      "name": "lvs_test",
10088      "uuid": "a1c8d950-5715-4558-936d-ab9e6eca0794"
10089    }
10090  }
10091]
10092~~~
10093
10094## RAID
10095
10096### bdev_raid_get_bdevs {#rpc_bdev_raid_get_bdevs}
10097
10098This is used to list all the raid bdev details based on the input category requested. Category should be one
10099of 'all', 'online', 'configuring' or 'offline'. 'all' means all the raid bdevs whether they are online or
10100configuring or offline. 'online' is the raid bdev which is registered with bdev layer. 'configuring' is
10101the raid bdev which does not have full configuration discovered yet. 'offline' is the raid bdev which is
10102not registered with bdev as of now and it has encountered any error or user has requested to offline
10103the raid bdev.
10104
10105#### Parameters
10106
10107Name                    | Optional | Type        | Description
10108----------------------- | -------- | ----------- | -----------
10109category                | Required | string      | all or online or configuring or offline
10110
10111#### Example
10112
10113Example request:
10114
10115~~~json
10116{
10117  "jsonrpc": "2.0",
10118  "method": "bdev_raid_get_bdevs",
10119  "id": 1,
10120  "params": {
10121    "category": "all"
10122  }
10123}
10124~~~
10125
10126Example response:
10127
10128~~~json
10129{
10130  "jsonrpc": "2.0",
10131  "id": 1,
10132  "result": [
10133    {
10134      "name": "RaidBdev0",
10135      "strip_size_kb": 128,
10136      "state": "online",
10137      "raid_level": "raid0",
10138      "num_base_bdevs": 2,
10139      "num_base_bdevs_discovered": 2,
10140      "base_bdevs_list": [
10141        "malloc0",
10142        "malloc1"
10143      ]
10144    },
10145    {
10146      "name": "RaidBdev1",
10147      "strip_size_kb": 128,
10148      "state": "configuring",
10149      "raid_level": "raid0",
10150      "num_base_bdevs": 2,
10151      "num_base_bdevs_discovered": 1,
10152      "base_bdevs_list": [
10153        "malloc2",
10154        null
10155      ]
10156    }
10157  ]
10158}
10159~~~
10160
10161### bdev_raid_create {#rpc_bdev_raid_create}
10162
10163Constructs new RAID bdev.
10164
10165#### Parameters
10166
10167Name                    | Optional | Type        | Description
10168----------------------- | -------- | ----------- | -----------
10169name                    | Required | string      | RAID bdev name
10170strip_size_kb           | Required | number      | Strip size in KB
10171raid_level              | Required | string      | RAID level
10172base_bdevs              | Required | string      | Base bdevs name, whitespace separated list in quotes
10173
10174#### Example
10175
10176Example request:
10177
10178~~~json
10179{
10180  "jsonrpc": "2.0",
10181  "method": "bdev_raid_create",
10182  "id": 1,
10183  "params": {
10184    "name": "Raid0",
10185    "raid_level": "0",
10186    "base_bdevs": [
10187      "Malloc0",
10188      "Malloc1",
10189      "Malloc2",
10190      "Malloc3"
10191    ],
10192    "strip_size_kb": 4
10193  }
10194}
10195~~~
10196
10197Example response:
10198
10199~~~json
10200{
10201  "jsonrpc": "2.0",
10202  "id": 1,
10203  "result": true
10204}
10205~~~
10206
10207### bdev_raid_delete {#rpc_bdev_raid_delete}
10208
10209Removes RAID bdev.
10210
10211#### Parameters
10212
10213Name                    | Optional | Type        | Description
10214----------------------- | -------- | ----------- | -----------
10215name                    | Required | string      | RAID bdev name
10216
10217#### Example
10218
10219Example request:
10220
10221~~~json
10222{
10223  "jsonrpc": "2.0",
10224  "method": "bdev_raid_delete",
10225  "id": 1,
10226  "params": {
10227    "name": "Raid0"
10228  }
10229}
10230~~~
10231
10232Example response:
10233
10234~~~json
10235{
10236  "jsonrpc": "2.0",
10237  "id": 1,
10238  "result": true
10239}
10240~~~
10241
10242### bdev_raid_remove_base_bdev {#rpc_bdev_raid_remove_base_bdev}
10243
10244Remove base bdev from existing raid bdev.
10245
10246#### Parameters
10247
10248Name                    | Optional | Type        | Description
10249----------------------- | -------- | ----------- | -----------
10250name                    | Required | string      | Base bdev name in RAID
10251
10252#### Example
10253
10254Example request:
10255
10256~~~json
10257{
10258  "jsonrpc": "2.0",
10259  "method": "bdev_raid_remove_base_bdev",
10260  "id": 1,
10261  "params": {
10262    "name": "Raid0"
10263  }
10264}
10265~~~
10266
10267Example response:
10268
10269~~~json
10270{
10271  "jsonrpc": "2.0",
10272  "id": 1,
10273  "result": true
10274}
10275~~~
10276
10277## SPLIT
10278
10279### bdev_split_create {#rpc_bdev_split_create}
10280
10281This is used to split an underlying block device and create several smaller equal-sized vbdevs.
10282
10283#### Parameters
10284
10285Name                    | Optional | Type        | Description
10286----------------------- | -------- | ----------- | -----------
10287base_bdev               | Required | string      | base bdev name
10288split_count             | Required | number      | number of splits
10289split_size_mb           | Optional | number      | size in MB to restrict the size
10290
10291#### Example
10292
10293Example request:
10294
10295~~~json
10296{
10297  "jsonrpc": "2.0",
10298  "method": "bdev_split_create",
10299  "id": 1,
10300  "params": {
10301    "base_bdev": "Malloc0",
10302    "split_count": 4
10303  }
10304}
10305~~~
10306
10307Example response:
10308
10309~~~json
10310{
10311  "jsonrpc": "2.0",
10312  "id": 1,
10313  "result": [
10314    "Malloc0p0",
10315    "Malloc0p1",
10316    "Malloc0p2",
10317    "Malloc0p3"
10318  ]
10319}
10320~~~
10321
10322### bdev_split_delete {#rpc_bdev_split_delete}
10323
10324This is used to remove the split vbdevs.
10325
10326#### Parameters
10327
10328Name                    | Optional | Type        | Description
10329----------------------- | -------- | ----------- | -----------
10330base_bdev               | Required | string      | base bdev name
10331
10332#### Example
10333
10334Example request:
10335
10336~~~json
10337{
10338  "jsonrpc": "2.0",
10339  "method": "bdev_split_delete",
10340  "id": 1,
10341  "params": {
10342    "base_bdev": "Malloc0"
10343  }
10344}
10345~~~
10346
10347Example response:
10348
10349~~~json
10350{
10351  "jsonrpc": "2.0",
10352  "id": 1,
10353  "result": true
10354}
10355~~~
10356
10357## Uring
10358
10359### bdev_uring_create {#rpc_bdev_uring_create}
10360
10361Create a bdev with io_uring backend.
10362
10363#### Parameters
10364
10365Name                    | Optional | Type        | Description
10366----------------------- | -------- | ----------- | -----------
10367filename                | Required | string      | path to device or file (ex: /dev/nvme0n1)
10368name                    | Required | string      | name of bdev
10369block_size              | Optional | number      | block size of device (If omitted, get the block size from the file)
10370
10371#### Example
10372
10373Example request:
10374
10375~~~json
10376{
10377  "jsonrpc": "2.0",
10378  "method": "bdev_uring_create",
10379  "id": 1,
10380  "params": {
10381    "name": "bdev_u0",
10382    "filename": "/dev/nvme0n1",
10383    "block_size": 512
10384  }
10385}
10386~~~
10387
10388Example response:
10389
10390~~~json
10391{
10392  "jsonrpc": "2.0",
10393  "id": 1,
10394  "result": "bdev_u0"
10395}
10396~~~
10397
10398### bdev_uring_delete {#rpc_bdev_uring_delete}
10399
10400Remove a uring bdev.
10401
10402#### Parameters
10403
10404Name                    | Optional | Type        | Description
10405----------------------- | -------- | ----------- | -----------
10406name                    | Required | string      | name of uring bdev to delete
10407
10408#### Example
10409
10410Example request:
10411
10412~~~json
10413{
10414  "jsonrpc": "2.0",
10415  "method": "bdev_uring_delete",
10416  "id": 1,
10417  "params": {
10418    "name": "bdev_u0"
10419  }
10420}
10421~~~
10422
10423Example response:
10424
10425~~~json
10426{
10427  "jsonrpc": "2.0",
10428  "id": 1,
10429  "result": true
10430}
10431~~~
10432
10433## OPAL
10434
10435### bdev_nvme_opal_init {#rpc_bdev_nvme_opal_init}
10436
10437This is used to initialize OPAL of a given NVMe ctrlr, including taking ownership and activating.
10438
10439#### Parameters
10440
10441Name                    | Optional | Type        | Description
10442----------------------- | -------- | ----------- | -----------
10443nvme_ctrlr_name         | Required | string      | name of nvme ctrlr
10444password                | Required | string      | admin password of OPAL
10445
10446#### Example
10447
10448Example request:
10449
10450~~~json
10451{
10452  "jsonrpc": "2.0",
10453  "method": "bdev_nvme_opal_init",
10454  "id": 1,
10455  "params": {
10456    "nvme_ctrlr_name": "nvme0",
10457    "password": "*****"
10458  }
10459}
10460~~~
10461
10462Example response:
10463
10464~~~json
10465{
10466  "jsonrpc": "2.0",
10467  "id": 1,
10468  "result": true
10469}
10470~~~
10471
10472### bdev_nvme_opal_revert {#rpc_bdev_nvme_opal_revert}
10473
10474This is used to revert OPAL to its factory settings. Erase all user configuration and data.
10475
10476#### Parameters
10477
10478Name                    | Optional | Type        | Description
10479----------------------- | -------- | ----------- | -----------
10480nvme_ctrlr_name         | Required | string      | name of nvme ctrlr
10481password                | Required | string      | admin password of OPAL
10482
10483#### Example
10484
10485Example request:
10486
10487~~~json
10488{
10489  "jsonrpc": "2.0",
10490  "method": "bdev_nvme_opal_revert",
10491  "id": 1,
10492  "params": {
10493    "nvme_ctrlr_name": "nvme0",
10494    "password": "*****"
10495  }
10496}
10497~~~
10498
10499Example response:
10500
10501~~~json
10502{
10503  "jsonrpc": "2.0",
10504  "id": 1,
10505  "result": true
10506}
10507~~~
10508
10509### bdev_opal_create {#rpc_bdev_opal_create}
10510
10511This is used to create an OPAL virtual bdev.
10512
10513#### Parameters
10514
10515Name                    | Optional | Type        | Description
10516----------------------- | -------- | ----------- | -----------
10517nvme_ctrlr_name         | Required | string      | name of nvme ctrlr that supports OPAL
10518nsid                    | Required | number      | namespace ID
10519locking_range_id        | Required | number      | OPAL locking range ID
10520range_start             | Required | number      | locking range start LBA
10521range_length            | Required | number      | locking range length
10522password                | Required | string      | admin password of OPAL
10523
10524#### Response
10525
10526The response is the name of created OPAL virtual bdev.
10527
10528#### Example
10529
10530Example request:
10531
10532~~~json
10533{
10534  "jsonrpc": "2.0",
10535  "method": "bdev_opal_create",
10536  "id": 1,
10537  "params": {
10538    "nvme_ctrlr_name": "nvme0",
10539    "nsid": 1,
10540    "locking_range_id": 1,
10541    "range_start": 0,
10542    "range_length": 4096,
10543    "password": "*****"
10544  }
10545}
10546~~~
10547
10548Example response:
10549
10550~~~json
10551{
10552  "jsonrpc": "2.0",
10553  "id": 1,
10554  "result": "nvme0n1r1"
10555}
10556~~~
10557
10558### bdev_opal_get_info {#rpc_bdev_opal_get_info}
10559
10560This is used to get information of a given OPAL bdev.
10561
10562#### Parameters
10563
10564Name                    | Optional | Type        | Description
10565----------------------- | -------- | ----------- | -----------
10566bdev_name               | Required | string      | name of OPAL vbdev
10567password                | Required | string      | admin password
10568
10569#### Response
10570
10571The response is the locking info of OPAL virtual bdev.
10572
10573#### Example
10574
10575Example request:
10576
10577~~~json
10578{
10579  "jsonrpc": "2.0",
10580  "method": "bdev_opal_get_info",
10581  "id": 1,
10582  "params": {
10583    "bdev_name": "nvme0n1r1",
10584    "password": "*****"
10585  }
10586}
10587~~~
10588
10589Example response:
10590
10591~~~json
10592{
10593  "jsonrpc": "2.0",
10594  "id": 1,
10595  "result": {
10596      "name": "nvme0n1r1",
10597      "range_start": 0,
10598      "range_length": 4096,
10599      "read_lock_enabled": true,
10600      "write_lock_enabled": true,
10601      "read_locked": false,
10602      "write_locked": false
10603    }
10604}
10605~~~
10606
10607### bdev_opal_delete {#rpc_bdev_opal_delete}
10608
10609This is used to delete OPAL vbdev.
10610
10611#### Parameters
10612
10613Name                    | Optional | Type        | Description
10614----------------------- | -------- | ----------- | -----------
10615bdev_name               | Required | string      | name of OPAL vbdev
10616password                | Required | string      | admin password
10617
10618#### Example
10619
10620Example request:
10621
10622~~~json
10623{
10624  "jsonrpc": "2.0",
10625  "method": "bdev_opal_delete",
10626  "id": 1,
10627  "params": {
10628    "bdev_name": "nvme0n1r1",
10629    "password": "*****"
10630  }
10631}
10632~~~
10633
10634Example response:
10635
10636~~~json
10637{
10638  "jsonrpc": "2.0",
10639  "id": 1,
10640  "result": true
10641}
10642~~~
10643
10644### bdev_opal_new_user {#rpc_bdev_opal_new_user}
10645
10646This enables a new user to the specified opal bdev so that the user can lock/unlock the bdev.
10647Recalling this for the same opal bdev, only the newest user will have the privilege.
10648
10649#### Parameters
10650
10651Name                    | Optional | Type        | Description
10652----------------------- | -------- | ----------- | -----------
10653bdev_name               | Required | string      | name of OPAL vbdev
10654admin_password          | Required | string      | admin password
10655user_id                 | Required | number      | user ID
10656user_password           | Required | string      | user password
10657
10658#### Example
10659
10660Example request:
10661
10662~~~json
10663{
10664  "jsonrpc": "2.0",
10665  "method": "bdev_opal_new_user",
10666  "id": 1,
10667  "params": {
10668    "bdev_name": "nvme0n1r1",
10669    "admin_password": "*****",
10670    "user_id": "1",
10671    "user_password": "********"
10672  }
10673}
10674~~~
10675
10676Example response:
10677
10678~~~json
10679{
10680  "jsonrpc": "2.0",
10681  "id": 1,
10682  "result": true
10683}
10684~~~
10685
10686### bdev_opal_set_lock_state {#rpc_bdev_opal_set_lock_state}
10687
10688This is used to lock/unlock specific opal bdev providing user ID and password.
10689
10690#### Parameters
10691
10692Name                    | Optional | Type        | Description
10693----------------------- | -------- | ----------- | -----------
10694bdev_name               | Required | string      | name of OPAL vbdev
10695user_id                 | Required | number      | user ID
10696password                | Required | string      | user password
10697lock_state              | Required | string      | lock state
10698
10699#### Example
10700
10701Example request:
10702
10703~~~json
10704{
10705  "jsonrpc": "2.0",
10706  "method": "bdev_opal_set_lock_state",
10707  "id": 1,
10708  "params": {
10709    "bdev_name": "nvme0n1r1",
10710    "user_id": "1",
10711    "user_password": "********",
10712    "lock_state": "rwlock"
10713  }
10714}
10715~~~
10716
10717Example response:
10718
10719~~~json
10720{
10721  "jsonrpc": "2.0",
10722  "id": 1,
10723  "result": true
10724}
10725~~~
10726
10727## Notifications
10728
10729### notify_get_types {#rpc_notify_get_types}
10730
10731Return list of all supported notification types.
10732
10733#### Parameters
10734
10735None
10736
10737#### Response
10738
10739The response is an array of strings - supported RPC notification types.
10740
10741#### Example
10742
10743Example request:
10744
10745~~~json
10746{
10747  "jsonrpc": "2.0",
10748  "method": "notify_get_types",
10749  "id": 1
10750}
10751~~~
10752
10753Example response:
10754
10755~~~json
10756{
10757  "id": 1,
10758  "result": [
10759    "bdev_register",
10760    "bdev_unregister"
10761  ],
10762  "jsonrpc": "2.0"
10763}
10764~~~
10765
10766### notify_get_notifications {#notify_get_notifications}
10767
10768Request notifications. Returns array of notifications that happened since the specified id (or first that is available).
10769
10770Notice: Notifications are kept in circular buffer with limited size. Older notifications might be inaccessible
10771due to being overwritten by new ones.
10772
10773#### Parameters
10774
10775Name                    | Optional | Type        | Description
10776----------------------- | -------- | ----------- | -----------
10777id                      | Optional | number      | First Event ID to fetch (default: first available).
10778max                     | Optional | number      | Maximum number of event to return (default: no limit).
10779
10780#### Response
10781
10782Response is an array of event objects.
10783
10784Name                    | Optional | Type        | Description
10785----------------------- | -------- | ----------- | -----------
10786id                      | Optional | number      | Event ID.
10787type                    | Optional | number      | Type of the event.
10788ctx                     | Optional | string      | Event context.
10789
10790#### Example
10791
10792Example request:
10793
10794~~~json
10795{
10796  "id": 1,
10797  "jsonrpc": "2.0",
10798  "method": "notify_get_notifications",
10799  "params": {
10800    "id": 1,
10801    "max": 10
10802  }
10803}
10804
10805~~~
10806
10807Example response:
10808
10809~~~json
10810{
10811  "jsonrpc": "2.0",
10812  "id": 1,
10813  "result": [
10814    {
10815      "ctx": "Malloc0",
10816      "type": "bdev_register",
10817      "id": 1
10818    },
10819    {
10820      "ctx": "Malloc2",
10821      "type": "bdev_register",
10822      "id": 2
10823    }
10824  ]
10825}
10826~~~
10827
10828## Linux Userspace Block Device (UBLK) {#jsonrpc_components_ublk}
10829
10830SPDK supports exporting bdevs though Linux ublk. The motivation behind it is to back a Linux kernel block device
10831with an SPDK user space bdev.
10832
10833To export a device over ublk, first make sure the Linux kernel ublk driver is loaded by running 'modprobe ublk_drv'.
10834
10835### ublk_create_target {#rpc_ublk_create_target}
10836
10837Start to create ublk threads and initialize ublk target. It will return an error if user calls this RPC twice without
10838ublk_destroy_target in between. It will use current cpumask in SPDK when user does not specify cpumask option.
10839
10840#### Parameters
10841
10842Name                    | Optional | Type        | Description
10843----------------------- | -------- | ----------- | -----------
10844cpumask                 | Optional | string      | Cpumask for ublk target
10845
10846#### Response
10847
10848True if ublk target initialization is successful; False if failed.
10849
10850#### Example
10851
10852Example request:
10853
10854~~~json
10855{
10856  "params": {
10857    "cpumask": "0x2"
10858  },
10859  "jsonrpc": "2.0",
10860  "method": "ublk_create_target",
10861  "id": 1
10862}
10863~~~
10864
10865Example response:
10866
10867~~~json
10868{
10869  "jsonrpc": "2.0",
10870  "id": 1,
10871  "result": true
10872}
10873~~~
10874
10875### ublk_destroy_target {#rpc_ublk_destroy_target}
10876
10877Release all UBLK devices and destroy ublk target.
10878
10879#### Response
10880
10881True if ublk target destruction is successful; False if failed.
10882
10883#### Example
10884
10885Example request:
10886
10887~~~json
10888{
10889  "jsonrpc": "2.0",
10890  "method": "ublk_destroy_target",
10891  "id": 1
10892}
10893~~~
10894
10895Example response:
10896
10897~~~json
10898{
10899  "jsonrpc": "2.0",
10900  "id": 1,
10901  "result": true
10902}
10903~~~
10904
10905### ublk_start_disk {#rpc_ublk_start_disk}
10906
10907Start to export one SPDK bdev as a UBLK device
10908
10909#### Parameters
10910
10911Name                    | Optional | Type        | Description
10912----------------------- | -------- | ----------- | -----------
10913bdev_name               | Required | string      | Bdev name to export
10914ublk_id                 | Required | int         | Device id
10915queue_depth             | Optional | int         | Device queue depth
10916num_queues              | Optional | int         | Total number of device queues
10917
10918#### Response
10919
10920UBLK device ID
10921
10922#### Example
10923
10924Example request:
10925
10926~~~json
10927{
10928 "params": {
10929    "ublk_id": "1",
10930    "bdev_name": "Malloc1"
10931  },
10932  "jsonrpc": "2.0",
10933  "method": "ublk_start_disk",
10934  "id": 1
10935}
10936~~~
10937
10938Example response:
10939
10940~~~json
10941{
10942  "jsonrpc": "2.0",
10943  "id": 1,
10944  "result": 1
10945}
10946~~~
10947
10948### ublk_stop_disk {#rpc_ublk_stop_disk}
10949
10950Delete a UBLK device
10951
10952#### Parameters
10953
10954Name                    | Optional | Type        | Description
10955----------------------- | -------- | ----------- | -----------
10956ublk_id                 | Required | int         | Device id to delete
10957
10958#### Response
10959
10960True if UBLK device is deleted successfully; False if failed.
10961
10962#### Example
10963
10964Example request:
10965
10966~~~json
10967{
10968 "params": {
10969    "ublk_id": "1",
10970  },
10971  "jsonrpc": "2.0",
10972  "method": "ublk_stop_disk",
10973  "id": 1
10974}
10975~~~
10976
10977Example response:
10978
10979~~~json
10980{
10981  "jsonrpc": "2.0",
10982  "id": 1,
10983  "result": true
10984}
10985~~~
10986
10987### ublk_get_disks {#rpc_ublk_get_disks}
10988
10989Display full or specified ublk device list
10990
10991#### Parameters
10992
10993Name                    | Optional | Type        | Description
10994----------------------- | -------- | ----------- | -----------
10995ublk_id                 | Optional | int         | ublk device id to display
10996
10997#### Response
10998
10999Display ublk device list
11000
11001#### Example
11002
11003Example request:
11004
11005~~~json
11006{
11007  "jsonrpc": "2.0",
11008  "method": "ublk_get_disks",
11009  "id": 1
11010}
11011~~~
11012
11013Example response:
11014
11015~~~json
11016{
11017  "jsonrpc": "2.0",
11018  "id": 1,
11019  "result":  [
11020    {
11021      "ublk_device": "/dev/ublkb1",
11022      "id": 1,
11023      "queue_depth": 512,
11024      "num_queues": 1,
11025      "bdev_name": "Malloc1"
11026    }
11027  ]
11028}
11029~~~
11030
11031## Linux Network Block Device (NBD) {#jsonrpc_components_nbd}
11032
11033SPDK supports exporting bdevs through Linux nbd. These devices then appear as standard Linux kernel block devices
11034and can be accessed using standard utilities like fdisk.
11035
11036In order to export a device over nbd, first make sure the Linux kernel nbd driver is loaded by running 'modprobe nbd'.
11037
11038### nbd_start_disk {#rpc_nbd_start_disk}
11039
11040Start to export one SPDK bdev as NBD disk
11041
11042#### Parameters
11043
11044Name                    | Optional | Type        | Description
11045----------------------- | -------- | ----------- | -----------
11046bdev_name               | Required | string      | Bdev name to export
11047nbd_device              | Optional | string      | NBD device name to assign
11048
11049#### Response
11050
11051Path of exported NBD disk
11052
11053#### Example
11054
11055Example request:
11056
11057~~~json
11058{
11059 "params": {
11060    "nbd_device": "/dev/nbd1",
11061    "bdev_name": "Malloc1"
11062  },
11063  "jsonrpc": "2.0",
11064  "method": "nbd_start_disk",
11065  "id": 1
11066}
11067~~~
11068
11069Example response:
11070
11071~~~json
11072{
11073  "jsonrpc": "2.0",
11074  "id": 1,
11075  "result": "/dev/nbd1"
11076}
11077~~~
11078
11079### nbd_stop_disk {#rpc_nbd_stop_disk}
11080
11081Stop one NBD disk which is based on SPDK bdev.
11082
11083#### Parameters
11084
11085Name                    | Optional | Type        | Description
11086----------------------- | -------- | ----------- | -----------
11087nbd_device              | Required | string      | NBD device name to stop
11088
11089#### Example
11090
11091Example request:
11092
11093~~~json
11094{
11095 "params": {
11096    "nbd_device": "/dev/nbd1",
11097  },
11098  "jsonrpc": "2.0",
11099  "method": "nbd_stop_disk",
11100  "id": 1
11101}
11102~~~
11103
11104Example response:
11105
11106~~~json
11107{
11108  "jsonrpc": "2.0",
11109  "id": 1,
11110  "result": "true"
11111}
11112~~~
11113
11114### nbd_get_disks {#rpc_nbd_get_disks}
11115
11116Display all or specified NBD device list
11117
11118#### Parameters
11119
11120Name                    | Optional | Type        | Description
11121----------------------- | -------- | ----------- | -----------
11122nbd_device              | Optional | string      | NBD device name to display
11123
11124#### Response
11125
11126The response is an array of exported NBD devices and their corresponding SPDK bdev.
11127
11128#### Example
11129
11130Example request:
11131
11132~~~json
11133{
11134  "jsonrpc": "2.0",
11135  "method": "nbd_get_disks",
11136  "id": 1
11137}
11138~~~
11139
11140Example response:
11141
11142~~~json
11143{
11144  "jsonrpc": "2.0",
11145  "id": 1,
11146  "result":  [
11147    {
11148      "bdev_name": "Malloc0",
11149      "nbd_device": "/dev/nbd0"
11150    },
11151    {
11152      "bdev_name": "Malloc1",
11153      "nbd_device": "/dev/nbd1"
11154    }
11155  ]
11156}
11157~~~
11158
11159## Blobfs {#jsonrpc_components_blobfs}
11160
11161### blobfs_detect {#rpc_blobfs_detect}
11162
11163Detect whether a blobfs exists on bdev.
11164
11165#### Parameters
11166
11167Name                    | Optional | Type        | Description
11168----------------------- | -------- | ----------- | -----------
11169bdev_name               | Required | string      | Block device name to detect blobfs
11170
11171#### Response
11172
11173True if a blobfs exists on the bdev; False otherwise.
11174
11175#### Example
11176
11177Example request:
11178
11179~~~json
11180{
11181  "jsonrpc": "2.0",
11182  "id": 1,
11183  "method": "blobfs_detect",
11184  "params": {
11185    "bdev_name": "Malloc0"
11186  }
11187}
11188~~~
11189
11190Example response:
11191
11192~~~json
11193{
11194  "jsonrpc": "2.0",
11195  "id": 1,
11196  "result": "true"
11197}
11198~~~
11199
11200### blobfs_create {#rpc_blobfs_create}
11201
11202Build blobfs on bdev.
11203
11204#### Parameters
11205
11206Name                    | Optional | Type        | Description
11207----------------------- | -------- | ----------- | -----------
11208bdev_name               | Required | string      | Block device name to create blobfs
11209cluster_sz              | Optional | number      | Size of cluster in bytes. Must be multiple of 4KiB page size, default and minimal value is 1M.
11210
11211#### Example
11212
11213Example request:
11214
11215~~~json
11216{
11217  "jsonrpc": "2.0",
11218  "id": 1,
11219  "method": "blobfs_create",
11220  "params": {
11221    "bdev_name": "Malloc0",
11222    "cluster_sz": 1M
11223  }
11224}
11225~~~
11226
11227Example response:
11228
11229~~~json
11230{
11231  "jsonrpc": "2.0",
11232  "id": 1,
11233  "result": "true"
11234}
11235~~~
11236
11237### blobfs_mount {#rpc_blobfs_mount}
11238
11239Mount a blobfs on bdev to one host path through FUSE
11240
11241#### Parameters
11242
11243Name                    | Optional | Type        | Description
11244----------------------- | -------- | ----------- | -----------
11245bdev_name               | Required | string      | Block device name where the blobfs is
11246mountpoint              | Required | string      | Mountpoint path in host to mount blobfs
11247
11248#### Example
11249
11250Example request:
11251
11252~~~json
11253{
11254  "jsonrpc": "2.0",
11255  "id": 1,
11256  "method": ""blobfs_mount"",
11257  "params": {
11258    "bdev_name": "Malloc0",
11259    "mountpoint": "/mnt/"
11260  }
11261}
11262~~~
11263
11264Example response:
11265
11266~~~json
11267{
11268  "jsonrpc": "2.0",
11269  "id": 1,
11270  "result": "true"
11271}
11272~~~
11273
11274### blobfs_set_cache_size {#rpc_blobfs_set_cache_size}
11275
11276Set cache pool size for blobfs filesystems.  This RPC is only permitted when the cache pool is not already initialized.
11277
11278The cache pool is initialized when the first blobfs filesystem is initialized or loaded.  It is freed when the all
11279initialized or loaded filesystems are unloaded.
11280
11281#### Parameters
11282
11283Name                    | Optional | Type        | Description
11284----------------------- | -------- | ----------- | -----------
11285size_in_mb              | Required | number      | Cache size in megabytes
11286
11287#### Response
11288
11289True if cache size is set successfully; False if failed to set.
11290
11291#### Example
11292
11293Example request:
11294
11295~~~json
11296{
11297  "jsonrpc": "2.0",
11298  "id": 1,
11299  "method": "blobfs_set_cache_size",
11300  "params": {
11301    "size_in_mb": 512,
11302  }
11303}
11304~~~
11305
11306Example response:
11307
11308~~~json
11309{
11310  "jsonrpc": "2.0",
11311  "id": 1,
11312  "result": true
11313}
11314~~~
11315
11316## Socket layer {#jsonrpc_components_sock}
11317
11318### sock_impl_get_options {#rpc_sock_impl_get_options}
11319
11320Get parameters for the socket layer implementation.
11321
11322#### Parameters
11323
11324Name                    | Optional | Type        | Description
11325----------------------- | -------- | ----------- | -----------
11326impl_name               | Required | string      | Name of socket implementation, e.g. posix
11327
11328#### Response
11329
11330Response is an object with current socket layer options for requested implementation.
11331
11332#### Example
11333
11334Example request:
11335
11336~~~json
11337{
11338  "jsonrpc": "2.0",
11339  "method": "sock_impl_get_options",
11340  "id": 1,
11341  "params": {
11342    "impl_name": "posix"
11343  }
11344}
11345~~~
11346
11347Example response:
11348
11349~~~json
11350{
11351  "jsonrpc": "2.0",
11352  "id": 1,
11353  "result": {
11354    "recv_buf_size": 2097152,
11355    "send_buf_size": 2097152,
11356    "enable_recv_pipe": true,
11357    "enable_quickack": true,
11358    "enable_placement_id": 0,
11359    "enable_zerocopy_send_server": true,
11360    "enable_zerocopy_send_client": false,
11361    "zerocopy_threshold": 0,
11362    "tls_version": 13,
11363    "enable_ktls": false
11364  }
11365}
11366~~~
11367
11368### sock_impl_set_options {#rpc_sock_impl_set_options}
11369
11370Set parameters for the socket layer implementation.
11371
11372#### Parameters
11373
11374Name                        | Optional | Type        | Description
11375--------------------------- | -------- | ----------- | -----------
11376impl_name                   | Required | string      | Name of socket implementation, e.g. posix
11377recv_buf_size               | Optional | number      | Size of socket receive buffer in bytes
11378send_buf_size               | Optional | number      | Size of socket send buffer in bytes
11379enable_recv_pipe            | Optional | boolean     | Enable or disable receive pipe
11380enable_quick_ack            | Optional | boolean     | Enable or disable quick ACK
11381enable_placement_id         | Optional | number      | Enable or disable placement_id. 0:disable,1:incoming_napi,2:incoming_cpu
11382enable_zerocopy_send_server | Optional | boolean     | Enable or disable zero copy on send for server sockets
11383enable_zerocopy_send_client | Optional | boolean     | Enable or disable zero copy on send for client sockets
11384zerocopy_threshold          | Optional | number      | Set zerocopy_threshold in bytes. A consecutive sequence of requests' iovecs
11385--                          | --       | --          | that fall below this threshold may be sent without zerocopy flag set
11386tls_version                 | Optional | number      | TLS protocol version, e.g. 13 for v1.3 (only applies when impl_name == ssl)
11387enable_ktls                 | Optional | boolean     | Enable or disable Kernel TLS (only applies when impl_name == ssl)
11388
11389#### Response
11390
11391True if socket layer options were set successfully.
11392
11393#### Example
11394
11395Example request:
11396
11397~~~json
11398{
11399  "jsonrpc": "2.0",
11400  "method": "sock_impl_set_options",
11401  "id": 1,
11402  "params": {
11403    "impl_name": "posix",
11404    "recv_buf_size": 2097152,
11405    "send_buf_size": 2097152,
11406    "enable_recv_pipe": false,
11407    "enable_quick_ack": false,
11408    "enable_placement_id": 0,
11409    "enable_zerocopy_send_server": true,
11410    "enable_zerocopy_send_client": false,
11411    "zerocopy_threshold": 10240,
11412    "tls_version": 13,
11413    "enable_ktls": false
11414  }
11415}
11416~~~
11417
11418Example response:
11419
11420~~~json
11421{
11422  "jsonrpc": "2.0",
11423  "id": 1,
11424  "result": true
11425}
11426~~~
11427
11428### sock_set_default_impl {#rpc_sock_set_default_impl}
11429
11430Set the default sock implementation.
11431
11432#### Parameters
11433
11434Name                    | Optional | Type        | Description
11435----------------------- | -------- | ----------- | -----------
11436impl_name               | Required | string      | Name of socket implementation, e.g. posix
11437
11438#### Response
11439
11440True if the default socket layer configuration was set successfully.
11441
11442#### Example
11443
11444Example request:
11445
11446~~~json
11447{
11448  "jsonrpc": "2.0",
11449  "method": "sock_set_default_impl",
11450  "id": 1,
11451  "params": {
11452    "impl_name": "posix"
11453  }
11454}
11455~~~
11456
11457Example response:
11458
11459~~~json
11460{
11461  "jsonrpc": "2.0",
11462  "id": 1,
11463  "result": true
11464}
11465~~~
11466
11467## Miscellaneous RPC commands
11468
11469### bdev_nvme_send_cmd {#rpc_bdev_nvme_send_cmd}
11470
11471Send NVMe command directly to NVMe controller or namespace. Parameters and responses encoded by base64 urlsafe need further processing.
11472
11473Notice: bdev_nvme_send_cmd requires user to guarantee the correctness of NVMe command itself, and also optional parameters.
11474Illegal command contents or mismatching buffer size may result in unpredictable behavior.
11475
11476#### Parameters
11477
11478Name                    | Optional | Type        | Description
11479----------------------- | -------- | ----------- | -----------
11480name                    | Required | string      | Name of the operating NVMe controller
11481cmd_type                | Required | string      | Type of nvme cmd. Valid values are: admin, io
11482data_direction          | Required | string      | Direction of data transfer. Valid values are: c2h, h2c
11483cmdbuf                  | Required | string      | NVMe command encoded by base64 urlsafe
11484data                    | Optional | string      | Data transferring to controller from host, encoded by base64 urlsafe
11485metadata                | Optional | string      | Metadata transferring to controller from host, encoded by base64 urlsafe
11486data_len                | Optional | number      | Data length required to transfer from controller to host
11487metadata_len            | Optional | number      | Metadata length required to transfer from controller to host
11488timeout_ms              | Optional | number      | Command execution timeout value, in milliseconds
11489
11490#### Response
11491
11492Name                    | Type        | Description
11493----------------------- | ----------- | -----------
11494cpl                     | string      | NVMe completion queue entry, encoded by base64 urlsafe
11495data                    | string      | Data transferred from controller to host, encoded by base64 urlsafe
11496metadata                | string      | Metadata transferred from controller to host, encoded by base64 urlsafe
11497
11498#### Example
11499
11500Example request:
11501
11502~~~json
11503{
11504  "jsonrpc": "2.0",
11505  "method": "bdev_nvme_send_cmd",
11506  "id": 1,
11507  "params": {
11508    "name": "Nvme0",
11509    "cmd_type": "admin"
11510    "data_direction": "c2h",
11511    "cmdbuf": "BgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAsGUs9P5_AAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
11512    "data_len": 60,
11513  }
11514}
11515~~~
11516
11517Example response:
11518
11519~~~json
11520{
11521  "jsonrpc": "2.0",
11522  "id": 1,
11523  "result":  {
11524    "cpl": "AAAAAAAAAAARAAAAWrmwABAA==",
11525    "data": "sIjg6AAAAACwiODoAAAAALCI4OgAAAAAAAYAAREAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
11526  }
11527
11528}
11529~~~
11530
11531### vmd_enable {#rpc_enable_vmd}
11532
11533Enable VMD enumeration.
11534
11535#### Parameters
11536
11537This method has no parameters.
11538
11539#### Response
11540
11541Completion status of enumeration is returned as a boolean.
11542
11543### Example
11544
11545Example request:
11546
11547~~~json
11548{
11549  "jsonrpc": "2.0",
11550  "method": "vmd_enable",
11551  "id": 1
11552}
11553~~~
11554
11555Example response:
11556
11557~~~json
11558{
11559  "jsonrpc": "2.0",
11560  "id": 1,
11561  "result": true
11562}
11563~~~
11564
11565### vmd_remove_device {#rpc_vmd_remove_device}
11566
11567Remove a device behind a VMD.
11568
11569### Parameters
11570
11571Name                    | Optional | Type        | Description
11572----------------------- | -------- | ----------- | -----------
11573addr                    | Required | string      | Address of the device to remove.
11574
11575### Example
11576
11577~~~json
11578{
11579  "jsonrpc": "2.0",
11580  "method": "vmd_remove_device",
11581  "params": {
11582    "addr": "5d0505:01:00.0"
11583  }
11584  "id": 1
11585}
11586~~~
11587
11588Example response:
11589
11590~~~json
11591{
11592  "jsonrpc": "2.0",
11593  "id": 1,
11594  "result": true
11595}
11596~~~
11597
11598### vmd_rescan {#rpc_vmd_rescan}
11599
11600Force a rescan of the devices behind VMD.
11601
11602### Parameters
11603
11604This method has no parameters.
11605
11606#### Response
11607
11608The response is the number of new devices found.
11609
11610### Example
11611
11612~~~json
11613{
11614  "jsonrpc": "2.0",
11615  "method": "vmd_rescan",
11616  "id": 1
11617}
11618~~~
11619
11620Example response:
11621
11622~~~json
11623{
11624  "jsonrpc": "2.0",
11625  "id": 1,
11626  "result": {
11627    "count": 1
11628  }
11629}
11630~~~
11631
11632### spdk_get_version {#rpc_spdk_get_version}
11633
11634Get the version info of the running SPDK application.
11635
11636#### Parameters
11637
11638This method has no parameters.
11639
11640#### Response
11641
11642The response is the version number including major version number, minor version number, patch level number and suffix string.
11643
11644#### Example
11645
11646Example request:
11647
11648~~~json
11649{
11650  "jsonrpc": "2.0",
11651  "id": 1,
11652  "method": "spdk_get_version"
11653}
11654~~~
11655
11656Example response:
11657
11658~~~json
11659{
11660  "jsonrpc": "2.0",
11661  "id": 1,
11662  "result":  {
11663    "version": "19.04-pre",
11664    "fields" : {
11665      "major": 19,
11666      "minor": 4,
11667      "patch": 0,
11668      "suffix": "-pre"
11669    }
11670  }
11671}
11672~~~
11673
11674### framework_get_pci_devices
11675
11676List PCIe devices attached to an SPDK application and the contents of their config space.
11677
11678#### Parameters
11679
11680This method has no parameters.
11681
11682#### Response
11683
11684The response is an array of attached PCIe devices.
11685
11686#### Example
11687
11688Example request:
11689
11690~~~json
11691{
11692  "jsonrpc": "2.0",
11693  "id": 1,
11694  "method": "framework_get_pci_devices"
11695}
11696~~~
11697
11698Example response:
11699Note that the config space buffer was trimmed.
11700
11701~~~json
11702{
11703  "jsonrpc": "2.0",
11704  "id": 1,
11705  "result": {
11706    [
11707      {
11708        "address": "0000:00:04.0",
11709        "config_space": "8680455807051000...0000000000000000"
11710      },
11711      {
11712        "address": "0000:00:03.0",
11713        "config_space": "8680455807051000...0000000000000000"
11714      }
11715    ]
11716  }
11717}
11718~~~
11719
11720### bdev_nvme_add_error_injection {#rpc_bdev_nvme_add_error_injection}
11721
11722Add a NVMe command error injection for a bdev nvme controller.
11723
11724#### Parameters
11725
11726Name                    | Optional | Type        | Description
11727----------------------- | -------- | ----------- | -----------
11728name                    | Required | string      | Name of the operating NVMe controller
11729cmd_type                | Required | string      | Type of NVMe command. Valid values are: admin, io
11730opc                     | Required | number      | Opcode for which the error injection is applied
11731do_not_submit           | Optional | boolean     | Set to true if request should not be submitted to the controller (default false)
11732timeout_in_us           | Optional | number      | Wait specified microseconds when do_not_submit is true
11733err_count               | Optional | number      | Number of matching NVMe commands to inject errors
11734sct                     | Optional | number      | Status code type (default 0)
11735sc                      | Optional | number      | Status code (default 0)
11736
11737#### Response
11738
11739true on success
11740
11741#### Example
11742
11743Example request:
11744
11745~~~json
11746{
11747  "jsonrpc": "2.0",
11748  "method": "bdev_nvme_add_error_injection",
11749  "id": 1,
11750  "params": {
11751    "name": "HotInNvme0",
11752    "opc": 2,
11753    "cmd_type": "io",
11754    "err_count": 1111111,
11755    "sct": 11,
11756    "sc": 33
11757  }
11758}
11759
11760~~~
11761
11762Example response:
11763
11764~~~json
11765{
11766  "jsonrpc": "2.0",
11767  "id": 1,
11768  "result": true
11769}
11770
11771~~~
11772
11773### bdev_nvme_remove_error_injection {#rpc_bdev_nvme_remove_error_injection}
11774
11775Remove a NVMe command error injection.
11776
11777#### Parameters
11778
11779Name                    | Optional | Type        | Description
11780----------------------- | -------- | ----------- | -----------
11781name                    | Required | string      | Name of the operating NVMe controller
11782cmd_type                | Required | string      | Type of NVMe command. Valid values are: admin, io
11783opc                     | Required | number      | Opcode for which the error injection is applied
11784
11785#### Response
11786
11787true on success
11788
11789#### Example
11790
11791Example request:
11792
11793~~~json
11794{
11795  "jsonrpc": "2.0",
11796  "method": "bdev_nvme_remove_error_injection",
11797  "id": 1,
11798  "params": {
11799    "name": "HotInNvme0",
11800    "opc": 2,
11801    "cmd_type": "io"
11802  }
11803}
11804
11805
11806~~~
11807
11808Example response:
11809
11810~~~json
11811{
11812  "jsonrpc": "2.0",
11813  "id": 1,
11814  "result": true
11815}
11816
11817~~~
11818
11819### bdev_daos_create {#rpc_bdev_daos_create}
11820
11821Construct @ref bdev_config_daos
11822
11823#### Parameters
11824
11825Name                    | Optional | Type        | Description
11826----------------------- | -------- | ----------- | -----------
11827name                    | Required | string      | Bdev name to use
11828pool                    | Required | string      | DAOS pool label or its uuid
11829cont                    | Required | string      | DAOS cont label or its uuid
11830block_size              | Required | number      | Block size in bytes -must be multiple of 512
11831num_blocks              | Required | number      | Number of blocks
11832uuid                    | Optional | string      | UUID of new bdev
11833oclass                  | Optional | string      | DAOS object class (default SX)
11834
11835To find more about various object classes please visit [DAOS documentation](https://github.com/daos-stack/daos/blob/master/src/object/README.md).
11836Please note, that DAOS bdev module uses the same CLI flag notation as `dmg` and `daos` commands,
11837for instance, `SX` or `EC_4P2G2` rather than in DAOS header file `OC_SX` or `OC_EC_4P2G2`.
11838
11839#### Result
11840
11841Name of newly created bdev.
11842
11843#### Example
11844
11845Example request:
11846
11847~~~json
11848{
11849  "params": {
11850    "block_size": 4096,
11851    "num_blocks": 16384,
11852    "name": "daosdev0",
11853    "pool": "test-pool",
11854    "cont": "test-cont",
11855    "oclass": "EC_4P2G2"
11856  },
11857  "jsonrpc": "2.0",
11858  "method": "bdev_daos_create",
11859  "id": 1
11860}
11861~~~
11862
11863Example response:
11864
11865~~~json
11866{
11867  "jsonrpc": "2.0",
11868  "id": 1,
11869  "result": "daosdev0"
11870}
11871~~~
11872
11873### bdev_daos_delete {#rpc_bdev_daos_delete}
11874
11875Delete @ref bdev_config_daos
11876
11877#### Parameters
11878
11879Name                    | Optional | Type        | Description
11880----------------------- | -------- | ----------- | -----------
11881name                    | Required | string      | Bdev name
11882
11883#### Example
11884
11885Example request:
11886
11887~~~json
11888{
11889  "params": {
11890    "name": "daosdev0"
11891  },
11892  "jsonrpc": "2.0",
11893  "method": "bdev_daos_delete",
11894  "id": 1
11895}
11896~~~
11897
11898Example response:
11899
11900~~~json
11901{
11902  "jsonrpc": "2.0",
11903  "id": 1,
11904  "result": true
11905}
11906~~~
11907
11908### bdev_daos_resize {#rpc_bdev_daos_resize}
11909
11910Resize @ref bdev_config_daos.
11911
11912#### Parameters
11913
11914Name                    | Optional | Type        | Description
11915----------------------- | -------- | ----------- | -----------
11916name                    | Required | string      | Bdev name
11917new_size                | Required | number      | Bdev new capacity in MiB
11918
11919#### Example
11920
11921Example request:
11922
11923~~~json
11924{
11925  "params": {
11926    "name": "daosdev0",
11927    "new_size": 8192
11928  },
11929  "jsonrpc": "2.0",
11930  "method": "bdev_daos_resize",
11931  "id": 1
11932}
11933~~~
11934
11935Example response:
11936
11937~~~json
11938{
11939  "jsonrpc": "2.0",
11940  "id": 1,
11941  "result": true
11942}
11943~~~
11944
11945### iobuf_set_options {#rpc_iobuf_set_options}
11946
11947Set iobuf buffer pool options.
11948
11949#### Parameters
11950
11951Name                    | Optional | Type        | Description
11952----------------------- | -------- | ----------- | -----------
11953small_pool_count        | Optional | number      | Number of small buffers in the global pool
11954large_pool_count        | Optional | number      | Number of large buffers in the global pool
11955small_bufsize           | Optional | number      | Size of a small buffer
11956large_bufsize           | Optional | number      | Size of a small buffer
11957
11958#### Example
11959
11960Example request:
11961
11962~~~json
11963{
11964  "jsonrpc": "2.0",
11965  "id": 1,
11966  "method": "iobuf_set_options",
11967  "params": {
11968    "small_pool_count": 16383,
11969    "large_pool_count": 2047
11970  }
11971}
11972~~~
11973
11974Example response:
11975
11976~~~json
11977{
11978  "jsonrpc": "2.0",
11979  "id": 1,
11980  "result": true
11981}
11982~~~
11983
11984### bdev_nvme_start_mdns_discovery {#rpc_bdev_nvme_start_mdns_discovery}
11985
11986Starts an mDNS based discovery service for the specified service type for the
11987auto-discovery of discovery controllers (NVMe TP-8009).
11988
11989The discovery service will listen for the mDNS discovery events from the
11990Avahi-daemon and will connect to the newly learnt discovery controllers.
11991Then the discovery service will automatically attach to any subsystem found in the
11992discovery log page from the discovery controllers learnt using mDNS.
11993When determining a controller name to use when attaching, it will use
11994the 'name' parameter as a prefix, followed by a unique integer assigned for each of the
11995discovery controllers learnt through mDNS, followed by a unique integer for that discovery
11996service. If the discovery service identifies a subsystem that has been previously
11997attached but is listed with a different path, it will use the same controller name
11998as the previous entry, and connect as a multipath.
11999
12000When the discovery service sees that a subsystem entry has been removed
12001from the log page, it will automatically detach from that controller as well.
12002
12003The 'name' is also used to later stop the discovery service.
12004
12005#### Parameters
12006
12007Name                       | Optional | Type        | Description
12008-------------------------- | -------- | ----------- | -----------
12009name                       | Required | string      | Prefix for NVMe discovery services found
12010svcname                    | Required | string      | Service to discover: e.g. _nvme-disc._tcp
12011hostnqn                    | Optional | string      | NVMe-oF hostnqn
12012
12013#### Example
12014
12015Example request:
12016
12017~~~json
12018{
12019  "jsonrpc": "2.0",
12020  "method": "bdev_nvme_start_mdns_discovery",
12021  "id": 1,
12022  "params": {
12023    "name": "cdc_auto",
12024    "svcname": "_nvme-disc._tcp",
12025    "hostnqn": "nqn.2021-12.io.spdk:host1",
12026  }
12027}
12028~~~
12029
12030Example response:
12031
12032~~~json
12033{
12034  "jsonrpc": "2.0",
12035  "id": 1,
12036  "result": true
12037}
12038~~~
12039
12040### bdev_nvme_stop_mdns_discovery {#rpc_bdev_nvme_stop_mdns_discovery}
12041
12042Stops a mDNS discovery service. This includes detaching any controllers that were
12043discovered via the service that is being stopped.
12044
12045#### Parameters
12046
12047Name                       | Optional | Type        | Description
12048-------------------------- | -------- | ----------- | -----------
12049name                       | Required | string      | Name of mDNS discovery instance to stop
12050
12051#### Example
12052
12053Example request:
12054
12055~~~json
12056{
12057  "jsonrpc": "2.0",
12058  "method": "bdev_nvme_stop_mdns_discovery",
12059  "id": 1,
12060  "params": {
12061    "name": "cdc_auto"
12062  }
12063}
12064~~~
12065
12066Example response:
12067
12068~~~json
12069{
12070  "jsonrpc": "2.0",
12071  "id": 1,
12072  "result": true
12073}
12074~~~
12075
12076### bdev_nvme_get_mdns_discovery_info {#rpc_bdev_nvme_get_mdns_discovery_info}
12077
12078Get the information about the mDNS discovery service instances.
12079
12080#### Example
12081
12082Example request:
12083~~~json
12084{
12085  "jsonrpc": "2.0",
12086  "method": "bdev_nvme_get_mdns_discovery_info",
12087  "id": 1
12088}
12089~~~
12090
12091Example response:
12092
12093~~~json
12094[
12095  {
12096    "name": "cdc_auto",
12097    "svcname": "_nvme-disc._tcp",
12098    "referrals": [
12099      {
12100        "name": "cdc_auto0",
12101        "trid": {
12102          "trtype": "TCP",
12103          "adrfam": "IPv4",
12104          "traddr": "66.1.2.21",
12105          "trsvcid": "8009",
12106          "subnqn": "nqn.2014-08.org.nvmexpress.discovery"
12107        }
12108      },
12109      {
12110        "name": "cdc_auto1",
12111        "trid": {
12112          "trtype": "TCP",
12113          "adrfam": "IPv4",
12114          "traddr": "66.1.1.21",
12115          "trsvcid": "8009",
12116          "subnqn": "nqn.2014-08.org.nvmexpress.discovery"
12117        }
12118      }
12119    ]
12120  }
12121]
12122~~~
12123