xref: /spdk/python/spdk/rpc/bdev.py (revision ba8f1a9e5d59b6dfa9fd07c1300891b4e03722d9)
1from .helpers import deprecated_alias
2
3
4def bdev_set_options(client, bdev_io_pool_size=None, bdev_io_cache_size=None, bdev_auto_examine=None,
5                     small_buf_pool_size=None, large_buf_pool_size=None):
6    """Set parameters for the bdev subsystem.
7
8    Args:
9        bdev_io_pool_size: number of bdev_io structures in shared buffer pool (optional)
10        bdev_io_cache_size: maximum number of bdev_io structures cached per thread (optional)
11        bdev_auto_examine: if set to false, the bdev layer will not examine every disks automatically (optional)
12        small_buf_pool_size: maximum number of small buffer (8KB buffer) pool size (optional)
13        large_buf_pool_size: maximum number of large buffer (64KB buffer) pool size (optional)
14    """
15    params = {}
16
17    if bdev_io_pool_size:
18        params['bdev_io_pool_size'] = bdev_io_pool_size
19    if bdev_io_cache_size:
20        params['bdev_io_cache_size'] = bdev_io_cache_size
21    if bdev_auto_examine is not None:
22        params["bdev_auto_examine"] = bdev_auto_examine
23    if small_buf_pool_size:
24        params['small_buf_pool_size'] = small_buf_pool_size
25    if large_buf_pool_size:
26        params['large_buf_pool_size'] = large_buf_pool_size
27    return client.call('bdev_set_options', params)
28
29
30def bdev_examine(client, name):
31    """Examine a bdev manually. If the bdev does not exist yet when this RPC is called,
32    it will be examined when it is created
33
34    Args:
35        name: name of the bdev
36    """
37    params = {
38        'name': name
39    }
40    return client.call('bdev_examine', params)
41
42
43def bdev_wait_for_examine(client):
44    """Report when all bdevs have been examined
45    """
46    return client.call('bdev_wait_for_examine')
47
48
49@deprecated_alias('construct_compress_bdev')
50def bdev_compress_create(client, base_bdev_name, pm_path, lb_size):
51    """Construct a compress virtual block device.
52
53    Args:
54        base_bdev_name: name of the underlying base bdev
55        pm_path: path to persistent memory
56        lb_size: logical block size for the compressed vol in bytes.  Must be 4K or 512.
57
58    Returns:
59        Name of created virtual block device.
60    """
61    params = {'base_bdev_name': base_bdev_name, 'pm_path': pm_path, 'lb_size': lb_size}
62
63    return client.call('bdev_compress_create', params)
64
65
66@deprecated_alias('delete_compress_bdev')
67def bdev_compress_delete(client, name):
68    """Delete compress virtual block device.
69
70    Args:
71        name: name of compress vbdev to delete
72    """
73    params = {'name': name}
74    return client.call('bdev_compress_delete', params)
75
76
77@deprecated_alias('set_compress_pmd')
78@deprecated_alias('compress_set_pmd')
79def bdev_compress_set_pmd(client, pmd):
80    """Set pmd options for the bdev compress.
81
82    Args:
83        pmd: 0 = auto-select, 1 = QAT, 2 = ISAL, 3 = mlx5_pci
84    """
85    params = {'pmd': pmd}
86
87    return client.call('bdev_compress_set_pmd', params)
88
89
90def bdev_compress_get_orphans(client, name=None):
91    """Get a list of comp bdevs that do not have a pmem file (aka orphaned).
92
93    Args:
94        name: comp bdev name to query (optional; if omitted, query all comp bdevs)
95
96    Returns:
97        List of comp bdev names.
98    """
99    params = {}
100    if name:
101        params['name'] = name
102    return client.call('bdev_compress_get_orphans', params)
103
104
105@deprecated_alias('construct_crypto_bdev')
106def bdev_crypto_create(client, base_bdev_name, name, crypto_pmd, key, cipher=None, key2=None):
107    """Construct a crypto virtual block device.
108
109    Args:
110        base_bdev_name: name of the underlying base bdev
111        name: name for the crypto vbdev
112        crypto_pmd: name of of the DPDK crypto driver to use
113        key: key
114
115    Returns:
116        Name of created virtual block device.
117    """
118    params = {'base_bdev_name': base_bdev_name, 'name': name, 'crypto_pmd': crypto_pmd, 'key': key}
119    if cipher:
120        params['cipher'] = cipher
121    if key2:
122        params['key2'] = key2
123    return client.call('bdev_crypto_create', params)
124
125
126@deprecated_alias('delete_crypto_bdev')
127def bdev_crypto_delete(client, name):
128    """Delete crypto virtual block device.
129
130    Args:
131        name: name of crypto vbdev to delete
132    """
133    params = {'name': name}
134    return client.call('bdev_crypto_delete', params)
135
136
137@deprecated_alias('construct_ocf_bdev')
138def bdev_ocf_create(client, name, mode, cache_line_size, cache_bdev_name, core_bdev_name):
139    """Add an OCF block device
140
141    Args:
142        name: name of constructed OCF bdev
143        mode: OCF cache mode: {'wb', 'wt', 'pt', 'wa', 'wi', 'wo'}
144        cache_line_size: OCF cache line size. The unit is KiB: {4, 8, 16, 32, 64}
145        cache_bdev_name: name of underlying cache bdev
146        core_bdev_name: name of underlying core bdev
147
148    Returns:
149        Name of created block device
150    """
151    params = {
152        'name': name,
153        'mode': mode,
154        'cache_line_size': cache_line_size,
155        'cache_bdev_name': cache_bdev_name,
156        'core_bdev_name': core_bdev_name,
157    }
158
159    return client.call('bdev_ocf_create', params)
160
161
162@deprecated_alias('delete_ocf_bdev')
163def bdev_ocf_delete(client, name):
164    """Delete an OCF device
165
166    Args:
167        name: name of OCF bdev
168
169    """
170    params = {'name': name}
171
172    return client.call('bdev_ocf_delete', params)
173
174
175@deprecated_alias('get_ocf_stats')
176def bdev_ocf_get_stats(client, name):
177    """Get statistics of chosen OCF block device
178
179    Args:
180        name: name of OCF bdev
181
182    Returns:
183        Statistics as json object
184    """
185    params = {'name': name}
186
187    return client.call('bdev_ocf_get_stats', params)
188
189
190@deprecated_alias('get_ocf_stats')
191def bdev_ocf_get_bdevs(client, name=None):
192    """Get list of OCF devices including unregistered ones
193
194    Args:
195        name: name of OCF vbdev or name of cache device or name of core device (optional)
196
197    Returns:
198        Array of OCF devices with their current status
199    """
200    params = None
201    if name:
202        params = {'name': name}
203    return client.call('bdev_ocf_get_bdevs', params)
204
205
206def bdev_ocf_set_cache_mode(client, name, mode):
207    """Set cache mode of OCF block device
208
209    Args:
210        name: name of OCF bdev
211        mode: OCF cache mode: {'wb', 'wt', 'pt', 'wa', 'wi', 'wo'}
212
213    Returns:
214        New cache mode name
215    """
216    params = {
217        'name': name,
218        'mode': mode,
219    }
220
221    return client.call('bdev_ocf_set_cache_mode', params)
222
223
224def bdev_ocf_set_seqcutoff(client, name, policy, threshold, promotion_count):
225    """Set sequential cutoff parameters on all cores for the given OCF cache device
226
227    Args:
228        name: Name of OCF cache bdev
229        policy: Sequential cutoff policy
230        threshold: Activation threshold [KiB] (optional)
231        promotion_count: Promotion request count (optional)
232    """
233    params = {
234        'name': name,
235        'policy': policy,
236    }
237    if threshold:
238        params['threshold'] = threshold
239    if promotion_count:
240        params['promotion_count'] = promotion_count
241
242    return client.call('bdev_ocf_set_seqcutoff', params)
243
244
245@deprecated_alias('construct_malloc_bdev')
246def bdev_malloc_create(client, num_blocks, block_size, name=None, uuid=None, optimal_io_boundary=None):
247    """Construct a malloc block device.
248
249    Args:
250        num_blocks: size of block device in blocks
251        block_size: block size of device; must be a power of 2 and at least 512
252        name: name of block device (optional)
253        uuid: UUID of block device (optional)
254        optimal_io_boundary: Split on optimal IO boundary, in number of blocks, default 0 (disabled, optional)
255
256    Returns:
257        Name of created block device.
258    """
259    params = {'num_blocks': num_blocks, 'block_size': block_size}
260    if name:
261        params['name'] = name
262    if uuid:
263        params['uuid'] = uuid
264    if optimal_io_boundary:
265        params['optimal_io_boundary'] = optimal_io_boundary
266    return client.call('bdev_malloc_create', params)
267
268
269@deprecated_alias('delete_malloc_bdev')
270def bdev_malloc_delete(client, name):
271    """Delete malloc block device.
272
273    Args:
274        bdev_name: name of malloc bdev to delete
275    """
276    params = {'name': name}
277    return client.call('bdev_malloc_delete', params)
278
279
280@deprecated_alias('construct_null_bdev')
281def bdev_null_create(client, num_blocks, block_size, name, uuid=None, md_size=None,
282                     dif_type=None, dif_is_head_of_md=None):
283    """Construct a null block device.
284
285    Args:
286        num_blocks: size of block device in blocks
287        block_size: block size of device; data part size must be a power of 2 and at least 512
288        name: name of block device
289        uuid: UUID of block device (optional)
290        md_size: metadata size of device (optional)
291        dif_type: protection information type (optional)
292        dif_is_head_of_md: protection information is in the first 8 bytes of metadata (optional)
293
294    Returns:
295        Name of created block device.
296    """
297    params = {'name': name, 'num_blocks': num_blocks,
298              'block_size': block_size}
299    if uuid:
300        params['uuid'] = uuid
301    if md_size:
302        params['md_size'] = md_size
303    if dif_type:
304        params['dif_type'] = dif_type
305    if dif_is_head_of_md:
306        params['dif_is_head_of_md'] = dif_is_head_of_md
307    return client.call('bdev_null_create', params)
308
309
310@deprecated_alias('delete_null_bdev')
311def bdev_null_delete(client, name):
312    """Remove null bdev from the system.
313
314    Args:
315        name: name of null bdev to delete
316    """
317    params = {'name': name}
318    return client.call('bdev_null_delete', params)
319
320
321def bdev_null_resize(client, name, new_size):
322    """Resize null bdev in the system.
323
324    Args:
325        name: name of null bdev to resize
326        new_size: new bdev size of resize operation. The unit is MiB
327    """
328    params = {
329            'name': name,
330            'new_size': new_size,
331            }
332    return client.call('bdev_null_resize', params)
333
334
335@deprecated_alias('get_raid_bdevs')
336def bdev_raid_get_bdevs(client, category):
337    """Get list of raid bdevs based on category
338
339    Args:
340        category: any one of all or online or configuring or offline
341
342    Returns:
343        List of raid bdev names
344    """
345    params = {'category': category}
346    return client.call('bdev_raid_get_bdevs', params)
347
348
349@deprecated_alias('construct_raid_bdev')
350def bdev_raid_create(client, name, raid_level, base_bdevs, strip_size=None, strip_size_kb=None):
351    """Create raid bdev. Either strip size arg will work but one is required.
352
353    Args:
354        name: user defined raid bdev name
355        strip_size (deprecated): strip size of raid bdev in KB, supported values like 8, 16, 32, 64, 128, 256, etc
356        strip_size_kb: strip size of raid bdev in KB, supported values like 8, 16, 32, 64, 128, 256, etc
357        raid_level: raid level of raid bdev, supported values 0
358        base_bdevs: Space separated names of Nvme bdevs in double quotes, like "Nvme0n1 Nvme1n1 Nvme2n1"
359
360    Returns:
361        None
362    """
363    params = {'name': name, 'raid_level': raid_level, 'base_bdevs': base_bdevs}
364
365    if strip_size:
366        params['strip_size'] = strip_size
367
368    if strip_size_kb:
369        params['strip_size_kb'] = strip_size_kb
370
371    return client.call('bdev_raid_create', params)
372
373
374@deprecated_alias('destroy_raid_bdev')
375def bdev_raid_delete(client, name):
376    """Delete raid bdev
377
378    Args:
379        name: raid bdev name
380
381    Returns:
382        None
383    """
384    params = {'name': name}
385    return client.call('bdev_raid_delete', params)
386
387
388@deprecated_alias('construct_aio_bdev')
389def bdev_aio_create(client, filename, name, block_size=None):
390    """Construct a Linux AIO block device.
391
392    Args:
393        filename: path to device or file (ex: /dev/sda)
394        name: name of block device
395        block_size: block size of device (optional; autodetected if omitted)
396
397    Returns:
398        Name of created block device.
399    """
400    params = {'name': name,
401              'filename': filename}
402
403    if block_size:
404        params['block_size'] = block_size
405
406    return client.call('bdev_aio_create', params)
407
408
409def bdev_aio_rescan(client, name):
410    """Rescan a Linux AIO block device.
411
412    Args:
413        bdev_name: name of aio bdev to delete
414    """
415    params = {'name': name}
416    return client.call('bdev_aio_rescan', params)
417
418
419@deprecated_alias('delete_aio_bdev')
420def bdev_aio_delete(client, name):
421    """Remove aio bdev from the system.
422
423    Args:
424        bdev_name: name of aio bdev to delete
425    """
426    params = {'name': name}
427    return client.call('bdev_aio_delete', params)
428
429
430def bdev_uring_create(client, filename, name, block_size=None):
431    """Create a bdev with Linux io_uring backend.
432
433    Args:
434        filename: path to device or file (ex: /dev/nvme0n1)
435        name: name of bdev
436        block_size: block size of device (optional; autodetected if omitted)
437
438    Returns:
439        Name of created bdev.
440    """
441    params = {'name': name,
442              'filename': filename}
443
444    if block_size:
445        params['block_size'] = block_size
446
447    return client.call('bdev_uring_create', params)
448
449
450def bdev_uring_delete(client, name):
451    """Delete a uring bdev.
452
453    Args:
454        name: name of uring bdev to delete
455    """
456    params = {'name': name}
457    return client.call('bdev_uring_delete', params)
458
459
460@deprecated_alias('set_bdev_nvme_options')
461def bdev_nvme_set_options(client, action_on_timeout=None, timeout_us=None, timeout_admin_us=None,
462                          keep_alive_timeout_ms=None, retry_count=None, arbitration_burst=None,
463                          low_priority_weight=None, medium_priority_weight=None, high_priority_weight=None,
464                          nvme_adminq_poll_period_us=None, nvme_ioq_poll_period_us=None, io_queue_requests=None,
465                          delay_cmd_submit=None, transport_retry_count=None, bdev_retry_count=None,
466                          transport_ack_timeout=None, ctrlr_loss_timeout_sec=None, reconnect_delay_sec=None,
467                          fast_io_fail_timeout_sec=None):
468    """Set options for the bdev nvme. This is startup command.
469
470    Args:
471        action_on_timeout:  action to take on command time out. Valid values are: none, reset, abort (optional)
472        timeout_us: Timeout for each command, in microseconds. If 0, don't track timeouts (optional)
473        timeout_admin_us: Timeout for each admin command, in microseconds. If 0, treat same as io timeouts (optional)
474        keep_alive_timeout_ms: Keep alive timeout period in millisecond, default is 10s (optional)
475        retry_count: The number of attempts per I/O when an I/O fails (deprecated) (optional)
476        arbitration_burst: The value is expressed as a power of two (optional)
477        low_priority_weight: The number of commands that may be executed from the low priority queue at one time (optional)
478        medium_priority_weight: The number of commands that may be executed from the medium priority queue at one time (optional)
479        high_priority_weight: The number of commands that may be executed from the high priority queue at one time (optional)
480        nvme_adminq_poll_period_us: How often the admin queue is polled for asynchronous events in microseconds (optional)
481        nvme_ioq_poll_period_us: How often to poll I/O queues for completions in microseconds (optional)
482        io_queue_requests: The number of requests allocated for each NVMe I/O queue. Default: 512 (optional)
483        delay_cmd_submit: Enable delayed NVMe command submission to allow batching of multiple commands (optional)
484        transport_retry_count: The number of attempts per I/O in the transport layer when an I/O fails (optional)
485        bdev_retry_count: The number of attempts per I/O in the bdev layer when an I/O fails. -1 means infinite retries. (optional)
486        transport_ack_timeout: Time to wait ack until packet retransmission for RDMA or until closes connection for TCP.
487        Range 0-31 where 0 is driver-specific default value (optional)
488        ctrlr_loss_timeout_sec: Time to wait until ctrlr is reconnected before deleting ctrlr.
489        -1 means infinite reconnect retries. 0 means no reconnect retry.
490        If reconnect_delay_sec is zero, ctrlr_loss_timeout_sec has to be zero.
491        If reconnect_delay_sec is non-zero, ctrlr_loss_timeout_sec has to be -1 or not less than reconnect_delay_sec.
492        This can be overridden by bdev_nvme_attach_controller. (optional)
493        reconnect_delay_sec: Time to delay a reconnect retry.
494        If ctrlr_loss_timeout_sec is zero, reconnect_delay_sec has to be zero.
495        If ctrlr_loss_timeout_sec is -1, reconnect_delay_sec has to be non-zero.
496        If ctrlr_loss_timeout_sec is not -1 or zero, reconnect_sec has to be non-zero and less than ctrlr_loss_timeout_sec.
497        This can be overridden by bdev_nvme_attach_controller. (optional)
498        fail_io_fast_timeout_sec: Time to wait until ctrlr is reconnected before failing I/O to ctrlr.
499        0 means no such timeout.
500        If fast_io_fail_timeout_sec is not zero, it has to be not less than reconnect_delay_sec and less than
501        ctrlr_loss_timeout_sec if ctrlr_loss_timeout_sec is not -1.
502        This can be overridden by bdev_nvme_attach_controller. (optional)
503
504    """
505    params = {}
506
507    if action_on_timeout:
508        params['action_on_timeout'] = action_on_timeout
509
510    if timeout_us is not None:
511        params['timeout_us'] = timeout_us
512
513    if timeout_admin_us is not None:
514        params['timeout_admin_us'] = timeout_admin_us
515
516    if keep_alive_timeout_ms is not None:
517        params['keep_alive_timeout_ms'] = keep_alive_timeout_ms
518
519    if retry_count is not None:
520        print("WARNING: retry_count is deprecated, please use transport_retry_count.")
521        params['retry_count'] = retry_count
522
523    if arbitration_burst is not None:
524        params['arbitration_burst'] = arbitration_burst
525
526    if low_priority_weight is not None:
527        params['low_priority_weight'] = low_priority_weight
528
529    if medium_priority_weight is not None:
530        params['medium_priority_weight'] = medium_priority_weight
531
532    if high_priority_weight is not None:
533        params['high_priority_weight'] = high_priority_weight
534
535    if nvme_adminq_poll_period_us:
536        params['nvme_adminq_poll_period_us'] = nvme_adminq_poll_period_us
537
538    if nvme_ioq_poll_period_us is not None:
539        params['nvme_ioq_poll_period_us'] = nvme_ioq_poll_period_us
540
541    if io_queue_requests is not None:
542        params['io_queue_requests'] = io_queue_requests
543
544    if delay_cmd_submit is not None:
545        params['delay_cmd_submit'] = delay_cmd_submit
546
547    if transport_retry_count is not None:
548        params['transport_retry_count'] = transport_retry_count
549
550    if bdev_retry_count is not None:
551        params['bdev_retry_count'] = bdev_retry_count
552
553    if transport_ack_timeout is not None:
554        params['transport_ack_timeout'] = transport_ack_timeout
555
556    if ctrlr_loss_timeout_sec is not None:
557        params['ctrlr_loss_timeout_sec'] = ctrlr_loss_timeout_sec
558
559    if reconnect_delay_sec is not None:
560        params['reconnect_delay_sec'] = reconnect_delay_sec
561
562    if fast_io_fail_timeout_sec is not None:
563        params['fast_io_fail_timeout_sec'] = fast_io_fail_timeout_sec
564
565    return client.call('bdev_nvme_set_options', params)
566
567
568@deprecated_alias('set_bdev_nvme_hotplug')
569def bdev_nvme_set_hotplug(client, enable, period_us=None):
570    """Set options for the bdev nvme. This is startup command.
571
572    Args:
573       enable: True to enable hotplug, False to disable.
574       period_us: how often the hotplug is processed for insert and remove events. Set 0 to reset to default. (optional)
575    """
576    params = {'enable': enable}
577
578    if period_us:
579        params['period_us'] = period_us
580
581    return client.call('bdev_nvme_set_hotplug', params)
582
583
584@deprecated_alias('construct_nvme_bdev')
585def bdev_nvme_attach_controller(client, name, trtype, traddr, adrfam=None, trsvcid=None,
586                                priority=None, subnqn=None, hostnqn=None, hostaddr=None,
587                                hostsvcid=None, prchk_reftag=None, prchk_guard=None,
588                                hdgst=None, ddgst=None, fabrics_timeout=None, multipath=None, num_io_queues=None,
589                                ctrlr_loss_timeout_sec=None, reconnect_delay_sec=None,
590                                fast_io_fail_timeout_sec=None):
591    """Construct block device for each NVMe namespace in the attached controller.
592
593    Args:
594        name: bdev name prefix; "n" + namespace ID will be appended to create unique names
595        trtype: transport type ("PCIe", "RDMA", "FC", "TCP")
596        traddr: transport address (PCI BDF or IP address)
597        adrfam: address family ("IPv4", "IPv6", "IB", or "FC")
598        trsvcid: transport service ID (port number for IP-based addresses)
599        priority: transport connection priority (Sock priority for TCP-based transports; optional)
600        subnqn: subsystem NQN to connect to (optional)
601        hostnqn: NQN to connect from (optional)
602        hostaddr: host transport address (IP address for IP-based transports, NULL for PCIe or FC; optional)
603        hostsvcid: host transport service ID (port number for IP-based transports, NULL for PCIe or FC; optional)
604        prchk_reftag: Enable checking of PI reference tag for I/O processing (optional)
605        prchk_guard: Enable checking of PI guard for I/O processing (optional)
606        hdgst: Enable TCP header digest (optional)
607        ddgst: Enable TCP data digest (optional)
608        fabrics_timeout: Fabrics connect timeout in us (optional)
609        multipath: The behavior when multiple paths are created ("disable", "failover", or "multipath"; failover if not specified)
610        num_io_queues: The number of IO queues to request during initialization. (optional)
611        ctrlr_loss_timeout_sec: Time to wait until ctrlr is reconnected before deleting ctrlr.
612        -1 means infinite reconnect retries. 0 means no reconnect retry.
613        If reconnect_delay_sec is zero, ctrlr_loss_timeout_sec has to be zero.
614        If reconnect_delay_sec is non-zero, ctrlr_loss_timeout_sec has to be -1 or not less than reconnect_delay_sec.
615        (optional)
616        reconnect_delay_sec: Time to delay a reconnect retry.
617        If ctrlr_loss_timeout_sec is zero, reconnect_delay_sec has to be zero.
618        If ctrlr_loss_timeout_sec is -1, reconnect_delay_sec has to be non-zero.
619        If ctrlr_loss_timeout_sec is not -1 or zero, reconnect_sec has to be non-zero and less than ctrlr_loss_timeout_sec.
620        (optional)
621        fail_io_fast_timeout_sec: Time to wait until ctrlr is reconnected before failing I/O to ctrlr.
622        0 means no such timeout.
623        If fast_io_fail_timeout_sec is not zero, it has to be not less than reconnect_delay_sec and less than
624        ctrlr_loss_timeout_sec if ctrlr_loss_timeout_sec is not -1. (optional)
625
626    Returns:
627        Names of created block devices.
628    """
629    params = {'name': name,
630              'trtype': trtype,
631              'traddr': traddr}
632
633    if hostnqn:
634        params['hostnqn'] = hostnqn
635
636    if hostaddr:
637        params['hostaddr'] = hostaddr
638
639    if hostsvcid:
640        params['hostsvcid'] = hostsvcid
641
642    if adrfam:
643        params['adrfam'] = adrfam
644
645    if trsvcid:
646        params['trsvcid'] = trsvcid
647
648    if priority:
649        params['priority'] = priority
650
651    if subnqn:
652        params['subnqn'] = subnqn
653
654    if prchk_reftag:
655        params['prchk_reftag'] = prchk_reftag
656
657    if prchk_guard:
658        params['prchk_guard'] = prchk_guard
659
660    if hdgst:
661        params['hdgst'] = hdgst
662
663    if ddgst:
664        params['ddgst'] = ddgst
665
666    if fabrics_timeout:
667        params['fabrics_connect_timeout_us'] = fabrics_timeout
668
669    if multipath:
670        params['multipath'] = multipath
671
672    if num_io_queues:
673        params['num_io_queues'] = num_io_queues
674
675    if ctrlr_loss_timeout_sec is not None:
676        params['ctrlr_loss_timeout_sec'] = ctrlr_loss_timeout_sec
677
678    if reconnect_delay_sec is not None:
679        params['reconnect_delay_sec'] = reconnect_delay_sec
680
681    if fast_io_fail_timeout_sec is not None:
682        params['fast_io_fail_timeout_sec'] = fast_io_fail_timeout_sec
683
684    return client.call('bdev_nvme_attach_controller', params)
685
686
687@deprecated_alias('delete_nvme_controller')
688def bdev_nvme_detach_controller(client, name, trtype=None, traddr=None,
689                                adrfam=None, trsvcid=None, subnqn=None,
690                                hostaddr=None, hostsvcid=None):
691    """Detach NVMe controller and delete any associated bdevs. Optionally,
692       If all of the transport ID options are specified, only remove that
693       transport path from the specified controller. If that is the only
694       available path for the controller, this will also result in the
695       controller being detached and the associated bdevs being deleted.
696
697    Args:
698        name: controller name
699        trtype: transport type ("PCIe", "RDMA")
700        traddr: transport address (PCI BDF or IP address)
701        adrfam: address family ("IPv4", "IPv6", "IB", or "FC")
702        trsvcid: transport service ID (port number for IP-based addresses)
703        subnqn: subsystem NQN to connect to (optional)
704        hostaddr: Host address (IP address)
705        hostsvcid: transport service ID on host side (port number)
706    """
707
708    params = {'name': name}
709
710    if trtype:
711        params['trtype'] = trtype
712
713    if traddr:
714        params['traddr'] = traddr
715
716    if adrfam:
717        params['adrfam'] = adrfam
718
719    if trsvcid:
720        params['trsvcid'] = trsvcid
721
722    if subnqn:
723        params['subnqn'] = subnqn
724
725    if hostaddr:
726        params['hostaddr'] = hostaddr
727
728    if hostsvcid:
729        params['hostsvcid'] = hostsvcid
730
731    return client.call('bdev_nvme_detach_controller', params)
732
733
734def bdev_nvme_reset_controller(client, name):
735    """Reset NVMe controller.
736
737    Args:
738        name: controller name
739    """
740
741    params = {'name': name}
742
743    return client.call('bdev_nvme_reset_controller', params)
744
745
746def bdev_nvme_start_discovery(client, name, trtype, traddr, adrfam=None, trsvcid=None,
747                              hostnqn=None, wait_for_attach=None, ctrlr_loss_timeout_sec=None,
748                              reconnect_delay_sec=None, fast_io_fail_timeout_sec=None):
749    """Start discovery with the specified discovery subsystem
750
751    Args:
752        name: bdev name prefix; "n" + namespace ID will be appended to create unique names
753        trtype: transport type ("PCIe", "RDMA", "FC", "TCP")
754        traddr: transport address (PCI BDF or IP address)
755        adrfam: address family ("IPv4", "IPv6", "IB", or "FC")
756        trsvcid: transport service ID (port number for IP-based addresses)
757        hostnqn: NQN to connect from (optional)
758        wait_for_attach: Wait to complete RPC until all discovered NVM subsystems have attached (optional)
759        ctrlr_loss_timeout_sec: Time to wait until ctrlr is reconnected before deleting ctrlr.
760        -1 means infinite reconnect retries. 0 means no reconnect retry.
761        If reconnect_delay_sec is zero, ctrlr_loss_timeout_sec has to be zero.
762        If reconnect_delay_sec is non-zero, ctrlr_loss_timeout_sec has to be -1 or not less than reconnect_delay_sec.
763        (optional)
764        reconnect_delay_sec: Time to delay a reconnect retry.
765        If ctrlr_loss_timeout_sec is zero, reconnect_delay_sec has to be zero.
766        If ctrlr_loss_timeout_sec is -1, reconnect_delay_sec has to be non-zero.
767        If ctrlr_loss_timeout_sec is not -1 or zero, reconnect_sec has to be non-zero and less than ctrlr_loss_timeout_sec.
768        (optional)
769        fail_io_fast_timeout_sec: Time to wait until ctrlr is reconnected before failing I/O to ctrlr.
770        0 means no such timeout.
771        If fast_io_fail_timeout_sec is not zero, it has to be not less than reconnect_delay_sec and less than
772        ctrlr_loss_timeout_sec if ctrlr_loss_timeout_sec is not -1. (optional)
773    """
774    params = {'name': name,
775              'trtype': trtype,
776              'traddr': traddr}
777
778    if hostnqn:
779        params['hostnqn'] = hostnqn
780
781    if adrfam:
782        params['adrfam'] = adrfam
783
784    if trsvcid:
785        params['trsvcid'] = trsvcid
786
787    if wait_for_attach:
788        params['wait_for_attach'] = True
789
790    if ctrlr_loss_timeout_sec is not None:
791        params['ctrlr_loss_timeout_sec'] = ctrlr_loss_timeout_sec
792
793    if reconnect_delay_sec is not None:
794        params['reconnect_delay_sec'] = reconnect_delay_sec
795
796    if fast_io_fail_timeout_sec is not None:
797        params['fast_io_fail_timeout_sec'] = fast_io_fail_timeout_sec
798
799    return client.call('bdev_nvme_start_discovery', params)
800
801
802def bdev_nvme_stop_discovery(client, name):
803    """Stop a previously started discovery service
804
805    Args:
806        name: name of discovery service to start
807    """
808    params = {'name': name}
809
810    return client.call('bdev_nvme_stop_discovery', params)
811
812
813def bdev_nvme_get_discovery_info(client):
814    """Get information about the automatic discovery
815    """
816    return client.call('bdev_nvme_get_discovery_info')
817
818
819def bdev_nvme_get_io_paths(client, name):
820    """Display all or the specified NVMe bdev's active I/O paths
821
822    Args:
823        name: Name of the NVMe bdev (optional)
824
825    Returns:
826        List of active I/O paths
827    """
828    params = {}
829    if name:
830        params['name'] = name
831    return client.call('bdev_nvme_get_io_paths', params)
832
833
834def bdev_nvme_set_preferred_path(client, name, cntlid):
835    """Set the preferred I/O path for an NVMe bdev when in multipath mode
836
837    Args:
838        name: NVMe bdev name
839        cntlid: NVMe-oF controller ID
840    """
841
842    params = {'name': name,
843              'cntlid': cntlid}
844
845    return client.call('bdev_nvme_set_preferred_path', params)
846
847
848def bdev_nvme_set_multipath_policy(client, name, policy):
849    """Set multipath policy of the NVMe bdev
850
851    Args:
852        name: NVMe bdev name
853        policy: Multipath policy (active_passive or active_active)
854    """
855
856    params = {'name': name,
857              'policy': policy}
858
859    return client.call('bdev_nvme_set_multipath_policy', params)
860
861
862def bdev_nvme_cuse_register(client, name):
863    """Register CUSE devices on NVMe controller.
864
865    Args:
866        name: Name of the operating NVMe controller
867    """
868    params = {'name': name}
869
870    return client.call('bdev_nvme_cuse_register', params)
871
872
873def bdev_nvme_cuse_unregister(client, name):
874    """Unregister CUSE devices on NVMe controller.
875
876    Args:
877        name: Name of the operating NVMe controller
878    """
879    params = {'name': name}
880
881    return client.call('bdev_nvme_cuse_unregister', params)
882
883
884def bdev_zone_block_create(client, name, base_bdev, zone_capacity, optimal_open_zones):
885    """Creates a virtual zone device on top of existing non-zoned bdev.
886
887    Args:
888        name: Zone device name
889        base_bdev: Base Nvme bdev name
890        zone_capacity: Surfaced zone capacity in blocks
891        optimal_open_zones: Number of zones required to reach optimal write speed (optional, default: 1)
892
893    Returns:
894        Name of created block device.
895    """
896    params = {'name': name,
897              'base_bdev': base_bdev,
898              'zone_capacity': zone_capacity,
899              'optimal_open_zones': optimal_open_zones}
900
901    return client.call('bdev_zone_block_create', params)
902
903
904def bdev_zone_block_delete(client, name):
905    """Remove block zone bdev from the system.
906
907    Args:
908        name: name of block zone bdev to delete
909    """
910    params = {'name': name}
911    return client.call('bdev_zone_block_delete', params)
912
913
914def bdev_rbd_register_cluster(client, name, user=None, config_param=None, config_file=None, key_file=None):
915    """Create a Rados Cluster object of the Ceph RBD backend.
916
917    Args:
918        name: name of Rados Cluster
919        user: Ceph user name (optional)
920        config_param: map of config keys to values (optional)
921        config_file: file path of Ceph configuration file (optional)
922        key_file: file path of Ceph key file (optional)
923
924    Returns:
925        Name of registered Rados Cluster object.
926    """
927    params = {'name': name}
928
929    if user is not None:
930        params['user_id'] = user
931    if config_param is not None:
932        params['config_param'] = config_param
933    if config_file is not None:
934        params['config_file'] = config_file
935    if key_file is not None:
936        params['key_file'] = key_file
937
938    return client.call('bdev_rbd_register_cluster', params)
939
940
941def bdev_rbd_unregister_cluster(client, name):
942    """Remove Rados cluster object from the system.
943
944    Args:
945        name: name of Rados cluster object to unregister
946    """
947    params = {'name': name}
948    return client.call('bdev_rbd_unregister_cluster', params)
949
950
951def bdev_rbd_get_clusters_info(client, name):
952    """Get the cluster(s) info
953
954    Args:
955        name: name of Rados cluster object to query (optional; if omitted, query all clusters)
956
957    Returns:
958        List of registered Rados cluster information objects.
959    """
960    params = {}
961    if name:
962        params['name'] = name
963    return client.call('bdev_rbd_get_clusters_info', params)
964
965
966@deprecated_alias('construct_rbd_bdev')
967def bdev_rbd_create(client, pool_name, rbd_name, block_size, name=None, user=None, config=None, cluster_name=None, uuid=None):
968    """Create a Ceph RBD block device.
969
970    Args:
971        pool_name: Ceph RBD pool name
972        rbd_name: Ceph RBD image name
973        block_size: block size of RBD volume
974        name: name of block device (optional)
975        user: Ceph user name (optional)
976        config: map of config keys to values (optional)
977        cluster_name: Name to identify Rados cluster (optional)
978        uuid: UUID of block device (optional)
979
980    Returns:
981        Name of created block device.
982    """
983    params = {
984        'pool_name': pool_name,
985        'rbd_name': rbd_name,
986        'block_size': block_size,
987    }
988
989    if name:
990        params['name'] = name
991    if user is not None:
992        params['user_id'] = user
993    if config is not None:
994        params['config'] = config
995    if cluster_name is not None:
996        params['cluster_name'] = cluster_name
997    if uuid is not None:
998        params['uuid'] = uuid
999
1000    return client.call('bdev_rbd_create', params)
1001
1002
1003@deprecated_alias('delete_rbd_bdev')
1004def bdev_rbd_delete(client, name):
1005    """Remove rbd bdev from the system.
1006
1007    Args:
1008        name: name of rbd bdev to delete
1009    """
1010    params = {'name': name}
1011    return client.call('bdev_rbd_delete', params)
1012
1013
1014def bdev_rbd_resize(client, name, new_size):
1015    """Resize rbd bdev in the system.
1016
1017    Args:
1018        name: name of rbd bdev to resize
1019        new_size: new bdev size of resize operation. The unit is MiB
1020    """
1021    params = {
1022            'name': name,
1023            'new_size': new_size,
1024            }
1025    return client.call('bdev_rbd_resize', params)
1026
1027
1028@deprecated_alias('construct_error_bdev')
1029def bdev_error_create(client, base_name):
1030    """Construct an error injection block device.
1031
1032    Args:
1033        base_name: base bdev name
1034    """
1035    params = {'base_name': base_name}
1036    return client.call('bdev_error_create', params)
1037
1038
1039def bdev_delay_create(client, base_bdev_name, name, avg_read_latency, p99_read_latency, avg_write_latency, p99_write_latency):
1040    """Construct a delay block device.
1041
1042    Args:
1043        base_bdev_name: name of the existing bdev
1044        name: name of block device
1045        avg_read_latency: complete 99% of read ops with this delay
1046        p99_read_latency: complete 1% of read ops with this delay
1047        avg_write_latency: complete 99% of write ops with this delay
1048        p99_write_latency: complete 1% of write ops with this delay
1049
1050    Returns:
1051        Name of created block device.
1052    """
1053    params = {
1054        'base_bdev_name': base_bdev_name,
1055        'name': name,
1056        'avg_read_latency': avg_read_latency,
1057        'p99_read_latency': p99_read_latency,
1058        'avg_write_latency': avg_write_latency,
1059        'p99_write_latency': p99_write_latency,
1060    }
1061    return client.call('bdev_delay_create', params)
1062
1063
1064def bdev_delay_delete(client, name):
1065    """Remove delay bdev from the system.
1066
1067    Args:
1068        name: name of delay bdev to delete
1069    """
1070    params = {'name': name}
1071    return client.call('bdev_delay_delete', params)
1072
1073
1074def bdev_delay_update_latency(client, delay_bdev_name, latency_type, latency_us):
1075    """Update the latency value for a delay block device
1076
1077    Args:
1078        delay_bdev_name: name of the delay bdev
1079        latency_type: 'one of: avg_read, avg_write, p99_read, p99_write. No other values accepted.'
1080        latency_us: 'new latency value.'
1081
1082    Returns:
1083        True if successful, or a specific error otherwise.
1084    """
1085    params = {
1086        'delay_bdev_name': delay_bdev_name,
1087        'latency_type': latency_type,
1088        'latency_us': latency_us,
1089    }
1090    return client.call('bdev_delay_update_latency', params)
1091
1092
1093@deprecated_alias('delete_error_bdev')
1094def bdev_error_delete(client, name):
1095    """Remove error bdev from the system.
1096
1097    Args:
1098        bdev_name: name of error bdev to delete
1099    """
1100    params = {'name': name}
1101    return client.call('bdev_error_delete', params)
1102
1103
1104@deprecated_alias('construct_iscsi_bdev')
1105def bdev_iscsi_create(client, name, url, initiator_iqn):
1106    """Construct an iSCSI block device.
1107
1108    Args:
1109        name: name of block device
1110        url: iSCSI URL
1111        initiator_iqn: IQN name to be used by initiator
1112
1113    Returns:
1114        Name of created block device.
1115    """
1116    params = {
1117        'name': name,
1118        'url': url,
1119        'initiator_iqn': initiator_iqn,
1120    }
1121    return client.call('bdev_iscsi_create', params)
1122
1123
1124@deprecated_alias('delete_iscsi_bdev')
1125def bdev_iscsi_delete(client, name):
1126    """Remove iSCSI bdev from the system.
1127
1128    Args:
1129        bdev_name: name of iSCSI bdev to delete
1130    """
1131    params = {'name': name}
1132    return client.call('bdev_iscsi_delete', params)
1133
1134
1135@deprecated_alias('construct_pmem_bdev')
1136def bdev_pmem_create(client, pmem_file, name):
1137    """Construct a libpmemblk block device.
1138
1139    Args:
1140        pmem_file: path to pmemblk pool file
1141        name: name of block device
1142
1143    Returns:
1144        Name of created block device.
1145    """
1146    params = {
1147        'pmem_file': pmem_file,
1148        'name': name
1149    }
1150    return client.call('bdev_pmem_create', params)
1151
1152
1153@deprecated_alias('delete_pmem_bdev')
1154def bdev_pmem_delete(client, name):
1155    """Remove pmem bdev from the system.
1156
1157    Args:
1158        name: name of pmem bdev to delete
1159    """
1160    params = {'name': name}
1161    return client.call('bdev_pmem_delete', params)
1162
1163
1164@deprecated_alias('construct_passthru_bdev')
1165def bdev_passthru_create(client, base_bdev_name, name):
1166    """Construct a pass-through block device.
1167
1168    Args:
1169        base_bdev_name: name of the existing bdev
1170        name: name of block device
1171
1172    Returns:
1173        Name of created block device.
1174    """
1175    params = {
1176        'base_bdev_name': base_bdev_name,
1177        'name': name,
1178    }
1179    return client.call('bdev_passthru_create', params)
1180
1181
1182@deprecated_alias('delete_passthru_bdev')
1183def bdev_passthru_delete(client, name):
1184    """Remove pass through bdev from the system.
1185
1186    Args:
1187        name: name of pass through bdev to delete
1188    """
1189    params = {'name': name}
1190    return client.call('bdev_passthru_delete', params)
1191
1192
1193def bdev_opal_create(client, nvme_ctrlr_name, nsid, locking_range_id, range_start, range_length, password):
1194    """Create opal virtual block devices from a base nvme bdev.
1195
1196    Args:
1197        nvme_ctrlr_name: name of the nvme ctrlr
1198        nsid: namespace ID of nvme ctrlr
1199        locking_range_id: locking range ID corresponding to this virtual bdev
1200        range_start: start address of this locking range
1201        range_length: length of this locking range
1202        password: admin password of base nvme bdev
1203
1204    Returns:
1205        Name of the new created block devices.
1206    """
1207    params = {
1208        'nvme_ctrlr_name': nvme_ctrlr_name,
1209        'nsid': nsid,
1210        'locking_range_id': locking_range_id,
1211        'range_start': range_start,
1212        'range_length': range_length,
1213        'password': password,
1214    }
1215
1216    return client.call('bdev_opal_create', params)
1217
1218
1219def bdev_opal_get_info(client, bdev_name, password):
1220    """Get opal locking range info.
1221
1222    Args:
1223        bdev_name: name of opal vbdev to get info
1224        password: admin password
1225
1226    Returns:
1227        Locking range info.
1228    """
1229    params = {
1230        'bdev_name': bdev_name,
1231        'password': password,
1232    }
1233
1234    return client.call('bdev_opal_get_info', params)
1235
1236
1237def bdev_opal_delete(client, bdev_name, password):
1238    """Delete opal virtual bdev from the system.
1239
1240    Args:
1241        bdev_name: name of opal vbdev to delete
1242        password: admin password of base nvme bdev
1243    """
1244    params = {
1245        'bdev_name': bdev_name,
1246        'password': password,
1247    }
1248
1249    return client.call('bdev_opal_delete', params)
1250
1251
1252def bdev_opal_new_user(client, bdev_name, admin_password, user_id, user_password):
1253    """Add a user to opal bdev who can set lock state for this bdev.
1254
1255    Args:
1256        bdev_name: name of opal vbdev
1257        admin_password: admin password
1258        user_id: ID of the user who will be added to this opal bdev
1259        user_password: password set for this user
1260    """
1261    params = {
1262        'bdev_name': bdev_name,
1263        'admin_password': admin_password,
1264        'user_id': user_id,
1265        'user_password': user_password,
1266    }
1267
1268    return client.call('bdev_opal_new_user', params)
1269
1270
1271def bdev_opal_set_lock_state(client, bdev_name, user_id, password, lock_state):
1272    """set lock state for an opal bdev.
1273
1274    Args:
1275        bdev_name: name of opal vbdev
1276        user_id: ID of the user who will set lock state
1277        password: password of the user
1278        lock_state: lock state to set
1279    """
1280    params = {
1281        'bdev_name': bdev_name,
1282        'user_id': user_id,
1283        'password': password,
1284        'lock_state': lock_state,
1285    }
1286
1287    return client.call('bdev_opal_set_lock_state', params)
1288
1289
1290@deprecated_alias('construct_split_vbdev')
1291def bdev_split_create(client, base_bdev, split_count, split_size_mb=None):
1292    """Create split block devices from a base bdev.
1293
1294    Args:
1295        base_bdev: name of bdev to split
1296        split_count: number of split bdevs to create
1297        split_size_mb: size of each split volume in MiB (optional)
1298
1299    Returns:
1300        List of created block devices.
1301    """
1302    params = {
1303        'base_bdev': base_bdev,
1304        'split_count': split_count,
1305    }
1306    if split_size_mb:
1307        params['split_size_mb'] = split_size_mb
1308
1309    return client.call('bdev_split_create', params)
1310
1311
1312@deprecated_alias('destruct_split_vbdev')
1313def bdev_split_delete(client, base_bdev):
1314    """Delete split block devices.
1315
1316    Args:
1317        base_bdev: name of previously split bdev
1318    """
1319    params = {
1320        'base_bdev': base_bdev,
1321    }
1322
1323    return client.call('bdev_split_delete', params)
1324
1325
1326@deprecated_alias('construct_ftl_bdev')
1327def bdev_ftl_create(client, name, base_bdev, **kwargs):
1328    """Construct FTL bdev
1329
1330    Args:
1331        name: name of the bdev
1332        base_bdev: name of the base bdev
1333        kwargs: optional parameters
1334    """
1335    params = {'name': name,
1336              'base_bdev': base_bdev}
1337    for key, value in kwargs.items():
1338        if value is not None:
1339            params[key] = value
1340
1341    return client.call('bdev_ftl_create', params)
1342
1343
1344@deprecated_alias('delete_ftl_bdev')
1345def bdev_ftl_delete(client, name):
1346    """Delete FTL bdev
1347
1348    Args:
1349        name: name of the bdev
1350    """
1351    params = {'name': name}
1352
1353    return client.call('bdev_ftl_delete', params)
1354
1355
1356def bdev_get_bdevs(client, name=None, timeout=None):
1357    """Get information about block devices.
1358
1359    Args:
1360        name: bdev name to query (optional; if omitted, query all bdevs)
1361        timeout: time in ms to wait for the bdev with specified name to appear
1362
1363    Returns:
1364        List of bdev information objects.
1365    """
1366    params = {}
1367    if name:
1368        params['name'] = name
1369    if timeout:
1370        params['timeout'] = timeout
1371    return client.call('bdev_get_bdevs', params)
1372
1373
1374def bdev_get_iostat(client, name=None):
1375    """Get I/O statistics for block devices.
1376
1377    Args:
1378        name: bdev name to query (optional; if omitted, query all bdevs)
1379
1380    Returns:
1381        I/O statistics for the requested block devices.
1382    """
1383    params = {}
1384    if name:
1385        params['name'] = name
1386    return client.call('bdev_get_iostat', params)
1387
1388
1389def bdev_enable_histogram(client, name, enable):
1390    """Control whether histogram is enabled for specified bdev.
1391
1392    Args:
1393        bdev_name: name of bdev
1394    """
1395    params = {'name': name, "enable": enable}
1396    return client.call('bdev_enable_histogram', params)
1397
1398
1399def bdev_get_histogram(client, name):
1400    """Get histogram for specified bdev.
1401
1402    Args:
1403        bdev_name: name of bdev
1404    """
1405    params = {'name': name}
1406    return client.call('bdev_get_histogram', params)
1407
1408
1409@deprecated_alias('bdev_inject_error')
1410def bdev_error_inject_error(client, name, io_type, error_type, num=1):
1411    """Inject an error via an error bdev.
1412
1413    Args:
1414        name: name of error bdev
1415        io_type: one of "clear", "read", "write", "unmap", "flush", or "all"
1416        error_type: one of "failure" or "pending"
1417        num: number of commands to fail
1418    """
1419    params = {
1420        'name': name,
1421        'io_type': io_type,
1422        'error_type': error_type,
1423        'num': num,
1424    }
1425
1426    return client.call('bdev_error_inject_error', params)
1427
1428
1429def bdev_set_qd_sampling_period(client, name, period):
1430    """Enable queue depth tracking on a specified bdev.
1431
1432    Args:
1433        name: name of a bdev on which to track queue depth.
1434        period: period (in microseconds) at which to update the queue depth reading. If set to 0, polling will be disabled.
1435    """
1436
1437    params = {}
1438    params['name'] = name
1439    params['period'] = period
1440    return client.call('bdev_set_qd_sampling_period', params)
1441
1442
1443def bdev_set_qos_limit(
1444        client,
1445        name,
1446        rw_ios_per_sec=None,
1447        rw_mbytes_per_sec=None,
1448        r_mbytes_per_sec=None,
1449        w_mbytes_per_sec=None):
1450    """Set QoS rate limit on a block device.
1451
1452    Args:
1453        name: name of block device
1454        rw_ios_per_sec: R/W IOs per second limit (>=1000, example: 20000). 0 means unlimited.
1455        rw_mbytes_per_sec: R/W megabytes per second limit (>=10, example: 100). 0 means unlimited.
1456        r_mbytes_per_sec: Read megabytes per second limit (>=10, example: 100). 0 means unlimited.
1457        w_mbytes_per_sec: Write megabytes per second limit (>=10, example: 100). 0 means unlimited.
1458    """
1459    params = {}
1460    params['name'] = name
1461    if rw_ios_per_sec is not None:
1462        params['rw_ios_per_sec'] = rw_ios_per_sec
1463    if rw_mbytes_per_sec is not None:
1464        params['rw_mbytes_per_sec'] = rw_mbytes_per_sec
1465    if r_mbytes_per_sec is not None:
1466        params['r_mbytes_per_sec'] = r_mbytes_per_sec
1467    if w_mbytes_per_sec is not None:
1468        params['w_mbytes_per_sec'] = w_mbytes_per_sec
1469    return client.call('bdev_set_qos_limit', params)
1470
1471
1472@deprecated_alias('apply_firmware')
1473def bdev_nvme_apply_firmware(client, bdev_name, filename):
1474    """Download and commit firmware to NVMe device.
1475
1476    Args:
1477        bdev_name: name of NVMe block device
1478        filename: filename of the firmware to download
1479    """
1480    params = {
1481        'filename': filename,
1482        'bdev_name': bdev_name,
1483    }
1484    return client.call('bdev_nvme_apply_firmware', params)
1485
1486
1487def bdev_nvme_get_transport_statistics(client):
1488    """Get bdev_nvme poll group transport statistics"""
1489    return client.call('bdev_nvme_get_transport_statistics')
1490
1491
1492def bdev_nvme_get_controller_health_info(client, name):
1493    """Display health log of the required NVMe bdev controller.
1494
1495    Args:
1496        name: name of the required NVMe bdev controller
1497
1498    Returns:
1499        Health log for the requested NVMe bdev controller.
1500    """
1501    params = {}
1502    params['name'] = name
1503    return client.call('bdev_nvme_get_controller_health_info', params)
1504