device_delete () Remove subdevices for eg. partitions
This commit is contained in:
@@ -113,8 +113,35 @@ void device_delete (const char* key, struct proc* proc, struct reschedule_ctx* r
|
|||||||
|
|
||||||
struct device* device = hash_entry (delete_link, struct device, device_table_link);
|
struct device* device = hash_entry (delete_link, struct device, device_table_link);
|
||||||
|
|
||||||
if (device != NULL)
|
if (device != NULL) {
|
||||||
|
/* Check for "subdevices", for eg. partition devices */
|
||||||
|
|
||||||
|
for (size_t i = 0; i < lengthof (device_table.device_buckets); i++) {
|
||||||
|
struct hash_node_link* hash_node = device_table.device_buckets[i];
|
||||||
|
|
||||||
|
while (hash_node != NULL) {
|
||||||
|
struct device* dev = hash_entry (hash_node, struct device, device_table_link);
|
||||||
|
hash_node = hash_node->next;
|
||||||
|
|
||||||
|
if (memcmp (dev->key, device->key, strlen (device->key)) == 0) {
|
||||||
|
struct hash_node_link* dev_delete_link;
|
||||||
|
|
||||||
|
size_t dev_key_len = strlen_null (dev->key);
|
||||||
|
uint32_t dev_hash = hash_fnv32 (dev->key, dev_key_len);
|
||||||
|
|
||||||
|
hash_delete (&device_table, dev->key, strlen_null (dev->key), dev_hash,
|
||||||
|
lengthof (device_table.device_buckets), device_buckets, struct device,
|
||||||
|
device_table_link, key, dev_delete_link);
|
||||||
|
|
||||||
|
dev->fini (dev, proc, rctx);
|
||||||
|
free (dev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
device->fini (device, proc, rctx);
|
device->fini (device, proc, rctx);
|
||||||
|
free (device);
|
||||||
|
}
|
||||||
|
|
||||||
spin_unlock (&device_table.lock, fdt);
|
spin_unlock (&device_table.lock, fdt);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ static void usb_eject (const char* dev_key) {
|
|||||||
|
|
||||||
if (strcmp (info->device_key, dev_key) == 0) {
|
if (strcmp (info->device_key, dev_key) == 0) {
|
||||||
int ret = volume_delete (info->volume_name);
|
int ret = volume_delete (info->volume_name);
|
||||||
mprintf ("Deleted volume %s: %s", info->volume_name, str_status[ret < 0 ? -ret : ret]);
|
mprintf ("Deleted volume %s: %s\n", info->volume_name, str_status[ret < 0 ? -ret : ret]);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user