Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
pnfs_osd_xdr.h
Go to the documentation of this file.
1 /*
2  * pNFS-osd on-the-wire data structures
3  *
4  * Copyright (C) 2007 Panasas Inc. [year of first publication]
5  * All rights reserved.
6  *
7  * Benny Halevy <[email protected]>
8  * Boaz Harrosh <[email protected]>
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License version 2
12  * See the file COPYING included with this distribution for more details.
13  *
14  * Redistribution and use in source and binary forms, with or without
15  * modification, are permitted provided that the following conditions
16  * are met:
17  *
18  * 1. Redistributions of source code must retain the above copyright
19  * notice, this list of conditions and the following disclaimer.
20  * 2. Redistributions in binary form must reproduce the above copyright
21  * notice, this list of conditions and the following disclaimer in the
22  * documentation and/or other materials provided with the distribution.
23  * 3. Neither the name of the Panasas company nor the names of its
24  * contributors may be used to endorse or promote products derived
25  * from this software without specific prior written permission.
26  *
27  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
28  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
29  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
30  * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
31  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
34  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
35  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
36  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
37  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38  */
39 #ifndef __PNFS_OSD_XDR_H__
40 #define __PNFS_OSD_XDR_H__
41 
42 #include <linux/nfs_fs.h>
43 
44 /*
45  * draft-ietf-nfsv4-minorversion-22
46  * draft-ietf-nfsv4-pnfs-obj-12
47  */
48 
49 /* Layout Structure */
50 
55  PNFS_OSD_RAID_PQ = 4 /* Reed-Solomon P+Q */
56 };
57 
58 /* struct pnfs_osd_data_map4 {
59  * uint32_t odm_num_comps;
60  * length4 odm_stripe_unit;
61  * uint32_t odm_group_width;
62  * uint32_t odm_group_depth;
63  * uint32_t odm_mirror_cnt;
64  * pnfs_osd_raid_algorithm4 odm_raid_algorithm;
65  * };
66  */
74 };
75 
76 /* struct pnfs_osd_objid4 {
77  * deviceid4 oid_device_id;
78  * uint64_t oid_partition_id;
79  * uint64_t oid_object_id;
80  * };
81  */
86 };
87 
88 /* For printout. I use:
89  * kprint("dev(%llx:%llx)", _DEVID_LO(pointer), _DEVID_HI(pointer));
90  * BE style
91  */
92 #define _DEVID_LO(oid_device_id) \
93  (unsigned long long)be64_to_cpup((__be64 *)(oid_device_id)->data)
94 
95 #define _DEVID_HI(oid_device_id) \
96  (unsigned long long)be64_to_cpup(((__be64 *)(oid_device_id)->data) + 1)
97 
102 };
103 
106  void *cred;
107 };
108 
112 };
113 
114 /* struct pnfs_osd_object_cred4 {
115  * pnfs_osd_objid4 oc_object_id;
116  * pnfs_osd_version4 oc_osd_version;
117  * pnfs_osd_cap_key_sec4 oc_cap_key_sec;
118  * opaque oc_capability_key<>;
119  * opaque oc_capability<>;
120  * };
121  */
128 };
129 
130 /* struct pnfs_osd_layout4 {
131  * pnfs_osd_data_map4 olo_map;
132  * uint32_t olo_comps_index;
133  * pnfs_osd_object_cred4 olo_components<>;
134  * };
135  */
141 };
142 
143 /* Device Address */
148 };
149 
150 /* union pnfs_osd_targetid4 switch (pnfs_osd_targetid_type4 oti_type) {
151  * case OBJ_TARGET_SCSI_NAME:
152  * string oti_scsi_name<>;
153  *
154  * case OBJ_TARGET_SCSI_DEVICE_ID:
155  * opaque oti_scsi_device_id<>;
156  *
157  * default:
158  * void;
159  * };
160  *
161  * union pnfs_osd_targetaddr4 switch (bool ota_available) {
162  * case TRUE:
163  * netaddr4 ota_netaddr;
164  * case FALSE:
165  * void;
166  * };
167  *
168  * struct pnfs_osd_deviceaddr4 {
169  * pnfs_osd_targetid4 oda_targetid;
170  * pnfs_osd_targetaddr4 oda_targetaddr;
171  * uint64_t oda_lun;
172  * opaque oda_systemid<>;
173  * pnfs_osd_object_cred4 oda_root_obj_cred;
174  * opaque oda_osdname<>;
175  * };
176  */
180 };
181 
182 /* struct netaddr4 {
183  * // see struct rpcb in RFC1833
184  * string r_netid<>; // network id
185  * string r_addr<>; // universal address
186  * };
187  */
191 };
192 
196 };
197 
205 };
206 
207 /* LAYOUTCOMMIT: layoutupdate */
208 
209 /* union pnfs_osd_deltaspaceused4 switch (bool dsu_valid) {
210  * case TRUE:
211  * int64_t dsu_delta;
212  * case FALSE:
213  * void;
214  * };
215  *
216  * struct pnfs_osd_layoutupdate4 {
217  * pnfs_osd_deltaspaceused4 olu_delta_space_used;
218  * bool olu_ioerr_flag;
219  * };
220  */
225 };
226 
227 /* LAYOUTRETURN: I/O Rrror Report */
228 
237 };
238 
239 /* struct pnfs_osd_ioerr4 {
240  * pnfs_osd_objid4 oer_component;
241  * length4 oer_comp_offset;
242  * length4 oer_comp_length;
243  * bool oer_iswrite;
244  * pnfs_osd_errno4 oer_errno;
245  * };
246  */
253 };
254 
255 /* OSD XDR Client API */
256 /* Layout helpers */
257 /* Layout decoding is done in two parts:
258  * 1. First Call pnfs_osd_xdr_decode_layout_map to read in only the header part
259  * of the layout. @iter members need not be initialized.
260  * Returned:
261  * @layout members are set. (@layout->olo_comps set to NULL).
262  *
263  * Zero on success, or negative error if passed xdr is broken.
264  *
265  * 2. 2nd Call pnfs_osd_xdr_decode_layout_comp() in a loop until it returns
266  * false, to decode the next component.
267  * Returned:
268  * true if there is more to decode or false if we are done or error.
269  *
270  * Example:
271  * struct pnfs_osd_xdr_decode_layout_iter iter;
272  * struct pnfs_osd_layout layout;
273  * struct pnfs_osd_object_cred comp;
274  * int status;
275  *
276  * status = pnfs_osd_xdr_decode_layout_map(&layout, &iter, xdr);
277  * if (unlikely(status))
278  * goto err;
279  * while(pnfs_osd_xdr_decode_layout_comp(&comp, &iter, xdr, &status)) {
280  * // All of @comp strings point to inside the xdr_buffer
281  * // or scrach buffer. Copy them out to user memory eg.
282  * copy_single_comp(dest_comp++, &comp);
283  * }
284  * if (unlikely(status))
285  * goto err;
286  */
287 
289  unsigned total_comps;
290  unsigned decoded_comps;
291 };
292 
294  struct pnfs_osd_xdr_decode_layout_iter *iter, struct xdr_stream *xdr);
295 
297  struct pnfs_osd_xdr_decode_layout_iter *iter, struct xdr_stream *xdr,
298  int *err);
299 
300 /* Device Info helpers */
301 
302 /* Note: All strings inside @deviceaddr point to space inside @p.
303  * @p should stay valid while @deviceaddr is in use.
304  */
306  struct pnfs_osd_deviceaddr *deviceaddr, __be32 *p);
307 
308 /* layoutupdate (layout_commit) xdr helpers */
309 extern int
310 pnfs_osd_xdr_encode_layoutupdate(struct xdr_stream *xdr,
311  struct pnfs_osd_layoutupdate *lou);
312 
313 /* osd_ioerror encoding (layout_return) */
314 extern __be32 *pnfs_osd_xdr_ioerr_reserve_space(struct xdr_stream *xdr);
315 extern void pnfs_osd_xdr_encode_ioerr(__be32 *p, struct pnfs_osd_ioerr *ioerr);
316 
317 #endif /* __PNFS_OSD_XDR_H__ */