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[] __counted_by(nr_volumes); 51 }; 52 53 __be32 nfsd4_block_encode_getdeviceinfo(struct xdr_stream *xdr, 54 const struct nfsd4_getdeviceinfo *gdp); 55 __be32 nfsd4_block_encode_layoutget(struct xdr_stream *xdr, 56 const 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