* Replace the path based lstat in the device watcher with the new device/node
based one. The path based version could not have worked for entry removed notifications at all as the node is removed from the directory at this point already * Forgot to delete the device watcher instance after removing all monitors * The PartitionRegistrar in DeleteDevice() was set to already locked which is not the case * Someone probably forgot to add a PartitionRegistrar to the media checker - it did register the device on each run but never actually unregistered it, which obviously messed up the reference counting a bit git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24815 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
3b9651f3fc
commit
5d7ee5e84a
|
@ -117,17 +117,8 @@ class KDiskDeviceManager::DeviceWatcher : public NotificationListener {
|
||||||
ino_t directory = event->GetInt64("directory", -1);
|
ino_t directory = event->GetInt64("directory", -1);
|
||||||
ino_t node = event->GetInt64("node", -1);
|
ino_t node = event->GetInt64("node", -1);
|
||||||
|
|
||||||
// TODO: it would be nice if we could stat based on the
|
|
||||||
// node here instead of having to resolve the path
|
|
||||||
KPath path(B_PATH_NAME_LENGTH + 1);
|
|
||||||
if (path.InitCheck() != B_OK
|
|
||||||
|| vfs_entry_ref_to_path(device, directory, name,
|
|
||||||
path.LockBuffer(), path.BufferSize()) != B_OK)
|
|
||||||
break;
|
|
||||||
path.UnlockBuffer();
|
|
||||||
|
|
||||||
struct stat st;
|
struct stat st;
|
||||||
if (lstat(path.Path(), &st) != 0)
|
if (vfs_stat_entry_ref(device, node, &st) != 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (S_ISDIR(st.st_mode)) {
|
if (S_ISDIR(st.st_mode)) {
|
||||||
|
@ -139,6 +130,15 @@ class KDiskDeviceManager::DeviceWatcher : public NotificationListener {
|
||||||
} else {
|
} else {
|
||||||
if (strcmp(name, "raw") == 0) {
|
if (strcmp(name, "raw") == 0) {
|
||||||
// a new raw device was added/removed
|
// a new raw device was added/removed
|
||||||
|
KPath path(B_PATH_NAME_LENGTH + 1);
|
||||||
|
if (path.InitCheck() != B_OK
|
||||||
|
|| vfs_entry_ref_to_path(device, directory,
|
||||||
|
name, path.LockBuffer(),
|
||||||
|
path.BufferSize()) != B_OK) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
path.UnlockBuffer();
|
||||||
|
|
||||||
if (opCode == B_ENTRY_CREATED)
|
if (opCode == B_ENTRY_CREATED)
|
||||||
fManager->CreateDevice(path.Path());
|
fManager->CreateDevice(path.Path());
|
||||||
else
|
else
|
||||||
|
@ -204,6 +204,7 @@ KDiskDeviceManager::~KDiskDeviceManager()
|
||||||
|
|
||||||
// stop all node monitoring
|
// stop all node monitoring
|
||||||
_AddRemoveMonitoring("/dev/disk", false);
|
_AddRemoveMonitoring("/dev/disk", false);
|
||||||
|
delete fDeviceWatcher;
|
||||||
|
|
||||||
// remove all devices
|
// remove all devices
|
||||||
for (int32 cookie = 0; KDiskDevice *device = NextDevice(&cookie);) {
|
for (int32 cookie = 0; KDiskDevice *device = NextDevice(&cookie);) {
|
||||||
|
@ -626,7 +627,7 @@ KDiskDeviceManager::DeleteDevice(const char *path)
|
||||||
if (device == NULL)
|
if (device == NULL)
|
||||||
return B_ENTRY_NOT_FOUND;
|
return B_ENTRY_NOT_FOUND;
|
||||||
|
|
||||||
PartitionRegistrar _(device, true);
|
PartitionRegistrar _(device, false);
|
||||||
if (DeviceWriteLocker locker = device) {
|
if (DeviceWriteLocker locker = device) {
|
||||||
if (_RemoveDevice(device))
|
if (_RemoveDevice(device))
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
@ -1336,6 +1337,7 @@ KDiskDeviceManager::_CheckMediaStatus()
|
||||||
while (!fTerminating) {
|
while (!fTerminating) {
|
||||||
int32 cookie = 0;
|
int32 cookie = 0;
|
||||||
while (KDiskDevice* device = RegisterNextDevice(&cookie)) {
|
while (KDiskDevice* device = RegisterNextDevice(&cookie)) {
|
||||||
|
PartitionRegistrar _(device, true);
|
||||||
DeviceWriteLocker locker(device);
|
DeviceWriteLocker locker(device);
|
||||||
|
|
||||||
if (device->IsBusy(true))
|
if (device->IsBusy(true))
|
||||||
|
|
Loading…
Reference in New Issue