Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
libvirt
提交
dec6d9df
L
libvirt
项目概览
openeuler
/
libvirt
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
libvirt
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
dec6d9df
编写于
3月 02, 2017
作者:
J
John Ferlan
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
nodedev: Reduce virNodeDevCapDataPtr usage
Replace with more data specific pointer types.
上级
a6c3382e
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
282 addition
and
276 deletion
+282
-276
src/conf/node_device_conf.c
src/conf/node_device_conf.c
+113
-108
src/node_device/node_device_driver.c
src/node_device/node_device_driver.c
+3
-3
src/node_device/node_device_hal.c
src/node_device/node_device_hal.c
+2
-2
src/node_device/node_device_linux_sysfs.c
src/node_device/node_device_linux_sysfs.c
+67
-67
src/node_device/node_device_linux_sysfs.h
src/node_device/node_device_linux_sysfs.h
+2
-2
src/node_device/node_device_udev.c
src/node_device/node_device_udev.c
+95
-94
未找到文件。
src/conf/node_device_conf.c
浏览文件 @
dec6d9df
...
...
@@ -582,7 +582,7 @@ static int
virNodeDevCapDRMParseXML
(
xmlXPathContextPtr
ctxt
,
virNodeDeviceDefPtr
def
,
xmlNodePtr
node
,
virNodeDevCapD
ataPtr
data
)
virNodeDevCapD
RMPtr
drm
)
{
xmlNodePtr
orignode
;
int
ret
=
-
1
,
val
;
...
...
@@ -598,7 +598,7 @@ virNodeDevCapDRMParseXML(xmlXPathContextPtr ctxt,
_
(
"unknown drm type '%s' for '%s'"
),
type
,
def
->
name
);
goto
out
;
}
d
ata
->
drm
.
type
=
val
;
d
rm
->
type
=
val
;
ret
=
0
;
...
...
@@ -613,7 +613,7 @@ static int
virNodeDevCapStorageParseXML
(
xmlXPathContextPtr
ctxt
,
virNodeDeviceDefPtr
def
,
xmlNodePtr
node
,
virNodeDevCap
DataPtr
data
)
virNodeDevCap
StoragePtr
storage
)
{
xmlNodePtr
orignode
,
*
nodes
=
NULL
;
size_t
i
;
...
...
@@ -623,19 +623,19 @@ virNodeDevCapStorageParseXML(xmlXPathContextPtr ctxt,
orignode
=
ctxt
->
node
;
ctxt
->
node
=
node
;
data
->
storage
.
block
=
virXPathString
(
"string(./block[1])"
,
ctxt
);
if
(
!
data
->
storage
.
block
)
{
storage
->
block
=
virXPathString
(
"string(./block[1])"
,
ctxt
);
if
(
!
storage
->
block
)
{
virReportError
(
VIR_ERR_INTERNAL_ERROR
,
_
(
"no block device path supplied for '%s'"
),
def
->
name
);
goto
out
;
}
data
->
storage
.
bus
=
virXPathString
(
"string(./bus[1])"
,
ctxt
);
data
->
storage
.
drive_type
=
virXPathString
(
"string(./drive_type[1])"
,
ctxt
);
data
->
storage
.
model
=
virXPathString
(
"string(./model[1])"
,
ctxt
);
data
->
storage
.
vendor
=
virXPathString
(
"string(./vendor[1])"
,
ctxt
);
data
->
storage
.
serial
=
virXPathString
(
"string(./serial[1])"
,
ctxt
);
storage
->
bus
=
virXPathString
(
"string(./bus[1])"
,
ctxt
);
storage
->
drive_type
=
virXPathString
(
"string(./drive_type[1])"
,
ctxt
);
storage
->
model
=
virXPathString
(
"string(./model[1])"
,
ctxt
);
storage
->
vendor
=
virXPathString
(
"string(./vendor[1])"
,
ctxt
);
storage
->
serial
=
virXPathString
(
"string(./serial[1])"
,
ctxt
);
if
((
n
=
virXPathNodeSet
(
"./capability"
,
ctxt
,
&
nodes
))
<
0
)
goto
out
;
...
...
@@ -651,19 +651,19 @@ virNodeDevCapStorageParseXML(xmlXPathContextPtr ctxt,
}
if
(
STREQ
(
type
,
"hotpluggable"
))
{
data
->
storage
.
flags
|=
VIR_NODE_DEV_CAP_STORAGE_HOTPLUGGABLE
;
storage
->
flags
|=
VIR_NODE_DEV_CAP_STORAGE_HOTPLUGGABLE
;
}
else
if
(
STREQ
(
type
,
"removable"
))
{
xmlNodePtr
orignode2
;
data
->
storage
.
flags
|=
VIR_NODE_DEV_CAP_STORAGE_REMOVABLE
;
storage
->
flags
|=
VIR_NODE_DEV_CAP_STORAGE_REMOVABLE
;
orignode2
=
ctxt
->
node
;
ctxt
->
node
=
nodes
[
i
];
if
(
virXPathBoolean
(
"count(./media_available[. = '1']) > 0"
,
ctxt
))
data
->
storage
.
flags
|=
VIR_NODE_DEV_CAP_STORAGE_REMOVABLE_MEDIA_AVAILABLE
;
storage
->
flags
|=
VIR_NODE_DEV_CAP_STORAGE_REMOVABLE_MEDIA_AVAILABLE
;
data
->
storage
.
media_label
=
virXPathString
(
"string(./media_label[1])"
,
ctxt
);
storage
->
media_label
=
virXPathString
(
"string(./media_label[1])"
,
ctxt
);
val
=
0
;
if
(
virNodeDevCapsDefParseULongLong
(
"number(./media_size[1])"
,
ctxt
,
&
val
,
def
,
...
...
@@ -673,7 +673,7 @@ virNodeDevCapStorageParseXML(xmlXPathContextPtr ctxt,
VIR_FREE
(
type
);
goto
out
;
}
data
->
storage
.
removable_media_size
=
val
;
storage
->
removable_media_size
=
val
;
ctxt
->
node
=
orignode2
;
}
else
{
...
...
@@ -687,13 +687,13 @@ virNodeDevCapStorageParseXML(xmlXPathContextPtr ctxt,
VIR_FREE
(
type
);
}
if
(
!
(
data
->
storage
.
flags
&
VIR_NODE_DEV_CAP_STORAGE_REMOVABLE
))
{
if
(
!
(
storage
->
flags
&
VIR_NODE_DEV_CAP_STORAGE_REMOVABLE
))
{
val
=
0
;
if
(
virNodeDevCapsDefParseULongLong
(
"number(./size[1])"
,
ctxt
,
&
val
,
def
,
_
(
"no size supplied for '%s'"
),
_
(
"invalid size supplied for '%s'"
))
<
0
)
goto
out
;
data
->
storage
.
size
=
val
;
storage
->
size
=
val
;
}
ret
=
0
;
...
...
@@ -708,7 +708,7 @@ static int
virNodeDevCapSCSIParseXML
(
xmlXPathContextPtr
ctxt
,
virNodeDeviceDefPtr
def
,
xmlNodePtr
node
,
virNodeDevCap
DataPtr
data
)
virNodeDevCap
SCSIPtr
scsi
)
{
xmlNodePtr
orignode
;
int
ret
=
-
1
;
...
...
@@ -717,30 +717,30 @@ virNodeDevCapSCSIParseXML(xmlXPathContextPtr ctxt,
ctxt
->
node
=
node
;
if
(
virNodeDevCapsDefParseULong
(
"number(./host[1])"
,
ctxt
,
&
data
->
scsi
.
host
,
def
,
&
scsi
->
host
,
def
,
_
(
"no SCSI host ID supplied for '%s'"
),
_
(
"invalid SCSI host ID supplied for '%s'"
))
<
0
)
goto
out
;
if
(
virNodeDevCapsDefParseULong
(
"number(./bus[1])"
,
ctxt
,
&
data
->
scsi
.
bus
,
def
,
&
scsi
->
bus
,
def
,
_
(
"no SCSI bus ID supplied for '%s'"
),
_
(
"invalid SCSI bus ID supplied for '%s'"
))
<
0
)
goto
out
;
if
(
virNodeDevCapsDefParseULong
(
"number(./target[1])"
,
ctxt
,
&
data
->
scsi
.
target
,
def
,
&
scsi
->
target
,
def
,
_
(
"no SCSI target ID supplied for '%s'"
),
_
(
"invalid SCSI target ID supplied for '%s'"
))
<
0
)
goto
out
;
if
(
virNodeDevCapsDefParseULong
(
"number(./lun[1])"
,
ctxt
,
&
data
->
scsi
.
lun
,
def
,
&
scsi
->
lun
,
def
,
_
(
"no SCSI LUN ID supplied for '%s'"
),
_
(
"invalid SCSI LUN ID supplied for '%s'"
))
<
0
)
goto
out
;
data
->
scsi
.
type
=
virXPathString
(
"string(./type[1])"
,
ctxt
);
scsi
->
type
=
virXPathString
(
"string(./type[1])"
,
ctxt
);
ret
=
0
;
out:
...
...
@@ -753,7 +753,7 @@ static int
virNodeDevCapSCSITargetParseXML
(
xmlXPathContextPtr
ctxt
,
virNodeDeviceDefPtr
def
,
xmlNodePtr
node
,
virNodeDevCap
DataPtr
data
)
virNodeDevCap
SCSITargetPtr
scsi_target
)
{
xmlNodePtr
orignode
;
int
ret
=
-
1
;
...
...
@@ -761,8 +761,8 @@ virNodeDevCapSCSITargetParseXML(xmlXPathContextPtr ctxt,
orignode
=
ctxt
->
node
;
ctxt
->
node
=
node
;
data
->
scsi_target
.
name
=
virXPathString
(
"string(./target[1])"
,
ctxt
);
if
(
!
data
->
scsi_target
.
name
)
{
scsi_target
->
name
=
virXPathString
(
"string(./target[1])"
,
ctxt
);
if
(
!
scsi_target
->
name
)
{
virReportError
(
VIR_ERR_INTERNAL_ERROR
,
_
(
"no target name supplied for '%s'"
),
def
->
name
);
...
...
@@ -781,7 +781,7 @@ static int
virNodeDevCapSCSIHostParseXML
(
xmlXPathContextPtr
ctxt
,
virNodeDeviceDefPtr
def
,
xmlNodePtr
node
,
virNodeDevCap
DataPtr
data
,
virNodeDevCap
SCSIHostPtr
scsi_host
,
int
create
,
const
char
*
virt_type
)
{
...
...
@@ -795,15 +795,15 @@ virNodeDevCapSCSIHostParseXML(xmlXPathContextPtr ctxt,
if
(
create
==
EXISTING_DEVICE
)
{
if
(
virNodeDevCapsDefParseULong
(
"number(./host[1])"
,
ctxt
,
&
data
->
scsi_host
.
host
,
def
,
&
scsi_host
->
host
,
def
,
_
(
"no SCSI host ID supplied for '%s'"
),
_
(
"invalid SCSI host ID supplied for '%s'"
))
<
0
)
{
goto
out
;
}
/* Optional unique_id value */
data
->
scsi_host
.
unique_id
=
-
1
;
scsi_host
->
unique_id
=
-
1
;
if
(
virNodeDevCapsDefParseIntOptional
(
"number(./unique_id[1])"
,
ctxt
,
&
data
->
scsi_host
.
unique_id
,
def
,
&
scsi_host
->
unique_id
,
def
,
_
(
"invalid unique_id supplied for '%s'"
))
<
0
)
{
goto
out
;
}
...
...
@@ -824,21 +824,21 @@ virNodeDevCapSCSIHostParseXML(xmlXPathContextPtr ctxt,
if
(
STREQ
(
type
,
"vport_ops"
))
{
data
->
scsi_host
.
flags
|=
VIR_NODE_DEV_CAP_FLAG_HBA_VPORT_OPS
;
scsi_host
->
flags
|=
VIR_NODE_DEV_CAP_FLAG_HBA_VPORT_OPS
;
}
else
if
(
STREQ
(
type
,
"fc_host"
))
{
xmlNodePtr
orignode2
;
data
->
scsi_host
.
flags
|=
VIR_NODE_DEV_CAP_FLAG_HBA_FC_HOST
;
scsi_host
->
flags
|=
VIR_NODE_DEV_CAP_FLAG_HBA_FC_HOST
;
orignode2
=
ctxt
->
node
;
ctxt
->
node
=
nodes
[
i
];
if
(
virNodeDevCapsDefParseString
(
"string(./wwnn[1])"
,
ctxt
,
&
data
->
scsi_host
.
wwnn
)
<
0
)
{
if
(
virRandomGenerateWWN
(
&
data
->
scsi_host
.
wwnn
,
virt_type
)
<
0
)
{
&
scsi_host
->
wwnn
)
<
0
)
{
if
(
virRandomGenerateWWN
(
&
scsi_host
->
wwnn
,
virt_type
)
<
0
)
{
virReportError
(
VIR_ERR_INTERNAL_ERROR
,
_
(
"no WWNN supplied for '%s', and "
"auto-generation failed"
),
...
...
@@ -849,8 +849,8 @@ virNodeDevCapSCSIHostParseXML(xmlXPathContextPtr ctxt,
if
(
virNodeDevCapsDefParseString
(
"string(./wwpn[1])"
,
ctxt
,
&
data
->
scsi_host
.
wwpn
)
<
0
)
{
if
(
virRandomGenerateWWN
(
&
data
->
scsi_host
.
wwpn
,
virt_type
)
<
0
)
{
&
scsi_host
->
wwpn
)
<
0
)
{
if
(
virRandomGenerateWWN
(
&
scsi_host
->
wwpn
,
virt_type
)
<
0
)
{
virReportError
(
VIR_ERR_INTERNAL_ERROR
,
_
(
"no WWPN supplied for '%s', and "
"auto-generation failed"
),
...
...
@@ -861,7 +861,7 @@ virNodeDevCapSCSIHostParseXML(xmlXPathContextPtr ctxt,
if
(
virNodeDevCapsDefParseString
(
"string(./fabric_wwn[1])"
,
ctxt
,
&
data
->
scsi_host
.
fabric_wwn
)
<
0
)
&
scsi_host
->
fabric_wwn
)
<
0
)
VIR_DEBUG
(
"No fabric_wwn defined for '%s'"
,
def
->
name
);
ctxt
->
node
=
orignode2
;
...
...
@@ -890,7 +890,7 @@ static int
virNodeDevCapNetParseXML
(
xmlXPathContextPtr
ctxt
,
virNodeDeviceDefPtr
def
,
xmlNodePtr
node
,
virNodeDevCap
DataPtr
data
)
virNodeDevCap
NetPtr
net
)
{
xmlNodePtr
orignode
,
lnk
;
size_t
i
=
-
1
;
...
...
@@ -901,21 +901,21 @@ virNodeDevCapNetParseXML(xmlXPathContextPtr ctxt,
orignode
=
ctxt
->
node
;
ctxt
->
node
=
node
;
data
->
net
.
ifname
=
virXPathString
(
"string(./interface[1])"
,
ctxt
);
if
(
!
data
->
net
.
ifname
)
{
net
->
ifname
=
virXPathString
(
"string(./interface[1])"
,
ctxt
);
if
(
!
net
->
ifname
)
{
virReportError
(
VIR_ERR_INTERNAL_ERROR
,
_
(
"no network interface supplied for '%s'"
),
def
->
name
);
goto
out
;
}
data
->
net
.
address
=
virXPathString
(
"string(./address[1])"
,
ctxt
);
net
->
address
=
virXPathString
(
"string(./address[1])"
,
ctxt
);
if
((
n
=
virXPathNodeSet
(
"./feature"
,
ctxt
,
&
nodes
))
<
0
)
goto
out
;
if
(
n
>
0
)
{
if
(
!
(
data
->
net
.
features
=
virBitmapNew
(
VIR_NET_DEV_FEAT_LAST
)))
if
(
!
(
net
->
features
=
virBitmapNew
(
VIR_NET_DEV_FEAT_LAST
)))
goto
out
;
}
...
...
@@ -933,11 +933,11 @@ virNodeDevCapNetParseXML(xmlXPathContextPtr ctxt,
tmp
);
goto
out
;
}
ignore_value
(
virBitmapSetBit
(
data
->
net
.
features
,
val
));
ignore_value
(
virBitmapSetBit
(
net
->
features
,
val
));
VIR_FREE
(
tmp
);
}
data
->
net
.
subtype
=
VIR_NODE_DEV_CAP_NET_LAST
;
net
->
subtype
=
VIR_NODE_DEV_CAP_NET_LAST
;
tmp
=
virXPathString
(
"string(./capability/@type)"
,
ctxt
);
if
(
tmp
)
{
...
...
@@ -949,11 +949,11 @@ virNodeDevCapNetParseXML(xmlXPathContextPtr ctxt,
def
->
name
);
goto
out
;
}
data
->
net
.
subtype
=
val
;
net
->
subtype
=
val
;
}
lnk
=
virXPathNode
(
"./link"
,
ctxt
);
if
(
lnk
&&
virInterfaceLinkParseXML
(
lnk
,
&
data
->
net
.
lnk
)
<
0
)
if
(
lnk
&&
virInterfaceLinkParseXML
(
lnk
,
&
net
->
lnk
)
<
0
)
goto
out
;
ret
=
0
;
...
...
@@ -969,7 +969,7 @@ static int
virNodeDevCapUSBInterfaceParseXML
(
xmlXPathContextPtr
ctxt
,
virNodeDeviceDefPtr
def
,
xmlNodePtr
node
,
virNodeDevCap
DataPtr
data
)
virNodeDevCap
USBIfPtr
usb_if
)
{
xmlNodePtr
orignode
;
int
ret
=
-
1
;
...
...
@@ -978,30 +978,30 @@ virNodeDevCapUSBInterfaceParseXML(xmlXPathContextPtr ctxt,
ctxt
->
node
=
node
;
if
(
virNodeDevCapsDefParseULong
(
"number(./number[1])"
,
ctxt
,
&
data
->
usb_if
.
number
,
def
,
&
usb_if
->
number
,
def
,
_
(
"no USB interface number supplied for '%s'"
),
_
(
"invalid USB interface number supplied for '%s'"
))
<
0
)
goto
out
;
if
(
virNodeDevCapsDefParseULong
(
"number(./class[1])"
,
ctxt
,
&
data
->
usb_if
.
_class
,
def
,
&
usb_if
->
_class
,
def
,
_
(
"no USB interface class supplied for '%s'"
),
_
(
"invalid USB interface class supplied for '%s'"
))
<
0
)
goto
out
;
if
(
virNodeDevCapsDefParseULong
(
"number(./subclass[1])"
,
ctxt
,
&
data
->
usb_if
.
subclass
,
def
,
&
usb_if
->
subclass
,
def
,
_
(
"no USB interface subclass supplied for '%s'"
),
_
(
"invalid USB interface subclass supplied for '%s'"
))
<
0
)
goto
out
;
if
(
virNodeDevCapsDefParseULong
(
"number(./protocol[1])"
,
ctxt
,
&
data
->
usb_if
.
protocol
,
def
,
&
usb_if
->
protocol
,
def
,
_
(
"no USB interface protocol supplied for '%s'"
),
_
(
"invalid USB interface protocol supplied for '%s'"
))
<
0
)
goto
out
;
data
->
usb_if
.
description
=
virXPathString
(
"string(./description[1])"
,
ctxt
);
usb_if
->
description
=
virXPathString
(
"string(./description[1])"
,
ctxt
);
ret
=
0
;
out:
...
...
@@ -1038,7 +1038,7 @@ static int
virNodeDevCapUSBDevParseXML
(
xmlXPathContextPtr
ctxt
,
virNodeDeviceDefPtr
def
,
xmlNodePtr
node
,
virNodeDevCap
DataPtr
data
)
virNodeDevCap
USBDevPtr
usb_dev
)
{
xmlNodePtr
orignode
;
int
ret
=
-
1
;
...
...
@@ -1047,31 +1047,31 @@ virNodeDevCapUSBDevParseXML(xmlXPathContextPtr ctxt,
ctxt
->
node
=
node
;
if
(
virNodeDevCapsDefParseULong
(
"number(./bus[1])"
,
ctxt
,
&
data
->
usb_dev
.
bus
,
def
,
&
usb_dev
->
bus
,
def
,
_
(
"no USB bus number supplied for '%s'"
),
_
(
"invalid USB bus number supplied for '%s'"
))
<
0
)
goto
out
;
if
(
virNodeDevCapsDefParseULong
(
"number(./device[1])"
,
ctxt
,
&
data
->
usb_dev
.
device
,
def
,
&
usb_dev
->
device
,
def
,
_
(
"no USB device number supplied for '%s'"
),
_
(
"invalid USB device number supplied for '%s'"
))
<
0
)
goto
out
;
if
(
virNodeDevCapsDefParseHexId
(
"string(./vendor[1]/@id)"
,
ctxt
,
&
data
->
usb_dev
.
vendor
,
def
,
&
usb_dev
->
vendor
,
def
,
_
(
"no USB vendor ID supplied for '%s'"
),
_
(
"invalid USB vendor ID supplied for '%s'"
))
<
0
)
goto
out
;
if
(
virNodeDevCapsDefParseHexId
(
"string(./product[1]/@id)"
,
ctxt
,
&
data
->
usb_dev
.
product
,
def
,
&
usb_dev
->
product
,
def
,
_
(
"no USB product ID supplied for '%s'"
),
_
(
"invalid USB product ID supplied for '%s'"
))
<
0
)
goto
out
;
data
->
usb_dev
.
vendor_name
=
virXPathString
(
"string(./vendor[1])"
,
ctxt
);
data
->
usb_dev
.
product_name
=
virXPathString
(
"string(./product[1])"
,
ctxt
);
usb_dev
->
vendor_name
=
virXPathString
(
"string(./vendor[1])"
,
ctxt
);
usb_dev
->
product_name
=
virXPathString
(
"string(./product[1])"
,
ctxt
);
ret
=
0
;
out:
...
...
@@ -1083,7 +1083,7 @@ virNodeDevCapUSBDevParseXML(xmlXPathContextPtr ctxt,
static
int
virNodeDevCapPCIDevIommuGroupParseXML
(
xmlXPathContextPtr
ctxt
,
xmlNodePtr
iommuGroupNode
,
virNodeDevCap
DataPtr
data
)
virNodeDevCap
PCIDevPtr
pci_dev
)
{
xmlNodePtr
origNode
=
ctxt
->
node
;
xmlNodePtr
*
addrNodes
=
NULL
;
...
...
@@ -1101,7 +1101,7 @@ virNodeDevCapPCIDevIommuGroupParseXML(xmlXPathContextPtr ctxt,
goto
cleanup
;
}
if
(
virStrToLong_ui
(
numberStr
,
NULL
,
10
,
&
data
->
pci_dev
.
iommuGroupNumber
)
<
0
)
{
&
pci_dev
->
iommuGroupNumber
)
<
0
)
{
virReportError
(
VIR_ERR_XML_ERROR
,
_
(
"invalid iommuGroup number attribute '%s'"
),
numberStr
);
...
...
@@ -1121,8 +1121,8 @@ virNodeDevCapPCIDevIommuGroupParseXML(xmlXPathContextPtr ctxt,
pciAddr
->
bus
=
addr
.
bus
;
pciAddr
->
slot
=
addr
.
slot
;
pciAddr
->
function
=
addr
.
function
;
if
(
VIR_APPEND_ELEMENT
(
data
->
pci_dev
.
iommuGroupDevices
,
data
->
pci_dev
.
nIommuGroupDevices
,
if
(
VIR_APPEND_ELEMENT
(
pci_dev
->
iommuGroupDevices
,
pci_dev
->
nIommuGroupDevices
,
pciAddr
)
<
0
)
goto
cleanup
;
}
...
...
@@ -1222,7 +1222,7 @@ virPCIEDeviceInfoParseXML(xmlXPathContextPtr ctxt,
static
int
virNodeDevPCICapabilityParseXML
(
xmlXPathContextPtr
ctxt
,
xmlNodePtr
node
,
virNodeDevCap
DataPtr
data
)
virNodeDevCap
PCIDevPtr
pci_dev
)
{
char
*
maxFuncsStr
=
virXMLPropString
(
node
,
"maxCount"
);
char
*
type
=
virXMLPropString
(
node
,
"type"
);
...
...
@@ -1241,7 +1241,7 @@ virNodeDevPCICapabilityParseXML(xmlXPathContextPtr ctxt,
if
(
STREQ
(
type
,
"phys_function"
))
{
xmlNodePtr
address
=
virXPathNode
(
"./address[1]"
,
ctxt
);
if
(
VIR_ALLOC
(
data
->
pci_dev
.
physical_function
)
<
0
)
if
(
VIR_ALLOC
(
pci_dev
->
physical_function
)
<
0
)
goto
out
;
if
(
!
address
)
{
...
...
@@ -1251,10 +1251,10 @@ virNodeDevPCICapabilityParseXML(xmlXPathContextPtr ctxt,
}
if
(
virPCIDeviceAddressParseXML
(
address
,
data
->
pci_dev
.
physical_function
)
<
0
)
pci_dev
->
physical_function
)
<
0
)
goto
out
;
data
->
pci_dev
.
flags
|=
VIR_NODE_DEV_CAP_FLAG_PCI_PHYSICAL_FUNCTION
;
pci_dev
->
flags
|=
VIR_NODE_DEV_CAP_FLAG_PCI_PHYSICAL_FUNCTION
;
}
else
if
(
STREQ
(
type
,
"virt_functions"
))
{
int
naddresses
;
...
...
@@ -1263,13 +1263,13 @@ virNodeDevPCICapabilityParseXML(xmlXPathContextPtr ctxt,
if
(
maxFuncsStr
&&
virStrToLong_uip
(
maxFuncsStr
,
NULL
,
10
,
&
data
->
pci_dev
.
max_virtual_functions
)
<
0
)
{
&
pci_dev
->
max_virtual_functions
)
<
0
)
{
virReportError
(
VIR_ERR_XML_ERROR
,
"%s"
,
_
(
"Malformed 'maxCount' parameter"
));
goto
out
;
}
if
(
VIR_ALLOC_N
(
data
->
pci_dev
.
virtual_functions
,
naddresses
)
<
0
)
if
(
VIR_ALLOC_N
(
pci_dev
->
virtual_functions
,
naddresses
)
<
0
)
goto
out
;
for
(
i
=
0
;
i
<
naddresses
;
i
++
)
{
...
...
@@ -1283,18 +1283,18 @@ virNodeDevPCICapabilityParseXML(xmlXPathContextPtr ctxt,
goto
out
;
}
if
(
VIR_APPEND_ELEMENT
(
data
->
pci_dev
.
virtual_functions
,
data
->
pci_dev
.
num_virtual_functions
,
if
(
VIR_APPEND_ELEMENT
(
pci_dev
->
virtual_functions
,
pci_dev
->
num_virtual_functions
,
addr
)
<
0
)
goto
out
;
}
data
->
pci_dev
.
flags
|=
VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION
;
pci_dev
->
flags
|=
VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION
;
}
else
{
int
hdrType
=
virPCIHeaderTypeFromString
(
type
);
if
(
hdrType
>
0
&&
!
data
->
pci_dev
.
hdrType
)
data
->
pci_dev
.
hdrType
=
hdrType
;
if
(
hdrType
>
0
&&
!
pci_dev
->
hdrType
)
pci_dev
->
hdrType
=
hdrType
;
}
ret
=
0
;
...
...
@@ -1311,7 +1311,7 @@ static int
virNodeDevCapPCIDevParseXML
(
xmlXPathContextPtr
ctxt
,
virNodeDeviceDefPtr
def
,
xmlNodePtr
node
,
virNodeDevCap
DataPtr
data
)
virNodeDevCap
PCIDevPtr
pci_dev
)
{
xmlNodePtr
orignode
,
iommuGroupNode
,
pciExpress
;
xmlNodePtr
*
nodes
=
NULL
;
...
...
@@ -1325,64 +1325,64 @@ virNodeDevCapPCIDevParseXML(xmlXPathContextPtr ctxt,
ctxt
->
node
=
node
;
if
(
virNodeDevCapsDefParseULong
(
"number(./domain[1])"
,
ctxt
,
&
data
->
pci_dev
.
domain
,
def
,
&
pci_dev
->
domain
,
def
,
_
(
"no PCI domain ID supplied for '%s'"
),
_
(
"invalid PCI domain ID supplied for '%s'"
))
<
0
)
goto
out
;
if
(
virNodeDevCapsDefParseULong
(
"number(./bus[1])"
,
ctxt
,
&
data
->
pci_dev
.
bus
,
def
,
&
pci_dev
->
bus
,
def
,
_
(
"no PCI bus ID supplied for '%s'"
),
_
(
"invalid PCI bus ID supplied for '%s'"
))
<
0
)
goto
out
;
if
(
virNodeDevCapsDefParseULong
(
"number(./slot[1])"
,
ctxt
,
&
data
->
pci_dev
.
slot
,
def
,
&
pci_dev
->
slot
,
def
,
_
(
"no PCI slot ID supplied for '%s'"
),
_
(
"invalid PCI slot ID supplied for '%s'"
))
<
0
)
goto
out
;
if
(
virNodeDevCapsDefParseULong
(
"number(./function[1])"
,
ctxt
,
&
data
->
pci_dev
.
function
,
def
,
&
pci_dev
->
function
,
def
,
_
(
"no PCI function ID supplied for '%s'"
),
_
(
"invalid PCI function ID supplied for '%s'"
))
<
0
)
goto
out
;
if
(
virNodeDevCapsDefParseHexId
(
"string(./vendor[1]/@id)"
,
ctxt
,
&
data
->
pci_dev
.
vendor
,
def
,
&
pci_dev
->
vendor
,
def
,
_
(
"no PCI vendor ID supplied for '%s'"
),
_
(
"invalid PCI vendor ID supplied for '%s'"
))
<
0
)
goto
out
;
if
(
virNodeDevCapsDefParseHexId
(
"string(./product[1]/@id)"
,
ctxt
,
&
data
->
pci_dev
.
product
,
def
,
&
pci_dev
->
product
,
def
,
_
(
"no PCI product ID supplied for '%s'"
),
_
(
"invalid PCI product ID supplied for '%s'"
))
<
0
)
goto
out
;
data
->
pci_dev
.
vendor_name
=
virXPathString
(
"string(./vendor[1])"
,
ctxt
);
data
->
pci_dev
.
product_name
=
virXPathString
(
"string(./product[1])"
,
ctxt
);
pci_dev
->
vendor_name
=
virXPathString
(
"string(./vendor[1])"
,
ctxt
);
pci_dev
->
product_name
=
virXPathString
(
"string(./product[1])"
,
ctxt
);
if
((
n
=
virXPathNodeSet
(
"./capability"
,
ctxt
,
&
nodes
))
<
0
)
goto
out
;
for
(
i
=
0
;
i
<
n
;
i
++
)
{
if
(
virNodeDevPCICapabilityParseXML
(
ctxt
,
nodes
[
i
],
data
)
<
0
)
if
(
virNodeDevPCICapabilityParseXML
(
ctxt
,
nodes
[
i
],
pci_dev
)
<
0
)
goto
out
;
}
VIR_FREE
(
nodes
);
if
((
iommuGroupNode
=
virXPathNode
(
"./iommuGroup[1]"
,
ctxt
)))
{
if
(
virNodeDevCapPCIDevIommuGroupParseXML
(
ctxt
,
iommuGroupNode
,
data
)
<
0
)
{
pci_dev
)
<
0
)
{
goto
out
;
}
}
/* The default value is -1 since zero is valid NUMA node number */
data
->
pci_dev
.
numa_node
=
-
1
;
pci_dev
->
numa_node
=
-
1
;
if
(
virNodeDevCapsDefParseIntOptional
(
"number(./numa[1]/@node)"
,
ctxt
,
&
data
->
pci_dev
.
numa_node
,
def
,
&
pci_dev
->
numa_node
,
def
,
_
(
"invalid NUMA node ID supplied for '%s'"
))
<
0
)
goto
out
;
...
...
@@ -1393,9 +1393,9 @@ virNodeDevCapPCIDevParseXML(xmlXPathContextPtr ctxt,
if
(
virPCIEDeviceInfoParseXML
(
ctxt
,
pciExpress
,
pci_express
)
<
0
)
goto
out
;
data
->
pci_dev
.
pci_express
=
pci_express
;
pci_dev
->
pci_express
=
pci_express
;
pci_express
=
NULL
;
data
->
pci_dev
.
flags
|=
VIR_NODE_DEV_CAP_FLAG_PCIE
;
pci_dev
->
flags
|=
VIR_NODE_DEV_CAP_FLAG_PCIE
;
}
ret
=
0
;
...
...
@@ -1412,8 +1412,10 @@ static int
virNodeDevCapSystemParseXML
(
xmlXPathContextPtr
ctxt
,
virNodeDeviceDefPtr
def
,
xmlNodePtr
node
,
virNodeDevCap
DataPtr
data
)
virNodeDevCap
SystemPtr
system
)
{
virNodeDevCapSystemHardwarePtr
hardware
=
&
system
->
hardware
;
virNodeDevCapSystemFirmwarePtr
firmware
=
&
system
->
firmware
;
xmlNodePtr
orignode
;
int
ret
=
-
1
;
char
*
tmp
;
...
...
@@ -1421,11 +1423,11 @@ virNodeDevCapSystemParseXML(xmlXPathContextPtr ctxt,
orignode
=
ctxt
->
node
;
ctxt
->
node
=
node
;
data
->
system
.
product_name
=
virXPathString
(
"string(./product[1])"
,
ctxt
);
system
->
product_name
=
virXPathString
(
"string(./product[1])"
,
ctxt
);
data
->
system
.
hardware
.
vendor_name
=
virXPathString
(
"string(./hardware/vendor[1])"
,
ctxt
);
data
->
system
.
hardware
.
version
=
virXPathString
(
"string(./hardware/version[1])"
,
ctxt
);
data
->
system
.
hardware
.
serial
=
virXPathString
(
"string(./hardware/serial[1])"
,
ctxt
);
hardware
->
vendor_name
=
virXPathString
(
"string(./hardware/vendor[1])"
,
ctxt
);
hardware
->
version
=
virXPathString
(
"string(./hardware/version[1])"
,
ctxt
);
hardware
->
serial
=
virXPathString
(
"string(./hardware/serial[1])"
,
ctxt
);
tmp
=
virXPathString
(
"string(./hardware/uuid[1])"
,
ctxt
);
if
(
!
tmp
)
{
...
...
@@ -1434,7 +1436,7 @@ virNodeDevCapSystemParseXML(xmlXPathContextPtr ctxt,
goto
out
;
}
if
(
virUUIDParse
(
tmp
,
data
->
system
.
hardware
.
uuid
)
<
0
)
{
if
(
virUUIDParse
(
tmp
,
hardware
->
uuid
)
<
0
)
{
virReportError
(
VIR_ERR_INTERNAL_ERROR
,
_
(
"malformed uuid element for '%s'"
),
def
->
name
);
VIR_FREE
(
tmp
);
...
...
@@ -1442,9 +1444,9 @@ virNodeDevCapSystemParseXML(xmlXPathContextPtr ctxt,
}
VIR_FREE
(
tmp
);
data
->
system
.
firmware
.
vendor_name
=
virXPathString
(
"string(./firmware/vendor[1])"
,
ctxt
);
data
->
system
.
firmware
.
version
=
virXPathString
(
"string(./firmware/version[1])"
,
ctxt
);
data
->
system
.
firmware
.
release_date
=
virXPathString
(
"string(./firmware/release_date[1])"
,
ctxt
);
firmware
->
vendor_name
=
virXPathString
(
"string(./firmware/vendor[1])"
,
ctxt
);
firmware
->
version
=
virXPathString
(
"string(./firmware/version[1])"
,
ctxt
);
firmware
->
release_date
=
virXPathString
(
"string(./firmware/release_date[1])"
,
ctxt
);
ret
=
0
;
out:
...
...
@@ -1485,37 +1487,40 @@ virNodeDevCapsDefParseXML(xmlXPathContextPtr ctxt,
switch
(
caps
->
data
.
type
)
{
case
VIR_NODE_DEV_CAP_SYSTEM
:
ret
=
virNodeDevCapSystemParseXML
(
ctxt
,
def
,
node
,
&
caps
->
data
);
ret
=
virNodeDevCapSystemParseXML
(
ctxt
,
def
,
node
,
&
caps
->
data
.
system
);
break
;
case
VIR_NODE_DEV_CAP_PCI_DEV
:
ret
=
virNodeDevCapPCIDevParseXML
(
ctxt
,
def
,
node
,
&
caps
->
data
);
ret
=
virNodeDevCapPCIDevParseXML
(
ctxt
,
def
,
node
,
&
caps
->
data
.
pci_dev
);
break
;
case
VIR_NODE_DEV_CAP_USB_DEV
:
ret
=
virNodeDevCapUSBDevParseXML
(
ctxt
,
def
,
node
,
&
caps
->
data
);
ret
=
virNodeDevCapUSBDevParseXML
(
ctxt
,
def
,
node
,
&
caps
->
data
.
usb_dev
);
break
;
case
VIR_NODE_DEV_CAP_USB_INTERFACE
:
ret
=
virNodeDevCapUSBInterfaceParseXML
(
ctxt
,
def
,
node
,
&
caps
->
data
);
ret
=
virNodeDevCapUSBInterfaceParseXML
(
ctxt
,
def
,
node
,
&
caps
->
data
.
usb_if
);
break
;
case
VIR_NODE_DEV_CAP_NET
:
ret
=
virNodeDevCapNetParseXML
(
ctxt
,
def
,
node
,
&
caps
->
data
);
ret
=
virNodeDevCapNetParseXML
(
ctxt
,
def
,
node
,
&
caps
->
data
.
net
);
break
;
case
VIR_NODE_DEV_CAP_SCSI_HOST
:
ret
=
virNodeDevCapSCSIHostParseXML
(
ctxt
,
def
,
node
,
&
caps
->
data
,
&
caps
->
data
.
scsi_host
,
create
,
virt_type
);
break
;
case
VIR_NODE_DEV_CAP_SCSI_TARGET
:
ret
=
virNodeDevCapSCSITargetParseXML
(
ctxt
,
def
,
node
,
&
caps
->
data
);
ret
=
virNodeDevCapSCSITargetParseXML
(
ctxt
,
def
,
node
,
&
caps
->
data
.
scsi_target
);
break
;
case
VIR_NODE_DEV_CAP_SCSI
:
ret
=
virNodeDevCapSCSIParseXML
(
ctxt
,
def
,
node
,
&
caps
->
data
);
ret
=
virNodeDevCapSCSIParseXML
(
ctxt
,
def
,
node
,
&
caps
->
data
.
scsi
);
break
;
case
VIR_NODE_DEV_CAP_STORAGE
:
ret
=
virNodeDevCapStorageParseXML
(
ctxt
,
def
,
node
,
&
caps
->
data
);
ret
=
virNodeDevCapStorageParseXML
(
ctxt
,
def
,
node
,
&
caps
->
data
.
storage
);
break
;
case
VIR_NODE_DEV_CAP_DRM
:
ret
=
virNodeDevCapDRMParseXML
(
ctxt
,
def
,
node
,
&
caps
->
data
);
ret
=
virNodeDevCapDRMParseXML
(
ctxt
,
def
,
node
,
&
caps
->
data
.
drm
);
break
;
case
VIR_NODE_DEV_CAP_FC_HOST
:
case
VIR_NODE_DEV_CAP_VPORTS
:
...
...
src/node_device/node_device_driver.c
浏览文件 @
dec6d9df
...
...
@@ -54,7 +54,7 @@ static int update_caps(virNodeDeviceObjPtr dev)
while
(
cap
)
{
switch
(
cap
->
data
.
type
)
{
case
VIR_NODE_DEV_CAP_SCSI_HOST
:
nodeDeviceSysfsGetSCSIHostCaps
(
&
dev
->
def
->
caps
->
data
);
nodeDeviceSysfsGetSCSIHostCaps
(
&
dev
->
def
->
caps
->
data
.
scsi_host
);
break
;
case
VIR_NODE_DEV_CAP_NET
:
if
(
virNetDevGetLinkInfo
(
cap
->
data
.
net
.
ifname
,
&
cap
->
data
.
net
.
lnk
)
<
0
)
...
...
@@ -65,7 +65,7 @@ static int update_caps(virNodeDeviceObjPtr dev)
break
;
case
VIR_NODE_DEV_CAP_PCI_DEV
:
if
(
nodeDeviceSysfsGetPCIRelatedDevCaps
(
dev
->
def
->
sysfs_path
,
&
dev
->
def
->
caps
->
data
)
<
0
)
&
dev
->
def
->
caps
->
data
.
pci_dev
)
<
0
)
return
-
1
;
break
;
...
...
@@ -297,7 +297,7 @@ nodeDeviceLookupSCSIHostByWWN(virConnectPtr conn,
while
(
cap
)
{
if
(
cap
->
data
.
type
==
VIR_NODE_DEV_CAP_SCSI_HOST
)
{
nodeDeviceSysfsGetSCSIHostCaps
(
&
cap
->
data
);
nodeDeviceSysfsGetSCSIHostCaps
(
&
cap
->
data
.
scsi_host
);
if
(
cap
->
data
.
scsi_host
.
flags
&
VIR_NODE_DEV_CAP_FLAG_HBA_FC_HOST
)
{
if
(
STREQ
(
cap
->
data
.
scsi_host
.
wwnn
,
wwnn
)
&&
...
...
src/node_device/node_device_hal.c
浏览文件 @
dec6d9df
...
...
@@ -153,7 +153,7 @@ gather_pci_cap(LibHalContext *ctx, const char *udi,
ignore_value
(
virStrToLong_ui
(
p
+
1
,
&
p
,
16
,
&
d
->
pci_dev
.
function
));
}
if
(
nodeDeviceSysfsGetPCIRelatedDevCaps
(
sysfs_path
,
d
)
<
0
)
{
if
(
nodeDeviceSysfsGetPCIRelatedDevCaps
(
sysfs_path
,
&
d
->
pci_dev
)
<
0
)
{
VIR_FREE
(
sysfs_path
);
return
-
1
;
}
...
...
@@ -239,7 +239,7 @@ gather_scsi_host_cap(LibHalContext *ctx, const char *udi,
(
void
)
get_int_prop
(
ctx
,
udi
,
"scsi_host.host"
,
(
int
*
)
&
d
->
scsi_host
.
host
);
retval
=
nodeDeviceSysfsGetSCSIHostCaps
(
d
);
retval
=
nodeDeviceSysfsGetSCSIHostCaps
(
&
d
->
scsi_host
);
if
(
retval
==
-
1
)
goto
out
;
...
...
src/node_device/node_device_linux_sysfs.c
浏览文件 @
dec6d9df
...
...
@@ -44,65 +44,65 @@
VIR_LOG_INIT
(
"node_device.node_device_linux_sysfs"
);
int
nodeDeviceSysfsGetSCSIHostCaps
(
virNodeDevCap
DataPtr
d
)
nodeDeviceSysfsGetSCSIHostCaps
(
virNodeDevCap
SCSIHostPtr
scsi_host
)
{
char
*
tmp
=
NULL
;
int
ret
=
-
1
;
if
((
d
->
scsi_host
.
unique_id
=
virSCSIHostGetUniqueId
(
NULL
,
d
->
scsi_host
.
host
))
<
0
)
{
VIR_DEBUG
(
"Failed to read unique_id for host%d"
,
d
->
scsi_host
.
host
);
d
->
scsi_host
.
unique_id
=
-
1
;
if
((
scsi_host
->
unique_id
=
virSCSIHostGetUniqueId
(
NULL
,
scsi_host
->
host
))
<
0
)
{
VIR_DEBUG
(
"Failed to read unique_id for host%d"
,
scsi_host
->
host
);
scsi_host
->
unique_id
=
-
1
;
}
VIR_DEBUG
(
"Checking if host%d is an FC HBA"
,
d
->
scsi_host
.
host
);
VIR_DEBUG
(
"Checking if host%d is an FC HBA"
,
scsi_host
->
host
);
if
(
virVHBAPathExists
(
NULL
,
d
->
scsi_host
.
host
))
{
d
->
scsi_host
.
flags
|=
VIR_NODE_DEV_CAP_FLAG_HBA_FC_HOST
;
if
(
virVHBAPathExists
(
NULL
,
scsi_host
->
host
))
{
scsi_host
->
flags
|=
VIR_NODE_DEV_CAP_FLAG_HBA_FC_HOST
;
if
(
!
(
tmp
=
virVHBAGetConfig
(
NULL
,
d
->
scsi_host
.
host
,
"port_name"
)))
{
VIR_WARN
(
"Failed to read WWPN for host%d"
,
d
->
scsi_host
.
host
);
if
(
!
(
tmp
=
virVHBAGetConfig
(
NULL
,
scsi_host
->
host
,
"port_name"
)))
{
VIR_WARN
(
"Failed to read WWPN for host%d"
,
scsi_host
->
host
);
goto
cleanup
;
}
VIR_FREE
(
d
->
scsi_host
.
wwpn
);
VIR_STEAL_PTR
(
d
->
scsi_host
.
wwpn
,
tmp
);
VIR_FREE
(
scsi_host
->
wwpn
);
VIR_STEAL_PTR
(
scsi_host
->
wwpn
,
tmp
);
if
(
!
(
tmp
=
virVHBAGetConfig
(
NULL
,
d
->
scsi_host
.
host
,
"node_name"
)))
{
VIR_WARN
(
"Failed to read WWNN for host%d"
,
d
->
scsi_host
.
host
);
if
(
!
(
tmp
=
virVHBAGetConfig
(
NULL
,
scsi_host
->
host
,
"node_name"
)))
{
VIR_WARN
(
"Failed to read WWNN for host%d"
,
scsi_host
->
host
);
goto
cleanup
;
}
VIR_FREE
(
d
->
scsi_host
.
wwnn
);
VIR_STEAL_PTR
(
d
->
scsi_host
.
wwnn
,
tmp
);
VIR_FREE
(
scsi_host
->
wwnn
);
VIR_STEAL_PTR
(
scsi_host
->
wwnn
,
tmp
);
if
((
tmp
=
virVHBAGetConfig
(
NULL
,
d
->
scsi_host
.
host
,
"fabric_name"
)))
{
VIR_FREE
(
d
->
scsi_host
.
fabric_wwn
);
VIR_STEAL_PTR
(
d
->
scsi_host
.
fabric_wwn
,
tmp
);
if
((
tmp
=
virVHBAGetConfig
(
NULL
,
scsi_host
->
host
,
"fabric_name"
)))
{
VIR_FREE
(
scsi_host
->
fabric_wwn
);
VIR_STEAL_PTR
(
scsi_host
->
fabric_wwn
,
tmp
);
}
}
if
(
virVHBAIsVportCapable
(
NULL
,
d
->
scsi_host
.
host
))
{
d
->
scsi_host
.
flags
|=
VIR_NODE_DEV_CAP_FLAG_HBA_VPORT_OPS
;
if
(
virVHBAIsVportCapable
(
NULL
,
scsi_host
->
host
))
{
scsi_host
->
flags
|=
VIR_NODE_DEV_CAP_FLAG_HBA_VPORT_OPS
;
if
(
!
(
tmp
=
virVHBAGetConfig
(
NULL
,
d
->
scsi_host
.
host
,
if
(
!
(
tmp
=
virVHBAGetConfig
(
NULL
,
scsi_host
->
host
,
"max_npiv_vports"
)))
{
VIR_WARN
(
"Failed to read max_npiv_vports for host%d"
,
d
->
scsi_host
.
host
);
scsi_host
->
host
);
goto
cleanup
;
}
if
(
virStrToLong_i
(
tmp
,
NULL
,
10
,
&
d
->
scsi_host
.
max_vports
)
<
0
)
{
if
(
virStrToLong_i
(
tmp
,
NULL
,
10
,
&
scsi_host
->
max_vports
)
<
0
)
{
VIR_WARN
(
"Failed to parse value of max_npiv_vports '%s'"
,
tmp
);
goto
cleanup
;
}
if
(
!
(
tmp
=
virVHBAGetConfig
(
NULL
,
d
->
scsi_host
.
host
,
if
(
!
(
tmp
=
virVHBAGetConfig
(
NULL
,
scsi_host
->
host
,
"npiv_vports_inuse"
)))
{
VIR_WARN
(
"Failed to read npiv_vports_inuse for host%d"
,
d
->
scsi_host
.
host
);
scsi_host
->
host
);
goto
cleanup
;
}
if
(
virStrToLong_i
(
tmp
,
NULL
,
10
,
&
d
->
scsi_host
.
vports
)
<
0
)
{
if
(
virStrToLong_i
(
tmp
,
NULL
,
10
,
&
scsi_host
->
vports
)
<
0
)
{
VIR_WARN
(
"Failed to parse value of npiv_vports_inuse '%s'"
,
tmp
);
goto
cleanup
;
}
...
...
@@ -112,12 +112,12 @@ nodeDeviceSysfsGetSCSIHostCaps(virNodeDevCapDataPtr d)
cleanup:
if
(
ret
<
0
)
{
/* Clear the two flags in case of producing confusing XML output */
d
->
scsi_host
.
flags
&=
~
(
VIR_NODE_DEV_CAP_FLAG_HBA_FC_HOST
|
scsi_host
->
flags
&=
~
(
VIR_NODE_DEV_CAP_FLAG_HBA_FC_HOST
|
VIR_NODE_DEV_CAP_FLAG_HBA_VPORT_OPS
);
VIR_FREE
(
d
->
scsi_host
.
wwnn
);
VIR_FREE
(
d
->
scsi_host
.
wwpn
);
VIR_FREE
(
d
->
scsi_host
.
fabric_wwn
);
VIR_FREE
(
scsi_host
->
wwnn
);
VIR_FREE
(
scsi_host
->
wwpn
);
VIR_FREE
(
scsi_host
->
fabric_wwn
);
}
VIR_FREE
(
tmp
);
return
ret
;
...
...
@@ -126,37 +126,37 @@ nodeDeviceSysfsGetSCSIHostCaps(virNodeDevCapDataPtr d)
static
int
nodeDeviceSysfsGetPCISRIOVCaps
(
const
char
*
sysfsPath
,
virNodeDevCap
DataPtr
data
)
virNodeDevCap
PCIDevPtr
pci_dev
)
{
size_t
i
;
int
ret
;
/* this could be a refresh, so clear out the old data */
for
(
i
=
0
;
i
<
data
->
pci_dev
.
num_virtual_functions
;
i
++
)
VIR_FREE
(
data
->
pci_dev
.
virtual_functions
[
i
]);
VIR_FREE
(
data
->
pci_dev
.
virtual_functions
);
data
->
pci_dev
.
num_virtual_functions
=
0
;
data
->
pci_dev
.
max_virtual_functions
=
0
;
data
->
pci_dev
.
flags
&=
~
VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION
;
data
->
pci_dev
.
flags
&=
~
VIR_NODE_DEV_CAP_FLAG_PCI_PHYSICAL_FUNCTION
;
for
(
i
=
0
;
i
<
pci_dev
->
num_virtual_functions
;
i
++
)
VIR_FREE
(
pci_dev
->
virtual_functions
[
i
]);
VIR_FREE
(
pci_dev
->
virtual_functions
);
pci_dev
->
num_virtual_functions
=
0
;
pci_dev
->
max_virtual_functions
=
0
;
pci_dev
->
flags
&=
~
VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION
;
pci_dev
->
flags
&=
~
VIR_NODE_DEV_CAP_FLAG_PCI_PHYSICAL_FUNCTION
;
ret
=
virPCIGetPhysicalFunction
(
sysfsPath
,
&
data
->
pci_dev
.
physical_function
);
&
pci_dev
->
physical_function
);
if
(
ret
<
0
)
goto
cleanup
;
if
(
data
->
pci_dev
.
physical_function
)
data
->
pci_dev
.
flags
|=
VIR_NODE_DEV_CAP_FLAG_PCI_PHYSICAL_FUNCTION
;
if
(
pci_dev
->
physical_function
)
pci_dev
->
flags
|=
VIR_NODE_DEV_CAP_FLAG_PCI_PHYSICAL_FUNCTION
;
ret
=
virPCIGetVirtualFunctions
(
sysfsPath
,
&
data
->
pci_dev
.
virtual_functions
,
&
data
->
pci_dev
.
num_virtual_functions
,
&
data
->
pci_dev
.
max_virtual_functions
);
ret
=
virPCIGetVirtualFunctions
(
sysfsPath
,
&
pci_dev
->
virtual_functions
,
&
pci_dev
->
num_virtual_functions
,
&
pci_dev
->
max_virtual_functions
);
if
(
ret
<
0
)
goto
cleanup
;
if
(
data
->
pci_dev
.
num_virtual_functions
>
0
||
data
->
pci_dev
.
max_virtual_functions
>
0
)
data
->
pci_dev
.
flags
|=
VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION
;
if
(
pci_dev
->
num_virtual_functions
>
0
||
pci_dev
->
max_virtual_functions
>
0
)
pci_dev
->
flags
|=
VIR_NODE_DEV_CAP_FLAG_PCI_VIRTUAL_FUNCTION
;
cleanup:
return
ret
;
...
...
@@ -164,23 +164,23 @@ nodeDeviceSysfsGetPCISRIOVCaps(const char *sysfsPath,
static
int
nodeDeviceSysfsGetPCIIOMMUGroupCaps
(
virNodeDevCap
DataPtr
data
)
nodeDeviceSysfsGetPCIIOMMUGroupCaps
(
virNodeDevCap
PCIDevPtr
pci_dev
)
{
size_t
i
;
int
tmpGroup
,
ret
=
-
1
;
virPCIDeviceAddress
addr
;
/* this could be a refresh, so clear out the old data */
for
(
i
=
0
;
i
<
data
->
pci_dev
.
nIommuGroupDevices
;
i
++
)
VIR_FREE
(
data
->
pci_dev
.
iommuGroupDevices
[
i
]);
VIR_FREE
(
data
->
pci_dev
.
iommuGroupDevices
);
data
->
pci_dev
.
nIommuGroupDevices
=
0
;
data
->
pci_dev
.
iommuGroupNumber
=
0
;
addr
.
domain
=
data
->
pci_dev
.
domain
;
addr
.
bus
=
data
->
pci_dev
.
bus
;
addr
.
slot
=
data
->
pci_dev
.
slot
;
addr
.
function
=
data
->
pci_dev
.
function
;
for
(
i
=
0
;
i
<
pci_dev
->
nIommuGroupDevices
;
i
++
)
VIR_FREE
(
pci_dev
->
iommuGroupDevices
[
i
]);
VIR_FREE
(
pci_dev
->
iommuGroupDevices
);
pci_dev
->
nIommuGroupDevices
=
0
;
pci_dev
->
iommuGroupNumber
=
0
;
addr
.
domain
=
pci_dev
->
domain
;
addr
.
bus
=
pci_dev
->
bus
;
addr
.
slot
=
pci_dev
->
slot
;
addr
.
function
=
pci_dev
->
function
;
tmpGroup
=
virPCIDeviceAddressGetIOMMUGroupNum
(
&
addr
);
if
(
tmpGroup
==
-
1
)
{
/* error was already reported */
...
...
@@ -192,10 +192,10 @@ nodeDeviceSysfsGetPCIIOMMUGroupCaps(virNodeDevCapDataPtr data)
goto
cleanup
;
}
if
(
tmpGroup
>=
0
)
{
if
(
virPCIDeviceAddressGetIOMMUGroupAddresses
(
&
addr
,
&
data
->
pci_dev
.
iommuGroupDevices
,
&
data
->
pci_dev
.
nIommuGroupDevices
)
<
0
)
if
(
virPCIDeviceAddressGetIOMMUGroupAddresses
(
&
addr
,
&
pci_dev
->
iommuGroupDevices
,
&
pci_dev
->
nIommuGroupDevices
)
<
0
)
goto
cleanup
;
data
->
pci_dev
.
iommuGroupNumber
=
tmpGroup
;
pci_dev
->
iommuGroupNumber
=
tmpGroup
;
}
ret
=
0
;
...
...
@@ -212,11 +212,11 @@ nodeDeviceSysfsGetPCIIOMMUGroupCaps(virNodeDevCapDataPtr data)
*/
int
nodeDeviceSysfsGetPCIRelatedDevCaps
(
const
char
*
sysfsPath
,
virNodeDevCap
DataPtr
data
)
virNodeDevCap
PCIDevPtr
pci_dev
)
{
if
(
nodeDeviceSysfsGetPCISRIOVCaps
(
sysfsPath
,
data
)
<
0
)
if
(
nodeDeviceSysfsGetPCISRIOVCaps
(
sysfsPath
,
pci_dev
)
<
0
)
return
-
1
;
if
(
nodeDeviceSysfsGetPCIIOMMUGroupCaps
(
data
)
<
0
)
if
(
nodeDeviceSysfsGetPCIIOMMUGroupCaps
(
pci_dev
)
<
0
)
return
-
1
;
return
0
;
}
...
...
@@ -225,14 +225,14 @@ nodeDeviceSysfsGetPCIRelatedDevCaps(const char *sysfsPath,
#else
int
nodeDeviceSysfsGetSCSIHostCaps
(
virNodeDevCap
DataPtr
d
ATTRIBUTE_UNUSED
)
nodeDeviceSysfsGetSCSIHostCaps
(
virNodeDevCap
SCSIHostPtr
scsi_host
ATTRIBUTE_UNUSED
)
{
return
-
1
;
}
int
nodeDeviceSysfsGetPCIRelatedDevCaps
(
const
char
*
sysfsPath
ATTRIBUTE_UNUSED
,
virNodeDevCap
DataPtr
data
ATTRIBUTE_UNUSED
)
virNodeDevCap
PCIDevPtr
pci_dev
ATTRIBUTE_UNUSED
)
{
return
-
1
;
}
...
...
src/node_device/node_device_linux_sysfs.h
浏览文件 @
dec6d9df
...
...
@@ -25,8 +25,8 @@
# include "node_device_conf.h"
int
nodeDeviceSysfsGetSCSIHostCaps
(
virNodeDevCap
DataPtr
d
);
int
nodeDeviceSysfsGetSCSIHostCaps
(
virNodeDevCap
SCSIHostPtr
scsi_host
);
int
nodeDeviceSysfsGetPCIRelatedDevCaps
(
const
char
*
sysfsPath
,
virNodeDevCap
DataPtr
data
);
virNodeDevCap
PCIDevPtr
pci_dev
);
#endif
/* __VIR_NODE_DEVICE_LINUX_SYSFS_H__ */
src/node_device/node_device_udev.c
浏览文件 @
dec6d9df
...
...
@@ -317,7 +317,7 @@ static int udevProcessPCI(struct udev_device *device,
virNodeDeviceDefPtr
def
)
{
const
char
*
syspath
=
NULL
;
virNodeDevCap
DataPtr
data
=
&
def
->
caps
->
data
;
virNodeDevCap
PCIDevPtr
pci_dev
=
&
def
->
caps
->
data
.
pci_dev
;
virPCIEDeviceInfoPtr
pci_express
=
NULL
;
virPCIDevicePtr
pciDev
=
NULL
;
udevPrivate
*
priv
=
driver
->
privateData
;
...
...
@@ -326,30 +326,30 @@ static int udevProcessPCI(struct udev_device *device,
syspath
=
udev_device_get_syspath
(
device
);
if
(
udevGetUintProperty
(
device
,
"PCI_CLASS"
,
&
data
->
pci_dev
.
class
,
16
)
<
0
)
if
(
udevGetUintProperty
(
device
,
"PCI_CLASS"
,
&
pci_dev
->
class
,
16
)
<
0
)
goto
cleanup
;
if
((
p
=
strrchr
(
syspath
,
'/'
))
==
NULL
||
virStrToLong_ui
(
p
+
1
,
&
p
,
16
,
&
data
->
pci_dev
.
domain
)
<
0
||
p
==
NULL
||
virStrToLong_ui
(
p
+
1
,
&
p
,
16
,
&
data
->
pci_dev
.
bus
)
<
0
||
p
==
NULL
||
virStrToLong_ui
(
p
+
1
,
&
p
,
16
,
&
data
->
pci_dev
.
slot
)
<
0
||
p
==
NULL
||
virStrToLong_ui
(
p
+
1
,
&
p
,
16
,
&
data
->
pci_dev
.
function
)
<
0
)
{
virStrToLong_ui
(
p
+
1
,
&
p
,
16
,
&
pci_dev
->
domain
)
<
0
||
p
==
NULL
||
virStrToLong_ui
(
p
+
1
,
&
p
,
16
,
&
pci_dev
->
bus
)
<
0
||
p
==
NULL
||
virStrToLong_ui
(
p
+
1
,
&
p
,
16
,
&
pci_dev
->
slot
)
<
0
||
p
==
NULL
||
virStrToLong_ui
(
p
+
1
,
&
p
,
16
,
&
pci_dev
->
function
)
<
0
)
{
virReportError
(
VIR_ERR_INTERNAL_ERROR
,
_
(
"failed to parse the PCI address from sysfs path: '%s'"
),
syspath
);
goto
cleanup
;
}
if
(
udevGetUintSysfsAttr
(
device
,
"vendor"
,
&
data
->
pci_dev
.
vendor
,
16
)
<
0
)
if
(
udevGetUintSysfsAttr
(
device
,
"vendor"
,
&
pci_dev
->
vendor
,
16
)
<
0
)
goto
cleanup
;
if
(
udevGetUintSysfsAttr
(
device
,
"device"
,
&
data
->
pci_dev
.
product
,
16
)
<
0
)
if
(
udevGetUintSysfsAttr
(
device
,
"device"
,
&
pci_dev
->
product
,
16
)
<
0
)
goto
cleanup
;
if
(
udevTranslatePCIIds
(
data
->
pci_dev
.
vendor
,
data
->
pci_dev
.
product
,
&
data
->
pci_dev
.
vendor_name
,
&
data
->
pci_dev
.
product_name
)
!=
0
)
{
if
(
udevTranslatePCIIds
(
pci_dev
->
vendor
,
pci_dev
->
product
,
&
pci_dev
->
vendor_name
,
&
pci_dev
->
product_name
)
!=
0
)
{
goto
cleanup
;
}
...
...
@@ -358,23 +358,24 @@ static int udevProcessPCI(struct udev_device *device,
/* The default value is -1, because it can't be 0
* as zero is valid node number. */
data
->
pci_dev
.
numa_node
=
-
1
;
pci_dev
->
numa_node
=
-
1
;
if
(
udevGetIntSysfsAttr
(
device
,
"numa_node"
,
&
data
->
pci_dev
.
numa_node
,
10
)
<
0
)
&
pci_dev
->
numa_node
,
10
)
<
0
)
goto
cleanup
;
if
(
nodeDeviceSysfsGetPCIRelatedDevCaps
(
syspath
,
data
)
<
0
)
if
(
nodeDeviceSysfsGetPCIRelatedDevCaps
(
syspath
,
&
def
->
caps
->
data
.
pci_dev
)
<
0
)
goto
cleanup
;
if
(
!
(
pciDev
=
virPCIDeviceNew
(
data
->
pci_dev
.
domain
,
data
->
pci_dev
.
bus
,
data
->
pci_dev
.
slot
,
data
->
pci_dev
.
function
)))
if
(
!
(
pciDev
=
virPCIDeviceNew
(
pci_dev
->
domain
,
pci_dev
->
bus
,
pci_dev
->
slot
,
pci_dev
->
function
)))
goto
cleanup
;
/* We need to be root to read PCI device configs */
if
(
priv
->
privileged
)
{
if
(
virPCIGetHeaderType
(
pciDev
,
&
data
->
pci_dev
.
hdrType
)
<
0
)
if
(
virPCIGetHeaderType
(
pciDev
,
&
pci_dev
->
hdrType
)
<
0
)
goto
cleanup
;
if
(
virPCIDeviceIsPCIExpress
(
pciDev
)
>
0
)
{
...
...
@@ -396,8 +397,8 @@ static int udevProcessPCI(struct udev_device *device,
pci_express
->
link_sta
->
port
=
-
1
;
/* PCIe can't negotiate port. Yet :) */
}
data
->
pci_dev
.
flags
|=
VIR_NODE_DEV_CAP_FLAG_PCIE
;
data
->
pci_dev
.
pci_express
=
pci_express
;
pci_dev
->
flags
|=
VIR_NODE_DEV_CAP_FLAG_PCIE
;
pci_dev
->
pci_express
=
pci_express
;
pci_express
=
NULL
;
}
}
...
...
@@ -430,7 +431,7 @@ static int drmGetMinorType(int minor)
static
int
udevProcessDRMDevice
(
struct
udev_device
*
device
,
virNodeDeviceDefPtr
def
)
{
virNodeDevCapD
ataPtr
data
=
&
def
->
caps
->
data
;
virNodeDevCapD
RMPtr
drm
=
&
def
->
caps
->
data
.
drm
;
int
minor
;
if
(
udevGenerateDeviceName
(
device
,
def
,
NULL
)
!=
0
)
...
...
@@ -442,7 +443,7 @@ static int udevProcessDRMDevice(struct udev_device *device,
if
((
minor
=
drmGetMinorType
(
minor
))
==
-
1
)
return
-
1
;
d
ata
->
drm
.
type
=
minor
;
d
rm
->
type
=
minor
;
return
0
;
}
...
...
@@ -450,36 +451,36 @@ static int udevProcessDRMDevice(struct udev_device *device,
static
int
udevProcessUSBDevice
(
struct
udev_device
*
device
,
virNodeDeviceDefPtr
def
)
{
virNodeDevCap
DataPtr
data
=
&
def
->
caps
->
data
;
virNodeDevCap
USBDevPtr
usb_dev
=
&
def
->
caps
->
data
.
usb_dev
;
if
(
udevGetUintProperty
(
device
,
"BUSNUM"
,
&
data
->
usb_dev
.
bus
,
10
)
<
0
)
if
(
udevGetUintProperty
(
device
,
"BUSNUM"
,
&
usb_dev
->
bus
,
10
)
<
0
)
return
-
1
;
if
(
udevGetUintProperty
(
device
,
"DEVNUM"
,
&
data
->
usb_dev
.
device
,
10
)
<
0
)
if
(
udevGetUintProperty
(
device
,
"DEVNUM"
,
&
usb_dev
->
device
,
10
)
<
0
)
return
-
1
;
if
(
udevGetUintProperty
(
device
,
"ID_VENDOR_ID"
,
&
data
->
usb_dev
.
vendor
,
16
)
<
0
)
if
(
udevGetUintProperty
(
device
,
"ID_VENDOR_ID"
,
&
usb_dev
->
vendor
,
16
)
<
0
)
return
-
1
;
if
(
udevGetStringProperty
(
device
,
"ID_VENDOR_FROM_DATABASE"
,
&
data
->
usb_dev
.
vendor_name
)
<
0
)
&
usb_dev
->
vendor_name
)
<
0
)
return
-
1
;
if
(
!
data
->
usb_dev
.
vendor_name
&&
if
(
!
usb_dev
->
vendor_name
&&
udevGetStringSysfsAttr
(
device
,
"manufacturer"
,
&
data
->
usb_dev
.
vendor_name
)
<
0
)
&
usb_dev
->
vendor_name
)
<
0
)
return
-
1
;
if
(
udevGetUintProperty
(
device
,
"ID_MODEL_ID"
,
&
data
->
usb_dev
.
product
,
16
)
<
0
)
if
(
udevGetUintProperty
(
device
,
"ID_MODEL_ID"
,
&
usb_dev
->
product
,
16
)
<
0
)
return
-
1
;
if
(
udevGetStringProperty
(
device
,
"ID_MODEL_FROM_DATABASE"
,
&
data
->
usb_dev
.
product_name
)
<
0
)
&
usb_dev
->
product_name
)
<
0
)
return
-
1
;
if
(
!
data
->
usb_dev
.
product_name
&&
if
(
!
usb_dev
->
product_name
&&
udevGetStringSysfsAttr
(
device
,
"product"
,
&
data
->
usb_dev
.
product_name
)
<
0
)
&
usb_dev
->
product_name
)
<
0
)
return
-
1
;
if
(
udevGenerateDeviceName
(
device
,
def
,
NULL
)
!=
0
)
...
...
@@ -492,22 +493,22 @@ static int udevProcessUSBDevice(struct udev_device *device,
static
int
udevProcessUSBInterface
(
struct
udev_device
*
device
,
virNodeDeviceDefPtr
def
)
{
virNodeDevCap
DataPtr
data
=
&
def
->
caps
->
data
;
virNodeDevCap
USBIfPtr
usb_if
=
&
def
->
caps
->
data
.
usb_if
;
if
(
udevGetUintSysfsAttr
(
device
,
"bInterfaceNumber"
,
&
data
->
usb_if
.
number
,
16
)
<
0
)
&
usb_if
->
number
,
16
)
<
0
)
return
-
1
;
if
(
udevGetUintSysfsAttr
(
device
,
"bInterfaceClass"
,
&
data
->
usb_if
.
_class
,
16
)
<
0
)
&
usb_if
->
_class
,
16
)
<
0
)
return
-
1
;
if
(
udevGetUintSysfsAttr
(
device
,
"bInterfaceSubClass"
,
&
data
->
usb_if
.
subclass
,
16
)
<
0
)
&
usb_if
->
subclass
,
16
)
<
0
)
return
-
1
;
if
(
udevGetUintSysfsAttr
(
device
,
"bInterfaceProtocol"
,
&
data
->
usb_if
.
protocol
,
16
)
<
0
)
&
usb_if
->
protocol
,
16
)
<
0
)
return
-
1
;
if
(
udevGenerateDeviceName
(
device
,
def
,
NULL
)
!=
0
)
...
...
@@ -521,33 +522,33 @@ static int udevProcessNetworkInterface(struct udev_device *device,
virNodeDeviceDefPtr
def
)
{
const
char
*
devtype
=
udev_device_get_devtype
(
device
);
virNodeDevCap
DataPtr
data
=
&
def
->
caps
->
data
;
virNodeDevCap
NetPtr
net
=
&
def
->
caps
->
data
.
net
;
if
(
devtype
&&
STREQ
(
devtype
,
"wlan"
))
{
data
->
net
.
subtype
=
VIR_NODE_DEV_CAP_NET_80211
;
net
->
subtype
=
VIR_NODE_DEV_CAP_NET_80211
;
}
else
{
data
->
net
.
subtype
=
VIR_NODE_DEV_CAP_NET_80203
;
net
->
subtype
=
VIR_NODE_DEV_CAP_NET_80203
;
}
if
(
udevGetStringProperty
(
device
,
"INTERFACE"
,
&
data
->
net
.
ifname
)
<
0
)
&
net
->
ifname
)
<
0
)
return
-
1
;
if
(
udevGetStringSysfsAttr
(
device
,
"address"
,
&
data
->
net
.
address
)
<
0
)
&
net
->
address
)
<
0
)
return
-
1
;
if
(
udevGetUintSysfsAttr
(
device
,
"addr_len"
,
&
data
->
net
.
address_len
,
0
)
<
0
)
if
(
udevGetUintSysfsAttr
(
device
,
"addr_len"
,
&
net
->
address_len
,
0
)
<
0
)
return
-
1
;
if
(
udevGenerateDeviceName
(
device
,
def
,
data
->
net
.
address
)
!=
0
)
if
(
udevGenerateDeviceName
(
device
,
def
,
net
->
address
)
!=
0
)
return
-
1
;
if
(
virNetDevGetLinkInfo
(
data
->
net
.
ifname
,
&
data
->
net
.
lnk
)
<
0
)
if
(
virNetDevGetLinkInfo
(
net
->
ifname
,
&
net
->
lnk
)
<
0
)
return
-
1
;
if
(
virNetDevGetFeatures
(
data
->
net
.
ifname
,
&
data
->
net
.
features
)
<
0
)
if
(
virNetDevGetFeatures
(
net
->
ifname
,
&
net
->
features
)
<
0
)
return
-
1
;
return
0
;
...
...
@@ -557,21 +558,21 @@ static int udevProcessNetworkInterface(struct udev_device *device,
static
int
udevProcessSCSIHost
(
struct
udev_device
*
device
ATTRIBUTE_UNUSED
,
virNodeDeviceDefPtr
def
)
{
virNodeDevCap
DataPtr
data
=
&
def
->
caps
->
data
;
virNodeDevCap
SCSIHostPtr
scsi_host
=
&
def
->
caps
->
data
.
scsi_host
;
char
*
filename
=
NULL
;
char
*
str
;
filename
=
last_component
(
def
->
sysfs_path
);
if
(
!
(
str
=
STRSKIP
(
filename
,
"host"
))
||
virStrToLong_ui
(
str
,
NULL
,
0
,
&
data
->
scsi_host
.
host
)
<
0
)
{
virStrToLong_ui
(
str
,
NULL
,
0
,
&
scsi_host
->
host
)
<
0
)
{
virReportError
(
VIR_ERR_INTERNAL_ERROR
,
_
(
"failed to parse SCSI host '%s'"
),
filename
);
return
-
1
;
}
nodeDeviceSysfsGetSCSIHostCaps
(
&
def
->
caps
->
data
);
nodeDeviceSysfsGetSCSIHostCaps
(
&
def
->
caps
->
data
.
scsi_host
);
if
(
udevGenerateDeviceName
(
device
,
def
,
NULL
)
!=
0
)
return
-
1
;
...
...
@@ -584,11 +585,11 @@ static int udevProcessSCSITarget(struct udev_device *device ATTRIBUTE_UNUSED,
virNodeDeviceDefPtr
def
)
{
const
char
*
sysname
=
NULL
;
virNodeDevCap
DataPtr
data
=
&
def
->
caps
->
data
;
virNodeDevCap
SCSITargetPtr
scsi_target
=
&
def
->
caps
->
data
.
scsi_target
;
sysname
=
udev_device_get_sysname
(
device
);
if
(
VIR_STRDUP
(
data
->
scsi_target
.
name
,
sysname
)
<
0
)
if
(
VIR_STRDUP
(
scsi_target
->
name
,
sysname
)
<
0
)
return
-
1
;
if
(
udevGenerateDeviceName
(
device
,
def
,
NULL
)
!=
0
)
...
...
@@ -661,15 +662,15 @@ static int udevProcessSCSIDevice(struct udev_device *device ATTRIBUTE_UNUSED,
{
int
ret
=
-
1
;
unsigned
int
tmp
=
0
;
virNodeDevCap
DataPtr
data
=
&
def
->
caps
->
data
;
virNodeDevCap
SCSIPtr
scsi
=
&
def
->
caps
->
data
.
scsi
;
char
*
filename
=
NULL
,
*
p
=
NULL
;
filename
=
last_component
(
def
->
sysfs_path
);
if
(
virStrToLong_ui
(
filename
,
&
p
,
10
,
&
data
->
scsi
.
host
)
<
0
||
p
==
NULL
||
virStrToLong_ui
(
p
+
1
,
&
p
,
10
,
&
data
->
scsi
.
bus
)
<
0
||
p
==
NULL
||
virStrToLong_ui
(
p
+
1
,
&
p
,
10
,
&
data
->
scsi
.
target
)
<
0
||
p
==
NULL
||
virStrToLong_ui
(
p
+
1
,
&
p
,
10
,
&
data
->
scsi
.
lun
)
<
0
)
{
if
(
virStrToLong_ui
(
filename
,
&
p
,
10
,
&
scsi
->
host
)
<
0
||
p
==
NULL
||
virStrToLong_ui
(
p
+
1
,
&
p
,
10
,
&
scsi
->
bus
)
<
0
||
p
==
NULL
||
virStrToLong_ui
(
p
+
1
,
&
p
,
10
,
&
scsi
->
target
)
<
0
||
p
==
NULL
||
virStrToLong_ui
(
p
+
1
,
&
p
,
10
,
&
scsi
->
lun
)
<
0
)
{
virReportError
(
VIR_ERR_INTERNAL_ERROR
,
_
(
"failed to parse the SCSI address from filename: '%s'"
),
filename
);
...
...
@@ -680,7 +681,7 @@ static int udevProcessSCSIDevice(struct udev_device *device ATTRIBUTE_UNUSED,
if
(
udevGetUintSysfsAttr
(
device
,
"type"
,
&
tmp
,
0
)
<
0
)
goto
cleanup
;
if
(
udevGetSCSIType
(
def
,
tmp
,
&
data
->
scsi
.
type
)
<
0
)
if
(
udevGetSCSIType
(
def
,
tmp
,
&
scsi
->
type
)
<
0
)
goto
cleanup
;
}
...
...
@@ -702,17 +703,16 @@ static int udevProcessSCSIDevice(struct udev_device *device ATTRIBUTE_UNUSED,
static
int
udevProcessDisk
(
struct
udev_device
*
device
,
virNodeDeviceDefPtr
def
)
{
virNodeDevCap
DataPtr
data
=
&
def
->
caps
->
data
;
virNodeDevCap
StoragePtr
storage
=
&
def
->
caps
->
data
.
storage
;
if
(
udevGetUint64SysfsAttr
(
device
,
"size"
,
&
data
->
storage
.
num_blocks
)
<
0
)
if
(
udevGetUint64SysfsAttr
(
device
,
"size"
,
&
storage
->
num_blocks
)
<
0
)
return
-
1
;
if
(
udevGetUint64SysfsAttr
(
device
,
"queue/logical_block_size"
,
&
data
->
storage
.
logical_block_size
)
<
0
)
&
storage
->
logical_block_size
)
<
0
)
return
-
1
;
data
->
storage
.
size
=
data
->
storage
.
num_blocks
*
data
->
storage
.
logical_block_size
;
storage
->
size
=
storage
->
num_blocks
*
storage
->
logical_block_size
;
return
0
;
}
...
...
@@ -722,7 +722,7 @@ static int udevProcessRemoveableMedia(struct udev_device *device,
virNodeDeviceDefPtr
def
,
int
has_media
)
{
virNodeDevCap
DataPtr
data
=
&
def
->
caps
->
data
;
virNodeDevCap
StoragePtr
storage
=
&
def
->
caps
->
data
.
storage
;
int
is_removable
=
0
;
if
(
udevGetIntSysfsAttr
(
device
,
"removable"
,
&
is_removable
,
0
)
<
0
)
...
...
@@ -737,15 +737,15 @@ static int udevProcessRemoveableMedia(struct udev_device *device,
VIR_NODE_DEV_CAP_STORAGE_REMOVABLE_MEDIA_AVAILABLE
;
if
(
udevGetStringProperty
(
device
,
"ID_FS_LABEL"
,
&
data
->
storage
.
media_label
)
<
0
)
&
storage
->
media_label
)
<
0
)
return
-
1
;
if
(
udevGetUint64SysfsAttr
(
device
,
"size"
,
&
data
->
storage
.
num_blocks
)
<
0
)
&
storage
->
num_blocks
)
<
0
)
return
-
1
;
if
(
udevGetUint64SysfsAttr
(
device
,
"queue/logical_block_size"
,
&
data
->
storage
.
logical_block_size
)
<
0
)
&
storage
->
logical_block_size
)
<
0
)
return
-
1
;
/* XXX This calculation is wrong for the qemu virtual cdrom
...
...
@@ -800,18 +800,17 @@ static int udevProcessFloppy(struct udev_device *device,
static
int
udevProcessSD
(
struct
udev_device
*
device
,
virNodeDeviceDefPtr
def
)
{
virNodeDevCap
DataPtr
data
=
&
def
->
caps
->
data
;
virNodeDevCap
StoragePtr
storage
=
&
def
->
caps
->
data
.
storage
;
if
(
udevGetUint64SysfsAttr
(
device
,
"size"
,
&
data
->
storage
.
num_blocks
)
<
0
)
&
storage
->
num_blocks
)
<
0
)
return
-
1
;
if
(
udevGetUint64SysfsAttr
(
device
,
"queue/logical_block_size"
,
&
data
->
storage
.
logical_block_size
)
<
0
)
&
storage
->
logical_block_size
)
<
0
)
return
-
1
;
data
->
storage
.
size
=
data
->
storage
.
num_blocks
*
data
->
storage
.
logical_block_size
;
storage
->
size
=
storage
->
num_blocks
*
storage
->
logical_block_size
;
return
0
;
}
...
...
@@ -846,7 +845,7 @@ static int udevKludgeStorageType(virNodeDeviceDefPtr def)
static
int
udevProcessStorage
(
struct
udev_device
*
device
,
virNodeDeviceDefPtr
def
)
{
virNodeDevCap
DataPtr
data
=
&
def
->
caps
->
data
;
virNodeDevCap
StoragePtr
storage
=
&
def
->
caps
->
data
.
storage
;
int
ret
=
-
1
;
const
char
*
devnode
;
...
...
@@ -856,20 +855,20 @@ static int udevProcessStorage(struct udev_device *device,
goto
cleanup
;
}
if
(
VIR_STRDUP
(
data
->
storage
.
block
,
devnode
)
<
0
)
if
(
VIR_STRDUP
(
storage
->
block
,
devnode
)
<
0
)
goto
cleanup
;
if
(
udevGetStringProperty
(
device
,
"ID_BUS"
,
&
data
->
storage
.
bus
)
<
0
)
if
(
udevGetStringProperty
(
device
,
"ID_BUS"
,
&
storage
->
bus
)
<
0
)
goto
cleanup
;
if
(
udevGetStringProperty
(
device
,
"ID_SERIAL"
,
&
data
->
storage
.
serial
)
<
0
)
if
(
udevGetStringProperty
(
device
,
"ID_SERIAL"
,
&
storage
->
serial
)
<
0
)
goto
cleanup
;
if
(
udevGetStringSysfsAttr
(
device
,
"device/vendor"
,
&
data
->
storage
.
vendor
)
<
0
)
if
(
udevGetStringSysfsAttr
(
device
,
"device/vendor"
,
&
storage
->
vendor
)
<
0
)
goto
cleanup
;
if
(
def
->
caps
->
data
.
storage
.
vendor
)
virTrimSpaces
(
def
->
caps
->
data
.
storage
.
vendor
,
NULL
);
if
(
udevGetStringSysfsAttr
(
device
,
"device/model"
,
&
data
->
storage
.
model
)
<
0
)
if
(
udevGetStringSysfsAttr
(
device
,
"device/model"
,
&
storage
->
model
)
<
0
)
goto
cleanup
;
if
(
def
->
caps
->
data
.
storage
.
model
)
virTrimSpaces
(
def
->
caps
->
data
.
storage
.
model
,
NULL
);
...
...
@@ -878,10 +877,10 @@ static int udevProcessStorage(struct udev_device *device,
* expected, so I don't see a problem with not having a property
* for it. */
if
(
udevGetStringProperty
(
device
,
"ID_TYPE"
,
&
data
->
storage
.
drive_type
)
<
0
)
if
(
udevGetStringProperty
(
device
,
"ID_TYPE"
,
&
storage
->
drive_type
)
<
0
)
goto
cleanup
;
if
(
!
data
->
storage
.
drive_type
||
if
(
!
storage
->
drive_type
||
STREQ
(
def
->
caps
->
data
.
storage
.
drive_type
,
"generic"
))
{
int
val
=
0
;
const
char
*
str
=
NULL
;
...
...
@@ -908,7 +907,7 @@ static int udevProcessStorage(struct udev_device *device,
}
if
(
str
)
{
if
(
VIR_STRDUP
(
data
->
storage
.
drive_type
,
str
)
<
0
)
if
(
VIR_STRDUP
(
storage
->
drive_type
,
str
)
<
0
)
goto
cleanup
;
}
else
{
/* If udev doesn't have it, perhaps we can guess it. */
...
...
@@ -931,7 +930,7 @@ static int udevProcessStorage(struct udev_device *device,
goto
cleanup
;
}
if
(
udevGenerateDeviceName
(
device
,
def
,
data
->
storage
.
serial
)
!=
0
)
if
(
udevGenerateDeviceName
(
device
,
def
,
storage
->
serial
)
!=
0
)
goto
cleanup
;
cleanup:
...
...
@@ -1421,10 +1420,12 @@ static void udevEventHandleCallback(int watch ATTRIBUTE_UNUSED,
/* DMI is intel-compatible specific */
#if defined(__x86_64__) || defined(__i386__) || defined(__amd64__)
static
void
udevGetDMIData
(
virNodeDevCap
DataPtr
data
)
udevGetDMIData
(
virNodeDevCap
SystemPtr
system
)
{
struct
udev
*
udev
=
NULL
;
struct
udev_device
*
device
=
NULL
;
virNodeDevCapSystemHardwarePtr
hardware
=
&
system
->
hardware
;
virNodeDevCapSystemFirmwarePtr
firmware
=
&
system
->
firmware
;
udev
=
udev_monitor_get_udev
(
DRV_STATE_UDEV_MONITOR
(
driver
));
...
...
@@ -1440,29 +1441,29 @@ udevGetDMIData(virNodeDevCapDataPtr data)
}
if
(
udevGetStringSysfsAttr
(
device
,
"product_name"
,
&
data
->
system
.
product_name
)
<
0
)
&
system
->
product_name
)
<
0
)
goto
cleanup
;
if
(
udevGetStringSysfsAttr
(
device
,
"sys_vendor"
,
&
data
->
system
.
hardware
.
vendor_name
)
<
0
)
&
hardware
->
vendor_name
)
<
0
)
goto
cleanup
;
if
(
udevGetStringSysfsAttr
(
device
,
"product_version"
,
&
data
->
system
.
hardware
.
version
)
<
0
)
&
hardware
->
version
)
<
0
)
goto
cleanup
;
if
(
udevGetStringSysfsAttr
(
device
,
"product_serial"
,
&
data
->
system
.
hardware
.
serial
)
<
0
)
&
hardware
->
serial
)
<
0
)
goto
cleanup
;
if
(
virGetHostUUID
(
data
->
system
.
hardware
.
uuid
))
if
(
virGetHostUUID
(
hardware
->
uuid
))
goto
cleanup
;
if
(
udevGetStringSysfsAttr
(
device
,
"bios_vendor"
,
&
data
->
system
.
firmware
.
vendor_name
)
<
0
)
&
firmware
->
vendor_name
)
<
0
)
goto
cleanup
;
if
(
udevGetStringSysfsAttr
(
device
,
"bios_version"
,
&
data
->
system
.
firmware
.
version
)
<
0
)
&
firmware
->
version
)
<
0
)
goto
cleanup
;
if
(
udevGetStringSysfsAttr
(
device
,
"bios_date"
,
&
data
->
system
.
firmware
.
release_date
)
<
0
)
&
firmware
->
release_date
)
<
0
)
goto
cleanup
;
cleanup:
...
...
@@ -1489,7 +1490,7 @@ static int udevSetupSystemDev(void)
goto
cleanup
;
#if defined(__x86_64__) || defined(__i386__) || defined(__amd64__)
udevGetDMIData
(
&
def
->
caps
->
data
);
udevGetDMIData
(
&
def
->
caps
->
data
.
system
);
#endif
dev
=
virNodeDeviceObjAssignDef
(
&
driver
->
devs
,
def
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录