xref: /linux/fs/nfsd/blocklayoutxdr.h (revision 8c04a6d6e07ce565928ea98ae8c534cac871af19)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
28650b8a0SChristoph Hellwig #ifndef _NFSD_BLOCKLAYOUTXDR_H
38650b8a0SChristoph Hellwig #define _NFSD_BLOCKLAYOUTXDR_H 1
48650b8a0SChristoph Hellwig 
58650b8a0SChristoph Hellwig #include <linux/blkdev.h>
68650b8a0SChristoph Hellwig #include "xdr4.h"
78650b8a0SChristoph Hellwig 
88650b8a0SChristoph Hellwig struct iomap;
98650b8a0SChristoph Hellwig struct xdr_stream;
108650b8a0SChristoph Hellwig 
118650b8a0SChristoph Hellwig struct pnfs_block_extent {
128650b8a0SChristoph Hellwig 	struct nfsd4_deviceid		vol_id;
138650b8a0SChristoph Hellwig 	u64				foff;
148650b8a0SChristoph Hellwig 	u64				len;
158650b8a0SChristoph Hellwig 	u64				soff;
168650b8a0SChristoph Hellwig 	enum pnfs_block_extent_state	es;
178650b8a0SChristoph Hellwig };
188650b8a0SChristoph Hellwig 
19f99d4fbdSChristoph Hellwig struct pnfs_block_range {
20f99d4fbdSChristoph Hellwig 	u64				foff;
21f99d4fbdSChristoph Hellwig 	u64				len;
22f99d4fbdSChristoph Hellwig };
23f99d4fbdSChristoph Hellwig 
248650b8a0SChristoph Hellwig /*
258650b8a0SChristoph Hellwig  * Random upper cap for the uuid length to avoid unbounded allocation.
268650b8a0SChristoph Hellwig  * Not actually limited by the protocol.
278650b8a0SChristoph Hellwig  */
288650b8a0SChristoph Hellwig #define PNFS_BLOCK_UUID_LEN	128
298650b8a0SChristoph Hellwig 
308650b8a0SChristoph Hellwig struct pnfs_block_volume {
318650b8a0SChristoph Hellwig 	enum pnfs_block_volume_type	type;
328650b8a0SChristoph Hellwig 	union {
338650b8a0SChristoph Hellwig 		struct {
348650b8a0SChristoph Hellwig 			u64		offset;
358650b8a0SChristoph Hellwig 			u32		sig_len;
368650b8a0SChristoph Hellwig 			u8		sig[PNFS_BLOCK_UUID_LEN];
378650b8a0SChristoph Hellwig 		} simple;
38f99d4fbdSChristoph Hellwig 		struct {
39f99d4fbdSChristoph Hellwig 			enum scsi_code_set		code_set;
40f99d4fbdSChristoph Hellwig 			enum scsi_designator_type	designator_type;
41f99d4fbdSChristoph Hellwig 			int				designator_len;
42f99d4fbdSChristoph Hellwig 			u8				designator[256];
43f99d4fbdSChristoph Hellwig 			u64				pr_key;
44f99d4fbdSChristoph Hellwig 		} scsi;
458650b8a0SChristoph Hellwig 	};
468650b8a0SChristoph Hellwig };
478650b8a0SChristoph Hellwig 
488650b8a0SChristoph Hellwig struct pnfs_block_deviceaddr {
498650b8a0SChristoph Hellwig 	u32				nr_volumes;
50*2869b3a0SThorsten Blum 	struct pnfs_block_volume	volumes[] __counted_by(nr_volumes);
518650b8a0SChristoph Hellwig };
528650b8a0SChristoph Hellwig 
538650b8a0SChristoph Hellwig __be32 nfsd4_block_encode_getdeviceinfo(struct xdr_stream *xdr,
5482e93babSChuck Lever 		const struct nfsd4_getdeviceinfo *gdp);
558650b8a0SChristoph Hellwig __be32 nfsd4_block_encode_layoutget(struct xdr_stream *xdr,
5673debe47SChuck Lever 		const struct nfsd4_layoutget *lgp);
578650b8a0SChristoph Hellwig int nfsd4_block_decode_layoutupdate(__be32 *p, u32 len, struct iomap **iomapp,
588650b8a0SChristoph Hellwig 		u32 block_size);
59f99d4fbdSChristoph Hellwig int nfsd4_scsi_decode_layoutupdate(__be32 *p, u32 len, struct iomap **iomapp,
60f99d4fbdSChristoph Hellwig 		u32 block_size);
618650b8a0SChristoph Hellwig 
628650b8a0SChristoph Hellwig #endif /* _NFSD_BLOCKLAYOUTXDR_H */
63