From 2976912a518db378fc4f89d3506d5e206fbd0844 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Tue, 27 May 2008 12:04:09 +0000 Subject: [PATCH] * BaseDevice didn't initialize the fInitialized member, and thus causing bug #2265. * Device::InitDevice()/UninitDevice() are called from outside of the device manager, so they better lock it. * Turned off debug output in devfs and the device manager. * Fixed debug output in devfs to print the actual vnode/cookie values, instead of the structures the VFS passes in now. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@25670 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/kernel/device_manager/BaseDevice.cpp | 1 + src/system/kernel/device_manager/devfs.cpp | 9 ++++----- src/system/kernel/device_manager/device_manager.cpp | 6 +++++- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/system/kernel/device_manager/BaseDevice.cpp b/src/system/kernel/device_manager/BaseDevice.cpp index 32e1467536..1e462f4bca 100644 --- a/src/system/kernel/device_manager/BaseDevice.cpp +++ b/src/system/kernel/device_manager/BaseDevice.cpp @@ -10,6 +10,7 @@ BaseDevice::BaseDevice() : fNode(NULL), + fInitialized(0), fDeviceModule(NULL), fDeviceData(NULL) { diff --git a/src/system/kernel/device_manager/devfs.cpp b/src/system/kernel/device_manager/devfs.cpp index 1f498bd20b..1d9014db14 100644 --- a/src/system/kernel/device_manager/devfs.cpp +++ b/src/system/kernel/device_manager/devfs.cpp @@ -40,7 +40,7 @@ #include "legacy_drivers.h" -#define TRACE_DEVFS +//#define TRACE_DEVFS #ifdef TRACE_DEVFS # define TRACE(x) dprintf x #else @@ -1140,12 +1140,11 @@ devfs_open(fs_volume* _volume, fs_vnode* _vnode, int openMode, struct devfs_cookie* cookie; status_t status = B_OK; - TRACE(("devfs_open: vnode %p, openMode 0x%x, fs_cookie %p \n", vnode, openMode, _cookie)); - cookie = (struct devfs_cookie*)malloc(sizeof(struct devfs_cookie)); if (cookie == NULL) return B_NO_MEMORY; + TRACE(("devfs_open: vnode %p, openMode 0x%x, cookie %p\n", vnode, openMode, cookie)); cookie->device_cookie = NULL; if (S_ISCHR(vnode->stream.type)) { @@ -1484,7 +1483,7 @@ devfs_rewind_dir(fs_volume *_volume, fs_vnode *_vnode, void *_cookie) struct devfs_dir_cookie *cookie = (devfs_dir_cookie *)_cookie; struct devfs *fs = (struct devfs *)_volume->private_volume; - TRACE(("devfs_rewind_dir: vnode %p, cookie %p\n", _vnode, _cookie)); + TRACE(("devfs_rewind_dir: vnode %p, cookie %p\n", vnode, cookie)); if (!S_ISDIR(vnode->stream.type)) return B_BAD_VALUE; @@ -1510,7 +1509,7 @@ devfs_ioctl(fs_volume *_volume, fs_vnode *_vnode, void *_cookie, ulong op, struct devfs_cookie *cookie = (struct devfs_cookie *)_cookie; TRACE(("devfs_ioctl: vnode %p, cookie %p, op %ld, buf %p, len %ld\n", - _vnode, _cookie, op, buffer, length)); + vnode, cookie, op, buffer, length)); // we are actually checking for a *device* here, we don't make the // distinction between char and block devices diff --git a/src/system/kernel/device_manager/device_manager.cpp b/src/system/kernel/device_manager/device_manager.cpp index c53914f3f0..ddba8d4c06 100644 --- a/src/system/kernel/device_manager/device_manager.cpp +++ b/src/system/kernel/device_manager/device_manager.cpp @@ -32,7 +32,7 @@ #include "io_resources.h" -#define TRACE_DEVICE_MANAGER +//#define TRACE_DEVICE_MANAGER #ifdef TRACE_DEVICE_MANAGER # define TRACE(a) dprintf a #else @@ -1000,6 +1000,8 @@ Device::InitCheck() const status_t Device::InitDevice() { + RecursiveLocker _(sLock); + if ((fNode->Flags() & NODE_FLAG_DEVICE_REMOVED) != 0) { // TODO: maybe the device should be unlinked in devfs, too return ENODEV; @@ -1042,6 +1044,8 @@ Device::InitDevice() void Device::UninitDevice() { + RecursiveLocker _(sLock); + if (fInitialized-- > 1) { fNode->UninitDriver(); return;