void init_disk (void) { char **list; char *msg; int i; char *path; msg = xenbus_ls(XBT_NIL, "device/vbd", &list); if (msg) { printk("Error %s while reading list of disks\n", msg); free(msg); return; } blk_nb = 0; while (list[blk_nb]) blk_nb++; blk_dev = malloc(blk_nb * sizeof(*blk_dev)); blk_info = malloc(blk_nb * sizeof(*blk_info)); qsort(list, blk_nb, sizeof(*list), vbdcmp); for (i = 0; i < blk_nb; i++) { printk("vbd %s is hd%d\n", list[i], i); asprintf(&path, "device/vbd/%s", list[i]); blk_dev[i] = init_blkfront(path, &blk_info[i]); free(path); free(list[i]); } }
static int devopen(int num) { int devnum = 768 + (num<<6); char buf[32]; int nlocks; if (blkopen[num]) { blkopen[num]++; return 1; } snprintf(buf, sizeof(buf), "device/vbd/%d", devnum); rumpkern_unsched(&nlocks, NULL); blkdevs[num] = init_blkfront(buf, &blkinfos[num]); rumpkern_sched(nlocks, NULL); if (blkdevs[num] != NULL) { blkopen[num] = 1; return 0; } else { return EIO; /* guess something */ } }