Changeset 03661d19 in mainline for uspace/lib/fdisk/src/fdisk.c


Ignore:
Timestamp:
2015-10-29T10:16:08Z (9 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
55f8c6e7
Parents:
9854a8f
Message:

Handle simplified capacity entry.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/fdisk/src/fdisk.c

    r9854a8f r03661d19  
    10371037    vbd_part_spec_t *vpspec)
    10381038{
    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;
    10401043        aoff64_t fblock0;
    10411044        aoff64_t fnblocks;
    10421045        aoff64_t hdrb;
    10431046        label_pcnt_t pcnt;
     1047        fdisk_spc_t spc;
    10441048        int index;
    10451049        int rc;
     
    10471051        printf("fdisk_part_spec_prepare() - dev=%p pspec=%p vpspec=%p\n", dev, pspec,
    10481052            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);
    10521074
    10531075        pcnt = -1;
     
    10711093                return EINVAL;
    10721094
    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) {
    10781137                rc = fdisk_part_get_free_idx(dev, &index);
    10791138                if (rc != EOK)
    10801139                        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;
    11101150
    11111151        if (pspec->pkind != lpk_extended) {
     
    11151155                        return EIO;
    11161156        }
     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);
    11171161
    11181162        return EOK;
Note: See TracChangeset for help on using the changeset viewer.