]>
Commit | Line | Data |
---|---|---|
911525db MA |
1 | /* |
2 | * Common code for block device models | |
3 | * | |
4 | * Copyright (C) 2012 Red Hat, Inc. | |
5 | * | |
6 | * This work is licensed under the terms of the GNU GPL, version 2 or | |
7 | * later. See the COPYING file in the top-level directory. | |
8 | */ | |
9 | ||
10 | #include "blockdev.h" | |
11 | #include "hw/block-common.h" | |
b7eb0c9f | 12 | #include "qemu-error.h" |
911525db MA |
13 | |
14 | void blkconf_serial(BlockConf *conf, char **serial) | |
15 | { | |
16 | DriveInfo *dinfo; | |
17 | ||
18 | if (!*serial) { | |
19 | /* try to fall back to value set with legacy -drive serial=... */ | |
20 | dinfo = drive_get_by_blockdev(conf->bs); | |
577d0a38 | 21 | if (dinfo->serial) { |
911525db MA |
22 | *serial = g_strdup(dinfo->serial); |
23 | } | |
24 | } | |
25 | } | |
b7eb0c9f MA |
26 | |
27 | int blkconf_geometry(BlockConf *conf, int *ptrans, | |
28 | unsigned cyls_max, unsigned heads_max, unsigned secs_max) | |
29 | { | |
30 | DriveInfo *dinfo; | |
31 | ||
32 | if (!conf->cyls && !conf->heads && !conf->secs) { | |
33 | /* try to fall back to value set with legacy -drive cyls=... */ | |
34 | dinfo = drive_get_by_blockdev(conf->bs); | |
35 | conf->cyls = dinfo->cyls; | |
36 | conf->heads = dinfo->heads; | |
37 | conf->secs = dinfo->secs; | |
38 | if (ptrans) { | |
39 | *ptrans = dinfo->trans; | |
40 | } | |
41 | } | |
42 | if (!conf->cyls && !conf->heads && !conf->secs) { | |
43 | hd_geometry_guess(conf->bs, | |
44 | &conf->cyls, &conf->heads, &conf->secs, | |
45 | ptrans); | |
46 | } else if (ptrans && *ptrans == BIOS_ATA_TRANSLATION_AUTO) { | |
47 | *ptrans = hd_bios_chs_auto_trans(conf->cyls, conf->heads, conf->secs); | |
48 | } | |
49 | if (conf->cyls || conf->heads || conf->secs) { | |
50 | if (conf->cyls < 1 || conf->cyls > cyls_max) { | |
51 | error_report("cyls must be between 1 and %u", cyls_max); | |
52 | return -1; | |
53 | } | |
54 | if (conf->heads < 1 || conf->heads > heads_max) { | |
55 | error_report("heads must be between 1 and %u", heads_max); | |
56 | return -1; | |
57 | } | |
58 | if (conf->secs < 1 || conf->secs > secs_max) { | |
59 | error_report("secs must be between 1 and %u", secs_max); | |
60 | return -1; | |
61 | } | |
62 | } | |
63 | return 0; | |
64 | } |