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.