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