Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=79df4c60c5b24ebc90f591d5991b22782813fcfe
Commit:     79df4c60c5b24ebc90f591d5991b22782813fcfe
Parent:     13d36c248379ca09c269f5dbed6dce1e3a326a48
Author:     Kenji Kaneshige <[EMAIL PROTECTED]>
AuthorDate: Thu Feb 21 15:24:16 2008 +0900
Committer:  Greg Kroah-Hartman <[EMAIL PROTECTED]>
CommitDate: Thu Feb 21 15:34:39 2008 -0800

    PCI: Fix wrong reference counter check for proc_dir_entry
    
    Fix wrong counter check for proc_dir_entry in pci_proc_detach_device().
    
    The pci_proc_detach_device() returns with -EBUSY before calling
    remove_proc_entry() if the reference counter of proc_dir_entry is not
    0. But this check is wrong and pci_proc_detach_device() always fails
    because the reference counter of proc_dir_entry is initialized with 1
    at creating time and decremented in remove_proc_entry(). This bug
    cause strange behaviour as followings:
    
    - Accessing /proc/bus/pci/XXXX/YY file after hot-removing pci adapter
      card causes kernel panic.
    
    - Repeating hot-add/hot-remove of pci adapter card increases files
      with the same name under /proc/bus/pci/XXXX/ directory. For example:
    
        # pwd
        /proc/bus/pci/0002:09
        # ls
        01.0
        # for i in `seq 5`
        > do
        > echo 0 > /sys/bus/pci/slots/0009_0032/power
        > echo 1 > /sys/bus/pci/slots/0009_0032/power
        > done
        # ls
        01.0  01.0  01.0  01.0  01.0  01.0
    
    The pci_proc_detach_device() should check if the reference counter is
    not larger than 1 instead.
    
    Signed-off-by: Kenji Kaneshige <[EMAIL PROTECTED]>
    Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>
---
 drivers/pci/proc.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/pci/proc.c b/drivers/pci/proc.c
index 68aeeb7..ef18fcd 100644
--- a/drivers/pci/proc.c
+++ b/drivers/pci/proc.c
@@ -422,7 +422,7 @@ int pci_proc_detach_device(struct pci_dev *dev)
        struct proc_dir_entry *e;
 
        if ((e = dev->procent)) {
-               if (atomic_read(&e->count))
+               if (atomic_read(&e->count) > 1)
                        return -EBUSY;
                remove_proc_entry(e->name, dev->bus->procdir);
                dev->procent = NULL;
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to