Implement storage device partition rescan (XDRV_PARTITION_RESCAN), Self-hosted installation WIP
This commit is contained in:
@@ -464,3 +464,26 @@ DEFINE_DEVICE_OP (idedrv_get_size) {
|
||||
|
||||
return ST_OK;
|
||||
}
|
||||
|
||||
DEFINE_DEVICE_OP (idedrv_partition_rescan) {
|
||||
uint64_t fsd;
|
||||
|
||||
struct list_node_link *subdevice_link, *tmp_subdevice_link;
|
||||
list_foreach (device->subdevices, subdevice_link, tmp_subdevice_link) {
|
||||
struct device* subdevice = list_entry (subdevice_link, struct device, subdevices_link);
|
||||
|
||||
spin_lock (&subdevice->lock, &fsd);
|
||||
list_remove (device->subdevices, &subdevice->subdevices_link);
|
||||
spin_unlock (&subdevice->lock, fsd);
|
||||
|
||||
device_delete (subdevice->key, proc, rctx);
|
||||
}
|
||||
|
||||
spin_unlock (&device->lock, *lockflags);
|
||||
|
||||
int r = device_probe_partitions (proc, rctx, device);
|
||||
|
||||
spin_lock (&device->lock, lockflags);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -67,6 +67,8 @@ DEFINE_DEVICE_OP (idedrv_get_sector_size);
|
||||
|
||||
DEFINE_DEVICE_OP (idedrv_get_size);
|
||||
|
||||
DEFINE_DEVICE_OP (idedrv_partition_rescan);
|
||||
|
||||
void ide_probe (uint16_t io, uint16_t ctrl, uint8_t devno, struct ide_probe* probe);
|
||||
|
||||
#endif // _KERNEL_DEVICE_IDEDRV_H
|
||||
|
||||
@@ -110,3 +110,5 @@ DEFINE_DEVICE_OP (partdrv_get_size) {
|
||||
|
||||
return ST_OK;
|
||||
}
|
||||
|
||||
DEFINE_DEVICE_OP (partdrv_partition_rescan) { return ST_OK; }
|
||||
|
||||
@@ -34,4 +34,6 @@ DEFINE_DEVICE_OP (partdrv_get_sector_size);
|
||||
|
||||
DEFINE_DEVICE_OP (partdrv_get_size);
|
||||
|
||||
DEFINE_DEVICE_OP (partdrv_partition_rescan);
|
||||
|
||||
#endif // _KERNEL_DEVICE_PARTDRV_H
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
static int device_probe_partitions_dos (struct proc* proc, struct reschedule_ctx* rctx,
|
||||
struct device* device) {
|
||||
uint64_t fd;
|
||||
uint64_t fd, fsd;
|
||||
|
||||
struct dos_mbr mbr;
|
||||
memset (&mbr, 0, sizeof (mbr));
|
||||
@@ -28,6 +28,7 @@ static int device_probe_partitions_dos (struct proc* proc, struct reschedule_ctx
|
||||
[XDRV_GET_DEVICE_TYPE] = &partdrv_get_device_type,
|
||||
[XDRV_READ] = &partdrv_read,
|
||||
[XDRV_WRITE] = &partdrv_write,
|
||||
[XDRV_PARTITION_RESCAN] = &partdrv_partition_rescan,
|
||||
};
|
||||
|
||||
spin_lock (&device->lock, &fd);
|
||||
@@ -59,8 +60,12 @@ static int device_probe_partitions_dos (struct proc* proc, struct reschedule_ctx
|
||||
memset (key, 0, sizeof (key));
|
||||
snprintf (key, sizeof (key), "%sp%zu", device->key, i);
|
||||
|
||||
device_create (DEVICE_TYPE_DRIVE, key, ops, lengthof (ops), &partdrv_init, &partdrv_fini, &init,
|
||||
proc, rctx);
|
||||
struct device* part_dev = device_create (DEVICE_TYPE_DRIVE, key, ops, lengthof (ops),
|
||||
&partdrv_init, &partdrv_fini, &init, proc, rctx);
|
||||
|
||||
spin_lock (&part_dev->lock, &fsd);
|
||||
list_append (device->subdevices, &part_dev->subdevices_link);
|
||||
spin_unlock (&part_dev->lock, fsd);
|
||||
}
|
||||
|
||||
spin_unlock (&device->lock, fd);
|
||||
|
||||
@@ -114,3 +114,26 @@ DEFINE_DEVICE_OP (ramdrv_write) {
|
||||
|
||||
return ST_OK;
|
||||
}
|
||||
|
||||
DEFINE_DEVICE_OP (ramdrv_partition_rescan) {
|
||||
uint64_t fsd;
|
||||
|
||||
struct list_node_link *subdevice_link, *tmp_subdevice_link;
|
||||
list_foreach (device->subdevices, subdevice_link, tmp_subdevice_link) {
|
||||
struct device* subdevice = list_entry (subdevice_link, struct device, subdevices_link);
|
||||
|
||||
spin_lock (&subdevice->lock, &fsd);
|
||||
list_remove (device->subdevices, &subdevice->subdevices_link);
|
||||
spin_unlock (&subdevice->lock, fsd);
|
||||
|
||||
device_delete (subdevice->key, proc, rctx);
|
||||
}
|
||||
|
||||
spin_unlock (&device->lock, *lockflags);
|
||||
|
||||
int r = device_probe_partitions (proc, rctx, device);
|
||||
|
||||
spin_lock (&device->lock, lockflags);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -35,4 +35,6 @@ DEFINE_DEVICE_OP (ramdrv_get_sector_size);
|
||||
|
||||
DEFINE_DEVICE_OP (ramdrv_get_size);
|
||||
|
||||
DEFINE_DEVICE_OP (ramdrv_partition_rescan);
|
||||
|
||||
#endif // _KERNEL_DEVICE_RAMDRV_H
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#include <device/def_device_op.h>
|
||||
#include <device/device.h>
|
||||
#include <device/storage/partitions.h>
|
||||
#include <device/storage/usbdrv.h>
|
||||
#include <device/usb/xhci.h>
|
||||
#include <devices.h>
|
||||
@@ -101,8 +102,8 @@ static int usb_ms_scsi_read_capacity (struct xhci* xhci, struct xhci_usb_device*
|
||||
goto done;
|
||||
}
|
||||
|
||||
uint32_t last_lba = BE2LE32 (*(uint32_t*)&data[0]);
|
||||
uint32_t blk_len = BE2LE32 (*(uint32_t*)&data[4]);
|
||||
uint32_t last_lba = BSWAP32 (*(uint32_t*)&data[0]);
|
||||
uint32_t blk_len = BSWAP32 (*(uint32_t*)&data[4]);
|
||||
|
||||
*sector_size = blk_len;
|
||||
*sector_count = (size_t)last_lba + 1;
|
||||
@@ -422,6 +423,29 @@ DEFINE_DEVICE_OP (usbdrv_get_size) {
|
||||
return ST_OK;
|
||||
}
|
||||
|
||||
DEFINE_DEVICE_OP (usbdrv_partition_rescan) {
|
||||
uint64_t fsd;
|
||||
|
||||
struct list_node_link *subdevice_link, *tmp_subdevice_link;
|
||||
list_foreach (device->subdevices, subdevice_link, tmp_subdevice_link) {
|
||||
struct device* subdevice = list_entry (subdevice_link, struct device, subdevices_link);
|
||||
|
||||
spin_lock (&subdevice->lock, &fsd);
|
||||
list_remove (device->subdevices, &subdevice->subdevices_link);
|
||||
spin_unlock (&subdevice->lock, fsd);
|
||||
|
||||
device_delete (subdevice->key, proc, rctx);
|
||||
}
|
||||
|
||||
spin_unlock (&device->lock, *lockflags);
|
||||
|
||||
int r = device_probe_partitions (proc, rctx, device);
|
||||
|
||||
spin_lock (&device->lock, lockflags);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
DEFINE_DEVICE_INIT (usbdrv_init) {
|
||||
uint64_t fd;
|
||||
int ret;
|
||||
|
||||
@@ -60,4 +60,6 @@ DEFINE_DEVICE_OP (usbdrv_get_sector_size);
|
||||
|
||||
DEFINE_DEVICE_OP (usbdrv_get_size);
|
||||
|
||||
DEFINE_DEVICE_OP (usbdrv_partition_rescan);
|
||||
|
||||
#endif // _KERNEL_DEVICE_STORAGE_USBDRV_H
|
||||
|
||||
Reference in New Issue
Block a user