162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef _NFSD_BLOCKLAYOUTXDR_H
362306a36Sopenharmony_ci#define _NFSD_BLOCKLAYOUTXDR_H 1
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/blkdev.h>
662306a36Sopenharmony_ci#include "xdr4.h"
762306a36Sopenharmony_ci
862306a36Sopenharmony_cistruct iomap;
962306a36Sopenharmony_cistruct xdr_stream;
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cistruct pnfs_block_extent {
1262306a36Sopenharmony_ci	struct nfsd4_deviceid		vol_id;
1362306a36Sopenharmony_ci	u64				foff;
1462306a36Sopenharmony_ci	u64				len;
1562306a36Sopenharmony_ci	u64				soff;
1662306a36Sopenharmony_ci	enum pnfs_block_extent_state	es;
1762306a36Sopenharmony_ci};
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistruct pnfs_block_range {
2062306a36Sopenharmony_ci	u64				foff;
2162306a36Sopenharmony_ci	u64				len;
2262306a36Sopenharmony_ci};
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci/*
2562306a36Sopenharmony_ci * Random upper cap for the uuid length to avoid unbounded allocation.
2662306a36Sopenharmony_ci * Not actually limited by the protocol.
2762306a36Sopenharmony_ci */
2862306a36Sopenharmony_ci#define PNFS_BLOCK_UUID_LEN	128
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_cistruct pnfs_block_volume {
3162306a36Sopenharmony_ci	enum pnfs_block_volume_type	type;
3262306a36Sopenharmony_ci	union {
3362306a36Sopenharmony_ci		struct {
3462306a36Sopenharmony_ci			u64		offset;
3562306a36Sopenharmony_ci			u32		sig_len;
3662306a36Sopenharmony_ci			u8		sig[PNFS_BLOCK_UUID_LEN];
3762306a36Sopenharmony_ci		} simple;
3862306a36Sopenharmony_ci		struct {
3962306a36Sopenharmony_ci			enum scsi_code_set		code_set;
4062306a36Sopenharmony_ci			enum scsi_designator_type	designator_type;
4162306a36Sopenharmony_ci			int				designator_len;
4262306a36Sopenharmony_ci			u8				designator[256];
4362306a36Sopenharmony_ci			u64				pr_key;
4462306a36Sopenharmony_ci		} scsi;
4562306a36Sopenharmony_ci	};
4662306a36Sopenharmony_ci};
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cistruct pnfs_block_deviceaddr {
4962306a36Sopenharmony_ci	u32				nr_volumes;
5062306a36Sopenharmony_ci	struct pnfs_block_volume	volumes[];
5162306a36Sopenharmony_ci};
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci__be32 nfsd4_block_encode_getdeviceinfo(struct xdr_stream *xdr,
5462306a36Sopenharmony_ci		struct nfsd4_getdeviceinfo *gdp);
5562306a36Sopenharmony_ci__be32 nfsd4_block_encode_layoutget(struct xdr_stream *xdr,
5662306a36Sopenharmony_ci		struct nfsd4_layoutget *lgp);
5762306a36Sopenharmony_ciint nfsd4_block_decode_layoutupdate(__be32 *p, u32 len, struct iomap **iomapp,
5862306a36Sopenharmony_ci		u32 block_size);
5962306a36Sopenharmony_ciint nfsd4_scsi_decode_layoutupdate(__be32 *p, u32 len, struct iomap **iomapp,
6062306a36Sopenharmony_ci		u32 block_size);
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci#endif /* _NFSD_BLOCKLAYOUTXDR_H */
63