162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef _LINUX_CEPH_STRIPER_H
362306a36Sopenharmony_ci#define _LINUX_CEPH_STRIPER_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/list.h>
662306a36Sopenharmony_ci#include <linux/types.h>
762306a36Sopenharmony_ci
862306a36Sopenharmony_cistruct ceph_file_layout;
962306a36Sopenharmony_ci
1062306a36Sopenharmony_civoid ceph_calc_file_object_mapping(struct ceph_file_layout *l,
1162306a36Sopenharmony_ci				   u64 off, u64 len,
1262306a36Sopenharmony_ci				   u64 *objno, u64 *objoff, u32 *xlen);
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cistruct ceph_object_extent {
1562306a36Sopenharmony_ci	struct list_head oe_item;
1662306a36Sopenharmony_ci	u64 oe_objno;
1762306a36Sopenharmony_ci	u64 oe_off;
1862306a36Sopenharmony_ci	u64 oe_len;
1962306a36Sopenharmony_ci};
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cistatic inline void ceph_object_extent_init(struct ceph_object_extent *ex)
2262306a36Sopenharmony_ci{
2362306a36Sopenharmony_ci	INIT_LIST_HEAD(&ex->oe_item);
2462306a36Sopenharmony_ci}
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci/*
2762306a36Sopenharmony_ci * Called for each mapped stripe unit.
2862306a36Sopenharmony_ci *
2962306a36Sopenharmony_ci * @bytes: number of bytes mapped, i.e. the minimum of the full length
3062306a36Sopenharmony_ci *         requested (file extent length) or the remainder of the stripe
3162306a36Sopenharmony_ci *         unit within an object
3262306a36Sopenharmony_ci */
3362306a36Sopenharmony_citypedef void (*ceph_object_extent_fn_t)(struct ceph_object_extent *ex,
3462306a36Sopenharmony_ci					u32 bytes, void *arg);
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ciint ceph_file_to_extents(struct ceph_file_layout *l, u64 off, u64 len,
3762306a36Sopenharmony_ci			 struct list_head *object_extents,
3862306a36Sopenharmony_ci			 struct ceph_object_extent *alloc_fn(void *arg),
3962306a36Sopenharmony_ci			 void *alloc_arg,
4062306a36Sopenharmony_ci			 ceph_object_extent_fn_t action_fn,
4162306a36Sopenharmony_ci			 void *action_arg);
4262306a36Sopenharmony_ciint ceph_iterate_extents(struct ceph_file_layout *l, u64 off, u64 len,
4362306a36Sopenharmony_ci			 struct list_head *object_extents,
4462306a36Sopenharmony_ci			 ceph_object_extent_fn_t action_fn,
4562306a36Sopenharmony_ci			 void *action_arg);
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_cistruct ceph_file_extent {
4862306a36Sopenharmony_ci	u64 fe_off;
4962306a36Sopenharmony_ci	u64 fe_len;
5062306a36Sopenharmony_ci};
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_cistatic inline u64 ceph_file_extents_bytes(struct ceph_file_extent *file_extents,
5362306a36Sopenharmony_ci					  u32 num_file_extents)
5462306a36Sopenharmony_ci{
5562306a36Sopenharmony_ci	u64 bytes = 0;
5662306a36Sopenharmony_ci	u32 i;
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci	for (i = 0; i < num_file_extents; i++)
5962306a36Sopenharmony_ci		bytes += file_extents[i].fe_len;
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci	return bytes;
6262306a36Sopenharmony_ci}
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ciint ceph_extent_to_file(struct ceph_file_layout *l,
6562306a36Sopenharmony_ci			u64 objno, u64 objoff, u64 objlen,
6662306a36Sopenharmony_ci			struct ceph_file_extent **file_extents,
6762306a36Sopenharmony_ci			u32 *num_file_extents);
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ciu64 ceph_get_num_objects(struct ceph_file_layout *l, u64 size);
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci#endif
72