Change vfs mount ordering such that the root is always last in the

linked list. Its also the only one statically allocated and made
available over USB.
crypto-aes
Scott Shawcroft 6 years ago
parent 5ddbf26b62
commit d6a24afd71

@ -42,15 +42,13 @@
#define VFS_INDEX 0
// The root FS is always at the end of the list.
static fs_user_mount_t* get_vfs(int index) {
mp_vfs_mount_t* current_mount = MP_STATE_VM(vfs_mount_table);
for (uint8_t i = 0; current_mount != NULL; i++) {
if (i == VFS_INDEX) {
return (fs_user_mount_t *) current_mount->obj;
}
while (current_mount->next != NULL) {
current_mount = current_mount->next;
}
return NULL;
return current_mount->obj;
}
//! This function tests memory state, and starts memory initialization

@ -117,18 +117,22 @@ void mp_init(void) {
#if MICROPY_VFS
#if MICROPY_FATFS_NUM_PERSISTENT > 0
// We preserve the last MICROPY_FATFS_NUM_PERSISTENT mounts because newer
// mounts are put at the front of the list.
mp_vfs_mount_t *vfs = MP_STATE_VM(vfs_mount_table);
if (vfs != NULL) {
MP_STATE_VM(vfs_cur) = vfs;
// Count how many mounts we have.
uint8_t count = 0;
while (vfs != NULL) {
vfs = vfs->next;
count++;
}
// Skip forward until the vfs->next pointer is the first vfs that shouldn't
// persist.
uint8_t i = 1;
while (vfs != NULL && i < MICROPY_FATFS_NUM_PERSISTENT) {
// Find the vfs MICROPY_FATFS_NUM_PERSISTENT mounts from the end.
vfs = MP_STATE_VM(vfs_mount_table);
for (uint8_t j = 0; j < count - MICROPY_FATFS_NUM_PERSISTENT; j++) {
vfs = vfs->next;
i++;
}
vfs->next = NULL;
MP_STATE_VM(vfs_mount_table) = vfs;
MP_STATE_VM(vfs_cur) = vfs;
#else
// initialise the VFS sub-system
MP_STATE_VM(vfs_cur) = NULL;

@ -78,16 +78,10 @@ void common_hal_storage_mount(mp_obj_t vfs_obj, const char* mount_path, bool rea
}
}
// insert the vfs into the mount table
// Insert the vfs into the mount table by pushing it onto the front of the
// mount table.
mp_vfs_mount_t **vfsp = &MP_STATE_VM(vfs_mount_table);
while (*vfsp != NULL) {
if ((*vfsp)->len == 1) {
// make sure anything mounted at the root stays at the end of the list
vfs->next = *vfsp;
break;
}
vfsp = &(*vfsp)->next;
}
vfs->next = *vfsp;
*vfsp = vfs;
}

Loading…
Cancel
Save