Skip to content
This repository was archived by the owner on Feb 8, 2021. It is now read-only.

Commit 02ba85f

Browse files
committed
Merge pull request #36 from gao-feng/scsi
find scsi disk device if scsi addr is given
2 parents d563b3e + ce0ab6b commit 02ba85f

File tree

5 files changed

+56
-0
lines changed

5 files changed

+56
-0
lines changed

src/container.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ static int container_setup_volume(struct hyper_container *container)
2828
for (i = 0; i < container->vols_num; i++) {
2929
vol = &container->vols[i];
3030

31+
if (vol->scsiaddr)
32+
hyper_find_sd("/.oldroot", vol->scsiaddr, &vol->device);
33+
3134
sprintf(dev, "/.oldroot/dev/%s", vol->device);
3235
sprintf(path, "/tmp/%s", vol->mountpoint);
3336
fprintf(stdout, "mount %s to %s, tmp path %s\n",
@@ -371,6 +374,9 @@ static int hyper_container_init(void *data)
371374
if (container->fstype) {
372375
char dev[128];
373376

377+
if (container->scsiaddr)
378+
hyper_find_sd("", container->scsiaddr, &container->image);
379+
374380
sprintf(dev, "/dev/%s", container->image);
375381
fprintf(stdout, "device %s\n", dev);
376382

src/container.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ struct env {
1010

1111
struct volume {
1212
char *device;
13+
char *scsiaddr;
1314
char *mountpoint;
1415
char *fstype;
1516
int readonly;
@@ -30,6 +31,7 @@ struct hyper_container {
3031
char *id;
3132
char *rootfs;
3233
char *image;
34+
char *scsiaddr;
3335
char *workdir;
3436
char *fstype;
3537
struct volume *vols;

src/parse.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ static void container_free_volumes(struct hyper_container *c)
7676
free(c->vols[i].device);
7777
free(c->vols[i].mountpoint);
7878
free(c->vols[i].fstype);
79+
free(c->vols[i].scsiaddr);
7980
}
8081
free(c->vols);
8182
c->vols = NULL;
@@ -115,6 +116,9 @@ static int container_parse_volumes(struct hyper_container *c, char *json, jsmnto
115116
c->vols[j].device =
116117
strdup(json_token_str(json, &toks[++i]));
117118
fprintf(stdout, "volume %d device %s\n", j, c->vols[j].device);
119+
} else if (json_token_streq(json, &toks[i], "addr")) {
120+
c->vols[j].scsiaddr = strdup(json_token_str(json, &toks[++i]));
121+
fprintf(stdout, "volume %d scsi id %s\n", j, c->vols[j].scsiaddr);
118122
} else if (json_token_streq(json, &toks[i], "mount")) {
119123
c->vols[j].mountpoint =
120124
strdup(json_token_str(json, &toks[++i]));
@@ -321,6 +325,9 @@ void hyper_free_container(struct hyper_container *c)
321325
free(c->image);
322326
c->image = NULL;
323327

328+
free(c->scsiaddr);
329+
c->scsiaddr = NULL;
330+
324331
free(c->workdir);
325332
c->workdir = NULL;
326333

@@ -403,6 +410,10 @@ static int hyper_parse_container(struct hyper_pod *pod, struct hyper_container *
403410
c->image = strdup(json_token_str(json, &toks[++i]));
404411
fprintf(stdout, "container image %s\n", c->image);
405412
i++;
413+
} else if (json_token_streq(json, t, "addr") && t->size == 1) {
414+
c->scsiaddr = strdup(json_token_str(json, &toks[++i]));
415+
fprintf(stdout, "container image scsi id %s\n", c->scsiaddr);
416+
i++;
406417
} else if (json_token_streq(json, t, "fstype") && t->size == 1) {
407418
c->fstype = strdup(json_token_str(json, &toks[++i]));
408419
fprintf(stdout, "container fstype %s\n", c->fstype);
@@ -1098,6 +1109,8 @@ int hyper_parse_read_file(struct hyper_reader *reader, char *json, int length)
10981109
return ret;
10991110
fail:
11001111
free(reader->id);
1112+
reader->id = NULL;
11011113
free(reader->file);
1114+
reader->file = NULL;
11021115
goto out;
11031116
}

src/util.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,40 @@ int hyper_list_dir(char *path)
6464
return 0;
6565
}
6666

67+
int hyper_find_sd(char *prefix, char *addr, char **dev) {
68+
struct dirent **list;
69+
struct dirent *dir;
70+
char path[512];
71+
int i, num;
72+
73+
sprintf(path, "%s/sys/class/scsi_disk/0:0:%s/device/block/", prefix, addr);
74+
fprintf(stdout, "orig dev %s, scan path %s\n", *dev, path);
75+
76+
num = scandir(path, &list, NULL, NULL);
77+
if (num < 0) {
78+
perror("scan path failed");
79+
return -1;
80+
}
81+
82+
for (i = 0; i < num; i++) {
83+
dir = list[i];
84+
if (dir->d_name[0] == '.') {
85+
continue;
86+
}
87+
88+
fprintf(stdout, "%s get %s\n", path, dir->d_name);
89+
free(*dev);
90+
*dev = strdup(dir->d_name);
91+
break;
92+
}
93+
94+
for (i = 0; i < num; i++)
95+
free(list[i]);
96+
97+
free(list);
98+
return 0;
99+
}
100+
67101
int hyper_mkdir(char *hyper_path)
68102
{
69103
struct stat st;

src/util.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ struct env;
1616

1717
char *read_cmdline(void);
1818
int hyper_setup_env(struct env *envs, int num);
19+
int hyper_find_sd(char *prefix, char *addr, char **dev);
1920
int hyper_list_dir(char *path);
2021
int hyper_mkdir(char *path);
2122
int hyper_open_channel(char *channel, int mode);

0 commit comments

Comments
 (0)