HI, Rafael Thanks for commenting. > From: Rafael J. Wysocki [mailto:rjw@xxxxxxxxxxxxx] > Sent: Monday, March 03, 2014 9:17 PM > > On Monday, March 03, 2014 03:19:36 PM Lv Zheng wrote: > > > > The information contained in _DDN (Dos Device Name) might be useful > > for userspace utilities, this patch thus exports such information > > using "ddn" attribute. > > Note that the "ddn" attribute will be created as long as the _DDN > > identifying object exists, whatever its evaluation succeeds or not. > > > > This patch must modify the code which is using "struct acpi_buffer" > > as the buffer.length must be reset to ACPI_ALLOCATE_BUFFER before > > reusing it to invoke acpi_evaluate_object() again. > > > > Signed-off-by: Lv Zheng <lv.zheng@xxxxxxxxx> > > Cc: Arjan van de Ven <arjan@xxxxxxxxxxxxxxx> > > --- > > > > Documentation/ABI/testing/sysfs-bus-acpi | 7 +++++ > > drivers/acpi/scan.c | 47 > > +++++++++++++++++++++++++++++- include/acpi/acpi_bus.h | > > 1 + > > 3 files changed, 54 insertions(+), 1 deletion(-) > > > > Patch > > > > diff --git a/Documentation/ABI/testing/sysfs-bus-acpi > > b/Documentation/ABI/testing/sysfs-bus-acpi index 7fa9cbc..db376b8 100644 > > --- a/Documentation/ABI/testing/sysfs-bus-acpi > > +++ b/Documentation/ABI/testing/sysfs-bus-acpi > > > > @@ -49,6 +49,13 @@ Description: > > This attribute contains the output of the device object's > > _UID control method, if present. > > > > +What: /sys/bus/acpi/devices/.../ddn > > +Date: February 2014 > > +Contact: Rafael J. Wysocki <rjw@xxxxxxxxxxxxx> > > +Description: > > + This attribute contains the output of the device object's > > + _DDN control method, if present. > > + > > > > What: /sys/bus/acpi/devices/.../eject > > Date: December 2006 > > Contact: Rafael J. Wysocki <rjw@xxxxxxxxxxxxx> > > > > diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c > > index 4789c9b..5f039a6 100644 > > --- a/drivers/acpi/scan.c > > +++ b/drivers/acpi/scan.c > > @@ -662,6 +662,18 @@ static ssize_t description_show(struct device *dev, > > > > } > > static DEVICE_ATTR(description, 0444, description_show, NULL); > > > > +/* sysfs file that shows DOS device name text from the ACPI _DDN method */ > > +static ssize_t ddn_show(struct device *dev, struct device_attribute *attr, > > + char *buf) { > > + struct acpi_device *acpi_dev = to_acpi_device(dev); > > + > > + if (acpi_dev->pnp.ddn == NULL) > > Please use "if (!acpi_dev->pnp.ddn)" > > Also, you can do > > return acpi_dev->pnp.ddn ? snprintf(buf, PAGE_SIZE, "%s\n", acpi_dev->pnp.ddn) : 0; OK, I'll update this. > > > + return 0; > > + > > + return snprintf(buf, PAGE_SIZE, "%s\n", acpi_dev->pnp.ddn); > > +} > > +static DEVICE_ATTR(ddn, 0444, ddn_show, NULL); > > + > > > > static ssize_t > > acpi_device_sun_show(struct device *dev, struct device_attribute *attr, > > > > char *buf) { > > > > @@ -687,10 +699,11 @@ static DEVICE_ATTR_RO(status); > > > > static int acpi_device_setup_files(struct acpi_device *dev) > > { > > > > - struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL}; > > + struct acpi_buffer buffer; > > > > acpi_status status; > > unsigned long long sun; > > int result = 0; > > > > + union acpi_object *object; > > > > /* > > > > * Devices gotten from FADT don't have a "path" attribute > > > > @@ -715,6 +728,8 @@ static int acpi_device_setup_files(struct acpi_device > > *dev)> > > * If device has _STR, 'description' file is created > > */ > > > > if (acpi_has_method(dev->handle, "_STR")) { > > > > + buffer.length = ACPI_ALLOCATE_BUFFER; > > + buffer.pointer = NULL; > > > > status = acpi_evaluate_object(dev->handle, "_STR", > > > > NULL, &buffer); > > > > if (ACPI_FAILURE(status)) > > > > @@ -725,6 +740,29 @@ static int acpi_device_setup_files(struct acpi_device > > *dev)> > > goto end; > > > > } > > > > + /* > > + * If device has _DDN, 'ddn' file is created > > + */ > > + if (acpi_has_method(dev->handle, "_DDN")) { > > + buffer.length = ACPI_ALLOCATE_BUFFER; > > + buffer.pointer = NULL; > > + status = acpi_evaluate_object_typed(dev->handle, "_DDN", > > + NULL, &buffer, > > + ACPI_TYPE_STRING); > > + if (ACPI_FAILURE(status)) > > + buffer.pointer = NULL; > > + object = buffer.pointer; > > + if (object) { > > + dev->pnp.ddn = kstrndup(object->string.pointer, > > + object->string.length, > > + GFP_KERNEL); > > Is the string guaranteed to be null-terminated after that? Yes, ACPICA internal routines will use ACPI_STRNCPY and likewise to ensure this. I'll change it to kstrdup. Thanks and best regards -Lv > > > + kfree(object); > > + } > > + result = device_create_file(&dev->dev, &dev_attr_ddn); > > + if (result) > > + goto end; > > + } > > + > > > > if (dev->pnp.type.bus_address) > > > > result = device_create_file(&dev->dev, &dev_attr_adr); > > > > if (dev->pnp.unique_id) > > > > @@ -787,6 +825,13 @@ static void acpi_device_remove_files(struct > > acpi_device *dev)> > > device_remove_file(&dev->dev, &dev_attr_description); > > > > } > > /* > > > > + * If device has _DDN, remove 'ddn' file > > + */ > > + if (acpi_has_method(dev->handle, "_DDN")) { > > + device_remove_file(&dev->dev, &dev_attr_ddn); > > + kfree(dev->pnp.ddn); > > + } > > + /* > > > > * If device has _EJ0, remove 'eject' file. > > */ > > > > if (acpi_has_method(dev->handle, "_EJ0")) > > > > diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h > > index 9d82482..92cab35 100644 > > --- a/include/acpi/acpi_bus.h > > +++ b/include/acpi/acpi_bus.h > > @@ -244,6 +244,7 @@ struct acpi_device_pnp { > > > > acpi_device_name device_name; /* Driver-determined */ > > acpi_device_class device_class; /* " */ > > union acpi_object *str_obj; /* unicode string for _STR method */ > > > > + char *ddn; /* _DDN */ > > > > unsigned long sun; /* _SUN */ > > > > }; > > > -- > I speak only for myself. > Rafael J. Wysocki, Intel Open Source Technology Center. ��.n��������+%������w��{.n�����{�����ܨ}���Ơz�j:+v�����w����ޙ��&�)ߡ�a����z�ޗ���ݢj��w�f