1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _NFSD_BLOCKLAYOUTXDR_H
3 #define _NFSD_BLOCKLAYOUTXDR_H 1
4 
5 #include <linux/blkdev.h>
6 #include "xdr4.h"
7 
8 struct iomap;
9 struct xdr_stream;
10 
11 struct pnfs_block_extent {
12 	struct nfsd4_deviceid		vol_id;
13 	u64				foff;
14 	u64				len;
15 	u64				soff;
16 	enum pnfs_block_extent_state	es;
17 };
18 
19 struct pnfs_block_range {
20 	u64				foff;
21 	u64				len;
22 };
23 
24 /*
25  * Random upper cap for the uuid length to avoid unbounded allocation.
26  * Not actually limited by the protocol.
27  */
28 #define PNFS_BLOCK_UUID_LEN	128
29 
30 struct pnfs_block_volume {
31 	enum pnfs_block_volume_type	type;
32 	union {
33 		struct {
34 			u64		offset;
35 			u32		sig_len;
36 			u8		sig[PNFS_BLOCK_UUID_LEN];
37 		} simple;
38 		struct {
39 			enum scsi_code_set		code_set;
40 			enum scsi_designator_type	designator_type;
41 			int				designator_len;
42 			u8				designator[256];
43 			u64				pr_key;
44 		} scsi;
45 	};
46 };
47 
48 struct pnfs_block_deviceaddr {
49 	u32				nr_volumes;
50 	struct pnfs_block_volume	volumes[];
51 };
52 
53 __be32 nfsd4_block_encode_getdeviceinfo(struct xdr_stream *xdr,
54 		struct nfsd4_getdeviceinfo *gdp);
55 __be32 nfsd4_block_encode_layoutget(struct xdr_stream *xdr,
56 		struct nfsd4_layoutget *lgp);
57 int nfsd4_block_decode_layoutupdate(__be32 *p, u32 len, struct iomap **iomapp,
58 		u32 block_size);
59 int nfsd4_scsi_decode_layoutupdate(__be32 *p, u32 len, struct iomap **iomapp,
60 		u32 block_size);
61 
62 #endif /* _NFSD_BLOCKLAYOUTXDR_H */
63