void blkconf_geometry(BlockConf *conf, int *ptrans,

                      unsigned cyls_max, unsigned heads_max, unsigned secs_max,

                      Error **errp)

{

    DriveInfo *dinfo;



    if (!conf->cyls && !conf->heads && !conf->secs) {

        /* try to fall back to value set with legacy -drive cyls=... */

        dinfo = drive_get_by_blockdev(conf->bs);

        conf->cyls  = dinfo->cyls;

        conf->heads = dinfo->heads;

        conf->secs  = dinfo->secs;

        if (ptrans) {

            *ptrans = dinfo->trans;

        }

    }

    if (!conf->cyls && !conf->heads && !conf->secs) {

        hd_geometry_guess(conf->bs,

                          &conf->cyls, &conf->heads, &conf->secs,

                          ptrans);

    } else if (ptrans && *ptrans == BIOS_ATA_TRANSLATION_AUTO) {

        *ptrans = hd_bios_chs_auto_trans(conf->cyls, conf->heads, conf->secs);

    }

    if (conf->cyls || conf->heads || conf->secs) {

        if (conf->cyls < 1 || conf->cyls > cyls_max) {

            error_setg(errp, "cyls must be between 1 and %u", cyls_max);

            return;

        }

        if (conf->heads < 1 || conf->heads > heads_max) {

            error_setg(errp, "heads must be between 1 and %u", heads_max);

            return;

        }

        if (conf->secs < 1 || conf->secs > secs_max) {

            error_setg(errp, "secs must be between 1 and %u", secs_max);

            return;

        }

    }

}

void blkconf_geometry(BlockConf *conf, int *ptrans,

                      unsigned cyls_max, unsigned heads_max, unsigned secs_max,

                      Error **errp)

{

    DriveInfo *dinfo;



    if (!conf->cyls && !conf->heads && !conf->secs) {

        

        dinfo = drive_get_by_blockdev(conf->bs);

        conf->cyls  = dinfo->cyls;

        conf->heads = dinfo->heads;

        conf->secs  = dinfo->secs;

        if (ptrans) {

            *ptrans = dinfo->trans;

        }

    }

    if (!conf->cyls && !conf->heads && !conf->secs) {

        hd_geometry_guess(conf->bs,

                          &conf->cyls, &conf->heads, &conf->secs,

                          ptrans);

    } else if (ptrans && *ptrans == BIOS_ATA_TRANSLATION_AUTO) {

        *ptrans = hd_bios_chs_auto_trans(conf->cyls, conf->heads, conf->secs);

    }

    if (conf->cyls || conf->heads || conf->secs) {

        if (conf->cyls < 1 || conf->cyls > cyls_max) {

            error_setg(errp, "cyls must be between 1 and %u", cyls_max);

            return;

        }

        if (conf->heads < 1 || conf->heads > heads_max) {

            error_setg(errp, "heads must be between 1 and %u", heads_max);

            return;

        }

        if (conf->secs < 1 || conf->secs > secs_max) {

            error_setg(errp, "secs must be between 1 and %u", secs_max);

            return;

        }

    }

}

void FUNC_0(BlockConf *VAR_0, int *VAR_1,

                      unsigned VAR_2, unsigned VAR_3, unsigned VAR_4,

                      Error **VAR_5)

{

    DriveInfo *dinfo;



    if (!VAR_0->cyls && !VAR_0->heads && !VAR_0->secs) {

        

        dinfo = drive_get_by_blockdev(VAR_0->bs);

        VAR_0->cyls  = dinfo->cyls;

        VAR_0->heads = dinfo->heads;

        VAR_0->secs  = dinfo->secs;

        if (VAR_1) {

            *VAR_1 = dinfo->trans;

        }

    }

    if (!VAR_0->cyls && !VAR_0->heads && !VAR_0->secs) {

        hd_geometry_guess(VAR_0->bs,

                          &VAR_0->cyls, &VAR_0->heads, &VAR_0->secs,

                          VAR_1);

    } else if (VAR_1 && *VAR_1 == BIOS_ATA_TRANSLATION_AUTO) {

        *VAR_1 = hd_bios_chs_auto_trans(VAR_0->cyls, VAR_0->heads, VAR_0->secs);

    }

    if (VAR_0->cyls || VAR_0->heads || VAR_0->secs) {

        if (VAR_0->cyls < 1 || VAR_0->cyls > VAR_2) {

            error_setg(VAR_5, "cyls must be between 1 and %u", VAR_2);

            return;

        }

        if (VAR_0->heads < 1 || VAR_0->heads > VAR_3) {

            error_setg(VAR_5, "heads must be between 1 and %u", VAR_3);

            return;

        }

        if (VAR_0->secs < 1 || VAR_0->secs > VAR_4) {

            error_setg(VAR_5, "secs must be between 1 and %u", VAR_4);

            return;

        }

    }

}

void FUNC_0(BlockConf *VAR_0, int *VAR_1,
unsigned VAR_2, unsigned VAR_3, unsigned VAR_4,
Error **VAR_5)
{ DriveInfo *dinfo; if (!VAR_0->cyls && !VAR_0->heads && !VAR_0->secs) { dinfo = drive_get_by_blockdev(VAR_0->bs); VAR_0->cyls  = dinfo->cyls; VAR_0->heads = dinfo->heads; VAR_0->secs  = dinfo->secs; if (VAR_1) { *VAR_1 = dinfo->trans; } } if (!VAR_0->cyls && !VAR_0->heads && !VAR_0->secs) { hd_geometry_guess(VAR_0->bs,
&VAR_0->cyls, &VAR_0->heads, &VAR_0->secs,
VAR_1); } else if (VAR_1 && *VAR_1 == BIOS_ATA_TRANSLATION_AUTO) { *VAR_1 = hd_bios_chs_auto_trans(VAR_0->cyls, VAR_0->heads, VAR_0->secs); } if (VAR_0->cyls || VAR_0->heads || VAR_0->secs) { if (VAR_0->cyls < 1 || VAR_0->cyls > VAR_2) { error_setg(VAR_5, "cyls must be between 1 and %u", VAR_2); return; } if (VAR_0->heads < 1 || VAR_0->heads > VAR_3) { error_setg(VAR_5, "heads must be between 1 and %u", VAR_3); return; } if (VAR_0->secs < 1 || VAR_0->secs > VAR_4) { error_setg(VAR_5, "secs must be between 1 and %u", VAR_4); return; } } }