Skip to content

Commit

Permalink
Let installer amend RAM disk image with volume server configuration.
Browse files Browse the repository at this point in the history
  • Loading branch information
Jiri Svoboda committed Oct 6, 2018
1 parent e88eb48 commit df8eaba
Show file tree
Hide file tree
Showing 11 changed files with 383 additions and 6 deletions.
8 changes: 6 additions & 2 deletions boot/Makefile
Expand Up @@ -38,15 +38,16 @@ endif

build_dist: clean_dist
mkdir -p "$(DIST_PATH)/app/"
mkdir -p "$(DIST_PATH)/cfg/net/"
mkdir -p "$(DIST_PATH)/data/cfg/"
mkdir -p "$(DIST_PATH)/cfg/"
mkdir -p "$(DIST_PATH)/data/"
mkdir -p "$(DIST_PATH)/lib/"
mkdir -p "$(DIST_PATH)/loc/"
mkdir -p "$(DIST_PATH)/log/"
mkdir -p "$(DIST_PATH)/srv/"
mkdir -p "$(DIST_PATH)/test/"
mkdir -p "$(DIST_PATH)/tmp/"
mkdir -p "$(DIST_PATH)/vol/"
mkdir -p "$(DIST_PATH)/w/"
for file in $(RD_SRVS) ; do \
cp "$$file" "$(DIST_PATH)/srv/" ; \
done
Expand Down Expand Up @@ -134,10 +135,13 @@ endif
clean_dist:
rm -f $(INITRD).img $(COMPS).s $(COMPS).h $(COMPS)_desc.c $(COMPONENTS_DEFLATE) $(COMPS).o $(COMPS)_desc.o $(COMPS).zip $(LINK)
find $(USPACE_PATH)/dist -mindepth 1 -maxdepth 1 -type f -exec rm \{\} \;
rm -f $(USPACE_PATH)/dist/app/*
rm -f $(USPACE_PATH)/dist/cfg/*
rm -f $(USPACE_PATH)/dist/srv/*
rm -rf $(USPACE_PATH)/dist/drv/*
rm -rf $(USPACE_PATH)/dist/lib/*
rm -rf $(USPACE_PATH)/dist/inc/*
rm -f $(USPACE_PATH)/dist/app/*
rm -f $(USPACE_PATH)/dist/test/*
rm -f $(USPACE_PATH)/dist/cfg/net/*
rm -f $(USPACE_PATH)/dist/w/*
2 changes: 1 addition & 1 deletion tools/mkext2.py
Expand Up @@ -309,7 +309,7 @@ def write_superblock(self, block_group):
sb.features_incompatible = 2 # filetype
sb.features_read_only = 0
sb.uuid = self.uuid.bytes_le
sb.volume_name = 'HelenOS rdimage\0'
sb.volume_name = 'HelenOS-rd\0\0\0\0\0\0'
self.outf.write(bytes(sb.pack()))

def write_all_metadata(self):
Expand Down
6 changes: 4 additions & 2 deletions uspace/app/sysinst/Makefile
Expand Up @@ -27,12 +27,14 @@
#

USPACE_PREFIX = ../..
LIBS = block fdisk
LIBS = block fdisk sif

BINARY = sysinst

SOURCES = \
futil.c \
sysinst.c
rdimg.c \
sysinst.c \
volume.c

include $(USPACE_PREFIX)/Makefile.common
219 changes: 219 additions & 0 deletions uspace/app/sysinst/rdimg.c
@@ -0,0 +1,219 @@
/*
* Copyright (c) 2018 Jiri Svoboda
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* - The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/** @addtogroup sysinst
* @{
*/
/** @file RAM disk image manipulation
*/

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <str.h>
#include <task.h>
#include <vfs/vfs.h>
#include <vol.h>

#include "rdimg.h"

#define FILE_BD "/srv/file_bd"
#define RD_SVC "bd/iird"
#define RD_LABEL "HelenOS-rd"

/** Find volume by volume label. */
static errno_t rd_img_part_by_label(vol_t *vol, const char *label,
service_id_t *rid)
{
vol_part_info_t vinfo;
service_id_t *part_ids = NULL;
size_t nparts;
size_t i;
errno_t rc;

rc = vol_get_parts(vol, &part_ids, &nparts);
if (rc != EOK) {
printf("Error getting list of volumes.\n");
goto out;
}

for (i = 0; i < nparts; i++) {
rc = vol_part_info(vol, part_ids[i], &vinfo);
if (rc != EOK) {
printf("Error getting volume information.\n");
rc = EIO;
goto out;
}

if (str_cmp(vinfo.label, label) == 0) {
*rid = part_ids[i];
rc = EOK;
goto out;
}
}

rc = ENOENT;
out:
free(part_ids);
return rc;
}

