0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 #ifndef FS_NFS_NFS4FILELAYOUT_H
0031 #define FS_NFS_NFS4FILELAYOUT_H
0032
0033 #include "../pnfs.h"
0034
0035
0036
0037
0038
0039
0040
0041 #define NFS4_PNFS_MAX_STRIPE_CNT 4096
0042 #define NFS4_PNFS_MAX_MULTI_CNT 256
0043
0044 enum stripetype4 {
0045 STRIPE_SPARSE = 1,
0046 STRIPE_DENSE = 2
0047 };
0048
0049 struct nfs4_file_layout_dsaddr {
0050 struct nfs4_deviceid_node id_node;
0051 u32 stripe_count;
0052 u8 *stripe_indices;
0053 u32 ds_num;
0054 struct nfs4_pnfs_ds *ds_list[];
0055 };
0056
0057 struct nfs4_filelayout_segment {
0058 struct pnfs_layout_segment generic_hdr;
0059 u32 stripe_type;
0060 u32 commit_through_mds;
0061 u32 stripe_unit;
0062 u32 first_stripe_index;
0063 u64 pattern_offset;
0064 struct nfs4_deviceid deviceid;
0065 struct nfs4_file_layout_dsaddr *dsaddr;
0066 unsigned int num_fh;
0067 struct nfs_fh **fh_array;
0068 };
0069
0070 struct nfs4_filelayout {
0071 struct pnfs_layout_hdr generic_hdr;
0072 struct pnfs_ds_commit_info commit_info;
0073 };
0074
0075 static inline struct nfs4_filelayout *
0076 FILELAYOUT_FROM_HDR(struct pnfs_layout_hdr *lo)
0077 {
0078 return container_of(lo, struct nfs4_filelayout, generic_hdr);
0079 }
0080
0081 static inline struct nfs4_filelayout_segment *
0082 FILELAYOUT_LSEG(struct pnfs_layout_segment *lseg)
0083 {
0084 return container_of(lseg,
0085 struct nfs4_filelayout_segment,
0086 generic_hdr);
0087 }
0088
0089 static inline struct nfs4_deviceid_node *
0090 FILELAYOUT_DEVID_NODE(struct pnfs_layout_segment *lseg)
0091 {
0092 return &FILELAYOUT_LSEG(lseg)->dsaddr->id_node;
0093 }
0094
0095 static inline bool
0096 filelayout_test_devid_invalid(struct nfs4_deviceid_node *node)
0097 {
0098 return test_bit(NFS_DEVICEID_INVALID, &node->flags);
0099 }
0100
0101 extern bool
0102 filelayout_test_devid_unavailable(struct nfs4_deviceid_node *node);
0103
0104 extern struct nfs_fh *
0105 nfs4_fl_select_ds_fh(struct pnfs_layout_segment *lseg, u32 j);
0106
0107 u32 nfs4_fl_calc_j_index(struct pnfs_layout_segment *lseg, loff_t offset);
0108 u32 nfs4_fl_calc_ds_index(struct pnfs_layout_segment *lseg, u32 j);
0109 struct nfs4_pnfs_ds *nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg,
0110 u32 ds_idx);
0111
0112 extern struct nfs4_file_layout_dsaddr *
0113 nfs4_fl_alloc_deviceid_node(struct nfs_server *server,
0114 struct pnfs_device *pdev, gfp_t gfp_flags);
0115 extern void nfs4_fl_put_deviceid(struct nfs4_file_layout_dsaddr *dsaddr);
0116 extern void nfs4_fl_free_deviceid(struct nfs4_file_layout_dsaddr *dsaddr);
0117
0118 #endif