Lines Matching refs:buffer

609  * @buffer:  Block of data being worked on
618 * Return: -1 Error, the calculated offset exceeded the size of the buffer
619 * n OK, a range-checked offset into buffer
621 static int ldm_relative(const u8 *buffer, int buflen, int base, int offset)
625 if (!buffer || offset < 0 || base > buflen) {
626 if (!buffer)
627 ldm_error("!buffer");
634 if (base + buffer[base] >= buflen) {
635 ldm_error("base (%d) + buffer[base] (%d) >= buflen (%d)", base,
636 buffer[base], buflen);
639 return buffer[base] + offset + 1;
676 * ldm_get_vstr - Read a length-prefixed string into a buffer
678 * @buffer: Location to copy string to
679 * @buflen: Size of the output buffer
683 * these strings into a buffer.
686 * If the buffer is too small, the output will be truncated.
688 * Return: 0, Error and @buffer contents are undefined
692 static int ldm_get_vstr (const u8 *block, u8 *buffer, int buflen)
696 BUG_ON (!block || !buffer);
703 memcpy (buffer, block + 1, length);
704 buffer[length] = 0;
711 * @buffer: Block of data being worked on
720 static bool ldm_parse_cmp3 (const u8 *buffer, int buflen, struct vblk *vb)
725 BUG_ON (!buffer || !vb);
727 r_objid = ldm_relative (buffer, buflen, 0x18, 0);
728 r_name = ldm_relative (buffer, buflen, 0x18, r_objid);
729 r_vstate = ldm_relative (buffer, buflen, 0x18, r_name);
730 r_child = ldm_relative (buffer, buflen, 0x1D, r_vstate);
731 r_parent = ldm_relative (buffer, buflen, 0x2D, r_child);
733 if (buffer[0x12] & VBLK_FLAG_COMP_STRIPE) {
734 r_stripe = ldm_relative (buffer, buflen, 0x2E, r_parent);
735 r_cols = ldm_relative (buffer, buflen, 0x2E, r_stripe);
745 if (len != get_unaligned_be32(buffer + 0x14))
749 ldm_get_vstr (buffer + 0x18 + r_name, comp->state,
751 comp->type = buffer[0x18 + r_vstate];
752 comp->children = ldm_get_vnum (buffer + 0x1D + r_vstate);
753 comp->parent_id = ldm_get_vnum (buffer + 0x2D + r_child);
754 comp->chunksize = r_stripe ? ldm_get_vnum (buffer+r_parent+0x2E) : 0;
761 * @buffer: Block of data being worked on
770 static int ldm_parse_dgr3 (const u8 *buffer, int buflen, struct vblk *vb)
775 BUG_ON (!buffer || !vb);
777 r_objid = ldm_relative (buffer, buflen, 0x18, 0);
778 r_name = ldm_relative (buffer, buflen, 0x18, r_objid);
779 r_diskid = ldm_relative (buffer, buflen, 0x18, r_name);
781 if (buffer[0x12] & VBLK_FLAG_DGR3_IDS) {
782 r_id1 = ldm_relative (buffer, buflen, 0x24, r_diskid);
783 r_id2 = ldm_relative (buffer, buflen, 0x24, r_id1);
791 if (len != get_unaligned_be32(buffer + 0x14))
795 ldm_get_vstr (buffer + 0x18 + r_name, dgrp->disk_id,
802 * @buffer: Block of data being worked on
811 static bool ldm_parse_dgr4 (const u8 *buffer, int buflen, struct vblk *vb)
816 BUG_ON (!buffer || !vb);
818 r_objid = ldm_relative (buffer, buflen, 0x18, 0);
819 r_name = ldm_relative (buffer, buflen, 0x18, r_objid);
821 if (buffer[0x12] & VBLK_FLAG_DGR4_IDS) {
822 r_id1 = ldm_relative (buffer, buflen, 0x44, r_name);
823 r_id2 = ldm_relative (buffer, buflen, 0x44, r_id1);
831 if (len != get_unaligned_be32(buffer + 0x14))
834 ldm_get_vstr (buffer + 0x18 + r_objid, buf, sizeof (buf));
840 * @buffer: Block of data being worked on
849 static bool ldm_parse_dsk3 (const u8 *buffer, int buflen, struct vblk *vb)
854 BUG_ON (!buffer || !vb);
856 r_objid = ldm_relative (buffer, buflen, 0x18, 0);
857 r_name = ldm_relative (buffer, buflen, 0x18, r_objid);
858 r_diskid = ldm_relative (buffer, buflen, 0x18, r_name);
859 r_altname = ldm_relative (buffer, buflen, 0x18, r_diskid);
865 if (len != get_unaligned_be32(buffer + 0x14))
869 ldm_get_vstr (buffer + 0x18 + r_diskid, disk->alt_name,
871 if (uuid_parse(buffer + 0x19 + r_name, &disk->disk_id))
879 * @buffer: Block of data being worked on
888 static bool ldm_parse_dsk4 (const u8 *buffer, int buflen, struct vblk *vb)
893 BUG_ON (!buffer || !vb);
895 r_objid = ldm_relative (buffer, buflen, 0x18, 0);
896 r_name = ldm_relative (buffer, buflen, 0x18, r_objid);
902 if (len != get_unaligned_be32(buffer + 0x14))
906 import_uuid(&disk->disk_id, buffer + 0x18 + r_name);
912 * @buffer: Block of data being worked on
921 static bool ldm_parse_prt3(const u8 *buffer, int buflen, struct vblk *vb)
926 BUG_ON(!buffer || !vb);
927 r_objid = ldm_relative(buffer, buflen, 0x18, 0);
932 r_name = ldm_relative(buffer, buflen, 0x18, r_objid);
937 r_size = ldm_relative(buffer, buflen, 0x34, r_name);
942 r_parent = ldm_relative(buffer, buflen, 0x34, r_size);
947 r_diskid = ldm_relative(buffer, buflen, 0x34, r_parent);
952 if (buffer[0x12] & VBLK_FLAG_PART_INDEX) {
953 r_index = ldm_relative(buffer, buflen, 0x34, r_diskid);
966 if (len > get_unaligned_be32(buffer + 0x14)) {
967 ldm_error("len %d > BE32(buffer + 0x14) %d", len,
968 get_unaligned_be32(buffer + 0x14));
972 part->start = get_unaligned_be64(buffer + 0x24 + r_name);
973 part->volume_offset = get_unaligned_be64(buffer + 0x2C + r_name);
974 part->size = ldm_get_vnum(buffer + 0x34 + r_name);
975 part->parent_id = ldm_get_vnum(buffer + 0x34 + r_size);
976 part->disk_id = ldm_get_vnum(buffer + 0x34 + r_parent);
978 part->partnum = buffer[0x35 + r_diskid];
986 * @buffer: Block of data being worked on
995 static bool ldm_parse_vol5(const u8 *buffer, int buflen, struct vblk *vb)
1001 BUG_ON(!buffer || !vb);
1002 r_objid = ldm_relative(buffer, buflen, 0x18, 0);
1007 r_name = ldm_relative(buffer, buflen, 0x18, r_objid);
1012 r_vtype = ldm_relative(buffer, buflen, 0x18, r_name);
1017 r_disable_drive_letter = ldm_relative(buffer, buflen, 0x18, r_vtype);
1023 r_child = ldm_relative(buffer, buflen, 0x2D, r_disable_drive_letter);
1028 r_size = ldm_relative(buffer, buflen, 0x3D, r_child);
1033 if (buffer[0x12] & VBLK_FLAG_VOLU_ID1) {
1034 r_id1 = ldm_relative(buffer, buflen, 0x52, r_size);
1041 if (buffer[0x12] & VBLK_FLAG_VOLU_ID2) {
1042 r_id2 = ldm_relative(buffer, buflen, 0x52, r_id1);
1049 if (buffer[0x12] & VBLK_FLAG_VOLU_SIZE) {
1050 r_size2 = ldm_relative(buffer, buflen, 0x52, r_id2);
1057 if (buffer[0x12] & VBLK_FLAG_VOLU_DRIVE) {
1058 r_drive = ldm_relative(buffer, buflen, 0x52, r_size2);
1071 if (len > get_unaligned_be32(buffer + 0x14)) {
1072 ldm_error("len %d > BE32(buffer + 0x14) %d", len,
1073 get_unaligned_be32(buffer + 0x14));
1077 ldm_get_vstr(buffer + 0x18 + r_name, volu->volume_type,
1079 memcpy(volu->volume_state, buffer + 0x18 + r_disable_drive_letter,
1081 volu->size = ldm_get_vnum(buffer + 0x3D + r_child);
1082 volu->partition_type = buffer[0x41 + r_size];
1083 memcpy(volu->guid, buffer + 0x42 + r_size, sizeof(volu->guid));
1084 if (buffer[0x12] & VBLK_FLAG_VOLU_DRIVE) {
1085 ldm_get_vstr(buffer + 0x52 + r_size, volu->drive_hint,