mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-02-17 06:40:11 -05:00
When pNFS client in the block or scsi layout mode sends layoutcommit to MDS, a variable length array of modified extents is supplied within the request. This patch allows the server to accept such extent arrays if they do not fit within single memory page. The issue can be reproduced when writing to a 1GB file using FIO with O_DIRECT, 4K block and large I/O depth without preallocation of the file. In this case, the server returns NFSERR_BADXDR to the client. Co-developed-by: Konstantin Evtushenko <koevtushenko@yandex.com> Signed-off-by: Konstantin Evtushenko <koevtushenko@yandex.com> Signed-off-by: Sergey Bashirov <sergeybashirov@gmail.com> Reviewed-by: Jeff Layton <jlayton@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
63 lines
1.4 KiB
C
63 lines
1.4 KiB
C
/* 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;
|
|
|
|
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;
|
|
};
|
|
|
|
/*
|
|
* 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 */
|