Changeset 1626cd4 in mainline for uspace/lib/label
- Timestamp:
- 2015-07-02T19:01:37Z (10 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 6a0d4ce2
- Parents:
- 3faa03d
- Location:
- uspace/lib/label
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/label/include/std/mbr.h
r3faa03d r1626cd4 38 38 #include <stdint.h> 39 39 40 /** Block address of Master Boot Record. */ 41 #define MBR_BA 0 40 enum { 41 /** Block address of Master Boot Record. */ 42 mbr_ba = 0, 42 43 43 enum { 44 /** First block allowed for allocation */ 45 mbr_ablock0 = 18, 46 44 47 /** Number of primary partition records */ 45 48 mbr_nprimary = 4, -
uspace/lib/label/include/types/liblabel.h
r3faa03d r1626cd4 43 43 44 44 typedef struct label label_t; 45 typedef struct label_info label_info_t; 45 46 typedef struct label_part label_part_t; 46 47 typedef struct label_part_info label_part_info_t; … … 53 54 void (*close)(label_t *); 54 55 int (*destroy)(label_t *); 56 int (*get_info)(label_t *, label_info_t *); 55 57 label_part_t *(*part_first)(label_t *); 56 58 label_part_t *(*part_next)(label_part_t *); … … 60 62 } label_ops_t; 61 63 62 typedef struct{64 struct label_info { 63 65 /** Disk contents */ 64 66 label_disk_cnt_t dcnt; 65 67 /** Label type */ 66 68 label_type_t ltype; 67 } label_info_t; 69 /** First block that can be allocated */ 70 aoff64_t ablock0; 71 /** Number of blocks that can be allocated */ 72 aoff64_t anblocks; 73 }; 68 74 69 75 struct label_part_info { 76 /** Partition index */ 77 int index; 70 78 /** Address of first block */ 71 79 aoff64_t block0; … … 80 88 /** Link to label_t.parts */ 81 89 link_t llabel; 90 /** Index */ 91 int index; 92 /** First block */ 82 93 aoff64_t block0; 94 /** Number of blocks */ 83 95 aoff64_t nblocks; 84 96 }; … … 96 108 /** Partitions */ 97 109 list_t parts; /* of label_part_t */ 110 /** First block that can be allocated */ 111 aoff64_t ablock0; 112 /** Number of blocks that can be allocated */ 113 aoff64_t anblocks; 98 114 }; 99 115 -
uspace/lib/label/src/gpt.c
r3faa03d r1626cd4 37 37 #include <byteorder.h> 38 38 #include <errno.h> 39 #include <mem.h> 39 40 #include <stdlib.h> 40 41 … … 46 47 static void gpt_close(label_t *); 47 48 static int gpt_destroy(label_t *); 49 static int gpt_get_info(label_t *, label_info_t *); 48 50 static label_part_t *gpt_part_first(label_t *); 49 51 static label_part_t *gpt_part_next(label_part_t *); … … 52 54 static int gpt_part_destroy(label_part_t *); 53 55 54 static int gpt_pte_to_part(label_t *, gpt_entry_t * );56 static int gpt_pte_to_part(label_t *, gpt_entry_t *, int); 55 57 56 58 const uint8_t efi_signature[8] = { … … 64 66 .close = gpt_close, 65 67 .destroy = gpt_destroy, 68 .get_info = gpt_get_info, 66 69 .part_first = gpt_part_first, 67 70 .part_next = gpt_part_next, … … 83 86 uint64_t ba; 84 87 uint32_t entry; 88 uint64_t ba_min, ba_max; 85 89 int i; 86 90 int rc; … … 126 130 bcnt = (num_entries + esize - 1) / esize; 127 131 ba = uint64_t_le2host(gpt_hdr->entry_lba); 132 ba_min = uint64_t_le2host(gpt_hdr->first_usable_lba); 133 ba_max = uint64_t_le2host(gpt_hdr->last_usable_lba); 128 134 129 135 if (num_entries < 1) { … … 133 139 134 140 if (esize < sizeof(gpt_entry_t)) { 141 rc = EINVAL; 142 goto error; 143 } 144 145 if (ba_max < ba_min) { 135 146 rc = EINVAL; 136 147 goto error; … … 151 162 for (entry = 0; entry < num_entries; entry++) { 152 163 eptr = (gpt_entry_t *)(etable + entry * esize); 153 rc = gpt_pte_to_part(label, eptr );164 rc = gpt_pte_to_part(label, eptr, entry + 1); 154 165 if (rc != EOK) 155 166 goto error; … … 163 174 label->ops = &gpt_label_ops; 164 175 label->ltype = lt_gpt; 176 label->ablock0 = ba_min; 177 label->anblocks = ba_max - ba_min + 1; 165 178 *rlabel = label; 166 179 return EOK; … … 187 200 } 188 201 202 static int gpt_get_info(label_t *label, label_info_t *linfo) 203 { 204 memset(linfo, 0, sizeof(label_info_t)); 205 linfo->dcnt = dc_label; 206 linfo->ltype = lt_gpt; 207 linfo->ablock0 = label->ablock0; 208 linfo->anblocks = label->anblocks; 209 return EOK; 210 } 211 189 212 static label_part_t *gpt_part_first(label_t *label) 190 213 { … … 211 234 static void gpt_part_get_info(label_part_t *part, label_part_info_t *pinfo) 212 235 { 236 pinfo->index = part->index; 213 237 pinfo->block0 = part->block0; 214 238 pinfo->nblocks = part->nblocks; … … 218 242 label_part_t **rpart) 219 243 { 220 return E OK;244 return ENOTSUP; 221 245 } 222 246 223 247 static int gpt_part_destroy(label_part_t *part) 224 248 { 225 return E OK;226 } 227 228 static int gpt_pte_to_part(label_t *label, gpt_entry_t *pte )249 return ENOTSUP; 250 } 251 252 static int gpt_pte_to_part(label_t *label, gpt_entry_t *pte, int index) 229 253 { 230 254 label_part_t *part; … … 250 274 return EINVAL; 251 275 276 part->index = index; 252 277 part->block0 = b0; 253 278 part->nblocks = b1 - b0 + 1; -
uspace/lib/label/src/label.c
r3faa03d r1626cd4 97 97 int label_get_info(label_t *label, label_info_t *linfo) 98 98 { 99 memset(linfo, 0, sizeof(label_info_t)); 100 linfo->dcnt = dc_label; 101 linfo->ltype = label->ltype; 102 return EOK; 99 return label->ops->get_info(label, linfo); 103 100 } 104 101 -
uspace/lib/label/src/mbr.c
r3faa03d r1626cd4 37 37 #include <byteorder.h> 38 38 #include <errno.h> 39 #include <mem.h> 39 40 #include <stdlib.h> 40 41 … … 46 47 static void mbr_close(label_t *); 47 48 static int mbr_destroy(label_t *); 49 static int mbr_get_info(label_t *, label_info_t *); 48 50 static label_part_t *mbr_part_first(label_t *); 49 51 static label_part_t *mbr_part_next(label_part_t *); … … 52 54 static int mbr_part_destroy(label_part_t *); 53 55 54 static int mbr_pte_to_part(label_t *, mbr_pte_t * );56 static int mbr_pte_to_part(label_t *, mbr_pte_t *, int); 55 57 56 58 label_ops_t mbr_label_ops = { … … 59 61 .close = mbr_close, 60 62 .destroy = mbr_destroy, 63 .get_info = mbr_get_info, 61 64 .part_first = mbr_part_first, 62 65 .part_next = mbr_part_next, … … 73 76 uint16_t sgn; 74 77 size_t bsize; 78 aoff64_t nblocks; 75 79 uint32_t entry; 76 80 int rc; … … 82 86 } 83 87 88 rc = block_get_nblocks(sid, &nblocks); 89 if (rc != EOK) { 90 rc = EIO; 91 goto error; 92 } 93 84 94 if (bsize < 512 || (bsize % 512) != 0) { 95 rc = EINVAL; 96 goto error; 97 } 98 99 if (nblocks < mbr_ablock0) { 85 100 rc = EINVAL; 86 101 goto error; … … 93 108 } 94 109 95 rc = block_read_direct(sid, MBR_BA, 1, mbr);110 rc = block_read_direct(sid, mbr_ba, 1, mbr); 96 111 if (rc != EOK) { 97 112 rc = EIO; … … 114 129 for (entry = 0; entry < mbr_nprimary; entry++) { 115 130 eptr = &mbr->pte[entry]; 116 rc = mbr_pte_to_part(label, eptr );131 rc = mbr_pte_to_part(label, eptr, entry + 1); 117 132 if (rc != EOK) 118 133 goto error; … … 124 139 label->ops = &mbr_label_ops; 125 140 label->ltype = lt_mbr; 141 label->ablock0 = mbr_ablock0; 142 label->anblocks = nblocks - mbr_ablock0; 126 143 *rlabel = label; 127 144 return EOK; … … 147 164 } 148 165 166 static int mbr_get_info(label_t *label, label_info_t *linfo) 167 { 168 memset(linfo, 0, sizeof(label_info_t)); 169 linfo->dcnt = dc_label; 170 linfo->ltype = lt_mbr; 171 linfo->ablock0 = label->ablock0; 172 linfo->anblocks = label->anblocks; 173 return EOK; 174 } 175 149 176 static label_part_t *mbr_part_first(label_t *label) 150 177 { … … 171 198 static void mbr_part_get_info(label_part_t *part, label_part_info_t *pinfo) 172 199 { 200 pinfo->index = part->index; 173 201 pinfo->block0 = part->block0; 174 202 pinfo->nblocks = part->nblocks; … … 178 206 label_part_t **rpart) 179 207 { 180 return E OK;208 return ENOTSUP; 181 209 } 182 210 183 211 static int mbr_part_destroy(label_part_t *part) 184 212 { 185 return E OK;186 } 187 188 static int mbr_pte_to_part(label_t *label, mbr_pte_t *pte )213 return ENOTSUP; 214 } 215 216 static int mbr_pte_to_part(label_t *label, mbr_pte_t *pte, int index) 189 217 { 190 218 label_part_t *part; … … 204 232 return ENOMEM; 205 233 234 part->index = index; 206 235 part->block0 = block0; 207 236 part->nblocks = nblocks;
Note:
See TracChangeset
for help on using the changeset viewer.