@@ -99,7 +99,7 @@ STATIC mp_obj_t fat_vfs_make_new(const mp_obj_type_t *type, size_t n_args, size_
99
99
}
100
100
101
101
STATIC void verify_fs_writable (fs_user_mount_t * vfs ) {
102
- if (!filesystem_is_writable_by_python (vfs )) {
102
+ if (!filesystem_lock (vfs )) {
103
103
mp_raise_OSError (MP_EROFS );
104
104
}
105
105
}
@@ -218,7 +218,6 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(fat_vfs_ilistdir_obj, 1, 2, fat_vfs_i
218
218
219
219
STATIC mp_obj_t fat_vfs_remove_internal (mp_obj_t vfs_in , mp_obj_t path_in , mp_int_t attr ) {
220
220
mp_obj_fat_vfs_t * self = MP_OBJ_TO_PTR (vfs_in );
221
- verify_fs_writable (self );
222
221
const char * path = mp_obj_str_get_str (path_in );
223
222
224
223
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
230
229
231
230
// check if path is a file or directory
232
231
if ((fno .fattrib & AM_DIR ) == attr ) {
232
+ verify_fs_writable (self );
233
233
res = f_unlink (& self -> fatfs , path );
234
+ filesystem_unlock (self );
234
235
235
236
if (res != FR_OK ) {
236
237
mp_raise_OSError_fresult (res );
@@ -253,17 +254,18 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_2(fat_vfs_rmdir_obj, fat_vfs_rmdir);
253
254
254
255
STATIC mp_obj_t fat_vfs_rename (mp_obj_t vfs_in , mp_obj_t path_in , mp_obj_t path_out ) {
255
256
mp_obj_fat_vfs_t * self = MP_OBJ_TO_PTR (vfs_in );
256
- verify_fs_writable (self );
257
257
const char * old_path = mp_obj_str_get_str (path_in );
258
258
const char * new_path = mp_obj_str_get_str (path_out );
259
259
260
+ verify_fs_writable (self );
260
261
FRESULT res = f_rename (& self -> fatfs , old_path , new_path );
261
262
if (res == FR_EXIST ) {
262
263
// if new_path exists then try removing it (but only if it's a file)
263
264
fat_vfs_remove_internal (vfs_in , path_out , 0 ); // 0 == file attribute
264
265
// try to rename again
265
266
res = f_rename (& self -> fatfs , old_path , new_path );
266
267
}
268
+ filesystem_unlock (self );
267
269
if (res == FR_OK ) {
268
270
return mp_const_none ;
269
271
} else {
@@ -275,9 +277,10 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_3(fat_vfs_rename_obj, fat_vfs_rename);
275
277
276
278
STATIC mp_obj_t fat_vfs_mkdir (mp_obj_t vfs_in , mp_obj_t path_o ) {
277
279
mp_obj_fat_vfs_t * self = MP_OBJ_TO_PTR (vfs_in );
278
- verify_fs_writable (self );
279
280
const char * path = mp_obj_str_get_str (path_o );
281
+ verify_fs_writable (self );
280
282
FRESULT res = f_mkdir (& self -> fatfs , path );
283
+ filesystem_unlock (self );
281
284
if (res == FR_OK ) {
282
285
return mp_const_none ;
283
286
} else {
@@ -463,7 +466,11 @@ STATIC MP_DEFINE_CONST_FUN_OBJ_3(fat_vfs_utime_obj, vfs_fat_utime);
463
466
464
467
STATIC mp_obj_t vfs_fat_getreadonly (mp_obj_t self_in ) {
465
468
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 );
467
474
}
468
475
STATIC MP_DEFINE_CONST_FUN_OBJ_1 (fat_vfs_getreadonly_obj , vfs_fat_getreadonly );
469
476
STATIC 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);
487
494
488
495
STATIC mp_obj_t vfs_fat_setlabel (mp_obj_t self_in , mp_obj_t label_in ) {
489
496
fs_user_mount_t * self = MP_OBJ_TO_PTR (self_in );
490
- verify_fs_writable (self );
491
497
const char * label_str = mp_obj_str_get_str (label_in );
498
+ verify_fs_writable (self );
492
499
FRESULT res = f_setlabel (& self -> fatfs , label_str );
500
+ filesystem_unlock (self );
493
501
if (res != FR_OK ) {
494
502
if (res == FR_WRITE_PROTECTED ) {
495
503
mp_raise_msg (& mp_type_OSError , MP_ERROR_TEXT ("Read-only filesystem" ));
0 commit comments