double proc entries

danny
2006-08-21T02:49:19Z

[-- Attachment #1: Type: text/plain, Size: 1146 bytes --]

Hi,
Recently I noticed that unloading video.ko causes a warning from remove_proc_entry because the subdir is not empty. This is related to the fact that I have 2 VID
entries in /proc/acpi/video, and this messes up things a bit. The cause of this is that the VID entry appears both on the PCI and on the AGP bus, sysfs handles this
nicely:
./firmware/acpi/namespace/ACPI/_SB/PCI0/AGP/VID
./firmware/acpi/namespace/ACPI/_SB/PCI0/AGP/VID/DVI0
./firmware/acpi/namespace/ACPI/_SB/PCI0/AGP/VID/CRT0
./firmware/acpi/namespace/ACPI/_SB/PCI0/AGP/VID/LCD0
./firmware/acpi/namespace/ACPI/_SB/PCI0/VID
./firmware/acpi/namespace/ACPI/_SB/PCI0/VID/DVI0
./firmware/acpi/namespace/ACPI/_SB/PCI0/VID/CRT0
./firmware/acpi/namespace/ACPI/_SB/PCI0/VID/LCD0

More information can be found here:
http://qa.mandriva.com/show_bug.cgi?id=22249

proc/acpi/video/ does not know about AGP or PCI. Attached patch fixes the problem but is not so beautiful.
Maybe it's better to make another subdir in video for the parent of the device, but I thought this would be more likely to break userland apps.
Perhaps someone can do better.

Regards,

Danny

(Please CC on reply).

[-- Attachment #2: acpi_fix-double-proc-entries.patch --]
[-- Type: text/plain, Size: 2290 bytes --]

--- linux/drivers/acpi/video.c.orig 2006-06-20 18:31:55.000000000 +0900
+++ linux/drivers/acpi/video.c 2006-08-21 11:23:29.000000000 +0900
@@ -1183,13 +1183,18 @@
{
struct proc_dir_entry *entry = NULL;
struct acpi_video_bus *video;
+ char proc_dir_name[32];

ACPI_FUNCTION_TRACE("acpi_video_bus_add_fs");

video = (struct acpi_video_bus *)acpi_driver_data(device);
-
+
if (!acpi_device_dir(device)) {
- acpi_device_dir(device) = proc_mkdir(acpi_device_bid(device),
+ strcpy(proc_dir_name, acpi_device_bid(device));
+ strcat(proc_dir_name, "_");
+ strcat(proc_dir_name, acpi_device_bid(device->parent));
+
+ acpi_device_dir(device) = proc_mkdir(proc_dir_name,
acpi_video_dir);
if (!acpi_device_dir(device))
return_VALUE(-ENODEV);
@@ -1265,6 +1270,7 @@
static int acpi_video_bus_remove_fs(struct acpi_device *device)
{
struct acpi_video_bus *video;
+ char proc_dir_name[32];

ACPI_FUNCTION_TRACE("acpi_video_bus_remove_fs");

@@ -1276,7 +1282,11 @@
remove_proc_entry("POST_info", acpi_device_dir(device));
remove_proc_entry("POST", acpi_device_dir(device));
remove_proc_entry("DOS", acpi_device_dir(device));
- remove_proc_entry(acpi_device_bid(device), acpi_video_dir);
+
+ strcpy(proc_dir_name, acpi_device_bid(device));
+ strcat(proc_dir_name, "_");
+ strcat(proc_dir_name, acpi_device_bid(device->parent));
+ remove_proc_entry(proc_dir_name, acpi_video_dir);
acpi_device_dir(device) = NULL;
}

@@ -1748,12 +1758,13 @@
int result = 0;
acpi_status status = 0;
struct acpi_video_bus *video = NULL;
-
+ char proc_dir_name[32];
+
ACPI_FUNCTION_TRACE("acpi_video_bus_add");

if (!device)
return_VALUE(-EINVAL);
-
+
video = kmalloc(sizeof(struct acpi_video_bus), GFP_KERNEL);
if (!video)
return_VALUE(-ENOMEM);
@@ -1789,8 +1800,12 @@
goto end;
}

+ strcpy(proc_dir_name, acpi_device_bid(device));
+ strcat(proc_dir_name, "_");
+ strcat(proc_dir_name, acpi_device_bid(device->parent));
+
printk(KERN_INFO PREFIX "%s [%s] (multi-head: %s rom: %s post: %s)\n",
- ACPI_VIDEO_DEVICE_NAME, acpi_device_bid(device),
+ ACPI_VIDEO_DEVICE_NAME, proc_dir_name,