diff --git a/extmod/vfs.c b/extmod/vfs.c
index 2880271c6d866fbee1b33745655dc22c68e2d21a..0cba0bc58f7a4df19e5f1ba9b75b7958d1626701 100644
--- a/extmod/vfs.c
+++ b/extmod/vfs.c
@@ -31,6 +31,7 @@
 #include "py/objstr.h"
 #include "py/mperrno.h"
 #include "extmod/vfs.h"
+#include "extmod/vfs_fat.h"
 
 #if MICROPY_VFS
 
@@ -114,6 +115,12 @@ mp_import_stat_t mp_vfs_import_stat(const char *path) {
     if (vfs == VFS_NONE || vfs == VFS_ROOT) {
         return MP_IMPORT_STAT_NO_EXIST;
     }
+    #if MICROPY_VFS_FAT
+    // fast paths for known VFS types
+    if (mp_obj_get_type(vfs->obj) == &mp_fat_vfs_type) {
+        return fat_vfs_import_stat(MP_OBJ_TO_PTR(vfs->obj), path_out);
+    }
+    #endif
     // TODO delegate to vfs.stat() method
     return MP_IMPORT_STAT_NO_EXIST;
 }
diff --git a/extmod/vfs_fat.h b/extmod/vfs_fat.h
index 52674eb6e4866702c6184e18534114f0795eb5f9..1ea8a9637e3ec3d500cfee1efb40b2c9fa82ebd1 100644
--- a/extmod/vfs_fat.h
+++ b/extmod/vfs_fat.h
@@ -24,6 +24,8 @@
  * THE SOFTWARE.
  */
 
+#include "py/lexer.h"
+
 struct _fs_user_mount_t;
 
 extern const byte fresult_to_errno_table[20];
@@ -31,6 +33,7 @@ extern const mp_obj_type_t mp_fat_vfs_type;
 
 struct _fs_user_mount_t *ff_get_vfs(const char **path);
 
+mp_import_stat_t fat_vfs_import_stat(struct _fs_user_mount_t *vfs, const char *path);
 mp_obj_t fatfs_builtin_open(mp_uint_t n_args, const mp_obj_t *args, mp_map_t *kwargs);
 mp_obj_t fatfs_builtin_open_self(mp_obj_t self_in, mp_obj_t path, mp_obj_t mode);
 MP_DECLARE_CONST_FUN_OBJ_KW(mp_builtin_open_obj);
diff --git a/extmod/vfs_fat_misc.c b/extmod/vfs_fat_misc.c
index ea267a15fa7efcb4f19255b9a3cae2c2feca8494..489e535868898ed1b46af78524d572285b09179f 100644
--- a/extmod/vfs_fat_misc.c
+++ b/extmod/vfs_fat_misc.c
@@ -108,21 +108,17 @@ mp_obj_t fat_vfs_listdir2(fs_user_mount_t *vfs, const char *path, bool is_str_ty
     return dir_list;
 }
 
-mp_import_stat_t fat_vfs_import_stat(const char *path);
-
-mp_import_stat_t fat_vfs_import_stat(const char *path) {
+mp_import_stat_t fat_vfs_import_stat(fs_user_mount_t *vfs, const char *path) {
     FILINFO fno;
 #if !MICROPY_FATFS_OO && _USE_LFN
     fno.lfname = NULL;
     fno.lfsize = 0;
 #endif
     #if MICROPY_FATFS_OO
-    fs_user_mount_t *vfs = ff_get_vfs(&path);
-    if (vfs == NULL) {
-        return MP_IMPORT_STAT_NO_EXIST;
-    }
+    assert(vfs != NULL);
     FRESULT res = f_stat(&vfs->fatfs, path, &fno);
     #else
+    (void)vfs;
     FRESULT res = f_stat(path, &fno);
     #endif
     if (res == FR_OK) {
diff --git a/stmhal/import.c b/stmhal/import.c
index 1edbe2caa1fae6a5300dc7d65178ddf157098600..2bc282e7b72aea79345f39d45c6987a181dd0625 100644
--- a/stmhal/import.c
+++ b/stmhal/import.c
@@ -28,9 +28,8 @@
 
 #include "py/lexer.h"
 #include "lib/fatfs/ff.h"
-
-mp_import_stat_t fat_vfs_import_stat(const char *path);
+#include "extmod/vfs_fat.h"
 
 mp_import_stat_t mp_import_stat(const char *path) {
-    return fat_vfs_import_stat(path);
+    return fat_vfs_import_stat(NULL, path);
 }