Merge pull request #36 from gao-feng/scsi

find scsi disk device if scsi addr is given
This commit is contained in:
feisky
2015-12-25 10:36:11 +08:00
5 changed files with 56 additions and 0 deletions
+6
View File
@@ -28,6 +28,9 @@ static int container_setup_volume(struct hyper_container *container)
for (i = 0; i < container->vols_num; i++) {
vol = &container->vols[i];
if (vol->scsiaddr)
hyper_find_sd("/.oldroot", vol->scsiaddr, &vol->device);
sprintf(dev, "/.oldroot/dev/%s", vol->device);
sprintf(path, "/tmp/%s", vol->mountpoint);
fprintf(stdout, "mount %s to %s, tmp path %s\n",
@@ -371,6 +374,9 @@ static int hyper_container_init(void *data)
if (container->fstype) {
char dev[128];
if (container->scsiaddr)
hyper_find_sd("", container->scsiaddr, &container->image);
sprintf(dev, "/dev/%s", container->image);
fprintf(stdout, "device %s\n", dev);
+2
View File
@@ -10,6 +10,7 @@ struct env {
struct volume {
char *device;
char *scsiaddr;
char *mountpoint;
char *fstype;
int readonly;
@@ -30,6 +31,7 @@ struct hyper_container {
char *id;
char *rootfs;
char *image;
char *scsiaddr;
char *workdir;
char *fstype;
struct volume *vols;
+13
View File
@@ -76,6 +76,7 @@ static void container_free_volumes(struct hyper_container *c)
free(c->vols[i].device);
free(c->vols[i].mountpoint);
free(c->vols[i].fstype);
free(c->vols[i].scsiaddr);
}
free(c->vols);
c->vols = NULL;
@@ -115,6 +116,9 @@ static int container_parse_volumes(struct hyper_container *c, char *json, jsmnto
c->vols[j].device =
strdup(json_token_str(json, &toks[++i]));
fprintf(stdout, "volume %d device %s\n", j, c->vols[j].device);
} else if (json_token_streq(json, &toks[i], "addr")) {
c->vols[j].scsiaddr = strdup(json_token_str(json, &toks[++i]));
fprintf(stdout, "volume %d scsi id %s\n", j, c->vols[j].scsiaddr);
} else if (json_token_streq(json, &toks[i], "mount")) {
c->vols[j].mountpoint =
strdup(json_token_str(json, &toks[++i]));
@@ -321,6 +325,9 @@ void hyper_free_container(struct hyper_container *c)
free(c->image);
c->image = NULL;
free(c->scsiaddr);
c->scsiaddr = NULL;
free(c->workdir);
c->workdir = NULL;
@@ -403,6 +410,10 @@ static int hyper_parse_container(struct hyper_pod *pod, struct hyper_container *
c->image = strdup(json_token_str(json, &toks[++i]));
fprintf(stdout, "container image %s\n", c->image);
i++;
} else if (json_token_streq(json, t, "addr") && t->size == 1) {
c->scsiaddr = strdup(json_token_str(json, &toks[++i]));
fprintf(stdout, "container image scsi id %s\n", c->scsiaddr);
i++;
} else if (json_token_streq(json, t, "fstype") && t->size == 1) {
c->fstype = strdup(json_token_str(json, &toks[++i]));
fprintf(stdout, "container fstype %s\n", c->fstype);
@@ -1098,6 +1109,8 @@ out:
return ret;
fail:
free(reader->id);
reader->id = NULL;
free(reader->file);
reader->file = NULL;
goto out;
}
+34
View File
@@ -64,6 +64,40 @@ int hyper_list_dir(char *path)
return 0;
}
int hyper_find_sd(char *prefix, char *addr, char **dev) {
struct dirent **list;
struct dirent *dir;
char path[512];
int i, num;
sprintf(path, "%s/sys/class/scsi_disk/0:0:%s/device/block/", prefix, addr);
fprintf(stdout, "orig dev %s, scan path %s\n", *dev, path);
num = scandir(path, &list, NULL, NULL);
if (num < 0) {
perror("scan path failed");
return -1;
}
for (i = 0; i < num; i++) {
dir = list[i];
if (dir->d_name[0] == '.') {
continue;
}
fprintf(stdout, "%s get %s\n", path, dir->d_name);
free(*dev);
*dev = strdup(dir->d_name);
break;
}
for (i = 0; i < num; i++)
free(list[i]);
free(list);
return 0;
}
int hyper_mkdir(char *hyper_path)
{
struct stat st;
+1
View File
@@ -16,6 +16,7 @@ struct env;
char *read_cmdline(void);
int hyper_setup_env(struct env *envs, int num);
int hyper_find_sd(char *prefix, char *addr, char **dev);
int hyper_list_dir(char *path);
int hyper_mkdir(char *path);
int hyper_open_channel(char *channel, int mode);