1f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh/* 2f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * Object-Based pNFS Layout XDR layer 3f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * 4f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * Copyright (C) 2007 Panasas Inc. [year of first publication] 5f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * All rights reserved. 6f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * 7f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * Benny Halevy <bhalevy@panasas.com> 8aa281ac631008b9c18c405c8880007789f659c7dBoaz Harrosh * Boaz Harrosh <ooo@electrozaur.com> 9f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * 10f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * This program is free software; you can redistribute it and/or modify 11f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * it under the terms of the GNU General Public License version 2 12f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * See the file COPYING included with this distribution for more details. 13f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * 14f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * Redistribution and use in source and binary forms, with or without 15f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * modification, are permitted provided that the following conditions 16f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * are met: 17f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * 18f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * 1. Redistributions of source code must retain the above copyright 19f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * notice, this list of conditions and the following disclaimer. 20f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * 2. Redistributions in binary form must reproduce the above copyright 21f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * notice, this list of conditions and the following disclaimer in the 22f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * documentation and/or other materials provided with the distribution. 23f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * 3. Neither the name of the Panasas company nor the names of its 24f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * contributors may be used to endorse or promote products derived 25f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * from this software without specific prior written permission. 26f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * 27f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED 28f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 29f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 30f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 31f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 32f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 33f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 34f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 35f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 36f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 37f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 38f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh */ 39f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 40f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh#include <linux/pnfs_osd_xdr.h> 41f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 42f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh#define NFSDBG_FACILITY NFSDBG_PNFS_LD 43f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 44f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh/* 45f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * The following implementation is based on RFC5664 46f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh */ 47f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 48f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh/* 49f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct pnfs_osd_objid { 50f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct nfs4_deviceid oid_device_id; 51f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * u64 oid_partition_id; 52f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * u64 oid_object_id; 53f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * }; // xdr size 32 bytes 54f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh */ 55f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harroshstatic __be32 * 56f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh_osd_xdr_decode_objid(__be32 *p, struct pnfs_osd_objid *objid) 57f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh{ 58f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = xdr_decode_opaque_fixed(p, objid->oid_device_id.data, 59f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh sizeof(objid->oid_device_id.data)); 60f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 61f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = xdr_decode_hyper(p, &objid->oid_partition_id); 62f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = xdr_decode_hyper(p, &objid->oid_object_id); 63f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh return p; 64f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh} 65f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh/* 66f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct pnfs_osd_opaque_cred { 67f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * u32 cred_len; 68f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * void *cred; 69f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * }; // xdr size [variable] 70f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * The return pointers are from the xdr buffer 71f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh */ 72f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harroshstatic int 73f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh_osd_xdr_decode_opaque_cred(struct pnfs_osd_opaque_cred *opaque_cred, 74f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh struct xdr_stream *xdr) 75f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh{ 76f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh __be32 *p = xdr_inline_decode(xdr, 1); 77f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 78f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh if (!p) 79f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh return -EINVAL; 80f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 81f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh opaque_cred->cred_len = be32_to_cpu(*p++); 82f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 83f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = xdr_inline_decode(xdr, opaque_cred->cred_len); 84f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh if (!p) 85f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh return -EINVAL; 86f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 87f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh opaque_cred->cred = p; 88f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh return 0; 89f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh} 90f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 91f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh/* 92f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct pnfs_osd_object_cred { 93f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct pnfs_osd_objid oc_object_id; 94f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * u32 oc_osd_version; 95f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * u32 oc_cap_key_sec; 96f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct pnfs_osd_opaque_cred oc_cap_key 97f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct pnfs_osd_opaque_cred oc_cap; 98f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * }; // xdr size 32 + 4 + 4 + [variable] + [variable] 99f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh */ 100f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harroshstatic int 101f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh_osd_xdr_decode_object_cred(struct pnfs_osd_object_cred *comp, 102f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh struct xdr_stream *xdr) 103f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh{ 104f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh __be32 *p = xdr_inline_decode(xdr, 32 + 4 + 4); 105f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh int ret; 106f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 107f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh if (!p) 108f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh return -EIO; 109f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 110f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = _osd_xdr_decode_objid(p, &comp->oc_object_id); 111f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh comp->oc_osd_version = be32_to_cpup(p++); 112f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh comp->oc_cap_key_sec = be32_to_cpup(p); 113f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 114f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh ret = _osd_xdr_decode_opaque_cred(&comp->oc_cap_key, xdr); 115f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh if (unlikely(ret)) 116f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh return ret; 117f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 118f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh ret = _osd_xdr_decode_opaque_cred(&comp->oc_cap, xdr); 119f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh return ret; 120f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh} 121f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 122f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh/* 123f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct pnfs_osd_data_map { 124f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * u32 odm_num_comps; 125f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * u64 odm_stripe_unit; 126f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * u32 odm_group_width; 127f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * u32 odm_group_depth; 128f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * u32 odm_mirror_cnt; 129f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * u32 odm_raid_algorithm; 130f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * }; // xdr size 4 + 8 + 4 + 4 + 4 + 4 131f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh */ 132f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harroshstatic inline int 133f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh_osd_data_map_xdr_sz(void) 134f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh{ 135f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh return 4 + 8 + 4 + 4 + 4 + 4; 136f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh} 137f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 138f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harroshstatic __be32 * 139f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh_osd_xdr_decode_data_map(__be32 *p, struct pnfs_osd_data_map *data_map) 140f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh{ 141f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh data_map->odm_num_comps = be32_to_cpup(p++); 142f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = xdr_decode_hyper(p, &data_map->odm_stripe_unit); 143f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh data_map->odm_group_width = be32_to_cpup(p++); 144f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh data_map->odm_group_depth = be32_to_cpup(p++); 145f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh data_map->odm_mirror_cnt = be32_to_cpup(p++); 146f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh data_map->odm_raid_algorithm = be32_to_cpup(p++); 147f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh dprintk("%s: odm_num_comps=%u odm_stripe_unit=%llu odm_group_width=%u " 148f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh "odm_group_depth=%u odm_mirror_cnt=%u odm_raid_algorithm=%u\n", 149f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh __func__, 150f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh data_map->odm_num_comps, 151f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh (unsigned long long)data_map->odm_stripe_unit, 152f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh data_map->odm_group_width, 153f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh data_map->odm_group_depth, 154f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh data_map->odm_mirror_cnt, 155f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh data_map->odm_raid_algorithm); 156f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh return p; 157f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh} 158f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 159f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harroshint pnfs_osd_xdr_decode_layout_map(struct pnfs_osd_layout *layout, 160f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh struct pnfs_osd_xdr_decode_layout_iter *iter, struct xdr_stream *xdr) 161f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh{ 162f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh __be32 *p; 163f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 164f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh memset(iter, 0, sizeof(*iter)); 165f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 166f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = xdr_inline_decode(xdr, _osd_data_map_xdr_sz() + 4 + 4); 167f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh if (unlikely(!p)) 168f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh return -EINVAL; 169f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 170f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = _osd_xdr_decode_data_map(p, &layout->olo_map); 171f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh layout->olo_comps_index = be32_to_cpup(p++); 172f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh layout->olo_num_comps = be32_to_cpup(p++); 1739af7db3228acc286c50e3a0f054ec982efdbc6c6Boaz Harrosh dprintk("%s: olo_comps_index=%d olo_num_comps=%d\n", __func__, 1749af7db3228acc286c50e3a0f054ec982efdbc6c6Boaz Harrosh layout->olo_comps_index, layout->olo_num_comps); 1759af7db3228acc286c50e3a0f054ec982efdbc6c6Boaz Harrosh 176f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh iter->total_comps = layout->olo_num_comps; 177f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh return 0; 178f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh} 179f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 180f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harroshbool pnfs_osd_xdr_decode_layout_comp(struct pnfs_osd_object_cred *comp, 181f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh struct pnfs_osd_xdr_decode_layout_iter *iter, struct xdr_stream *xdr, 182f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh int *err) 183f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh{ 184f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh BUG_ON(iter->decoded_comps > iter->total_comps); 185f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh if (iter->decoded_comps == iter->total_comps) 186f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh return false; 187f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 188f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh *err = _osd_xdr_decode_object_cred(comp, xdr); 189f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh if (unlikely(*err)) { 190f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh dprintk("%s: _osd_xdr_decode_object_cred=>%d decoded_comps=%d " 191f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh "total_comps=%d\n", __func__, *err, 192f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh iter->decoded_comps, iter->total_comps); 193f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh return false; /* stop the loop */ 194f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh } 195f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh dprintk("%s: dev(%llx:%llx) par=0x%llx obj=0x%llx " 196f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh "key_len=%u cap_len=%u\n", 197f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh __func__, 198f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh _DEVID_LO(&comp->oc_object_id.oid_device_id), 199f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh _DEVID_HI(&comp->oc_object_id.oid_device_id), 200f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh comp->oc_object_id.oid_partition_id, 201f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh comp->oc_object_id.oid_object_id, 202f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh comp->oc_cap_key.cred_len, comp->oc_cap.cred_len); 203f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 204f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh iter->decoded_comps++; 205f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh return true; 206f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh} 207f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 208f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh/* 209f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * Get Device Information Decoding 210f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * 211f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * Note: since Device Information is currently done synchronously, all 212f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * variable strings fields are left inside the rpc buffer and are only 213f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * pointed to by the pnfs_osd_deviceaddr members. So the read buffer 214f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * should not be freed while the returned information is in use. 215f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh */ 216f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh/* 217f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh *struct nfs4_string { 218f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * unsigned int len; 219f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * char *data; 220f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh *}; // size [variable] 221f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * NOTE: Returned string points to inside the XDR buffer 222f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh */ 223f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harroshstatic __be32 * 224f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh__read_u8_opaque(__be32 *p, struct nfs4_string *str) 225f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh{ 226f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh str->len = be32_to_cpup(p++); 227f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh str->data = (char *)p; 228f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 229f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p += XDR_QUADLEN(str->len); 230f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh return p; 231f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh} 232f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 233f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh/* 234f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct pnfs_osd_targetid { 235f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * u32 oti_type; 236f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct nfs4_string oti_scsi_device_id; 237f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * };// size 4 + [variable] 238f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh */ 239f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harroshstatic __be32 * 240f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh__read_targetid(__be32 *p, struct pnfs_osd_targetid* targetid) 241f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh{ 242f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh u32 oti_type; 243f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 244f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh oti_type = be32_to_cpup(p++); 245f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh targetid->oti_type = oti_type; 246f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 247f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh switch (oti_type) { 248f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh case OBJ_TARGET_SCSI_NAME: 249f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh case OBJ_TARGET_SCSI_DEVICE_ID: 250f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = __read_u8_opaque(p, &targetid->oti_scsi_device_id); 251f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh } 252f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 253f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh return p; 254f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh} 255f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 256f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh/* 257f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct pnfs_osd_net_addr { 258f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct nfs4_string r_netid; 259f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct nfs4_string r_addr; 260f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * }; 261f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh */ 262f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harroshstatic __be32 * 263f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh__read_net_addr(__be32 *p, struct pnfs_osd_net_addr* netaddr) 264f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh{ 265f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = __read_u8_opaque(p, &netaddr->r_netid); 266f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = __read_u8_opaque(p, &netaddr->r_addr); 267f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 268f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh return p; 269f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh} 270f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 271f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh/* 272f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct pnfs_osd_targetaddr { 273f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * u32 ota_available; 274f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct pnfs_osd_net_addr ota_netaddr; 275f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * }; 276f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh */ 277f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harroshstatic __be32 * 278f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh__read_targetaddr(__be32 *p, struct pnfs_osd_targetaddr *targetaddr) 279f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh{ 280f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh u32 ota_available; 281f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 282f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh ota_available = be32_to_cpup(p++); 283f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh targetaddr->ota_available = ota_available; 284f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 285f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh if (ota_available) 286f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = __read_net_addr(p, &targetaddr->ota_netaddr); 287f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 288f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 289f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh return p; 290f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh} 291f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 292f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh/* 293f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct pnfs_osd_deviceaddr { 294f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct pnfs_osd_targetid oda_targetid; 295f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct pnfs_osd_targetaddr oda_targetaddr; 296f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * u8 oda_lun[8]; 297f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct nfs4_string oda_systemid; 298f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct pnfs_osd_object_cred oda_root_obj_cred; 299f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct nfs4_string oda_osdname; 300f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * }; 301f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh */ 302f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 303f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh/* We need this version for the pnfs_osd_xdr_decode_deviceaddr which does 304f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * not have an xdr_stream 305f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh */ 306f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harroshstatic __be32 * 307f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh__read_opaque_cred(__be32 *p, 308f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh struct pnfs_osd_opaque_cred *opaque_cred) 309f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh{ 310f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh opaque_cred->cred_len = be32_to_cpu(*p++); 311f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh opaque_cred->cred = p; 312f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh return p + XDR_QUADLEN(opaque_cred->cred_len); 313f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh} 314f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 315f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harroshstatic __be32 * 316f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh__read_object_cred(__be32 *p, struct pnfs_osd_object_cred *comp) 317f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh{ 318f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = _osd_xdr_decode_objid(p, &comp->oc_object_id); 319f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh comp->oc_osd_version = be32_to_cpup(p++); 320f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh comp->oc_cap_key_sec = be32_to_cpup(p++); 321f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 322f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = __read_opaque_cred(p, &comp->oc_cap_key); 323f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = __read_opaque_cred(p, &comp->oc_cap); 324f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh return p; 325f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh} 326f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 327f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harroshvoid pnfs_osd_xdr_decode_deviceaddr( 328f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh struct pnfs_osd_deviceaddr *deviceaddr, __be32 *p) 329f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh{ 330f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = __read_targetid(p, &deviceaddr->oda_targetid); 331f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 332f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = __read_targetaddr(p, &deviceaddr->oda_targetaddr); 333f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 334f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = xdr_decode_opaque_fixed(p, deviceaddr->oda_lun, 335f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh sizeof(deviceaddr->oda_lun)); 336f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 337f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = __read_u8_opaque(p, &deviceaddr->oda_systemid); 338f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 339f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = __read_object_cred(p, &deviceaddr->oda_root_obj_cred); 340f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 341f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = __read_u8_opaque(p, &deviceaddr->oda_osdname); 342f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 343f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh /* libosd likes this terminated in dbg. It's last, so no problems */ 344f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh deviceaddr->oda_osdname.data[deviceaddr->oda_osdname.len] = 0; 345f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh} 346f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 347f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh/* 348f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct pnfs_osd_layoutupdate { 349f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * u32 dsu_valid; 350f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * s64 dsu_delta; 351f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * u32 olu_ioerr_flag; 352f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * }; xdr size 4 + 8 + 4 353f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh */ 354f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harroshint 355f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harroshpnfs_osd_xdr_encode_layoutupdate(struct xdr_stream *xdr, 356f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh struct pnfs_osd_layoutupdate *lou) 357f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh{ 358f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh __be32 *p = xdr_reserve_space(xdr, 4 + 8 + 4); 359f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 360f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh if (!p) 361f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh return -E2BIG; 362f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 363f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh *p++ = cpu_to_be32(lou->dsu_valid); 364f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh if (lou->dsu_valid) 365f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = xdr_encode_hyper(p, lou->dsu_delta); 366f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh *p++ = cpu_to_be32(lou->olu_ioerr_flag); 367f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh return 0; 368f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh} 369f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 370f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh/* 371f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct pnfs_osd_objid { 372f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct nfs4_deviceid oid_device_id; 373f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * u64 oid_partition_id; 374f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * u64 oid_object_id; 375f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * }; // xdr size 32 bytes 376f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh */ 377f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harroshstatic inline __be32 * 378f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harroshpnfs_osd_xdr_encode_objid(__be32 *p, struct pnfs_osd_objid *object_id) 379f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh{ 380f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = xdr_encode_opaque_fixed(p, &object_id->oid_device_id.data, 381f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh sizeof(object_id->oid_device_id.data)); 382f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = xdr_encode_hyper(p, object_id->oid_partition_id); 383f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = xdr_encode_hyper(p, object_id->oid_object_id); 384f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 385f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh return p; 386f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh} 387f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 388f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh/* 389f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct pnfs_osd_ioerr { 390f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * struct pnfs_osd_objid oer_component; 391f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * u64 oer_comp_offset; 392f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * u64 oer_comp_length; 393f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * u32 oer_iswrite; 394f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * u32 oer_errno; 395f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh * }; // xdr size 32 + 24 bytes 396f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh */ 397f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harroshvoid pnfs_osd_xdr_encode_ioerr(__be32 *p, struct pnfs_osd_ioerr *ioerr) 398f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh{ 399f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = pnfs_osd_xdr_encode_objid(p, &ioerr->oer_component); 400f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = xdr_encode_hyper(p, ioerr->oer_comp_offset); 401f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = xdr_encode_hyper(p, ioerr->oer_comp_length); 402f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh *p++ = cpu_to_be32(ioerr->oer_iswrite); 403f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh *p = cpu_to_be32(ioerr->oer_errno); 404f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh} 405f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 406f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh__be32 *pnfs_osd_xdr_ioerr_reserve_space(struct xdr_stream *xdr) 407f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh{ 408f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh __be32 *p; 409f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 410f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh p = xdr_reserve_space(xdr, 32 + 24); 411f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh if (unlikely(!p)) 412f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh dprintk("%s: out of xdr space\n", __func__); 413f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh 414f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh return p; 415f1bc893a89d012649e4e7f43575b2c290e08ee42Boaz Harrosh} 416