diff --git a/atmel-samd/access_vfs.c b/atmel-samd/access_vfs.c index 5dc47a7a11..0eb11b84e6 100644 --- a/atmel-samd/access_vfs.c +++ b/atmel-samd/access_vfs.c @@ -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 diff --git a/py/runtime.c b/py/runtime.c index 504c17c15d..1eb6da4338 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -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; - } - // 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) { + // Count how many mounts we have. + uint8_t count = 0; + while (vfs != NULL) { vfs = vfs->next; - i++; + count++; } - vfs->next = NULL; + // 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; + } + 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; diff --git a/shared-module/storage/__init__.c b/shared-module/storage/__init__.c index 582b91a5b1..97a049bac6 100644 --- a/shared-module/storage/__init__.c +++ b/shared-module/storage/__init__.c @@ -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; }