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