root/fs/nfsd/blocklayoutxdr.h
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _NFSD_BLOCKLAYOUTXDR_H
#define _NFSD_BLOCKLAYOUTXDR_H 1

#include <linux/blkdev.h>
#include "xdr4.h"

struct iomap;
struct xdr_stream;

/* On the wire size of the layout4 struct with zero number of extents */
#define PNFS_BLOCK_LAYOUT4_SIZE \
        (sizeof(__be32) * 2 +   /* offset4 */ \
         sizeof(__be32) * 2 +   /* length4 */ \
         sizeof(__be32) +       /* layoutiomode4 */ \
         sizeof(__be32) +       /* layouttype4 */ \
         sizeof(__be32) +       /* number of bytes */ \
         sizeof(__be32))        /* number of extents */

struct pnfs_block_extent {
        struct nfsd4_deviceid           vol_id;
        u64                             foff;
        u64                             len;
        u64                             soff;
        enum pnfs_block_extent_state    es;
};

struct pnfs_block_range {
        u64                             foff;
        u64                             len;
};

struct pnfs_block_layout {
        u32                             nr_extents;
        struct pnfs_block_extent        extents[] __counted_by(nr_extents);
};

/*
 * Random upper cap for the uuid length to avoid unbounded allocation.
 * Not actually limited by the protocol.
 */
#define PNFS_BLOCK_UUID_LEN     128

struct pnfs_block_volume {
        enum pnfs_block_volume_type     type;
        union {
                struct {
                        u64             offset;
                        u32             sig_len;
                        u8              sig[PNFS_BLOCK_UUID_LEN];
                } simple;
                struct {
                        enum scsi_code_set              code_set;
                        enum scsi_designator_type       designator_type;
                        int                             designator_len;
                        u8                              designator[256];
                        u64                             pr_key;
                } scsi;
        };
};

struct pnfs_block_deviceaddr {
        u32                             nr_volumes;
        struct pnfs_block_volume        volumes[] __counted_by(nr_volumes);
};

__be32 nfsd4_block_encode_getdeviceinfo(struct xdr_stream *xdr,
                const struct nfsd4_getdeviceinfo *gdp);
__be32 nfsd4_block_encode_layoutget(struct xdr_stream *xdr,
                const struct nfsd4_layoutget *lgp);
__be32 nfsd4_block_decode_layoutupdate(struct xdr_stream *xdr,
                struct iomap **iomapp, int *nr_iomapsp, u32 block_size);
__be32 nfsd4_scsi_decode_layoutupdate(struct xdr_stream *xdr,
                struct iomap **iomapp, int *nr_iomapsp, u32 block_size);

#endif /* _NFSD_BLOCKLAYOUTXDR_H */