18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci *  NFSv4 file layout driver data structures.
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci *  Copyright (c) 2002
58c2ecf20Sopenharmony_ci *  The Regents of the University of Michigan
68c2ecf20Sopenharmony_ci *  All Rights Reserved
78c2ecf20Sopenharmony_ci *
88c2ecf20Sopenharmony_ci *  Dean Hildebrand <dhildebz@umich.edu>
98c2ecf20Sopenharmony_ci *
108c2ecf20Sopenharmony_ci *  Permission is granted to use, copy, create derivative works, and
118c2ecf20Sopenharmony_ci *  redistribute this software and such derivative works for any purpose,
128c2ecf20Sopenharmony_ci *  so long as the name of the University of Michigan is not used in
138c2ecf20Sopenharmony_ci *  any advertising or publicity pertaining to the use or distribution
148c2ecf20Sopenharmony_ci *  of this software without specific, written prior authorization. If
158c2ecf20Sopenharmony_ci *  the above copyright notice or any other identification of the
168c2ecf20Sopenharmony_ci *  University of Michigan is included in any copy of any portion of
178c2ecf20Sopenharmony_ci *  this software, then the disclaimer below must also be included.
188c2ecf20Sopenharmony_ci *
198c2ecf20Sopenharmony_ci *  This software is provided as is, without representation or warranty
208c2ecf20Sopenharmony_ci *  of any kind either express or implied, including without limitation
218c2ecf20Sopenharmony_ci *  the implied warranties of merchantability, fitness for a particular
228c2ecf20Sopenharmony_ci *  purpose, or noninfringement.  The Regents of the University of
238c2ecf20Sopenharmony_ci *  Michigan shall not be liable for any damages, including special,
248c2ecf20Sopenharmony_ci *  indirect, incidental, or consequential damages, with respect to any
258c2ecf20Sopenharmony_ci *  claim arising out of or in connection with the use of the software,
268c2ecf20Sopenharmony_ci *  even if it has been or is hereafter advised of the possibility of
278c2ecf20Sopenharmony_ci *  such damages.
288c2ecf20Sopenharmony_ci */
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci#ifndef FS_NFS_NFS4FILELAYOUT_H
318c2ecf20Sopenharmony_ci#define FS_NFS_NFS4FILELAYOUT_H
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci#include "../pnfs.h"
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci/*
368c2ecf20Sopenharmony_ci * Field testing shows we need to support up to 4096 stripe indices.
378c2ecf20Sopenharmony_ci * We store each index as a u8 (u32 on the wire) to keep the memory footprint
388c2ecf20Sopenharmony_ci * reasonable. This in turn means we support a maximum of 256
398c2ecf20Sopenharmony_ci * RFC 5661 multipath_list4 structures.
408c2ecf20Sopenharmony_ci */
418c2ecf20Sopenharmony_ci#define NFS4_PNFS_MAX_STRIPE_CNT 4096
428c2ecf20Sopenharmony_ci#define NFS4_PNFS_MAX_MULTI_CNT  256 /* 256 fit into a u8 stripe_index */
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_cienum stripetype4 {
458c2ecf20Sopenharmony_ci	STRIPE_SPARSE = 1,
468c2ecf20Sopenharmony_ci	STRIPE_DENSE = 2
478c2ecf20Sopenharmony_ci};
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_cistruct nfs4_file_layout_dsaddr {
508c2ecf20Sopenharmony_ci	struct nfs4_deviceid_node	id_node;
518c2ecf20Sopenharmony_ci	u32				stripe_count;
528c2ecf20Sopenharmony_ci	u8				*stripe_indices;
538c2ecf20Sopenharmony_ci	u32				ds_num;
548c2ecf20Sopenharmony_ci	struct nfs4_pnfs_ds		*ds_list[1];
558c2ecf20Sopenharmony_ci};
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_cistruct nfs4_filelayout_segment {
588c2ecf20Sopenharmony_ci	struct pnfs_layout_segment	generic_hdr;
598c2ecf20Sopenharmony_ci	u32				stripe_type;
608c2ecf20Sopenharmony_ci	u32				commit_through_mds;
618c2ecf20Sopenharmony_ci	u32				stripe_unit;
628c2ecf20Sopenharmony_ci	u32				first_stripe_index;
638c2ecf20Sopenharmony_ci	u64				pattern_offset;
648c2ecf20Sopenharmony_ci	struct nfs4_deviceid		deviceid;
658c2ecf20Sopenharmony_ci	struct nfs4_file_layout_dsaddr	*dsaddr; /* Point to GETDEVINFO data */
668c2ecf20Sopenharmony_ci	unsigned int			num_fh;
678c2ecf20Sopenharmony_ci	struct nfs_fh			**fh_array;
688c2ecf20Sopenharmony_ci};
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_cistruct nfs4_filelayout {
718c2ecf20Sopenharmony_ci	struct pnfs_layout_hdr generic_hdr;
728c2ecf20Sopenharmony_ci	struct pnfs_ds_commit_info commit_info;
738c2ecf20Sopenharmony_ci};
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_cistatic inline struct nfs4_filelayout *
768c2ecf20Sopenharmony_ciFILELAYOUT_FROM_HDR(struct pnfs_layout_hdr *lo)
778c2ecf20Sopenharmony_ci{
788c2ecf20Sopenharmony_ci	return container_of(lo, struct nfs4_filelayout, generic_hdr);
798c2ecf20Sopenharmony_ci}
808c2ecf20Sopenharmony_ci
818c2ecf20Sopenharmony_cistatic inline struct nfs4_filelayout_segment *
828c2ecf20Sopenharmony_ciFILELAYOUT_LSEG(struct pnfs_layout_segment *lseg)
838c2ecf20Sopenharmony_ci{
848c2ecf20Sopenharmony_ci	return container_of(lseg,
858c2ecf20Sopenharmony_ci			    struct nfs4_filelayout_segment,
868c2ecf20Sopenharmony_ci			    generic_hdr);
878c2ecf20Sopenharmony_ci}
888c2ecf20Sopenharmony_ci
898c2ecf20Sopenharmony_cistatic inline struct nfs4_deviceid_node *
908c2ecf20Sopenharmony_ciFILELAYOUT_DEVID_NODE(struct pnfs_layout_segment *lseg)
918c2ecf20Sopenharmony_ci{
928c2ecf20Sopenharmony_ci	return &FILELAYOUT_LSEG(lseg)->dsaddr->id_node;
938c2ecf20Sopenharmony_ci}
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_cistatic inline bool
968c2ecf20Sopenharmony_cifilelayout_test_devid_invalid(struct nfs4_deviceid_node *node)
978c2ecf20Sopenharmony_ci{
988c2ecf20Sopenharmony_ci	return test_bit(NFS_DEVICEID_INVALID, &node->flags);
998c2ecf20Sopenharmony_ci}
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_ciextern bool
1028c2ecf20Sopenharmony_cifilelayout_test_devid_unavailable(struct nfs4_deviceid_node *node);
1038c2ecf20Sopenharmony_ci
1048c2ecf20Sopenharmony_ciextern struct nfs_fh *
1058c2ecf20Sopenharmony_cinfs4_fl_select_ds_fh(struct pnfs_layout_segment *lseg, u32 j);
1068c2ecf20Sopenharmony_ci
1078c2ecf20Sopenharmony_ciu32 nfs4_fl_calc_j_index(struct pnfs_layout_segment *lseg, loff_t offset);
1088c2ecf20Sopenharmony_ciu32 nfs4_fl_calc_ds_index(struct pnfs_layout_segment *lseg, u32 j);
1098c2ecf20Sopenharmony_cistruct nfs4_pnfs_ds *nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg,
1108c2ecf20Sopenharmony_ci					u32 ds_idx);
1118c2ecf20Sopenharmony_ci
1128c2ecf20Sopenharmony_ciextern struct nfs4_file_layout_dsaddr *
1138c2ecf20Sopenharmony_cinfs4_fl_alloc_deviceid_node(struct nfs_server *server,
1148c2ecf20Sopenharmony_ci	struct pnfs_device *pdev, gfp_t gfp_flags);
1158c2ecf20Sopenharmony_ciextern void nfs4_fl_put_deviceid(struct nfs4_file_layout_dsaddr *dsaddr);
1168c2ecf20Sopenharmony_ciextern void nfs4_fl_free_deviceid(struct nfs4_file_layout_dsaddr *dsaddr);
1178c2ecf20Sopenharmony_ci
1188c2ecf20Sopenharmony_ci#endif /* FS_NFS_NFS4FILELAYOUT_H */
119