GNU Linux-libre 4.19.207-gnu1
[releases.git] / include / linux / ceph / striper.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _LINUX_CEPH_STRIPER_H
3 #define _LINUX_CEPH_STRIPER_H
4
5 #include <linux/list.h>
6 #include <linux/types.h>
7
8 struct ceph_file_layout;
9
10 void ceph_calc_file_object_mapping(struct ceph_file_layout *l,
11                                    u64 off, u64 len,
12                                    u64 *objno, u64 *objoff, u32 *xlen);
13
14 struct ceph_object_extent {
15         struct list_head oe_item;
16         u64 oe_objno;
17         u64 oe_off;
18         u64 oe_len;
19 };
20
21 static inline void ceph_object_extent_init(struct ceph_object_extent *ex)
22 {
23         INIT_LIST_HEAD(&ex->oe_item);
24 }
25
26 /*
27  * Called for each mapped stripe unit.
28  *
29  * @bytes: number of bytes mapped, i.e. the minimum of the full length
30  *         requested (file extent length) or the remainder of the stripe
31  *         unit within an object
32  */
33 typedef void (*ceph_object_extent_fn_t)(struct ceph_object_extent *ex,
34                                         u32 bytes, void *arg);
35
36 int ceph_file_to_extents(struct ceph_file_layout *l, u64 off, u64 len,
37                          struct list_head *object_extents,
38                          struct ceph_object_extent *alloc_fn(void *arg),
39                          void *alloc_arg,
40                          ceph_object_extent_fn_t action_fn,
41                          void *action_arg);
42 int ceph_iterate_extents(struct ceph_file_layout *l, u64 off, u64 len,
43                          struct list_head *object_extents,
44                          ceph_object_extent_fn_t action_fn,
45                          void *action_arg);
46
47 struct ceph_file_extent {
48         u64 fe_off;
49         u64 fe_len;
50 };
51
52 static inline u64 ceph_file_extents_bytes(struct ceph_file_extent *file_extents,
53                                           u32 num_file_extents)
54 {
55         u64 bytes = 0;
56         u32 i;
57
58         for (i = 0; i < num_file_extents; i++)
59                 bytes += file_extents[i].fe_len;
60
61         return bytes;
62 }
63
64 int ceph_extent_to_file(struct ceph_file_layout *l,
65                         u64 objno, u64 objoff, u64 objlen,
66                         struct ceph_file_extent **file_extents,
67                         u32 *num_file_extents);
68
69 #endif