/** Open RAM disk image.
*
* @param imgpath Image path
* @param rpath Place to store pointer to newly allocated string, the path to
* the mounted RAM disk.
* @param rimg Place to store pointer to newly allocated object.
*
* @return EOK on success or an error code
*/
errno_t rd_img_open(const char *imgpath, char **rpath, rd_img_t **rimg)
{
rd_img_t *img = NULL;
char *rdpath = NULL;
errno_t rc;
task_id_t id;
task_wait_t wait;
task_exit_t texit;
vfs_stat_t stat;
int retval;
int cnt;

printf("rd_img_open: begin\n");
rdpath = str_dup("/vol/" RD_LABEL);
if (rdpath == NULL) {
rc = ENOMEM;
goto error;
}

img = calloc(1, sizeof(rd_img_t));
if (img == NULL) {
rc = ENOMEM;
goto error;
}

printf("rd_img_open: spawn file_bd\n");
rc = task_spawnl(&id, &wait, FILE_BD, FILE_BD, imgpath, RD_SVC, NULL);
if (rc != EOK) {
rc = EIO;
goto error;
}

printf("rd_img_open: wait for file_bd\n");
rc = task_wait(&wait, &texit, &retval);
if (rc != EOK || texit != TASK_EXIT_NORMAL) {
rc = EIO;
goto error;
}

/* Wait for the RAM disk to become available */
printf("rd_img_open: wait for RAM disk to be mounted\n");
cnt = 10;
while (cnt > 0) {
rc = vfs_stat_path(rdpath, &stat);
if (rc == EOK)
break;

fibril_sleep(1);
--cnt;
}

if (cnt == 0) {
printf("rd_img_open: ran out of time\n");
rc = EIO;
goto error;
}

img->filebd_tid = id;
*rimg = img;
*rpath = rdpath;
printf("rd_img_open: success\n");
return EOK;
error:
if (rdpath != NULL)
free(rdpath);
if (img != NULL)
free(img);
return rc;
}

/** Close RAM disk image.
*
*/
errno_t rd_img_close(rd_img_t *img)
{
errno_t rc;
service_id_t rd_svcid;
vol_t *vol = NULL;

printf("rd_img_close: begin\n");

rc = vol_create(&vol);
if (rc != EOK) {
printf("Error opening volume management service.\n");
rc = EIO;
goto error;
}

printf("rd_img_close: Find RAM disk volume.\n");
rc = rd_img_part_by_label(vol, RD_LABEL, &rd_svcid);
if (rc != EOK) {
printf("Error getting RAM disk service ID.\n");
rc = EIO;
goto error;
}

printf("rd_img_close: eject RAM disk volume\n");
rc = vol_part_eject(vol, rd_svcid);
if (rc != EOK) {
printf("Error ejecting RAM disk volume.\n");
rc = EIO;
goto error;
}

vol_destroy(vol);

rc = task_kill(img->filebd_tid);
if (rc != EOK) {
printf("Error killing file_bd.\n");
rc = EIO;
goto error;
}

free(img);
printf("rd_img_close: success\n");
return EOK;
error:
free(img);
if (vol != NULL)
vol_destroy(vol);
return rc;
}

/** @}
*/
55 changes: 55 additions & 0 deletions uspace/app/sysinst/rdimg.h
@@ -0,0 +1,55 @@
/*
* Copyright (c) 2018 Jiri Svoboda
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* - The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/** @addtogroup sysinst
* @{
*/
/**
* @file
* @brief
*/

#ifndef RDIMG_H
#define RDIMG_H

#include <errno.h>
#include <task.h>

/** Open RAM disk image */
typedef struct {
/** Task ID of file_bd providing the RAM disk */
task_id_t filebd_tid;
} rd_img_t;

extern errno_t rd_img_open(const char *, char **, rd_img_t **);
extern errno_t rd_img_close(rd_img_t *);

#endif

/** @}
*/

0 comments on commit df8eaba

Please sign in to comment.