@@ -99,7 +99,7 @@ STATIC mp_obj_t fat_vfs_make_new(const mp_obj_type_t *type, size_t n_args, size_
9999}
100100
101101STATIC void verify_fs_writable (fs_user_mount_t * vfs ) {
102- if (!filesystem_is_writable_by_python (vfs )) {
102+ if (!filesystem_lock (vfs )) {
103103 mp_raise_OSError (MP_EROFS );
104104 }
105105}
@@ -218,7 +218,6 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(fat_vfs_ilistdir_obj, 1, 2, fat_vfs_i
218218
219219STATIC mp_obj_t fat_vfs_remove_internal (mp_obj_t vfs_in , mp_obj_t path_in , mp_int_t attr ) {
220220 mp_obj_fat_vfs_t * self = MP_OBJ_TO_PTR (vfs_in );
221- verify_fs_writable (self );
222221 const char * path = mp_obj_str_get_str (path_in );
223222
224223 FILINFO fno ;
@@ -230,7 +229,9 @@ STATIC mp_obj_t fat_vfs_remove_internal(mp_obj_t vfs_in, mp_obj_t path_in, mp_in
230229
231230 // check if path is a file or directory
232231 if ((fno .fattrib & AM_DIR ) == attr ) {
232+ verify_fs_writable (self );
233233 res = f_unlink (& self -> fatfs , path );
234+ filesystem_unlock (self );
234235
235236 if (res != FR_OK ) {
236237 mp_raise_OSError_fresult (res );
@@ -253,17 +254,18 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(fat_vfs_rmdir_obj, fat_vfs_rmdir);
253254
254255STATIC mp_obj_t fat_vfs_rename (mp_obj_t vfs_in , mp_obj_t path_in , mp_obj_t path_out ) {
255256 mp_obj_fat_vfs_t * self = MP_OBJ_TO_PTR (vfs_in );
256- verify_fs_writable (self );
257257 const char * old_path = mp_obj_str_get_str (path_in );
258258 const char * new_path = mp_obj_str_get_str (path_out );
259259
260+ verify_fs_writable (self );
260261 FRESULT res = f_rename (& self -> fatfs , old_path , new_path );
261262 if (res == FR_EXIST ) {
262263 // if new_path exists then try removing it (but only if it's a file)
263264 fat_vfs_remove_internal (vfs_in , path_out , 0 ); // 0 == file attribute
264265 // try to rename again
265266 res = f_rename (& self -> fatfs , old_path , new_path );
266267 }
268+ filesystem_unlock (self );
267269 if (res == FR_OK ) {
268270 return mp_const_none ;
269271 } else {
@@ -275,9 +277,10 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_3(fat_vfs_rename_obj, fat_vfs_rename);
275277
276278STATIC mp_obj_t fat_vfs_mkdir (mp_obj_t vfs_in , mp_obj_t path_o ) {
277279 mp_obj_fat_vfs_t * self = MP_OBJ_TO_PTR (vfs_in );
278- verify_fs_writable (self );
279280 const char * path = mp_obj_str_get_str (path_o );
281+ verify_fs_writable (self );
280282 FRESULT res = f_mkdir (& self -> fatfs , path );
283+ filesystem_unlock (self );
281284 if (res == FR_OK ) {
282285 return mp_const_none ;
283286 } else {
@@ -463,7 +466,11 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_3(fat_vfs_utime_obj, vfs_fat_utime);
463466
464467STATIC mp_obj_t vfs_fat_getreadonly (mp_obj_t self_in ) {
465468 fs_user_mount_t * self = MP_OBJ_TO_PTR (self_in );
466- return mp_obj_new_bool (!filesystem_is_writable_by_python (self ));
469+ bool writable = filesystem_lock (self );
470+ if (writable ) {
471+ filesystem_unlock (self );
472+ }
473+ return mp_obj_new_bool (!writable );
467474}
468475STATIC MP_DEFINE_CONST_FUN_OBJ_1 (fat_vfs_getreadonly_obj , vfs_fat_getreadonly );
469476STATIC const mp_obj_property_t fat_vfs_readonly_obj = {
@@ -487,9 +494,10 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_1(fat_vfs_getlabel_obj, vfs_fat_getlabel);
487494
488495STATIC mp_obj_t vfs_fat_setlabel (mp_obj_t self_in , mp_obj_t label_in ) {
489496 fs_user_mount_t * self = MP_OBJ_TO_PTR (self_in );
490- verify_fs_writable (self );
491497 const char * label_str = mp_obj_str_get_str (label_in );
498+ verify_fs_writable (self );
492499 FRESULT res = f_setlabel (& self -> fatfs , label_str );
500+ filesystem_unlock (self );
493501 if (res != FR_OK ) {
494502 if (res == FR_WRITE_PROTECTED ) {
495503 mp_raise_msg (& mp_type_OSError , MP_ERROR_TEXT ("Read-only filesystem" ));
0 commit comments