patch-2.4.4 linux/drivers/usb/usb.c
Next file: linux/drivers/video/Config.in
Previous file: linux/drivers/usb/usb-uhci.c
Back to the patch index
Back to the overall index
- Lines: 91
- Date:
Wed Apr 25 14:10:47 2001
- Orig file:
v2.4.3/linux/drivers/usb/usb.c
- Orig date:
Sun Mar 25 18:14:21 2001
diff -u --recursive --new-file v2.4.3/linux/drivers/usb/usb.c linux/drivers/usb/usb.c
@@ -2,7 +2,7 @@
* drivers/usb/usb.c
*
* (C) Copyright Linus Torvalds 1999
- * (C) Copyright Johannes Erdfelt 1999
+ * (C) Copyright Johannes Erdfelt 1999-2001
* (C) Copyright Andreas Gal 1999
* (C) Copyright Gregory P. Smith 1999
* (C) Copyright Deti Fliegl 1999 (new USB architecture)
@@ -18,8 +18,6 @@
* Think of this as a "USB library" rather than anything else.
* It should be considered a slave, with no callbacks. Callbacks
* are evil.
- *
- * $Id: usb.c,v 1.53 2000/01/14 16:19:09 acher Exp $
*/
#include <linux/config.h>
@@ -340,6 +338,17 @@
urb->bandwidth = 0;
}
+static void usb_bus_get(struct usb_bus *bus)
+{
+ atomic_inc(&bus->refcnt);
+}
+
+static void usb_bus_put(struct usb_bus *bus)
+{
+ if (atomic_dec_and_test(&bus->refcnt))
+ kfree(bus);
+}
+
/**
* usb_alloc_bus - creates a new USB host controller structure
* @op: pointer to a struct usb_operations that this bus structure should use
@@ -377,6 +386,8 @@
INIT_LIST_HEAD(&bus->bus_list);
INIT_LIST_HEAD(&bus->inodes);
+ atomic_set(&bus->refcnt, 1);
+
return bus;
}
@@ -391,7 +402,7 @@
if (!bus)
return;
- kfree(bus);
+ usb_bus_put(bus);
}
/**
@@ -411,6 +422,8 @@
} else
warn("too many buses");
+ usb_bus_get(bus);
+
/* Add it to the list of buses */
list_add(&bus->bus_list, &usb_bus_list);
@@ -439,6 +452,8 @@
usbdevfs_remove_bus(bus);
clear_bit(bus->busnum, busmap.busmap);
+
+ usb_bus_put(bus);
}
/*
@@ -902,6 +917,8 @@
memset(dev, 0, sizeof(*dev));
+ usb_bus_get(bus);
+
dev->bus = bus;
dev->parent = parent;
atomic_set(&dev->refcnt, 1);
@@ -918,6 +935,9 @@
if (atomic_dec_and_test(&dev->refcnt)) {
dev->bus->op->deallocate(dev);
usb_destroy_configuration(dev);
+
+ usb_bus_put(dev->bus);
+
kfree(dev);
}
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)