mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 00:28:52 +02:00 
			
		
		
		
	 2869b3a00e
			
		
	
	
		2869b3a00e
		
	
	
	
	
		
			
			Add the __counted_by compiler attribute to the flexible array member volumes to improve access bounds-checking via CONFIG_UBSAN_BOUNDS and CONFIG_FORTIFY_SOURCE. Use struct_size() instead of manually calculating the number of bytes to allocate for a pnfs_block_deviceaddr with a single volume. Signed-off-by: Thorsten Blum <thorsten.blum@toblux.com> Reviewed-by: Gustavo A. R. Silva <gustavoars@kernel.org> Acked-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
		
			
				
	
	
		
			62 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			62 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);
 | |
| int nfsd4_block_decode_layoutupdate(__be32 *p, u32 len, struct iomap **iomapp,
 | |
| 		u32 block_size);
 | |
| int nfsd4_scsi_decode_layoutupdate(__be32 *p, u32 len, struct iomap **iomapp,
 | |
| 		u32 block_size);
 | |
| 
 | |
| #endif /* _NFSD_BLOCKLAYOUTXDR_H */
 |