Commit 3b0ba927931925f0f76509747ae145df30c97a05
Committed by
Anthony Liguori
1 parent
1dae12e6
kill drives_opt
cleanup pretty simliar to the drives_table removal patch: - drop the table and make a linked list out of it. - pass around struct pointers instead of table indices. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Showing
3 changed files
with
43 additions
and
71 deletions
hw/device-hotplug.c
| @@ -30,17 +30,17 @@ | @@ -30,17 +30,17 @@ | ||
| 30 | 30 | ||
| 31 | DriveInfo *add_init_drive(const char *opts) | 31 | DriveInfo *add_init_drive(const char *opts) |
| 32 | { | 32 | { |
| 33 | - int drive_opt_idx; | ||
| 34 | int fatal_error; | 33 | int fatal_error; |
| 35 | DriveInfo *dinfo; | 34 | DriveInfo *dinfo; |
| 35 | + DriveOpt *dopt; | ||
| 36 | 36 | ||
| 37 | - drive_opt_idx = drive_add(NULL, "%s", opts); | ||
| 38 | - if (!drive_opt_idx) | 37 | + dopt = drive_add(NULL, "%s", opts); |
| 38 | + if (!dopt) | ||
| 39 | return NULL; | 39 | return NULL; |
| 40 | 40 | ||
| 41 | - dinfo = drive_init(&drives_opt[drive_opt_idx], 0, current_machine, &fatal_error); | 41 | + dinfo = drive_init(dopt, 0, current_machine, &fatal_error); |
| 42 | if (!dinfo) { | 42 | if (!dinfo) { |
| 43 | - drive_remove(drive_opt_idx); | 43 | + drive_remove(dopt); |
| 44 | return NULL; | 44 | return NULL; |
| 45 | } | 45 | } |
| 46 | 46 |
sysemu.h
| @@ -159,6 +159,12 @@ typedef enum { | @@ -159,6 +159,12 @@ typedef enum { | ||
| 159 | 159 | ||
| 160 | #define BLOCK_SERIAL_STRLEN 20 | 160 | #define BLOCK_SERIAL_STRLEN 20 |
| 161 | 161 | ||
| 162 | +typedef struct DriveOpt { | ||
| 163 | + const char *file; | ||
| 164 | + char opt[1024]; | ||
| 165 | + TAILQ_ENTRY(DriveOpt) next; | ||
| 166 | +} DriveOpt; | ||
| 167 | + | ||
| 162 | typedef struct DriveInfo { | 168 | typedef struct DriveInfo { |
| 163 | BlockDriverState *bdrv; | 169 | BlockDriverState *bdrv; |
| 164 | char *id; | 170 | char *id; |
| @@ -166,7 +172,7 @@ typedef struct DriveInfo { | @@ -166,7 +172,7 @@ typedef struct DriveInfo { | ||
| 166 | BlockInterfaceType type; | 172 | BlockInterfaceType type; |
| 167 | int bus; | 173 | int bus; |
| 168 | int unit; | 174 | int unit; |
| 169 | - int drive_opt_idx; | 175 | + DriveOpt *opt; |
| 170 | BlockInterfaceErrorAction onerror; | 176 | BlockInterfaceErrorAction onerror; |
| 171 | char serial[BLOCK_SERIAL_STRLEN + 1]; | 177 | char serial[BLOCK_SERIAL_STRLEN + 1]; |
| 172 | TAILQ_ENTRY(DriveInfo) next; | 178 | TAILQ_ENTRY(DriveInfo) next; |
| @@ -177,28 +183,20 @@ typedef struct DriveInfo { | @@ -177,28 +183,20 @@ typedef struct DriveInfo { | ||
| 177 | #define MAX_DRIVES 32 | 183 | #define MAX_DRIVES 32 |
| 178 | 184 | ||
| 179 | extern TAILQ_HEAD(drivelist, DriveInfo) drives; | 185 | extern TAILQ_HEAD(drivelist, DriveInfo) drives; |
| 186 | +extern TAILQ_HEAD(driveoptlist, DriveOpt) driveopts; | ||
| 180 | 187 | ||
| 181 | extern DriveInfo *drive_get(BlockInterfaceType type, int bus, int unit); | 188 | extern DriveInfo *drive_get(BlockInterfaceType type, int bus, int unit); |
| 182 | extern DriveInfo *drive_get_by_id(char *id); | 189 | extern DriveInfo *drive_get_by_id(char *id); |
| 183 | extern int drive_get_max_bus(BlockInterfaceType type); | 190 | extern int drive_get_max_bus(BlockInterfaceType type); |
| 184 | extern void drive_uninit(BlockDriverState *bdrv); | 191 | extern void drive_uninit(BlockDriverState *bdrv); |
| 185 | -extern void drive_remove(int index); | 192 | +extern void drive_remove(DriveOpt *opt); |
| 186 | extern const char *drive_get_serial(BlockDriverState *bdrv); | 193 | extern const char *drive_get_serial(BlockDriverState *bdrv); |
| 187 | extern BlockInterfaceErrorAction drive_get_onerror(BlockDriverState *bdrv); | 194 | extern BlockInterfaceErrorAction drive_get_onerror(BlockDriverState *bdrv); |
| 188 | 195 | ||
| 189 | BlockDriverState *qdev_init_bdrv(DeviceState *dev, BlockInterfaceType type); | 196 | BlockDriverState *qdev_init_bdrv(DeviceState *dev, BlockInterfaceType type); |
| 190 | 197 | ||
| 191 | -struct drive_opt { | ||
| 192 | - const char *file; | ||
| 193 | - char opt[1024]; | ||
| 194 | - int used; | ||
| 195 | -}; | ||
| 196 | - | ||
| 197 | -extern struct drive_opt drives_opt[MAX_DRIVES]; | ||
| 198 | -extern int nb_drives_opt; | ||
| 199 | - | ||
| 200 | -extern int drive_add(const char *file, const char *fmt, ...); | ||
| 201 | -extern DriveInfo *drive_init(struct drive_opt *arg, int snapshot, void *machine, | 198 | +extern DriveOpt *drive_add(const char *file, const char *fmt, ...); |
| 199 | +extern DriveInfo *drive_init(DriveOpt *arg, int snapshot, void *machine, | ||
| 202 | int *fatal_error); | 200 | int *fatal_error); |
| 203 | 201 | ||
| 204 | /* acpi */ | 202 | /* acpi */ |
vl.c
| @@ -181,6 +181,7 @@ const char *bios_name = NULL; | @@ -181,6 +181,7 @@ const char *bios_name = NULL; | ||
| 181 | /* Note: drives_table[MAX_DRIVES] is a dummy block driver if none available | 181 | /* Note: drives_table[MAX_DRIVES] is a dummy block driver if none available |
| 182 | to store the VM snapshots */ | 182 | to store the VM snapshots */ |
| 183 | struct drivelist drives = TAILQ_HEAD_INITIALIZER(drives); | 183 | struct drivelist drives = TAILQ_HEAD_INITIALIZER(drives); |
| 184 | +struct driveoptlist driveopts = TAILQ_HEAD_INITIALIZER(driveopts); | ||
| 184 | enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB; | 185 | enum vga_retrace_method vga_retrace_method = VGA_RETRACE_DUMB; |
| 185 | static DisplayState *display_state; | 186 | static DisplayState *display_state; |
| 186 | DisplayType display_type = DT_DEFAULT; | 187 | DisplayType display_type = DT_DEFAULT; |
| @@ -248,8 +249,6 @@ int alt_grab = 0; | @@ -248,8 +249,6 @@ int alt_grab = 0; | ||
| 248 | unsigned int nb_prom_envs = 0; | 249 | unsigned int nb_prom_envs = 0; |
| 249 | const char *prom_envs[MAX_PROM_ENVS]; | 250 | const char *prom_envs[MAX_PROM_ENVS]; |
| 250 | #endif | 251 | #endif |
| 251 | -int nb_drives_opt; | ||
| 252 | -struct drive_opt drives_opt[MAX_DRIVES]; | ||
| 253 | int boot_menu; | 252 | int boot_menu; |
| 254 | 253 | ||
| 255 | int nb_numa_nodes; | 254 | int nb_numa_nodes; |
| @@ -1865,43 +1864,27 @@ static int bt_parse(const char *opt) | @@ -1865,43 +1864,27 @@ static int bt_parse(const char *opt) | ||
| 1865 | #define MTD_ALIAS "if=mtd" | 1864 | #define MTD_ALIAS "if=mtd" |
| 1866 | #define SD_ALIAS "index=0,if=sd" | 1865 | #define SD_ALIAS "index=0,if=sd" |
| 1867 | 1866 | ||
| 1868 | -static int drive_opt_get_free_idx(void) | ||
| 1869 | -{ | ||
| 1870 | - int index; | ||
| 1871 | - | ||
| 1872 | - for (index = 0; index < MAX_DRIVES; index++) | ||
| 1873 | - if (!drives_opt[index].used) { | ||
| 1874 | - drives_opt[index].used = 1; | ||
| 1875 | - return index; | ||
| 1876 | - } | ||
| 1877 | - | ||
| 1878 | - return -1; | ||
| 1879 | -} | ||
| 1880 | - | ||
| 1881 | -int drive_add(const char *file, const char *fmt, ...) | 1867 | +DriveOpt *drive_add(const char *file, const char *fmt, ...) |
| 1882 | { | 1868 | { |
| 1883 | va_list ap; | 1869 | va_list ap; |
| 1884 | - int index = drive_opt_get_free_idx(); | 1870 | + DriveOpt *dopt; |
| 1885 | 1871 | ||
| 1886 | - if (nb_drives_opt >= MAX_DRIVES || index == -1) { | ||
| 1887 | - fprintf(stderr, "qemu: too many drives\n"); | ||
| 1888 | - return -1; | ||
| 1889 | - } | 1872 | + dopt = qemu_mallocz(sizeof(*dopt)); |
| 1890 | 1873 | ||
| 1891 | - drives_opt[index].file = file; | 1874 | + dopt->file = file; |
| 1892 | va_start(ap, fmt); | 1875 | va_start(ap, fmt); |
| 1893 | - vsnprintf(drives_opt[index].opt, | ||
| 1894 | - sizeof(drives_opt[0].opt), fmt, ap); | 1876 | + vsnprintf(dopt->opt, |
| 1877 | + sizeof(dopt->opt), fmt, ap); | ||
| 1895 | va_end(ap); | 1878 | va_end(ap); |
| 1896 | 1879 | ||
| 1897 | - nb_drives_opt++; | ||
| 1898 | - return index; | 1880 | + TAILQ_INSERT_TAIL(&driveopts, dopt, next); |
| 1881 | + return dopt; | ||
| 1899 | } | 1882 | } |
| 1900 | 1883 | ||
| 1901 | -void drive_remove(int index) | 1884 | +void drive_remove(DriveOpt *dopt) |
| 1902 | { | 1885 | { |
| 1903 | - drives_opt[index].used = 0; | ||
| 1904 | - nb_drives_opt--; | 1886 | + TAILQ_REMOVE(&driveopts, dopt, next); |
| 1887 | + qemu_free(dopt); | ||
| 1905 | } | 1888 | } |
| 1906 | 1889 | ||
| 1907 | DriveInfo *drive_get(BlockInterfaceType type, int bus, int unit) | 1890 | DriveInfo *drive_get(BlockInterfaceType type, int bus, int unit) |
| @@ -1982,14 +1965,14 @@ void drive_uninit(BlockDriverState *bdrv) | @@ -1982,14 +1965,14 @@ void drive_uninit(BlockDriverState *bdrv) | ||
| 1982 | TAILQ_FOREACH(dinfo, &drives, next) { | 1965 | TAILQ_FOREACH(dinfo, &drives, next) { |
| 1983 | if (dinfo->bdrv != bdrv) | 1966 | if (dinfo->bdrv != bdrv) |
| 1984 | continue; | 1967 | continue; |
| 1985 | - drive_remove(dinfo->drive_opt_idx); | 1968 | + drive_remove(dinfo->opt); |
| 1986 | TAILQ_REMOVE(&drives, dinfo, next); | 1969 | TAILQ_REMOVE(&drives, dinfo, next); |
| 1987 | qemu_free(dinfo); | 1970 | qemu_free(dinfo); |
| 1988 | break; | 1971 | break; |
| 1989 | } | 1972 | } |
| 1990 | } | 1973 | } |
| 1991 | 1974 | ||
| 1992 | -DriveInfo *drive_init(struct drive_opt *arg, int snapshot, void *opaque, | 1975 | +DriveInfo *drive_init(DriveOpt *arg, int snapshot, void *opaque, |
| 1993 | int *fatal_error) | 1976 | int *fatal_error) |
| 1994 | { | 1977 | { |
| 1995 | char buf[128]; | 1978 | char buf[128]; |
| @@ -2309,7 +2292,7 @@ DriveInfo *drive_init(struct drive_opt *arg, int snapshot, void *opaque, | @@ -2309,7 +2292,7 @@ DriveInfo *drive_init(struct drive_opt *arg, int snapshot, void *opaque, | ||
| 2309 | dinfo->bus = bus_id; | 2292 | dinfo->bus = bus_id; |
| 2310 | dinfo->unit = unit_id; | 2293 | dinfo->unit = unit_id; |
| 2311 | dinfo->onerror = onerror; | 2294 | dinfo->onerror = onerror; |
| 2312 | - dinfo->drive_opt_idx = arg - drives_opt; | 2295 | + dinfo->opt = arg; |
| 2313 | strncpy(dinfo->serial, serial, sizeof(serial)); | 2296 | strncpy(dinfo->serial, serial, sizeof(serial)); |
| 2314 | TAILQ_INSERT_TAIL(&drives, dinfo, next); | 2297 | TAILQ_INSERT_TAIL(&drives, dinfo, next); |
| 2315 | 2298 | ||
| @@ -4896,7 +4879,7 @@ int main(int argc, char **argv, char **envp) | @@ -4896,7 +4879,7 @@ int main(int argc, char **argv, char **envp) | ||
| 4896 | int cyls, heads, secs, translation; | 4879 | int cyls, heads, secs, translation; |
| 4897 | const char *net_clients[MAX_NET_CLIENTS]; | 4880 | const char *net_clients[MAX_NET_CLIENTS]; |
| 4898 | int nb_net_clients; | 4881 | int nb_net_clients; |
| 4899 | - int hda_index; | 4882 | + DriveOpt *dopt, *hda_opt = NULL; |
| 4900 | int optind; | 4883 | int optind; |
| 4901 | const char *r, *optarg; | 4884 | const char *r, *optarg; |
| 4902 | CharDriverState *monitor_hd = NULL; | 4885 | CharDriverState *monitor_hd = NULL; |
| @@ -4990,10 +4973,7 @@ int main(int argc, char **argv, char **envp) | @@ -4990,10 +4973,7 @@ int main(int argc, char **argv, char **envp) | ||
| 4990 | } | 4973 | } |
| 4991 | 4974 | ||
| 4992 | nb_net_clients = 0; | 4975 | nb_net_clients = 0; |
| 4993 | - nb_drives_opt = 0; | ||
| 4994 | nb_numa_nodes = 0; | 4976 | nb_numa_nodes = 0; |
| 4995 | - hda_index = -1; | ||
| 4996 | - | ||
| 4997 | nb_nics = 0; | 4977 | nb_nics = 0; |
| 4998 | 4978 | ||
| 4999 | tb_size = 0; | 4979 | tb_size = 0; |
| @@ -5007,7 +4987,7 @@ int main(int argc, char **argv, char **envp) | @@ -5007,7 +4987,7 @@ int main(int argc, char **argv, char **envp) | ||
| 5007 | break; | 4987 | break; |
| 5008 | r = argv[optind]; | 4988 | r = argv[optind]; |
| 5009 | if (r[0] != '-') { | 4989 | if (r[0] != '-') { |
| 5010 | - hda_index = drive_add(argv[optind++], HD_ALIAS, 0); | 4990 | + hda_opt = drive_add(argv[optind++], HD_ALIAS, 0); |
| 5011 | } else { | 4991 | } else { |
| 5012 | const QEMUOption *popt; | 4992 | const QEMUOption *popt; |
| 5013 | 4993 | ||
| @@ -5071,9 +5051,9 @@ int main(int argc, char **argv, char **envp) | @@ -5071,9 +5051,9 @@ int main(int argc, char **argv, char **envp) | ||
| 5071 | break; | 5051 | break; |
| 5072 | case QEMU_OPTION_hda: | 5052 | case QEMU_OPTION_hda: |
| 5073 | if (cyls == 0) | 5053 | if (cyls == 0) |
| 5074 | - hda_index = drive_add(optarg, HD_ALIAS, 0); | 5054 | + hda_opt = drive_add(optarg, HD_ALIAS, 0); |
| 5075 | else | 5055 | else |
| 5076 | - hda_index = drive_add(optarg, HD_ALIAS | 5056 | + hda_opt = drive_add(optarg, HD_ALIAS |
| 5077 | ",cyls=%d,heads=%d,secs=%d%s", | 5057 | ",cyls=%d,heads=%d,secs=%d%s", |
| 5078 | 0, cyls, heads, secs, | 5058 | 0, cyls, heads, secs, |
| 5079 | translation == BIOS_ATA_TRANSLATION_LBA ? | 5059 | translation == BIOS_ATA_TRANSLATION_LBA ? |
| @@ -5135,9 +5115,9 @@ int main(int argc, char **argv, char **envp) | @@ -5135,9 +5115,9 @@ int main(int argc, char **argv, char **envp) | ||
| 5135 | fprintf(stderr, "qemu: invalid physical CHS format\n"); | 5115 | fprintf(stderr, "qemu: invalid physical CHS format\n"); |
| 5136 | exit(1); | 5116 | exit(1); |
| 5137 | } | 5117 | } |
| 5138 | - if (hda_index != -1) | ||
| 5139 | - snprintf(drives_opt[hda_index].opt, | ||
| 5140 | - sizeof(drives_opt[hda_index].opt), | 5118 | + if (hda_opt != NULL) |
| 5119 | + snprintf(hda_opt->opt, | ||
| 5120 | + sizeof(hda_opt->opt), | ||
| 5141 | HD_ALIAS ",cyls=%d,heads=%d,secs=%d%s", | 5121 | HD_ALIAS ",cyls=%d,heads=%d,secs=%d%s", |
| 5142 | 0, cyls, heads, secs, | 5122 | 0, cyls, heads, secs, |
| 5143 | translation == BIOS_ATA_TRANSLATION_LBA ? | 5123 | translation == BIOS_ATA_TRANSLATION_LBA ? |
| @@ -5846,25 +5826,19 @@ int main(int argc, char **argv, char **envp) | @@ -5846,25 +5826,19 @@ int main(int argc, char **argv, char **envp) | ||
| 5846 | bdrv_init(); | 5826 | bdrv_init(); |
| 5847 | 5827 | ||
| 5848 | /* we always create the cdrom drive, even if no disk is there */ | 5828 | /* we always create the cdrom drive, even if no disk is there */ |
| 5849 | - | ||
| 5850 | - if (nb_drives_opt < MAX_DRIVES) | ||
| 5851 | - drive_add(NULL, CDROM_ALIAS); | 5829 | + drive_add(NULL, CDROM_ALIAS); |
| 5852 | 5830 | ||
| 5853 | /* we always create at least one floppy */ | 5831 | /* we always create at least one floppy */ |
| 5854 | - | ||
| 5855 | - if (nb_drives_opt < MAX_DRIVES) | ||
| 5856 | - drive_add(NULL, FD_ALIAS, 0); | 5832 | + drive_add(NULL, FD_ALIAS, 0); |
| 5857 | 5833 | ||
| 5858 | /* we always create one sd slot, even if no card is in it */ | 5834 | /* we always create one sd slot, even if no card is in it */ |
| 5859 | - | ||
| 5860 | - if (nb_drives_opt < MAX_DRIVES) | ||
| 5861 | - drive_add(NULL, SD_ALIAS); | 5835 | + drive_add(NULL, SD_ALIAS); |
| 5862 | 5836 | ||
| 5863 | /* open the virtual block devices */ | 5837 | /* open the virtual block devices */ |
| 5864 | 5838 | ||
| 5865 | - for(i = 0; i < nb_drives_opt; i++) { | 5839 | + TAILQ_FOREACH(dopt, &driveopts, next) { |
| 5866 | int fatal_error; | 5840 | int fatal_error; |
| 5867 | - if (drive_init(&drives_opt[i], snapshot, machine, &fatal_error) == NULL) | 5841 | + if (drive_init(dopt, snapshot, machine, &fatal_error) == NULL) |
| 5868 | if (fatal_error) | 5842 | if (fatal_error) |
| 5869 | exit(1); | 5843 | exit(1); |
| 5870 | } | 5844 | } |