summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2020-03-11 14:24:26 +1100
committerDamien George <damien.p.george@gmail.com>2020-03-11 14:24:26 +1100
commited848553b408e14746f0ce96c8b20517bfdede35 (patch)
tree910e0f26564a011b32c301ae792c138b6cffb92b
parent554c01fc256640b9e88578b9d0310b53a8786fef (diff)
downloadmicropython-ed848553b408e14746f0ce96c8b20517bfdede35.tar.gz
micropython-ed848553b408e14746f0ce96c8b20517bfdede35.zip
extmod/vfs: Factor out vfs mount-and-chdir helper from stm32.
-rw-r--r--extmod/vfs.c21
-rw-r--r--extmod/vfs.h2
-rw-r--r--ports/stm32/main.c24
3 files changed, 25 insertions, 22 deletions
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);
}
}