@@ -70,44 +70,43 @@ static enum nfsstat4 exofs_layout_get(
goto out;
}
- creds = kcalloc(el->s_numdevs, sizeof(*creds), GFP_KERNEL);
- if (!creds) {
- nfserr = NFS4ERR_LAYOUTTRYLATER;
- goto out;
- }
-
/* Fill in a pnfs_osd_layout struct */
layout.olo_map = sbi->data_map;
+ layout.olo_comps_index = 0;
+ layout.olo_num_comps = el->s_numdevs;
+ layout.olo_comps = creds;
+
+ err = pnfs_osd_xdr_encode_layout_hdr(xdr, &layout);
+ if (err) {
+ nfserr = NFS4ERR_TOOSMALL;
+ goto out;
+ }
+ /* Encode layout components */
for (i = 0; i < el->s_numdevs; i++) {
- struct pnfs_osd_object_cred *cred = &creds[i];
+ struct pnfs_osd_object_cred cred;
osd_id id = exofs_oi_objno(oi);
unsigned dev = exofs_layout_od_id(el, id, i);
- set_dev_id(&cred->oc_object_id.oid_device_id, args->lg_sbid,
+ set_dev_id(&cred.oc_object_id.oid_device_id, args->lg_sbid,
dev);
- cred->oc_object_id.oid_partition_id = el->s_pid;
- cred->oc_object_id.oid_object_id = id;
- cred->oc_osd_version = osd_dev_is_ver1(el->s_ods[dev]) ?
+ cred.oc_object_id.oid_partition_id = el->s_pid;
+ cred.oc_object_id.oid_object_id = id;
+ cred.oc_osd_version = osd_dev_is_ver1(el->s_ods[dev]) ?
PNFS_OSD_VERSION_1 :
PNFS_OSD_VERSION_2;
- cred->oc_cap_key_sec = PNFS_OSD_CAP_KEY_SEC_NONE;
-
- cred->oc_cap_key.cred_len = 0;
- cred->oc_cap_key.cred = NULL;
+ cred.oc_cap_key_sec = PNFS_OSD_CAP_KEY_SEC_NONE;
- cred->oc_cap.cred_len = OSD_CAP_LEN;
- cred->oc_cap.cred = oi->i_cred;
- }
-
- layout.olo_comps_index = 0;
- layout.olo_num_comps = el->s_numdevs;
- layout.olo_comps = creds;
+ cred.oc_cap_key.cred_len = 0;
+ cred.oc_cap_key.cred = NULL;
- err = pnfs_osd_xdr_encode_layout(xdr, &layout);
- if (err) {
- nfserr = NFS4ERR_TOOSMALL; /* FIXME: Change osd_xdr error codes */
- goto out;
+ cred.oc_cap.cred_len = OSD_CAP_LEN;
+ cred.oc_cap.cred = oi->i_cred;
+ err = pnfs_osd_xdr_encode_layout_cred(xdr, &cred);
+ if (err) {
+ nfserr = NFS4ERR_TOOSMALL;
+ goto out;
+ }
}
exp_xdr_encode_opaque_len(start, xdr->p);
This way there is No need for dynamic allocation of the creds array. Signed-off-by: Boaz Harrosh <bharrosh@panasas.com> --- fs/exofs/export.c | 55 ++++++++++++++++++++++++++--------------------------- 1 files changed, 27 insertions(+), 28 deletions(-)