diff --git a/extmod/vfs.c b/extmod/vfs.c index d8bc02c6f4..79a8e8509d 100644 --- a/extmod/vfs.c +++ b/extmod/vfs.c @@ -524,4 +524,25 @@ mp_obj_t mp_vfs_statvfs(mp_obj_t path_in) { } MP_DEFINE_CONST_FUN_OBJ_1(mp_vfs_statvfs_obj, mp_vfs_statvfs); +// This is a C-level helper function for ports to use if needed. +int mp_vfs_mount_and_chdir_protected(mp_obj_t bdev, mp_obj_t mount_point) { + nlr_buf_t nlr; + mp_int_t ret = -MP_EIO; + if (nlr_push(&nlr) == 0) { + mp_obj_t args[] = { bdev, mount_point }; + mp_vfs_mount(2, args, (mp_map_t *)&mp_const_empty_map); + mp_vfs_chdir(mount_point); + ret = 0; // success + nlr_pop(); + } else { + mp_obj_base_t *exc = nlr.ret_val; + if (mp_obj_is_subclass_fast(MP_OBJ_FROM_PTR(exc->type), MP_OBJ_FROM_PTR(&mp_type_OSError))) { + mp_obj_t v = mp_obj_exception_get_value(MP_OBJ_FROM_PTR(exc)); + mp_obj_get_int_maybe(v, &ret); // get errno value + ret = -ret; + } + } + return ret; +} + #endif // MICROPY_VFS diff --git a/extmod/vfs.h b/extmod/vfs.h index de899dd8eb..23f2eac893 100644 --- a/extmod/vfs.h +++ b/extmod/vfs.h @@ -102,6 +102,8 @@ mp_obj_t mp_vfs_rmdir(mp_obj_t path_in); mp_obj_t mp_vfs_stat(mp_obj_t path_in); mp_obj_t mp_vfs_statvfs(mp_obj_t path_in); +int mp_vfs_mount_and_chdir_protected(mp_obj_t bdev, mp_obj_t mount_point); + MP_DECLARE_CONST_FUN_OBJ_KW(mp_vfs_mount_obj); MP_DECLARE_CONST_FUN_OBJ_1(mp_vfs_umount_obj); MP_DECLARE_CONST_FUN_OBJ_KW(mp_vfs_open_obj); diff --git a/ports/stm32/main.c b/ports/stm32/main.c index 78973f4118..1bda964900 100644 --- a/ports/stm32/main.c +++ b/ports/stm32/main.c @@ -161,26 +161,6 @@ STATIC mp_obj_t pyb_main(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_a MP_DEFINE_CONST_FUN_OBJ_KW(pyb_main_obj, 1, pyb_main); #if MICROPY_HW_ENABLE_STORAGE -STATIC int vfs_mount_and_chdir(mp_obj_t bdev, mp_obj_t mount_point) { - nlr_buf_t nlr; - mp_int_t ret = -MP_EIO; - if (nlr_push(&nlr) == 0) { - mp_obj_t args[] = { bdev, mount_point }; - mp_vfs_mount(2, args, (mp_map_t *)&mp_const_empty_map); - mp_vfs_chdir(mount_point); - ret = 0; // success - nlr_pop(); - } else { - mp_obj_base_t *exc = nlr.ret_val; - if (mp_obj_is_subclass_fast(MP_OBJ_FROM_PTR(exc->type), MP_OBJ_FROM_PTR(&mp_type_OSError))) { - mp_obj_t v = mp_obj_exception_get_value(MP_OBJ_FROM_PTR(exc)); - mp_obj_get_int_maybe(v, &ret); // get errno value - ret = -ret; - } - } - return ret; -} - // avoid inlining to avoid stack usage within main() MP_NOINLINE STATIC bool init_flash_fs(uint reset_mode) { if (reset_mode == 3) { @@ -230,14 +210,14 @@ MP_NOINLINE STATIC bool init_flash_fs(uint reset_mode) { // Try to mount the flash on "/flash" and chdir to it for the boot-up directory. mp_obj_t mount_point = MP_OBJ_NEW_QSTR(MP_QSTR__slash_flash); - int ret = vfs_mount_and_chdir(bdev, mount_point); + int ret = mp_vfs_mount_and_chdir_protected(bdev, mount_point); if (ret == -MP_ENODEV && bdev == MP_OBJ_FROM_PTR(&pyb_flash_obj) && reset_mode != 3) { // No filesystem, bdev is still the default (so didn't detect a possibly corrupt littlefs), // and didn't already create a filesystem, so try to create a fresh one now. ret = factory_reset_create_filesystem(); if (ret == 0) { - ret = vfs_mount_and_chdir(bdev, mount_point); + ret = mp_vfs_mount_and_chdir_protected(bdev, mount_point); } }