Changeset 629b480 in mainline for uspace/app/sysinst/sysinst.c


Ignore:
Timestamp:
2025-04-25T20:48:07Z (3 months ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
21cd0c8, 32cb7cd, a4f8c3f, cbaf408
Parents:
4b9213d
Message:

Assorted installer fixes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/sysinst/sysinst.c

    r4b9213d r629b480  
    7373#define DEFAULT_DEV_0 "devices/\\hw\\sys\\00:01.1\\c0d0"
    7474#define DEFAULT_DEV_1 "devices/\\hw\\sys\\ide1\\c0d0"
     75#define DEFAULT_DEV_2 "devices/\\hw\\sys\\00:01.0\\ide1\\c0d0"
    7576//#define DEFAULT_DEV "devices/\\hw\\pci0\\00:01.2\\uhci_rh\\usb01_a1\\mass-storage0\\l0"
    7677/** Volume label for the new file system */
     
    9596        DEFAULT_DEV_0,
    9697        DEFAULT_DEV_1,
     98        DEFAULT_DEV_2,
    9799        NULL
    98100};
     
    155157static void sysinst_futil_copy_file(void *, const char *, const char *);
    156158static void sysinst_futil_create_dir(void *, const char *);
     159static errno_t sysinst_eject_dev(sysinst_t *, service_id_t);
    157160
    158161static futil_cb_t sysinst_futil_cb = {
     
    424427}
    425428
    426 /** Label the destination device.
     429/** Label and mount the destination device.
    427430 *
    428431 * @param sysinst System installer
     
    432435 * @return EOK on success or an error code
    433436 */
    434 static errno_t sysinst_label_dev(sysinst_t *sysinst, const char *dev,
    435     service_id_t *psvc_id)
    436 {
    437         fdisk_t *fdisk;
    438         fdisk_dev_t *fdev;
     437static errno_t sysinst_label_dev(sysinst_t *sysinst, const char *dev)
     438{
     439        fdisk_t *fdisk = NULL;
     440        fdisk_dev_t *fdev = NULL;
    439441        fdisk_part_t *part;
    440442        fdisk_part_spec_t pspec;
    441443        fdisk_part_info_t pinfo;
     444        bool dir_created = false;
     445        bool label_created = false;
    442446        capa_spec_t capa;
    443447        service_id_t sid;
     
    448452        rc = loc_service_get_id(dev, &sid, 0);
    449453        if (rc != EOK)
    450                 return rc;
     454                goto error;
    451455
    452456        sysinst_debug(sysinst, "sysinst_label_dev(): open device");
     
    455459        if (rc != EOK) {
    456460                sysinst_error(sysinst, "Error initializing fdisk.");
    457                 return rc;
     461                goto error;
    458462        }
    459463
     
    461465        if (rc != EOK) {
    462466                sysinst_error(sysinst, "Error opening device.");
    463                 return rc;
     467                goto error;
    464468        }
    465469
     
    469473        if (rc != EOK) {
    470474                sysinst_error(sysinst, "Error creating mount directory.");
    471                 return rc;
    472         }
     475                goto error;
     476        }
     477
     478        dir_created = true;
    473479
    474480        sysinst_debug(sysinst, "sysinst_label_dev(): create label");
     
    477483        if (rc != EOK) {
    478484                sysinst_error(sysinst, "Error creating label.");
    479                 return rc;
    480         }
     485                goto error;
     486        }
     487
     488        label_created = true;
    481489
    482490        sysinst_debug(sysinst, "sysinst_label_dev(): create partition");
     
    486494                sysinst_error(sysinst,
    487495                    "Error getting available capacity.");
    488                 return rc;
     496                goto error;
    489497        }
    490498
     
    499507        if (rc != EOK) {
    500508                sysinst_error(sysinst, "Error creating partition.");
    501                 return rc;
     509                goto error;
    502510        }
    503511
     
    505513        if (rc != EOK) {
    506514                sysinst_error(sysinst, "Error getting partition information.");
    507                 return rc;
     515                goto error;
    508516        }
    509517
    510518        sysinst_debug(sysinst, "sysinst_label_dev(): OK");
    511         *psvc_id = pinfo.svc_id;
     519        fdisk_dev_close(fdev);
     520        fdisk_destroy(fdisk);
     521        sysinst->psvc_id = pinfo.svc_id;
     522        return EOK;
     523error:
     524        if (label_created)
     525                fdisk_label_destroy(fdev);
     526        if (dir_created)
     527                (void)vfs_unlink_path(MOUNT_POINT);
     528        if (fdev != NULL)
     529                fdisk_dev_close(fdev);
     530        if (fdisk != NULL)
     531                fdisk_destroy(fdisk);
     532        return rc;
     533}
     534
     535/** Finish/unmount destination device.
     536 *
     537 * @param sysinst System installer
     538 *
     539 * @return EOK on success or an error code
     540 */
     541static errno_t sysinst_finish_dev(sysinst_t *sysinst)
     542{
     543        errno_t rc;
     544
     545        sysinst_debug(sysinst, "sysinst_finish_dev(): eject target volume");
     546        rc = sysinst_eject_dev(sysinst, sysinst->psvc_id);
     547        if (rc != EOK)
     548                return rc;
     549
     550        sysinst_debug(sysinst, "sysinst_finish_dev(): "
     551            "deleting mount directory");
     552        (void)vfs_unlink_path(MOUNT_POINT);
     553
    512554        return EOK;
    513555}
     
    811853 *
    812854 * @param sysinst System installer
    813  * @param psvc_id Partition service ID
     855 * @param part_id Partition service ID
    814856 * @return EOK on success or an error code
    815857 */
     
    825867        }
    826868
    827         rc = vol_part_eject(vol, part_id, vef_physical);
     869        rc = vol_part_eject(vol, part_id, vef_none);
    828870        if (rc != EOK) {
    829871                sysinst_error(sysinst, "Error ejecting volume.");
     
    837879}
    838880
     881/** Physically eject volume by mount point.
     882 *
     883 * @param sysinst System installer
     884 * @param path Mount point
     885 * @return EOK on success or an error code
     886 */
     887static errno_t sysinst_eject_phys_by_mp(sysinst_t *sysinst, const char *path)
     888{
     889        vol_t *vol = NULL;
     890        sysarg_t part_id;
     891        errno_t rc;
     892
     893        rc = vol_create(&vol);
     894        if (rc != EOK) {
     895                sysinst_error(sysinst, "Error contacting volume service.");
     896                goto out;
     897        }
     898
     899        log_msg(LOG_DEFAULT, LVL_NOTE, "vol_part_by_mp: mp='%s'\n",
     900            path);
     901        rc = vol_part_by_mp(vol, path, &part_id);
     902        if (rc != EOK) {
     903                sysinst_error(sysinst,
     904                    "Error finding installation media mount point.");
     905                goto out;
     906        }
     907
     908        log_msg(LOG_DEFAULT, LVL_NOTE, "eject svc_id %lu", (unsigned long)part_id);
     909        rc = vol_part_eject(vol, part_id, vef_physical);
     910        if (rc != EOK) {
     911                sysinst_error(sysinst, "Error ejecting volume.");
     912                goto out;
     913        }
     914
     915        rc = EOK;
     916out:
     917        vol_destroy(vol);
     918        return rc;
     919}
     920
    839921/** Restart the system.
    840922 *
     
    901983{
    902984        errno_t rc;
    903         service_id_t psvc_id;
    904985
    905986        sysinst_action(sysinst, "Creating device label and file system.");
    906987
    907         rc = sysinst_label_dev(sysinst, dev, &psvc_id);
     988        rc = sysinst_label_dev(sysinst, dev);
    908989        if (rc != EOK)
    909990                return rc;
     
    9241005                return rc;
    9251006
     1007        sysinst_action(sysinst, "Finishing system volume.");
     1008        rc = sysinst_finish_dev(sysinst);
     1009        if (rc != EOK)
     1010                return rc;
     1011
    9261012        sysinst_action(sysinst, "Installing boot blocks.");
    9271013        rc = sysinst_copy_boot_blocks(sysinst, dev);
     
    9291015                return rc;
    9301016
    931         sysinst_action(sysinst, "Ejecting device.");
    932         rc = sysinst_eject_dev(sysinst, psvc_id);
     1017        sysinst_action(sysinst, "Ejecting installation media.");
     1018        rc = sysinst_eject_phys_by_mp(sysinst, CD_MOUNT_POINT);
    9331019        if (rc != EOK)
    9341020                return rc;
Note: See TracChangeset for help on using the changeset viewer.