Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 1 | /* |
| 2 | * NFSv4 file layout driver data structures. |
| 3 | * |
| 4 | * Copyright (c) 2002 |
| 5 | * The Regents of the University of Michigan |
| 6 | * All Rights Reserved |
| 7 | * |
| 8 | * Dean Hildebrand <dhildebz@umich.edu> |
| 9 | * |
| 10 | * Permission is granted to use, copy, create derivative works, and |
| 11 | * redistribute this software and such derivative works for any purpose, |
| 12 | * so long as the name of the University of Michigan is not used in |
| 13 | * any advertising or publicity pertaining to the use or distribution |
| 14 | * of this software without specific, written prior authorization. If |
| 15 | * the above copyright notice or any other identification of the |
| 16 | * University of Michigan is included in any copy of any portion of |
| 17 | * this software, then the disclaimer below must also be included. |
| 18 | * |
| 19 | * This software is provided as is, without representation or warranty |
| 20 | * of any kind either express or implied, including without limitation |
| 21 | * the implied warranties of merchantability, fitness for a particular |
| 22 | * purpose, or noninfringement. The Regents of the University of |
| 23 | * Michigan shall not be liable for any damages, including special, |
| 24 | * indirect, incidental, or consequential damages, with respect to any |
| 25 | * claim arising out of or in connection with the use of the software, |
| 26 | * even if it has been or is hereafter advised of the possibility of |
| 27 | * such damages. |
| 28 | */ |
| 29 | |
| 30 | #ifndef FS_NFS_NFS4FILELAYOUT_H |
| 31 | #define FS_NFS_NFS4FILELAYOUT_H |
| 32 | |
| 33 | #include "pnfs.h" |
| 34 | |
| 35 | /* |
Andy Adamson | 98fc685 | 2012-04-27 17:53:45 -0400 | [diff] [blame] | 36 | * Default data server connection timeout and retrans vaules. |
| 37 | * Set by module paramters dataserver_timeo and dataserver_retrans. |
| 38 | */ |
| 39 | #define NFS4_DEF_DS_TIMEO 60 |
| 40 | #define NFS4_DEF_DS_RETRANS 5 |
| 41 | |
| 42 | /* |
Lucas De Marchi | 25985ed | 2011-03-30 22:57:33 -0300 | [diff] [blame] | 43 | * Field testing shows we need to support up to 4096 stripe indices. |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 44 | * We store each index as a u8 (u32 on the wire) to keep the memory footprint |
| 45 | * reasonable. This in turn means we support a maximum of 256 |
| 46 | * RFC 5661 multipath_list4 structures. |
| 47 | */ |
| 48 | #define NFS4_PNFS_MAX_STRIPE_CNT 4096 |
| 49 | #define NFS4_PNFS_MAX_MULTI_CNT 256 /* 256 fit into a u8 stripe_index */ |
| 50 | |
Andy Adamson | e7dd79af | 2012-04-27 17:53:46 -0400 | [diff] [blame] | 51 | /* error codes for internal use */ |
| 52 | #define NFS4ERR_RESET_TO_MDS 12001 |
| 53 | |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 54 | enum stripetype4 { |
| 55 | STRIPE_SPARSE = 1, |
| 56 | STRIPE_DENSE = 2 |
| 57 | }; |
| 58 | |
| 59 | /* Individual ip address */ |
Weston Andros Adamson | 14f9a60 | 2011-05-31 18:48:57 -0400 | [diff] [blame] | 60 | struct nfs4_pnfs_ds_addr { |
| 61 | struct sockaddr_storage da_addr; |
| 62 | size_t da_addrlen; |
| 63 | struct list_head da_node; /* nfs4_pnfs_dev_hlist dev_dslist */ |
| 64 | char *da_remotestr; /* human readable addr+port */ |
| 65 | }; |
| 66 | |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 67 | struct nfs4_pnfs_ds { |
| 68 | struct list_head ds_node; /* nfs4_pnfs_dev_hlist dev_dslist */ |
Weston Andros Adamson | 14f9a60 | 2011-05-31 18:48:57 -0400 | [diff] [blame] | 69 | char *ds_remotestr; /* comma sep list of addrs */ |
| 70 | struct list_head ds_addrs; |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 71 | struct nfs_client *ds_clp; |
| 72 | atomic_t ds_count; |
| 73 | }; |
| 74 | |
| 75 | struct nfs4_file_layout_dsaddr { |
Benny Halevy | a1eaecb | 2011-05-19 22:14:47 -0400 | [diff] [blame] | 76 | struct nfs4_deviceid_node id_node; |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 77 | u32 stripe_count; |
| 78 | u8 *stripe_indices; |
| 79 | u32 ds_num; |
| 80 | struct nfs4_pnfs_ds *ds_list[1]; |
| 81 | }; |
| 82 | |
| 83 | struct nfs4_filelayout_segment { |
| 84 | struct pnfs_layout_segment generic_hdr; |
| 85 | u32 stripe_type; |
| 86 | u32 commit_through_mds; |
| 87 | u32 stripe_unit; |
| 88 | u32 first_stripe_index; |
| 89 | u64 pattern_offset; |
| 90 | struct nfs4_file_layout_dsaddr *dsaddr; /* Point to GETDEVINFO data */ |
| 91 | unsigned int num_fh; |
| 92 | struct nfs_fh **fh_array; |
| 93 | }; |
| 94 | |
Fred Isaman | 799ba8d | 2012-04-20 14:47:38 -0400 | [diff] [blame] | 95 | struct nfs4_filelayout { |
| 96 | struct pnfs_layout_hdr generic_hdr; |
Fred Isaman | ea2cf22 | 2012-04-20 14:47:53 -0400 | [diff] [blame] | 97 | struct pnfs_ds_commit_info commit_info; |
Fred Isaman | 799ba8d | 2012-04-20 14:47:38 -0400 | [diff] [blame] | 98 | }; |
| 99 | |
| 100 | static inline struct nfs4_filelayout * |
| 101 | FILELAYOUT_FROM_HDR(struct pnfs_layout_hdr *lo) |
| 102 | { |
| 103 | return container_of(lo, struct nfs4_filelayout, generic_hdr); |
| 104 | } |
| 105 | |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 106 | static inline struct nfs4_filelayout_segment * |
| 107 | FILELAYOUT_LSEG(struct pnfs_layout_segment *lseg) |
| 108 | { |
| 109 | return container_of(lseg, |
| 110 | struct nfs4_filelayout_segment, |
| 111 | generic_hdr); |
| 112 | } |
| 113 | |
Andy Adamson | c47abcf | 2011-06-15 17:52:40 -0400 | [diff] [blame] | 114 | static inline struct nfs4_deviceid_node * |
| 115 | FILELAYOUT_DEVID_NODE(struct pnfs_layout_segment *lseg) |
| 116 | { |
| 117 | return &FILELAYOUT_LSEG(lseg)->dsaddr->id_node; |
| 118 | } |
| 119 | |
Andy Adamson | 554d458 | 2012-04-27 17:53:42 -0400 | [diff] [blame] | 120 | static inline void |
| 121 | filelayout_mark_devid_invalid(struct nfs4_deviceid_node *node) |
| 122 | { |
| 123 | u32 *p = (u32 *)&node->deviceid; |
| 124 | |
| 125 | printk(KERN_WARNING "NFS: Deviceid [%x%x%x%x] marked out of use.\n", |
| 126 | p[0], p[1], p[2], p[3]); |
| 127 | |
| 128 | set_bit(NFS_DEVICEID_INVALID, &node->flags); |
| 129 | } |
| 130 | |
| 131 | static inline bool |
| 132 | filelayout_test_devid_invalid(struct nfs4_deviceid_node *node) |
| 133 | { |
| 134 | return test_bit(NFS_DEVICEID_INVALID, &node->flags); |
| 135 | } |
| 136 | |
Trond Myklebust | 1dfed27 | 2012-09-18 19:51:12 -0400 | [diff] [blame] | 137 | extern bool |
| 138 | filelayout_test_devid_unavailable(struct nfs4_deviceid_node *node); |
Andy Adamson | 041245c | 2012-04-27 17:53:53 -0400 | [diff] [blame] | 139 | |
Fred Isaman | cfe7f41 | 2011-03-01 01:34:18 +0000 | [diff] [blame] | 140 | extern struct nfs_fh * |
| 141 | nfs4_fl_select_ds_fh(struct pnfs_layout_segment *lseg, u32 j); |
| 142 | |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 143 | extern void print_ds(struct nfs4_pnfs_ds *ds); |
Fred Isaman | cfe7f41 | 2011-03-01 01:34:18 +0000 | [diff] [blame] | 144 | u32 nfs4_fl_calc_j_index(struct pnfs_layout_segment *lseg, loff_t offset); |
| 145 | u32 nfs4_fl_calc_ds_index(struct pnfs_layout_segment *lseg, u32 j); |
| 146 | struct nfs4_pnfs_ds *nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg, |
| 147 | u32 ds_idx); |
Christoph Hellwig | ea8eecd | 2011-03-01 01:34:21 +0000 | [diff] [blame] | 148 | extern void nfs4_fl_put_deviceid(struct nfs4_file_layout_dsaddr *dsaddr); |
Benny Halevy | 1775bc3 | 2011-05-20 13:47:33 +0200 | [diff] [blame] | 149 | extern void nfs4_fl_free_deviceid(struct nfs4_file_layout_dsaddr *dsaddr); |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 150 | struct nfs4_file_layout_dsaddr * |
Trond Myklebust | 78e4e05 | 2012-09-18 21:02:29 -0400 | [diff] [blame] | 151 | filelayout_get_device_info(struct inode *inode, struct nfs4_deviceid *dev_id, gfp_t gfp_flags); |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 152 | |
| 153 | #endif /* FS_NFS_NFS4FILELAYOUT_H */ |