磁盘挂载异常处理流程

xend
路径错误:(libvirt)

src\xen\xend_internal.c
static int
xenDaemonAttachDeviceFlags(virDomainPtr domain, const char *xml,
                           unsigned int flags)
{
    case VIR_DOMAIN_DEVICE_DISK:
         
        /* modify by w00171884 2011.08.06
         * reason:add disk path checking
         */
        disk = dev->data.disk;
        if (access(disk->src, F_OK) != 0)
        {
            virXendError(VIR_ERR_INVALID_ARG,
                     _("%s is not exist"), disk->src);
            ret = -1;
            goto cleanup;
        }

格式错误:(libvirt)
#0  virXMLParseHelper (domcode=20, filename=0x0,
    xmlStr=0x7ffff403fe20 "    <dis type='file' device='disk'>\n      <driver name='file'/>\n      <source file='/home
/sdb/wyf/disk1G'/>\n      <target dev='xvdb' bus='xen'/>\n    </disk>\n\n\n",
    url=0x7ffff795740c "(device_definition)", ctxt=0x7ffff403fa28) at util/xml.c:827
#1  0x00007ffff7838e7a in virDomainDeviceDefParse (caps=0x675810, def=0x678c90,
    xmlStr=0x7ffff403fe20 "    <dis type='file' device='disk'>\n      <driver name='file'/>\n      <source file='/home
/sdb/wyf/disk1G'/>\n      <target dev='xvdb' bus='xen'/>\n    </disk>\n\n\n", flags=2) at conf/domain_conf.c:6749
#2  0x00007ffff791b4b5 in xenDaemonAttachDeviceFlags (domain=0x6761b0,
    xml=0x7ffff403fe20 "    <dis type='file' device='disk'>\n      <driver name='file'/>\n      <source file='/home/sd


xmlDocPtr
virXMLParseHelper(int domcode,
                  const char *filename,
                  const char *xmlStr,
                  const char *url,
                  xmlXPathContextPtr *ctxt)
{
    if (filename) {
        xml = xmlCtxtReadFile(pctxt, filename, NULL,
                              XML_PARSE_NOENT | XML_PARSE_NONET |
                              XML_PARSE_NOWARNING);
    } else {
        xml = xmlCtxtReadDoc(pctxt, BAD_CAST xmlStr, url, NULL,
                             XML_PARSE_NOENT | XML_PARSE_NONET |
                             XML_PARSE_NOWARNING);
}
    if (!xml)
        goto error;

xmlCtxtReadDoc配置文件解析函数,查出格式错误。

同名设备错误:(xend)

  /usr/lib64/python2.6/site-packages/xen/xend/Args.py(166)__call__()
-> return self.call_with_form_args(self.fn, fargs, xargs=xargs)
  /usr/lib64/python2.6/site-packages/xen/xend/Args.py(138)call_with_form_args()
-> return fn(*params, **keys)
  /usr/lib64/python2.6/site-packages/xen/xend/XendDomainInfo.py(1175)device_create()
-> dev_uuid = self.info.device_add(dev_type, cfg_sxp = dev_config)
  /usr/lib64/python2.6/site-packages/xen/xend/XendConfig.py(1673)device_add()
-> ret_uuid = self.device_duplicate_check(dev_type, dev_info, target, config)
> /usr/lib64/python2.6/site-packages/xen/xend/XendConfig.py(1486)device_duplicate_check()
-> raise XendConfigError('The device "%s" is already defined' %
device_create –> device_add -> device_duplicate_check

                                merge_sxp = sxp.from_string("('vbd' ('uname' ''))")
                            else:
                                merge_sxp = config

                            dev_uuid = sxp.child_value(o_dev_info, 'uuid')
                            if dev_uuid != None and \
                               self.device_update(dev_uuid, cfg_sxp = merge_sxp):
                                return dev_uuid

                        raise XendConfigError('The device "%s" is already defined' %
                                              blkdev_name)

xenlight
路径错误:(xenlight)

#0  libxlDomainAttachDeviceFlags (dom=0x7eece0,
    xml=0x7eedc0 "    <disk type='block' device='disk'>\n      <driver name='phy'/>\n      <source dev='/dev/mappe/wyf
-8'/>\n      <target dev='xvdb' bus='xen'/>\n    </disk>\n\n\n", flags=1) at libxl/libxl_driver.c:3787
#1  0x00000000004dc2af in libxlDomainAttachDevice (dom=0x7eece0,
    xml=0x7eedc0 "    <disk type='block' device='disk'>\n      <driver name='phy'/>\n      <source dev='/dev/mappe/wyf
-8'/>\n      <target dev='xvdb' bus='xen'/>\n    </disk>\n\n\n") at libxl/libxl_driver.c:3794
#2  0x00007f81cb667a4f in virDomainAttachDevice (domain=0x7eece0,
    xml=0x7eedc0 "    <disk type='block' device='disk'>\n      <driver name='phy'/>\n      <source dev='/dev/mappe/wyf
-8'/>\n      <target dev='xvdb' bus='xen'/>\n    </disk>\n\n\n") at libvirt.c:9978
#3  0x0000000000448977 in remoteDispatchDomainAttachDevice (server=0x7b7710, client=0x7f81bc000c60,
    msg=0x7f81bc0673f0, rerr=0x7f81c5d9aba0, args=0x7eed20) at remote_dispatch.h:320
#4  0x0000000000448a64 in remoteDispatchDomainAttachDeviceHelper (server=0x7b7710, client=0x7f81bc000c60,
    msg=0x7f81bc0673f0, rerr=0x7f81c5d9aba0, args=0x7eed20, ret=0x7eec50) at remote_dispatch.h:298
