
On 2012年12月14日 21:23, Eric Blake wrote:
On 12/13/2012 12:05 PM, Osier Yang wrote:
"virGetDevice{Major,Minor}" could be used across the sources, but it doesn't relate with this series, and could be done later.
* src/util/util.h: (Declare virGetDevice{Major,Minor}, and
You generally want both values in one go; calling stat() twice because you have two functions is not only a waste, but a racy window (if someone is modifying the pathname in the meantime).
+static char * +virGetUnprivSGIOSysfsPath(const char *path) +{ + int major, minor; + char *sysfs_path = NULL; + + if ((major = virGetDeviceMajor(path))< 0) { + virReportSystemError(-major, + _("Unable to get major number of device '%s'"), + path); + return NULL; + } + + if ((minor = virGetDeviceMinor(path))< 0) { + virReportSystemError(-minor, + _("Unable to get minor number of device '%s'"), + path); + return NULL; + } + + if (virAsprintf(&sysfs_path, "/sys/dev/block/%d:%d/queue/unpriv_sgio", + major, minor)< 0) {
This is hard-coded to probe the actual kernel. If you instead make it use a configurable prefix, then we could default to the kernel path, but also allow our testsuite to pass in a prefix from the testsuite, so that we can test this functionality even on kernels that don't support the feature (similar to how we have tests/nodeinfodata for faked cpu and node information). I'm not yet sure whether we'll need to fake this information in any of our tests, but it's food for thought.
Okay, nice suggestion.