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 | /* |
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 | |
| 49 | /* Individual ip address */ |
Weston Andros Adamson | 14f9a60 | 2011-05-31 18:48:57 -0400 | [diff] [blame] | 50 | struct nfs4_pnfs_ds_addr { |
| 51 | struct sockaddr_storage da_addr; |
| 52 | size_t da_addrlen; |
| 53 | struct list_head da_node; /* nfs4_pnfs_dev_hlist dev_dslist */ |
| 54 | char *da_remotestr; /* human readable addr+port */ |
| 55 | }; |
| 56 | |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 57 | struct nfs4_pnfs_ds { |
| 58 | struct list_head ds_node; /* nfs4_pnfs_dev_hlist dev_dslist */ |
Weston Andros Adamson | 14f9a60 | 2011-05-31 18:48:57 -0400 | [diff] [blame] | 59 | char *ds_remotestr; /* comma sep list of addrs */ |
| 60 | struct list_head ds_addrs; |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 61 | struct nfs_client *ds_clp; |
| 62 | atomic_t ds_count; |
| 63 | }; |
| 64 | |
Andy Adamson | 568e8c4 | 2011-03-01 01:34:22 +0000 | [diff] [blame] | 65 | /* nfs4_file_layout_dsaddr flags */ |
| 66 | #define NFS4_DEVICE_ID_NEG_ENTRY 0x00000001 |
| 67 | |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 68 | struct nfs4_file_layout_dsaddr { |
Benny Halevy | a1eaecb | 2011-05-19 22:14:47 -0400 | [diff] [blame] | 69 | struct nfs4_deviceid_node id_node; |
Andy Adamson | 568e8c4 | 2011-03-01 01:34:22 +0000 | [diff] [blame] | 70 | unsigned long flags; |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 71 | u32 stripe_count; |
| 72 | u8 *stripe_indices; |
| 73 | u32 ds_num; |
| 74 | struct nfs4_pnfs_ds *ds_list[1]; |
| 75 | }; |
| 76 | |
| 77 | struct nfs4_filelayout_segment { |
| 78 | struct pnfs_layout_segment generic_hdr; |
| 79 | u32 stripe_type; |
| 80 | u32 commit_through_mds; |
| 81 | u32 stripe_unit; |
| 82 | u32 first_stripe_index; |
| 83 | u64 pattern_offset; |
| 84 | struct nfs4_file_layout_dsaddr *dsaddr; /* Point to GETDEVINFO data */ |
| 85 | unsigned int num_fh; |
| 86 | struct nfs_fh **fh_array; |
Fred Isaman | 425eb73 | 2011-03-23 13:27:50 +0000 | [diff] [blame] | 87 | struct list_head *commit_buckets; /* Sort commits to ds */ |
| 88 | int number_of_buckets; |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 89 | }; |
| 90 | |
| 91 | static inline struct nfs4_filelayout_segment * |
| 92 | FILELAYOUT_LSEG(struct pnfs_layout_segment *lseg) |
| 93 | { |
| 94 | return container_of(lseg, |
| 95 | struct nfs4_filelayout_segment, |
| 96 | generic_hdr); |
| 97 | } |
| 98 | |
Andy Adamson | c47abcf | 2011-06-15 17:52:40 -0400 | [diff] [blame] | 99 | static inline struct nfs4_deviceid_node * |
| 100 | FILELAYOUT_DEVID_NODE(struct pnfs_layout_segment *lseg) |
| 101 | { |
| 102 | return &FILELAYOUT_LSEG(lseg)->dsaddr->id_node; |
| 103 | } |
| 104 | |
Fred Isaman | cfe7f41 | 2011-03-01 01:34:18 +0000 | [diff] [blame] | 105 | extern struct nfs_fh * |
| 106 | nfs4_fl_select_ds_fh(struct pnfs_layout_segment *lseg, u32 j); |
| 107 | |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 108 | extern void print_ds(struct nfs4_pnfs_ds *ds); |
Fred Isaman | cfe7f41 | 2011-03-01 01:34:18 +0000 | [diff] [blame] | 109 | u32 nfs4_fl_calc_j_index(struct pnfs_layout_segment *lseg, loff_t offset); |
| 110 | u32 nfs4_fl_calc_ds_index(struct pnfs_layout_segment *lseg, u32 j); |
| 111 | struct nfs4_pnfs_ds *nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg, |
| 112 | u32 ds_idx); |
Christoph Hellwig | ea8eecd | 2011-03-01 01:34:21 +0000 | [diff] [blame] | 113 | extern void nfs4_fl_put_deviceid(struct nfs4_file_layout_dsaddr *dsaddr); |
Benny Halevy | 1775bc3 | 2011-05-20 13:47:33 +0200 | [diff] [blame] | 114 | extern void nfs4_fl_free_deviceid(struct nfs4_file_layout_dsaddr *dsaddr); |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 115 | struct nfs4_file_layout_dsaddr * |
Trond Myklebust | a75b9df | 2011-05-11 18:00:51 -0400 | [diff] [blame] | 116 | 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] | 117 | |
| 118 | #endif /* FS_NFS_NFS4FILELAYOUT_H */ |