Changeset 03661d19 in mainline for uspace/lib/fdisk/src/fdisk.c
- Timestamp:
- 2015-10-29T10:16:08Z (9 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 55f8c6e7
- Parents:
- 9854a8f
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/fdisk/src/fdisk.c
r9854a8f r03661d19 1037 1037 vbd_part_spec_t *vpspec) 1038 1038 { 1039 aoff64_t req_blocks; 1039 aoff64_t nom_blocks; 1040 aoff64_t min_blocks; 1041 aoff64_t max_blocks; 1042 aoff64_t act_blocks; 1040 1043 aoff64_t fblock0; 1041 1044 aoff64_t fnblocks; 1042 1045 aoff64_t hdrb; 1043 1046 label_pcnt_t pcnt; 1047 fdisk_spc_t spc; 1044 1048 int index; 1045 1049 int rc; … … 1047 1051 printf("fdisk_part_spec_prepare() - dev=%p pspec=%p vpspec=%p\n", dev, pspec, 1048 1052 vpspec); 1049 fdisk_cap_to_blocks(&pspec->capacity, dev->dinfo.block_size, &req_blocks); 1050 1051 req_blocks = fdisk_ba_align_up(dev, req_blocks); 1053 rc = fdisk_cap_to_blocks(&pspec->capacity, fcv_nom, dev->dinfo.block_size, 1054 &nom_blocks); 1055 if (rc != EOK) 1056 return rc; 1057 1058 rc = fdisk_cap_to_blocks(&pspec->capacity, fcv_min, dev->dinfo.block_size, 1059 &min_blocks); 1060 if (rc != EOK) 1061 return rc; 1062 1063 rc = fdisk_cap_to_blocks(&pspec->capacity, fcv_max, dev->dinfo.block_size, 1064 &max_blocks); 1065 if (rc != EOK) 1066 return rc; 1067 1068 nom_blocks = fdisk_ba_align_up(dev, nom_blocks); 1069 min_blocks = fdisk_ba_align_up(dev, min_blocks); 1070 max_blocks = fdisk_ba_align_up(dev, max_blocks); 1071 1072 printf("fdisk_part_spec_prepare: nom=%" PRIu64 ", min=%" PRIu64 1073 ", max=%" PRIu64, nom_blocks, min_blocks, max_blocks); 1052 1074 1053 1075 pcnt = -1; … … 1071 1093 return EINVAL; 1072 1094 1073 printf("fdisk_part_spec_prepare() - switch\n"); 1074 switch (pspec->pkind) { 1075 case lpk_primary: 1076 case lpk_extended: 1077 printf("fdisk_part_spec_prepare() - pri/ext\n"); 1095 if (pspec->pkind == lpk_logical) { 1096 hdrb = max(1, dev->align); 1097 spc = spc_log; 1098 } else { 1099 hdrb = 0; 1100 spc = spc_pri; 1101 } 1102 1103 rc = fdisk_part_get_free_range(dev, hdrb + nom_blocks, spc, 1104 &fblock0, &fnblocks); 1105 1106 if (rc == EOK) { 1107 /* 1108 * If the size of the free range would still give the same capacity 1109 * when rounded, allocate entire range. Otherwise allocate exactly 1110 * what we were asked for. 1111 */ 1112 if (fnblocks <= max_blocks) { 1113 act_blocks = fnblocks; 1114 } else { 1115 act_blocks = hdrb + nom_blocks; 1116 } 1117 } else { 1118 assert(rc == ENOSPC); 1119 1120 /* 1121 * There is no free range that can contain exactly the requested 1122 * capacity. Try to allocate at least such number of blocks 1123 * that would still fullfill the request within the limits 1124 * of the precision with witch the capacity was specified 1125 * (i.e. when rounded up). 1126 */ 1127 rc = fdisk_part_get_free_range(dev, hdrb + min_blocks, spc, 1128 &fblock0, &fnblocks); 1129 if (rc != EOK) 1130 return rc; 1131 1132 assert(fnblocks < hdrb + nom_blocks); 1133 act_blocks = fnblocks; 1134 } 1135 1136 if (pspec->pkind != lpk_logical) { 1078 1137 rc = fdisk_part_get_free_idx(dev, &index); 1079 1138 if (rc != EOK) 1080 1139 return EIO; 1081 1082 printf("fdisk_part_spec_prepare() - get free range\n"); 1083 rc = fdisk_part_get_free_range(dev, req_blocks, spc_pri, 1084 &fblock0, &fnblocks); 1085 if (rc != EOK) 1086 return EIO; 1087 1088 printf("fdisk_part_spec_prepare() - memset\n"); 1089 memset(vpspec, 0, sizeof(vbd_part_spec_t)); 1090 vpspec->index = index; 1091 vpspec->block0 = fblock0; 1092 vpspec->nblocks = req_blocks; 1093 vpspec->pkind = pspec->pkind; 1094 break; 1095 case lpk_logical: 1096 printf("fdisk_part_spec_prepare() - log\n"); 1097 hdrb = max(1, dev->align); 1098 rc = fdisk_part_get_free_range(dev, hdrb + req_blocks, spc_log, 1099 &fblock0, &fnblocks); 1100 if (rc != EOK) 1101 return EIO; 1102 1103 memset(vpspec, 0, sizeof(vbd_part_spec_t)); 1104 vpspec->hdr_blocks = hdrb; 1105 vpspec->block0 = fblock0 + hdrb; 1106 vpspec->nblocks = req_blocks; 1107 vpspec->pkind = lpk_logical; 1108 break; 1109 } 1140 } else { 1141 index = 0; 1142 } 1143 1144 memset(vpspec, 0, sizeof(vbd_part_spec_t)); 1145 vpspec->index = index; 1146 vpspec->hdr_blocks = hdrb; 1147 vpspec->block0 = fblock0 + hdrb; 1148 vpspec->nblocks = act_blocks; 1149 vpspec->pkind = pspec->pkind; 1110 1150 1111 1151 if (pspec->pkind != lpk_extended) { … … 1115 1155 return EIO; 1116 1156 } 1157 1158 printf("fdisk_part_spec_prepare: hdrb=%" PRIu64 ", b0=%" PRIu64 1159 ", nblocks=%" PRIu64 ", pkind=%d\n", vpspec->hdr_blocks, 1160 vpspec->block0, vpspec->nblocks, vpspec->pkind); 1117 1161 1118 1162 return EOK;
Note:
See TracChangeset
for help on using the changeset viewer.