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 | |
Tom Haynes | b596872 | 2014-05-12 14:35:52 -0700 | [diff] [blame] | 33 | #include "../pnfs.h" |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 34 | |
| 35 | /* |
Lucas De Marchi | 25985ed | 2011-03-30 22:57:33 -0300 | [diff] [blame] | 36 | * Field testing shows we need to support up to 4096 stripe indices. |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 37 | * We store each index as a u8 (u32 on the wire) to keep the memory footprint |
| 38 | * reasonable. This in turn means we support a maximum of 256 |
| 39 | * RFC 5661 multipath_list4 structures. |
| 40 | */ |
| 41 | #define NFS4_PNFS_MAX_STRIPE_CNT 4096 |
| 42 | #define NFS4_PNFS_MAX_MULTI_CNT 256 /* 256 fit into a u8 stripe_index */ |
| 43 | |
| 44 | enum stripetype4 { |
| 45 | STRIPE_SPARSE = 1, |
| 46 | STRIPE_DENSE = 2 |
| 47 | }; |
| 48 | |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 49 | struct nfs4_file_layout_dsaddr { |
Benny Halevy | a1eaecb | 2011-05-19 22:14:47 -0400 | [diff] [blame] | 50 | struct nfs4_deviceid_node id_node; |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 51 | u32 stripe_count; |
| 52 | u8 *stripe_indices; |
| 53 | u32 ds_num; |
| 54 | struct nfs4_pnfs_ds *ds_list[1]; |
| 55 | }; |
| 56 | |
| 57 | struct nfs4_filelayout_segment { |
Andy Adamson | 551afbb | 2017-03-20 18:07:00 -0400 | [diff] [blame] | 58 | struct pnfs_layout_segment generic_hdr; |
| 59 | u32 stripe_type; |
| 60 | u32 commit_through_mds; |
| 61 | u32 stripe_unit; |
| 62 | u32 first_stripe_index; |
| 63 | u64 pattern_offset; |
Andy Adamson | 629dc87 | 2017-03-20 18:07:01 -0400 | [diff] [blame] | 64 | struct nfs4_deviceid deviceid; |
Andy Adamson | 551afbb | 2017-03-20 18:07:00 -0400 | [diff] [blame] | 65 | struct nfs4_file_layout_dsaddr *dsaddr; /* Point to GETDEVINFO data */ |
| 66 | unsigned int num_fh; |
| 67 | struct nfs_fh **fh_array; |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 68 | }; |
| 69 | |
Fred Isaman | 799ba8d | 2012-04-20 14:47:38 -0400 | [diff] [blame] | 70 | struct nfs4_filelayout { |
| 71 | struct pnfs_layout_hdr generic_hdr; |
Fred Isaman | ea2cf22 | 2012-04-20 14:47:53 -0400 | [diff] [blame] | 72 | struct pnfs_ds_commit_info commit_info; |
Fred Isaman | 799ba8d | 2012-04-20 14:47:38 -0400 | [diff] [blame] | 73 | }; |
| 74 | |
| 75 | static inline struct nfs4_filelayout * |
| 76 | FILELAYOUT_FROM_HDR(struct pnfs_layout_hdr *lo) |
| 77 | { |
| 78 | return container_of(lo, struct nfs4_filelayout, generic_hdr); |
| 79 | } |
| 80 | |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 81 | static inline struct nfs4_filelayout_segment * |
| 82 | FILELAYOUT_LSEG(struct pnfs_layout_segment *lseg) |
| 83 | { |
| 84 | return container_of(lseg, |
| 85 | struct nfs4_filelayout_segment, |
| 86 | generic_hdr); |
| 87 | } |
| 88 | |
Andy Adamson | c47abcf | 2011-06-15 17:52:40 -0400 | [diff] [blame] | 89 | static inline struct nfs4_deviceid_node * |
| 90 | FILELAYOUT_DEVID_NODE(struct pnfs_layout_segment *lseg) |
| 91 | { |
| 92 | return &FILELAYOUT_LSEG(lseg)->dsaddr->id_node; |
| 93 | } |
| 94 | |
Andy Adamson | 554d458 | 2012-04-27 17:53:42 -0400 | [diff] [blame] | 95 | static inline bool |
| 96 | filelayout_test_devid_invalid(struct nfs4_deviceid_node *node) |
| 97 | { |
| 98 | return test_bit(NFS_DEVICEID_INVALID, &node->flags); |
| 99 | } |
| 100 | |
Trond Myklebust | 1dfed27 | 2012-09-18 19:51:12 -0400 | [diff] [blame] | 101 | extern bool |
| 102 | filelayout_test_devid_unavailable(struct nfs4_deviceid_node *node); |
Andy Adamson | 041245c | 2012-04-27 17:53:53 -0400 | [diff] [blame] | 103 | |
Fred Isaman | cfe7f41 | 2011-03-01 01:34:18 +0000 | [diff] [blame] | 104 | extern struct nfs_fh * |
| 105 | nfs4_fl_select_ds_fh(struct pnfs_layout_segment *lseg, u32 j); |
| 106 | |
Fred Isaman | cfe7f41 | 2011-03-01 01:34:18 +0000 | [diff] [blame] | 107 | u32 nfs4_fl_calc_j_index(struct pnfs_layout_segment *lseg, loff_t offset); |
| 108 | u32 nfs4_fl_calc_ds_index(struct pnfs_layout_segment *lseg, u32 j); |
| 109 | struct nfs4_pnfs_ds *nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg, |
| 110 | u32 ds_idx); |
Christoph Hellwig | 661373b | 2014-09-02 21:27:57 -0700 | [diff] [blame] | 111 | |
| 112 | extern struct nfs4_file_layout_dsaddr * |
| 113 | nfs4_fl_alloc_deviceid_node(struct nfs_server *server, |
| 114 | struct pnfs_device *pdev, gfp_t gfp_flags); |
Christoph Hellwig | ea8eecd | 2011-03-01 01:34:21 +0000 | [diff] [blame] | 115 | extern void nfs4_fl_put_deviceid(struct nfs4_file_layout_dsaddr *dsaddr); |
Benny Halevy | 1775bc3 | 2011-05-20 13:47:33 +0200 | [diff] [blame] | 116 | extern void nfs4_fl_free_deviceid(struct nfs4_file_layout_dsaddr *dsaddr); |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 117 | |
| 118 | #endif /* FS_NFS_NFS4FILELAYOUT_H */ |