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 */ |
| 50 | struct nfs4_pnfs_ds { |
| 51 | struct list_head ds_node; /* nfs4_pnfs_dev_hlist dev_dslist */ |
| 52 | u32 ds_ip_addr; |
| 53 | u32 ds_port; |
| 54 | struct nfs_client *ds_clp; |
| 55 | atomic_t ds_count; |
| 56 | }; |
| 57 | |
Andy Adamson | 568e8c4 | 2011-03-01 01:34:22 +0000 | [diff] [blame] | 58 | /* nfs4_file_layout_dsaddr flags */ |
| 59 | #define NFS4_DEVICE_ID_NEG_ENTRY 0x00000001 |
| 60 | |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 61 | struct nfs4_file_layout_dsaddr { |
Christoph Hellwig | ea8eecd | 2011-03-01 01:34:21 +0000 | [diff] [blame] | 62 | struct hlist_node node; |
| 63 | struct nfs4_deviceid deviceid; |
| 64 | atomic_t ref; |
Andy Adamson | 568e8c4 | 2011-03-01 01:34:22 +0000 | [diff] [blame] | 65 | unsigned long flags; |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 66 | u32 stripe_count; |
| 67 | u8 *stripe_indices; |
| 68 | u32 ds_num; |
| 69 | struct nfs4_pnfs_ds *ds_list[1]; |
| 70 | }; |
| 71 | |
| 72 | struct nfs4_filelayout_segment { |
| 73 | struct pnfs_layout_segment generic_hdr; |
| 74 | u32 stripe_type; |
| 75 | u32 commit_through_mds; |
| 76 | u32 stripe_unit; |
| 77 | u32 first_stripe_index; |
| 78 | u64 pattern_offset; |
| 79 | struct nfs4_file_layout_dsaddr *dsaddr; /* Point to GETDEVINFO data */ |
| 80 | unsigned int num_fh; |
| 81 | struct nfs_fh **fh_array; |
Fred Isaman | 425eb73 | 2011-03-23 13:27:50 +0000 | [diff] [blame] | 82 | struct list_head *commit_buckets; /* Sort commits to ds */ |
| 83 | int number_of_buckets; |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 84 | }; |
| 85 | |
| 86 | static inline struct nfs4_filelayout_segment * |
| 87 | FILELAYOUT_LSEG(struct pnfs_layout_segment *lseg) |
| 88 | { |
| 89 | return container_of(lseg, |
| 90 | struct nfs4_filelayout_segment, |
| 91 | generic_hdr); |
| 92 | } |
| 93 | |
Fred Isaman | cfe7f41 | 2011-03-01 01:34:18 +0000 | [diff] [blame] | 94 | extern struct nfs_fh * |
| 95 | nfs4_fl_select_ds_fh(struct pnfs_layout_segment *lseg, u32 j); |
| 96 | |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 97 | extern void print_ds(struct nfs4_pnfs_ds *ds); |
| 98 | extern void print_deviceid(struct nfs4_deviceid *dev_id); |
Fred Isaman | cfe7f41 | 2011-03-01 01:34:18 +0000 | [diff] [blame] | 99 | u32 nfs4_fl_calc_j_index(struct pnfs_layout_segment *lseg, loff_t offset); |
| 100 | u32 nfs4_fl_calc_ds_index(struct pnfs_layout_segment *lseg, u32 j); |
| 101 | struct nfs4_pnfs_ds *nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg, |
| 102 | u32 ds_idx); |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 103 | extern struct nfs4_file_layout_dsaddr * |
Christoph Hellwig | ea8eecd | 2011-03-01 01:34:21 +0000 | [diff] [blame] | 104 | nfs4_fl_find_get_deviceid(struct nfs4_deviceid *dev_id); |
| 105 | extern void nfs4_fl_put_deviceid(struct nfs4_file_layout_dsaddr *dsaddr); |
Andy Adamson | 16b374c | 2010-10-20 00:18:04 -0400 | [diff] [blame] | 106 | struct nfs4_file_layout_dsaddr * |
| 107 | get_device_info(struct inode *inode, struct nfs4_deviceid *dev_id); |
| 108 | |
| 109 | #endif /* FS_NFS_NFS4FILELAYOUT_H */ |