#5  0x00007f81cb6ca61a in virNetServerProgramDispatchCall (prog=0x7c27a0, server=0x7b7710, client=0x7f81bc000c60,
    msg=0x7f81bc0673f0) at rpc/virnetserverprogram.c:416
#6  0x00007f81cb6caa50 in virNetServerProgramDispatch (prog=0x7c27a0, server=0x7b7710, client=0x7f81bc000c60,
    msg=0x7f81bc0673f0) at rpc/virnetserverprogram.c:289

->libxlDomainModifyDeviceFlags

libxlDomainModifyDeviceFlags -> libxlDomainAttachDeviceLive -> libxlDomainAttachDeviceDiskLive -> libxl_device_disk_add -> validate_virtual_disk

static int validate_virtual_disk(libxl_ctx *ctx, char *file_name,
    libxl_device_disk *disk)
{
    struct stat stat_buf;
    char *delimiter;

    if (disk->format == DISK_FORMAT_EMPTY)
        return 0;

    if (disk->format == DISK_FORMAT_RAW) {
        delimiter = strchr(file_name, ':');
        if (delimiter) {
            if (!strncmp(file_name, "vhd:", sizeof("vhd:")-1)) {
                disk->format = DISK_FORMAT_VHD;
                file_name = ++delimiter;
            }
        }
    }

    if ( stat(file_name, &stat_buf) != 0 ) {
        LIBXL__LOG_ERRNO(ctx, LIBXL__LOG_ERROR, "failed to stat %s", file_name);
        return ERROR_INVAL;
    }

格式错误:(libvirt)

同xend


同名设备错误:(libvirt)

#0  libxlDomainAttachDeviceDiskLive (priv=0x7fb4f0, vm=0x7fb2f0, dev=0x780110) at libxl/libxl_driver.c:3417
#1  0x00000000004d77d8 in libxlDomainAttachDeviceLive (priv=0x7fb4f0, vm=0x7fb2f0, dev=0x780110)
    at libxl/libxl_driver.c:3483
#2  0x00000000004dc022 in libxlDomainModifyDeviceFlags (dom=0x7f69b0,
    xml=0x7f6a90 "    <disk type='block' device='disk'>\n      <driver name='phy'/>\n      <source dev='/dev/mapper/wy
f-8'/>\n      <target dev='xvda' bus='xen'/>\n    </disk>\n\n\n", flags=1, action=0) at libxl/libxl_driver.c:3746
#3  0x00000000004dc268 in libxlDomainAttachDeviceFlags (dom=0x7f69b0,
    xml=0x7f6a90 "    <disk type='block' device='disk'>\n      <driver name='phy'/>\n      <source dev='/dev/mapper/wy
f-8'/>\n      <target dev='xvda' bus='xen'/>\n    </disk>\n\n\n", flags=1) at libxl/libxl_driver.c:3788


static int
libxlDomainAttachDeviceDiskLive(libxlDomainObjPrivatePtr priv,
                                virDomainObjPtr vm, virDomainDeviceDefPtr dev)
{
    virDomainDiskDefPtr l_disk = dev->data.disk;
    libxl_device_disk x_disk;
    int ret = -1;

    switch (l_disk->device)  {
        case VIR_DOMAIN_DISK_DEVICE_CDROM:
            ret = libxlDomainChangeEjectableMedia(priv, vm, l_disk);
            break;
        case VIR_DOMAIN_DISK_DEVICE_DISK:
            if (l_disk->bus == VIR_DOMAIN_DISK_BUS_XEN) {
                if (virDomainDiskIndexByName(vm->def, l_disk->dst, true) >= 0) {
                    libxlError(VIR_ERR_OPERATION_FAILED,
                            _("target %s already exists"), l_disk->dst);
                    goto cleanup;
                }

xvd格式不对

static int
libxlDomainAttachDeviceDiskLive(libxlDomainObjPrivatePtr priv,
                                virDomainObjPtr vm, virDomainDeviceDefPtr dev)
{
    switch (l_disk->device)  {
        case VIR_DOMAIN_DISK_DEVICE_DISK:
            if (l_disk->bus == VIR_DOMAIN_DISK_BUS_XEN) {
                if (virDomainDiskIndexByName(vm->def, l_disk->dst, true) >= 0) {
                    libxlError(VIR_ERR_OPERATION_FAILED,
                            _("target %s already exists"), l_disk->dst);
                    goto cleanup;
                }
                //TO DO

 

libxlDomainModifyDeviceFlags
virDomainDeviceDefParse

    if (xmlStrEqual(node->name, BAD_CAST "disk")) {
        dev->type = VIR_DOMAIN_DEVICE_DISK;
        if (!(dev->data.disk = virDomainDiskDefParseXML(caps, node, ctxt,
                                                        NULL, &def->seclabel, flags)))
            goto error;

virDomainDiskDefParseXML

static virDomainDiskDefPtr
virDomainDiskDefParseXML(virCapsPtr caps,
{
    if ((def->device == VIR_DOMAIN_DISK_DEVICE_DISK ||
         def->device == VIR_DOMAIN_DISK_DEVICE_LUN) &&
        !STRPREFIX((const char *)target, "hd") &&
        !STRPREFIX((const char *)target, "sd") &&
        !STRPREFIX((const char *)target, "vd") &&
        !STRPREFIX((const char *)target, "xvd") &&
        !STRPREFIX((const char *)target, "ubd")) {
        virDomainReportError(VIR_ERR_INTERNAL_ERROR,
                             _("Invalid harddisk device name: %s"), target);
        goto error;
    }

 

2013年5月23日上传

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值