ceph_async/
rados.rs

1// Copyright 2017 LambdaStack All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15// Portions from Chris Holcombe
16// The MIT License (MIT)
17//
18// Copyright (c) 2015 Chris Holcombe
19//
20// Permission is hereby granted, free of charge, to any person obtaining a copy
21// of this software and associated documentation files (the "Software"), to deal
22// in the Software without restriction, including without limitation the rights
23// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
24// copies of the Software, and to permit persons to whom the Software is
25// furnished to do so, subject to the following conditions:
26//
27// The above copyright notice and this permission notice shall be included in
28// all copies or substantial portions of the Software.
29//
30// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
31// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
32// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
33// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
34// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
35// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
36// SOFTWARE.
37
38#![allow(non_camel_case_types)]
39#![allow(unused_imports)]
40
41extern crate libc;
42
43use self::libc::{size_t, ssize_t, time_t, timeval};
44
45bitflags! {
46    pub struct AllocFlags: u32 {
47        const LIBRADOS_OP_FLAG_EXCL = 1;
48        const LIBRADOS_OP_FLAG_FAILOK = 2;
49        const LIBRADOS_OP_FLAG_FADVISE_RANDOM = 4;
50        const LIBRADOS_OP_FLAG_FADVISE_SEQUENTIAL = 8;
51        const LIBRADOS_OP_FLAG_FADVISE_WILLNEED = 16;
52        const LIBRADOS_OP_FLAG_FADVISE_DONTNEED = 32;
53        const LIBRADOS_OP_FLAG_FADVISE_NOCACHE = 64;
54    }
55}
56impl AllocFlags {
57    pub fn clear(&mut self) {
58        self.bits = 0; // The `bits` field can be accessed from within the
59                       // same module where the `bitflags!` macro was invoked.
60    }
61}
62
63bitflags! {
64    pub struct XattrFlags: u32 {
65        const LIBRADOS_CMPXATTR_OP_EQ = 1;
66        const LIBRADOS_CMPXATTR_OP_NE = 2;
67        const LIBRADOS_CMPXATTR_OP_GT = 3;
68        const LIBRADOS_CMPXATTR_OP_GTE = 4;
69        const LIBRADOS_CMPXATTR_OP_LT = 5;
70        const LIBRADOS_CMPXATTR_OP_LTE = 6;
71    }
72}
73impl XattrFlags {
74    pub fn clear(&mut self) {
75        self.bits = 0; // The `bits` field can be accessed from within the
76                       // same module where the `bitflags!` macro was invoked.
77    }
78}
79
80// Flags for rados_read_op_operate(), rados_write_op_operate(),
81// rados_aio_read_op_operate(), and rados_aio_write_op_operate()
82bitflags! {
83    pub struct OperationFlags: u32 {
84        const LIBRADOS_OPERATION_NOFLAG= 0;
85        const LIBRADOS_OPERATION_BALANCE_READS= 1;
86        const LIBRADOS_OPERATION_LOCALIZE_READS= 2;
87        const LIBRADOS_OPERATION_ORDER_READS_WRITES= 4;
88        const LIBRADOS_OPERATION_IGNORE_CACHE= 8;
89        const LIBRADOS_OPERATION_SKIPRWLOCKS= 16;
90        const LIBRADOS_OPERATION_IGNORE_OVERLAY= 32;
91    }
92}
93
94impl OperationFlags {
95    pub fn clear(&mut self) {
96        self.bits = 0; // The `bits` field can be accessed from within the
97                       // same module where the `bitflags!` macro was invoked.
98    }
99}
100
101pub type rados_t = *mut ::std::os::raw::c_void;
102pub type rados_config_t = *mut ::std::os::raw::c_void;
103pub type rados_ioctx_t = *mut ::std::os::raw::c_void;
104pub type rados_list_ctx_t = *mut ::std::os::raw::c_void;
105pub type rados_snap_t = u64;
106pub type rados_xattrs_iter_t = *mut ::std::os::raw::c_void;
107pub type rados_omap_iter_t = *mut ::std::os::raw::c_void;
108
109#[repr(C)]
110#[derive(Copy, Debug)]
111pub struct Struct_rados_pool_stat_t {
112    pub num_bytes: u64,
113    pub num_kb: u64,
114    pub num_objects: u64,
115    pub num_object_clones: u64,
116    pub num_object_copies: u64,
117    pub num_objects_missing_on_primary: u64,
118    pub num_objects_unfound: u64,
119    pub num_objects_degraded: u64,
120    pub num_rd: u64,
121    pub num_rd_kb: u64,
122    pub num_wr: u64,
123    pub num_wr_kb: u64,
124}
125
126impl ::std::clone::Clone for Struct_rados_pool_stat_t {
127    fn clone(&self) -> Self {
128        *self
129    }
130}
131
132impl ::std::default::Default for Struct_rados_pool_stat_t {
133    fn default() -> Self {
134        unsafe { ::std::mem::zeroed() }
135    }
136}
137
138#[repr(C)]
139#[derive(Copy, Debug)]
140pub struct Struct_rados_cluster_stat_t {
141    pub kb: u64,
142    pub kb_used: u64,
143    pub kb_avail: u64,
144    pub num_objects: u64,
145}
146
147impl ::std::clone::Clone for Struct_rados_cluster_stat_t {
148    fn clone(&self) -> Self {
149        *self
150    }
151}
152
153impl ::std::default::Default for Struct_rados_cluster_stat_t {
154    fn default() -> Self {
155        unsafe { ::std::mem::zeroed() }
156    }
157}
158
159pub type rados_write_op_t = *mut ::std::os::raw::c_void;
160
161pub type rados_read_op_t = *mut ::std::os::raw::c_void;
162
163pub type rados_completion_t = *mut ::std::os::raw::c_void;
164
165pub type rados_callback_t = ::std::option::Option<
166    extern "C" fn(cb: rados_completion_t, arg: *mut ::std::os::raw::c_void) -> (),
167>;
168
169pub type rados_watchcb_t = ::std::option::Option<
170    extern "C" fn(opcode: u8, ver: u64, arg: *mut ::std::os::raw::c_void) -> (),
171>;
172
173pub type rados_watchcb2_t = ::std::option::Option<
174    extern "C" fn(
175        arg: *mut ::std::os::raw::c_void,
176        notify_id: u64,
177        handle: u64,
178        notifier_id: u64,
179        data: *mut ::std::os::raw::c_void,
180        data_len: size_t,
181    ) -> (),
182>;
183
184pub type rados_watcherrcb_t = ::std::option::Option<
185    extern "C" fn(pre: *mut ::std::os::raw::c_void, cookie: u64, err: ::libc::c_int) -> (),
186>;
187
188pub type rados_log_callback_t = ::std::option::Option<
189    extern "C" fn(
190        arg: *mut ::std::os::raw::c_void,
191        line: *const ::libc::c_char,
192        who: *const ::libc::c_char,
193        sec: u64,
194        nsec: u64,
195        seq: u64,
196        level: *const ::libc::c_char,
197        msg: *const ::libc::c_char,
198    ) -> (),
199>;
200
201#[cfg(unix)]
202#[link(name = "rados", kind = "dylib")]
203extern "C" {
204    pub fn rados_version(
205        major: *mut ::libc::c_int,
206        minor: *mut ::libc::c_int,
207        extra: *mut ::libc::c_int,
208    ) -> ();
209
210    pub fn rados_create(cluster: *mut rados_t, id: *const ::libc::c_char) -> ::libc::c_int;
211
212    pub fn rados_create2(
213        pcluster: *mut rados_t,
214        clustername: *const ::libc::c_char,
215        name: *const ::libc::c_char,
216        flags: u64,
217    ) -> ::libc::c_int;
218
219    pub fn rados_create_with_context(cluster: *mut rados_t, cct: rados_config_t) -> ::libc::c_int;
220
221    pub fn rados_ping_monitor(
222        cluster: rados_t,
223        mon_id: *const ::libc::c_char,
224        outstr: *mut *mut ::libc::c_char,
225        outstrlen: *mut size_t,
226    ) -> ::libc::c_int;
227
228    pub fn rados_connect(cluster: rados_t) -> ::libc::c_int;
229
230    pub fn rados_shutdown(cluster: rados_t) -> ();
231
232    pub fn rados_conf_read_file(cluster: rados_t, path: *const ::libc::c_char) -> ::libc::c_int;
233
234    pub fn rados_conf_parse_argv(
235        cluster: rados_t,
236        argc: ::libc::c_int,
237        argv: *mut *const ::libc::c_char,
238    ) -> ::libc::c_int;
239
240    pub fn rados_conf_parse_argv_remainder(
241        cluster: rados_t,
242        argc: ::libc::c_int,
243        argv: *mut *const ::libc::c_char,
244        remargv: *mut *const ::libc::c_char,
245    ) -> ::libc::c_int;
246
247    pub fn rados_conf_parse_env(cluster: rados_t, var: *const ::libc::c_char) -> ::libc::c_int;
248
249    pub fn rados_conf_set(
250        cluster: rados_t,
251        option: *const ::libc::c_char,
252        value: *const ::libc::c_char,
253    ) -> ::libc::c_int;
254
255    pub fn rados_conf_get(
256        cluster: rados_t,
257        option: *const ::libc::c_char,
258        buf: *mut ::libc::c_char,
259        len: size_t,
260    ) -> ::libc::c_int;
261
262    pub fn rados_cluster_stat(
263        cluster: rados_t,
264        result: *mut Struct_rados_cluster_stat_t,
265    ) -> ::libc::c_int;
266
267    /// The Ceph documentation states that the return value of 0 means success
268    /// but actually a value < 0 is an error and a value > 0 is the length
269    /// which should be 36.
270    ///
271    pub fn rados_cluster_fsid(
272        cluster: rados_t,
273        buf: *mut ::libc::c_char,
274        len: size_t,
275    ) -> ::libc::c_int;
276
277    pub fn rados_wait_for_latest_osdmap(cluster: rados_t) -> ::libc::c_int;
278
279    pub fn rados_pool_list(
280        cluster: rados_t,
281        buf: *mut ::libc::c_char,
282        len: size_t,
283    ) -> ::libc::c_int;
284
285    pub fn rados_cct(cluster: rados_t) -> rados_config_t;
286
287    pub fn rados_get_instance_id(cluster: rados_t) -> u64;
288
289    pub fn rados_ioctx_create(
290        cluster: rados_t,
291        pool_name: *const ::libc::c_char,
292        ioctx: *mut rados_ioctx_t,
293    ) -> ::libc::c_int;
294
295    pub fn rados_ioctx_create2(
296        cluster: rados_t,
297        pool_id: i64,
298        ioctx: *mut rados_ioctx_t,
299    ) -> ::libc::c_int;
300
301    pub fn rados_ioctx_destroy(io: rados_ioctx_t) -> ();
302
303    pub fn rados_ioctx_cct(io: rados_ioctx_t) -> rados_config_t;
304
305    pub fn rados_ioctx_get_cluster(io: rados_ioctx_t) -> rados_t;
306
307    pub fn rados_ioctx_pool_stat(
308        io: rados_ioctx_t,
309        stats: *mut Struct_rados_pool_stat_t,
310    ) -> ::libc::c_int;
311
312    pub fn rados_pool_lookup(cluster: rados_t, pool_name: *const ::libc::c_char) -> i64;
313
314    pub fn rados_pool_reverse_lookup(
315        cluster: rados_t,
316        id: i64,
317        buf: *mut ::libc::c_char,
318        maxlen: size_t,
319    ) -> ::libc::c_int;
320
321    /// Returns -17 if pool already exists.
322    pub fn rados_pool_create(cluster: rados_t, pool_name: *const ::libc::c_char) -> ::libc::c_int;
323
324    pub fn rados_pool_create_with_auid(
325        cluster: rados_t,
326        pool_name: *const ::libc::c_char,
327        auid: u64,
328    ) -> ::libc::c_int;
329
330    pub fn rados_pool_create_with_crush_rule(
331        cluster: rados_t,
332        pool_name: *const ::libc::c_char,
333        crush_rule_num: u8,
334    ) -> ::libc::c_int;
335
336    pub fn rados_pool_create_with_all(
337        cluster: rados_t,
338        pool_name: *const ::libc::c_char,
339        auid: u64,
340        crush_rule_num: u8,
341    ) -> ::libc::c_int;
342
343    pub fn rados_pool_get_base_tier(
344        cluster: rados_t,
345        pool: i64,
346        base_tier: *mut i64,
347    ) -> ::libc::c_int;
348
349    pub fn rados_pool_delete(cluster: rados_t, pool_name: *const ::libc::c_char) -> ::libc::c_int;
350
351    pub fn rados_ioctx_pool_set_auid(io: rados_ioctx_t, auid: u64) -> ::libc::c_int;
352
353    pub fn rados_ioctx_pool_get_auid(io: rados_ioctx_t, auid: *mut u64) -> ::libc::c_int;
354
355    pub fn rados_ioctx_pool_requires_alignment(io: rados_ioctx_t) -> ::libc::c_int;
356
357    pub fn rados_ioctx_pool_required_alignment(io: rados_ioctx_t) -> u64;
358
359    pub fn rados_ioctx_get_id(io: rados_ioctx_t) -> i64;
360
361    pub fn rados_ioctx_get_pool_name(
362        io: rados_ioctx_t,
363        buf: *mut ::libc::c_char,
364        maxlen: ::libc::c_uint,
365    ) -> ::libc::c_int;
366
367    pub fn rados_ioctx_locator_set_key(io: rados_ioctx_t, key: *const ::libc::c_char) -> ();
368
369    pub fn rados_ioctx_set_namespace(io: rados_ioctx_t, nspace: *const ::libc::c_char) -> ();
370
371    pub fn rados_nobjects_list_open(io: rados_ioctx_t, ctx: *mut rados_list_ctx_t)
372        -> ::libc::c_int;
373
374    pub fn rados_nobjects_list_get_pg_hash_position(ctx: rados_list_ctx_t) -> u32;
375
376    pub fn rados_nobjects_list_seek(ctx: rados_list_ctx_t, pos: u32) -> u32;
377
378    pub fn rados_nobjects_list_next(
379        ctx: rados_list_ctx_t,
380        entry: *mut *mut *const ::libc::c_char,
381        key: *mut *mut *const ::libc::c_char,
382        nspace: *mut *mut *const ::libc::c_char,
383    ) -> ::libc::c_int;
384
385    pub fn rados_nobjects_list_close(ctx: rados_list_ctx_t) -> ();
386
387    pub fn rados_objects_list_open(io: rados_ioctx_t, ctx: *mut rados_list_ctx_t) -> ::libc::c_int;
388
389    pub fn rados_objects_list_get_pg_hash_position(ctx: rados_list_ctx_t) -> u32;
390
391    pub fn rados_objects_list_seek(ctx: rados_list_ctx_t, pos: u32) -> u32;
392
393    pub fn rados_objects_list_next(
394        ctx: rados_list_ctx_t,
395        entry: *mut *const ::libc::c_char,
396        key: *mut *const ::libc::c_char,
397    ) -> ::libc::c_int;
398
399    pub fn rados_objects_list_close(ctx: rados_list_ctx_t) -> ();
400
401    pub fn rados_ioctx_snap_create(
402        io: rados_ioctx_t,
403        snapname: *const ::libc::c_char,
404    ) -> ::libc::c_int;
405
406    pub fn rados_ioctx_snap_remove(
407        io: rados_ioctx_t,
408        snapname: *const ::libc::c_char,
409    ) -> ::libc::c_int;
410
411    pub fn rados_ioctx_snap_rollback(
412        io: rados_ioctx_t,
413        oid: *const ::libc::c_char,
414        snapname: *const ::libc::c_char,
415    ) -> ::libc::c_int;
416    // Deprecated: Use rados_ioctx_snap_rollback() instead
417    pub fn rados_rollback(
418        io: rados_ioctx_t,
419        oid: *const ::libc::c_char,
420        snapname: *const ::libc::c_char,
421    ) -> ::libc::c_int;
422
423    pub fn rados_ioctx_snap_set_read(io: rados_ioctx_t, snap: rados_snap_t) -> ();
424
425    pub fn rados_ioctx_selfmanaged_snap_create(
426        io: rados_ioctx_t,
427        snapid: *mut rados_snap_t,
428    ) -> ::libc::c_int;
429
430    pub fn rados_ioctx_selfmanaged_snap_remove(
431        io: rados_ioctx_t,
432        snapid: rados_snap_t,
433    ) -> ::libc::c_int;
434
435    pub fn rados_ioctx_selfmanaged_snap_rollback(
436        io: rados_ioctx_t,
437        oid: *const ::libc::c_char,
438        snapid: rados_snap_t,
439    ) -> ::libc::c_int;
440
441    pub fn rados_ioctx_selfmanaged_snap_set_write_ctx(
442        io: rados_ioctx_t,
443        seq: rados_snap_t,
444        snaps: *mut rados_snap_t,
445        num_snaps: ::libc::c_int,
446    ) -> ::libc::c_int;
447
448    pub fn rados_ioctx_snap_list(
449        io: rados_ioctx_t,
450        snaps: *mut rados_snap_t,
451        maxlen: ::libc::c_int,
452    ) -> ::libc::c_int;
453
454    pub fn rados_ioctx_snap_lookup(
455        io: rados_ioctx_t,
456        name: *const ::libc::c_char,
457        id: *mut rados_snap_t,
458    ) -> ::libc::c_int;
459
460    pub fn rados_ioctx_snap_get_name(
461        io: rados_ioctx_t,
462        id: rados_snap_t,
463        name: *mut ::libc::c_char,
464        maxlen: ::libc::c_int,
465    ) -> ::libc::c_int;
466
467    pub fn rados_ioctx_snap_get_stamp(
468        io: rados_ioctx_t,
469        id: rados_snap_t,
470        t: *mut time_t,
471    ) -> ::libc::c_int;
472
473    pub fn rados_get_last_version(io: rados_ioctx_t) -> u64;
474
475    pub fn rados_write(
476        io: rados_ioctx_t,
477        oid: *const ::libc::c_char,
478        buf: *const ::libc::c_char,
479        len: size_t,
480        off: u64,
481    ) -> ::libc::c_int;
482
483    pub fn rados_write_full(
484        io: rados_ioctx_t,
485        oid: *const ::libc::c_char,
486        buf: *const ::libc::c_char,
487        len: size_t,
488    ) -> ::libc::c_int;
489
490    pub fn rados_clone_range(
491        io: rados_ioctx_t,
492        dst: *const ::libc::c_char,
493        dst_off: u64,
494        src: *const ::libc::c_char,
495        src_off: u64,
496        len: size_t,
497    ) -> ::libc::c_int;
498
499    pub fn rados_append(
500        io: rados_ioctx_t,
501        oid: *const ::libc::c_char,
502        buf: *const ::libc::c_char,
503        len: size_t,
504    ) -> ::libc::c_int;
505
506    pub fn rados_read(
507        io: rados_ioctx_t,
508        oid: *const ::libc::c_char,
509        buf: *mut ::libc::c_char,
510        len: size_t,
511        off: u64,
512    ) -> ::libc::c_int;
513
514    pub fn rados_remove(io: rados_ioctx_t, oid: *const ::libc::c_char) -> ::libc::c_int;
515
516    pub fn rados_trunc(io: rados_ioctx_t, oid: *const ::libc::c_char, size: u64) -> ::libc::c_int;
517
518    pub fn rados_getxattr(
519        io: rados_ioctx_t,
520        o: *const ::libc::c_char,
521        name: *const ::libc::c_char,
522        buf: *mut ::libc::c_char,
523        len: size_t,
524    ) -> ::libc::c_int;
525
526    pub fn rados_setxattr(
527        io: rados_ioctx_t,
528        o: *const ::libc::c_char,
529        name: *const ::libc::c_char,
530        buf: *const ::libc::c_char,
531        len: size_t,
532    ) -> ::libc::c_int;
533
534    pub fn rados_rmxattr(
535        io: rados_ioctx_t,
536        o: *const ::libc::c_char,
537        name: *const ::libc::c_char,
538    ) -> ::libc::c_int;
539
540    pub fn rados_getxattrs(
541        io: rados_ioctx_t,
542        oid: *const ::libc::c_char,
543        iter: *mut rados_xattrs_iter_t,
544    ) -> ::libc::c_int;
545
546    pub fn rados_getxattrs_next(
547        iter: rados_xattrs_iter_t,
548        name: *mut *const ::libc::c_char,
549        val: *mut *const ::libc::c_char,
550        len: *mut size_t,
551    ) -> ::libc::c_int;
552
553    pub fn rados_getxattrs_end(iter: rados_xattrs_iter_t) -> ();
554
555    pub fn rados_omap_get_next(
556        iter: rados_omap_iter_t,
557        key: *mut *mut ::libc::c_char,
558        val: *mut *mut ::libc::c_char,
559        len: *mut size_t,
560    ) -> ::libc::c_int;
561
562    pub fn rados_omap_get_end(iter: rados_omap_iter_t) -> ();
563
564    pub fn rados_stat(
565        io: rados_ioctx_t,
566        o: *const ::libc::c_char,
567        psize: *mut u64,
568        pmtime: *mut time_t,
569    ) -> ::libc::c_int;
570
571    pub fn rados_tmap_update(
572        io: rados_ioctx_t,
573        o: *const ::libc::c_char,
574        cmdbuf: *const ::libc::c_char,
575        cmdbuflen: size_t,
576    ) -> ::libc::c_int;
577
578    pub fn rados_tmap_put(
579        io: rados_ioctx_t,
580        o: *const ::libc::c_char,
581        buf: *const ::libc::c_char,
582        buflen: size_t,
583    ) -> ::libc::c_int;
584
585    pub fn rados_tmap_get(
586        io: rados_ioctx_t,
587        o: *const ::libc::c_char,
588        buf: *mut ::libc::c_char,
589        buflen: size_t,
590    ) -> ::libc::c_int;
591
592    pub fn rados_exec(
593        io: rados_ioctx_t,
594        oid: *const ::libc::c_char,
595        cls: *const ::libc::c_char,
596        method: *const ::libc::c_char,
597        in_buf: *const ::libc::c_char,
598        in_len: size_t,
599        buf: *mut ::libc::c_char,
600        out_len: size_t,
601    ) -> ::libc::c_int;
602
603    pub fn rados_aio_create_completion(
604        cb_arg: *mut ::std::os::raw::c_void,
605        cb_complete: rados_callback_t,
606        cb_safe: rados_callback_t,
607        pc: *mut rados_completion_t,
608    ) -> ::libc::c_int;
609
610    pub fn rados_aio_create_completion2(
611        cb_arg: *mut ::std::os::raw::c_void,
612        cb_complete: rados_callback_t,
613        pc: *mut rados_completion_t,
614    ) -> ::libc::c_int;
615
616    pub fn rados_aio_wait_for_complete(c: rados_completion_t) -> ::libc::c_int;
617    pub fn rados_aio_wait_for_safe(c: rados_completion_t) -> ::libc::c_int;
618    pub fn rados_aio_is_complete(c: rados_completion_t) -> ::libc::c_int;
619    pub fn rados_aio_is_safe(c: rados_completion_t) -> ::libc::c_int;
620    pub fn rados_aio_wait_for_complete_and_cb(c: rados_completion_t) -> ::libc::c_int;
621    pub fn rados_aio_wait_for_safe_and_cb(c: rados_completion_t) -> ::libc::c_int;
622    pub fn rados_aio_is_complete_and_cb(c: rados_completion_t) -> ::libc::c_int;
623    pub fn rados_aio_is_safe_and_cb(c: rados_completion_t) -> ::libc::c_int;
624    pub fn rados_aio_get_return_value(c: rados_completion_t) -> ::libc::c_int;
625    pub fn rados_aio_release(c: rados_completion_t) -> ();
626    pub fn rados_aio_write(
627        io: rados_ioctx_t,
628        oid: *const ::libc::c_char,
629        completion: rados_completion_t,
630        buf: *const ::libc::c_char,
631        len: size_t,
632        off: u64,
633    ) -> ::libc::c_int;
634    pub fn rados_aio_append(
635        io: rados_ioctx_t,
636        oid: *const ::libc::c_char,
637        completion: rados_completion_t,
638        buf: *const ::libc::c_char,
639        len: size_t,
640    ) -> ::libc::c_int;
641    pub fn rados_aio_write_full(
642        io: rados_ioctx_t,
643        oid: *const ::libc::c_char,
644        completion: rados_completion_t,
645        buf: *const ::libc::c_char,
646        len: size_t,
647    ) -> ::libc::c_int;
648    pub fn rados_aio_remove(
649        io: rados_ioctx_t,
650        oid: *const ::libc::c_char,
651        completion: rados_completion_t,
652    ) -> ::libc::c_int;
653    pub fn rados_aio_read(
654        io: rados_ioctx_t,
655        oid: *const ::libc::c_char,
656        completion: rados_completion_t,
657        buf: *mut ::libc::c_char,
658        len: size_t,
659        off: u64,
660    ) -> ::libc::c_int;
661    pub fn rados_aio_flush(io: rados_ioctx_t) -> ::libc::c_int;
662    pub fn rados_aio_flush_async(
663        io: rados_ioctx_t,
664        completion: rados_completion_t,
665    ) -> ::libc::c_int;
666    pub fn rados_aio_stat(
667        io: rados_ioctx_t,
668        o: *const ::libc::c_char,
669        completion: rados_completion_t,
670        psize: *mut u64,
671        pmtime: *mut time_t,
672    ) -> ::libc::c_int;
673    pub fn rados_aio_cancel(io: rados_ioctx_t, completion: rados_completion_t) -> ::libc::c_int;
674    pub fn rados_watch(
675        io: rados_ioctx_t,
676        o: *const ::libc::c_char,
677        ver: u64,
678        cookie: *mut u64,
679        watchcb: rados_watchcb_t,
680        arg: *mut ::std::os::raw::c_void,
681    ) -> ::libc::c_int;
682    pub fn rados_watch2(
683        io: rados_ioctx_t,
684        o: *const ::libc::c_char,
685        cookie: *mut u64,
686        watchcb: rados_watchcb2_t,
687        watcherrcb: rados_watcherrcb_t,
688        arg: *mut ::std::os::raw::c_void,
689    ) -> ::libc::c_int;
690    pub fn rados_watch_check(io: rados_ioctx_t, cookie: u64) -> ::libc::c_int;
691    pub fn rados_unwatch(io: rados_ioctx_t, o: *const ::libc::c_char, cookie: u64)
692        -> ::libc::c_int;
693    pub fn rados_unwatch2(io: rados_ioctx_t, cookie: u64) -> ::libc::c_int;
694    pub fn rados_notify(
695        io: rados_ioctx_t,
696        o: *const ::libc::c_char,
697        ver: u64,
698        buf: *const ::libc::c_char,
699        buf_len: ::libc::c_int,
700    ) -> ::libc::c_int;
701    pub fn rados_notify2(
702        io: rados_ioctx_t,
703        o: *const ::libc::c_char,
704        buf: *const ::libc::c_char,
705        buf_len: ::libc::c_int,
706        timeout_ms: u64,
707        reply_buffer: *mut *mut ::libc::c_char,
708        reply_buffer_len: *mut size_t,
709    ) -> ::libc::c_int;
710    pub fn rados_notify_ack(
711        io: rados_ioctx_t,
712        o: *const ::libc::c_char,
713        notify_id: u64,
714        cookie: u64,
715        buf: *const ::libc::c_char,
716        buf_len: ::libc::c_int,
717    ) -> ::libc::c_int;
718    pub fn rados_watch_flush(cluster: rados_t) -> ::libc::c_int;
719    pub fn rados_set_alloc_hint(
720        io: rados_ioctx_t,
721        o: *const ::libc::c_char,
722        expected_object_size: u64,
723        expected_write_size: u64,
724    ) -> ::libc::c_int;
725    pub fn rados_create_write_op() -> rados_write_op_t;
726    pub fn rados_release_write_op(write_op: rados_write_op_t) -> ();
727    pub fn rados_write_op_set_flags(write_op: rados_write_op_t, flags: ::libc::c_int) -> ();
728    pub fn rados_write_op_assert_exists(write_op: rados_write_op_t) -> ();
729    pub fn rados_write_op_assert_version(write_op: rados_write_op_t, ver: u64) -> ();
730    pub fn rados_write_op_cmpxattr(
731        write_op: rados_write_op_t,
732        name: *const ::libc::c_char,
733        comparison_operator: u8,
734        value: *const ::libc::c_char,
735        value_len: size_t,
736    ) -> ();
737    pub fn rados_write_op_omap_cmp(
738        write_op: rados_write_op_t,
739        key: *const ::libc::c_char,
740        comparison_operator: u8,
741        val: *const ::libc::c_char,
742        val_len: size_t,
743        prval: *mut ::libc::c_int,
744    ) -> ();
745    pub fn rados_write_op_setxattr(
746        write_op: rados_write_op_t,
747        name: *const ::libc::c_char,
748        value: *const ::libc::c_char,
749        value_len: size_t,
750    ) -> ();
751    pub fn rados_write_op_rmxattr(write_op: rados_write_op_t, name: *const ::libc::c_char) -> ();
752    pub fn rados_write_op_create(
753        write_op: rados_write_op_t,
754        exclusive: ::libc::c_int,
755        category: *const ::libc::c_char,
756    ) -> ();
757    pub fn rados_write_op_write(
758        write_op: rados_write_op_t,
759        buffer: *const ::libc::c_char,
760        len: size_t,
761        offset: u64,
762    ) -> ();
763    pub fn rados_write_op_write_full(
764        write_op: rados_write_op_t,
765        buffer: *const ::libc::c_char,
766        len: size_t,
767    ) -> ();
768    pub fn rados_write_op_append(
769        write_op: rados_write_op_t,
770        buffer: *const ::libc::c_char,
771        len: size_t,
772    ) -> ();
773    pub fn rados_write_op_remove(write_op: rados_write_op_t) -> ();
774    pub fn rados_write_op_truncate(write_op: rados_write_op_t, offset: u64) -> ();
775    pub fn rados_write_op_zero(write_op: rados_write_op_t, offset: u64, len: u64) -> ();
776    pub fn rados_write_op_exec(
777        write_op: rados_write_op_t,
778        cls: *const ::libc::c_char,
779        method: *const ::libc::c_char,
780        in_buf: *const ::libc::c_char,
781        in_len: size_t,
782        prval: *mut ::libc::c_int,
783    ) -> ();
784    pub fn rados_write_op_omap_set(
785        write_op: rados_write_op_t,
786        keys: *const *const ::libc::c_char,
787        vals: *const *const ::libc::c_char,
788        lens: *const size_t,
789        num: size_t,
790    ) -> ();
791    pub fn rados_write_op_omap_rm_keys(
792        write_op: rados_write_op_t,
793        keys: *const *const ::libc::c_char,
794        keys_len: size_t,
795    ) -> ();
796    pub fn rados_write_op_omap_clear(write_op: rados_write_op_t) -> ();
797    pub fn rados_write_op_set_alloc_hint(
798        write_op: rados_write_op_t,
799        expected_object_size: u64,
800        expected_write_size: u64,
801    ) -> ();
802    pub fn rados_write_op_operate(
803        write_op: rados_write_op_t,
804        io: rados_ioctx_t,
805        oid: *const ::libc::c_char,
806        mtime: *mut time_t,
807        flags: ::libc::c_int,
808    ) -> ::libc::c_int;
809    pub fn rados_aio_write_op_operate(
810        write_op: rados_write_op_t,
811        io: rados_ioctx_t,
812        completion: rados_completion_t,
813        oid: *const ::libc::c_char,
814        mtime: *mut time_t,
815        flags: ::libc::c_int,
816    ) -> ::libc::c_int;
817    pub fn rados_create_read_op() -> rados_read_op_t;
818    pub fn rados_release_read_op(read_op: rados_read_op_t) -> ();
819    pub fn rados_read_op_set_flags(read_op: rados_read_op_t, flags: ::libc::c_int) -> ();
820    pub fn rados_read_op_assert_exists(read_op: rados_read_op_t) -> ();
821    pub fn rados_read_op_assert_version(write_op: rados_read_op_t, ver: u64) -> ();
822    pub fn rados_read_op_cmpxattr(
823        read_op: rados_read_op_t,
824        name: *const ::libc::c_char,
825        comparison_operator: u8,
826        value: *const ::libc::c_char,
827        value_len: size_t,
828    ) -> ();
829    pub fn rados_read_op_getxattrs(
830        read_op: rados_read_op_t,
831        iter: *mut rados_xattrs_iter_t,
832        prval: *mut ::libc::c_int,
833    ) -> ();
834    pub fn rados_read_op_omap_cmp(
835        read_op: rados_read_op_t,
836        key: *const ::libc::c_char,
837        comparison_operator: u8,
838        val: *const ::libc::c_char,
839        val_len: size_t,
840        prval: *mut ::libc::c_int,
841    ) -> ();
842    pub fn rados_read_op_stat(
843        read_op: rados_read_op_t,
844        psize: *mut u64,
845        pmtime: *mut time_t,
846        prval: *mut ::libc::c_int,
847    ) -> ();
848    pub fn rados_read_op_read(
849        read_op: rados_read_op_t,
850        offset: u64,
851        len: size_t,
852        buf: *mut ::libc::c_char,
853        bytes_read: *mut size_t,
854        prval: *mut ::libc::c_int,
855    ) -> ();
856    pub fn rados_read_op_exec(
857        read_op: rados_read_op_t,
858        cls: *const ::libc::c_char,
859        method: *const ::libc::c_char,
860        in_buf: *const ::libc::c_char,
861        in_len: size_t,
862        out_buf: *mut *mut ::libc::c_char,
863        out_len: *mut size_t,
864        prval: *mut ::libc::c_int,
865    ) -> ();
866    pub fn rados_read_op_exec_user_buf(
867        read_op: rados_read_op_t,
868        cls: *const ::libc::c_char,
869        method: *const ::libc::c_char,
870        in_buf: *const ::libc::c_char,
871        in_len: size_t,
872        out_buf: *mut ::libc::c_char,
873        out_len: size_t,
874        used_len: *mut size_t,
875        prval: *mut ::libc::c_int,
876    ) -> ();
877    pub fn rados_read_op_omap_get_vals(
878        read_op: rados_read_op_t,
879        start_after: *const ::libc::c_char,
880        filter_prefix: *const ::libc::c_char,
881        max_return: u64,
882        iter: *mut rados_omap_iter_t,
883        prval: *mut ::libc::c_int,
884    ) -> ();
885    pub fn rados_read_op_omap_get_keys(
886        read_op: rados_read_op_t,
887        start_after: *const ::libc::c_char,
888        max_return: u64,
889        iter: *mut rados_omap_iter_t,
890        prval: *mut ::libc::c_int,
891    ) -> ();
892    pub fn rados_read_op_omap_get_vals_by_keys(
893        read_op: rados_read_op_t,
894        keys: *const *const ::libc::c_char,
895        keys_len: size_t,
896        iter: *mut rados_omap_iter_t,
897        prval: *mut ::libc::c_int,
898    ) -> ();
899    pub fn rados_read_op_operate(
900        read_op: rados_read_op_t,
901        io: rados_ioctx_t,
902        oid: *const ::libc::c_char,
903        flags: ::libc::c_int,
904    ) -> ::libc::c_int;
905    pub fn rados_aio_read_op_operate(
906        read_op: rados_read_op_t,
907        io: rados_ioctx_t,
908        completion: rados_completion_t,
909        oid: *const ::libc::c_char,
910        flags: ::libc::c_int,
911    ) -> ::libc::c_int;
912
913    pub fn rados_aio_getxattr(
914        io: rados_ioctx_t,
915        o: *const ::libc::c_char,
916        completion: rados_completion_t,
917        name: *const ::libc::c_char,
918        buf: *mut ::libc::c_char,
919        len: size_t,
920    ) -> ::libc::c_int;
921
922    pub fn rados_aio_setxattr(
923        io: rados_ioctx_t,
924        o: *const ::libc::c_char,
925        completion: rados_completion_t,
926        name: *const ::libc::c_char,
927        buf: *const ::libc::c_char,
928        len: size_t,
929    ) -> ::libc::c_int;
930
931    pub fn rados_aio_rmxattr(
932        io: rados_ioctx_t,
933        o: *const ::libc::c_char,
934        completion: rados_completion_t,
935        name: *const ::libc::c_char,
936    ) -> ::libc::c_int;
937
938    pub fn rados_lock_exclusive(
939        io: rados_ioctx_t,
940        o: *const ::libc::c_char,
941        name: *const ::libc::c_char,
942        cookie: *const ::libc::c_char,
943        desc: *const ::libc::c_char,
944        duration: *mut timeval,
945        flags: u8,
946    ) -> ::libc::c_int;
947    pub fn rados_lock_shared(
948        io: rados_ioctx_t,
949        o: *const ::libc::c_char,
950        name: *const ::libc::c_char,
951        cookie: *const ::libc::c_char,
952        tag: *const ::libc::c_char,
953        desc: *const ::libc::c_char,
954        duration: *mut timeval,
955        flags: u8,
956    ) -> ::libc::c_int;
957    pub fn rados_unlock(
958        io: rados_ioctx_t,
959        o: *const ::libc::c_char,
960        name: *const ::libc::c_char,
961        cookie: *const ::libc::c_char,
962    ) -> ::libc::c_int;
963    pub fn rados_list_lockers(
964        io: rados_ioctx_t,
965        o: *const ::libc::c_char,
966        name: *const ::libc::c_char,
967        exclusive: *mut ::libc::c_int,
968        tag: *mut ::libc::c_char,
969        tag_len: *mut size_t,
970        clients: *mut ::libc::c_char,
971        clients_len: *mut size_t,
972        cookies: *mut ::libc::c_char,
973        cookies_len: *mut size_t,
974        addrs: *mut ::libc::c_char,
975        addrs_len: *mut size_t,
976    ) -> ssize_t;
977    pub fn rados_break_lock(
978        io: rados_ioctx_t,
979        o: *const ::libc::c_char,
980        name: *const ::libc::c_char,
981        client: *const ::libc::c_char,
982        cookie: *const ::libc::c_char,
983    ) -> ::libc::c_int;
984    pub fn rados_blacklist_add(
985        cluster: rados_t,
986        client_address: *mut ::libc::c_char,
987        expire_seconds: u32,
988    ) -> ::libc::c_int;
989    pub fn rados_mon_command(
990        cluster: rados_t,
991        cmd: *mut *const ::libc::c_char,
992        cmdlen: size_t,
993        inbuf: *const ::libc::c_char,
994        inbuflen: size_t,
995        outbuf: *mut *mut ::libc::c_char,
996        outbuflen: *mut size_t,
997        outs: *mut *mut ::libc::c_char,
998        outslen: *mut size_t,
999    ) -> ::libc::c_int;
1000    pub fn rados_mon_command_target(
1001        cluster: rados_t,
1002        name: *const ::libc::c_char,
1003        cmd: *mut *const ::libc::c_char,
1004        cmdlen: size_t,
1005        inbuf: *const ::libc::c_char,
1006        inbuflen: size_t,
1007        outbuf: *mut *mut ::libc::c_char,
1008        outbuflen: *mut size_t,
1009        outs: *mut *mut ::libc::c_char,
1010        outslen: *mut size_t,
1011    ) -> ::libc::c_int;
1012    pub fn rados_buffer_free(buf: *mut ::libc::c_char) -> ();
1013    pub fn rados_osd_command(
1014        cluster: rados_t,
1015        osdid: ::libc::c_int,
1016        cmd: *mut *const ::libc::c_char,
1017        cmdlen: size_t,
1018        inbuf: *const ::libc::c_char,
1019        inbuflen: size_t,
1020        outbuf: *mut *mut ::libc::c_char,
1021        outbuflen: *mut size_t,
1022        outs: *mut *mut ::libc::c_char,
1023        outslen: *mut size_t,
1024    ) -> ::libc::c_int;
1025    pub fn rados_pg_command(
1026        cluster: rados_t,
1027        pgstr: *const ::libc::c_char,
1028        cmd: *mut *const ::libc::c_char,
1029        cmdlen: size_t,
1030        inbuf: *const ::libc::c_char,
1031        inbuflen: size_t,
1032        outbuf: *mut *mut ::libc::c_char,
1033        outbuflen: *mut size_t,
1034        outs: *mut *mut ::libc::c_char,
1035        outslen: *mut size_t,
1036    ) -> ::libc::c_int;
1037    pub fn rados_monitor_log(
1038        cluster: rados_t,
1039        level: *const ::libc::c_char,
1040        cb: rados_log_callback_t,
1041        arg: *mut ::std::os::raw::c_void,
1042    ) -> ::libc::c_int;
1043}