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